在 Coq 中创建 dictionary/map
Creating a dictionary/map in Coq
我希望能够在 Coq 中拥有从任何类型到任何类型的映射。到目前为止,我已经从标准库中取得了一些成功 using Coq.FSets.FMapList
,但我只能通过执行以下操作来创建键为自然数的映射。
Require Import Coq.FSets.FMapList.
Require Import Coq.Structures.OrderedTypeEx.
Module Import NatMap := FMapList.Make(Nat_as_OT).
(* whatever I want to do with my NatMap *)
我知道 NatMap := FMapList.Make(Nat_as_OT).
声明我想使用键为 Nat_as_OT
的地图。然而,FMapList.Make
将只接受一个 OrderedType
作为参数。有办法让我自己制作 OrderedType
吗?或者有更好的创建地图的方法吗?
您不会轻易找到从任何类型到任何类型的映射,因为要使这样的映射起作用,您至少需要能够区分用于键的类型的两个元素。如果你只有这个能力(测试两个元素是否相同),那么映射可以以一种相当低效的方式实现:你基本上处理一个对 (key, value)
的列表和检索与键关联的值的成本平均而言,与地图中已处理的键数成正比。
如果你想稍微有点效率,通常的技巧是有散列键,但你需要能够计算散列值,所以你的类型不能完全是任意的。
最后,有可能使用基于具有顺序的类型的地图。在这种情况下,很容易实现 map 是这样一种方式,即检索一个键的值,平均成本是键数的对数。
现在,如何创建 OrderedType
对象?您需要实例化模块类型 MiniOrderedType
。因此,对于您的类型,您需要说明什么函数将扮演 eq
、lt
的角色,并显示 MiniOrderedType
模块类型中列出的各种重要属性(参见 this file). There are several example of this construction in this example file).
a map from any type to any type in Coq
为了完善 Yves 的答案,Coq 中唯一从任何类型 A
到任何类型 B
的映射是函数 space A -> B
(或A -> option B
)
也就是说,一旦添加了功能扩展性,这对于地图来说并不是一个糟糕的类型,但当然它缺少一些可以通过一些努力添加的基本操作。
我希望能够在 Coq 中拥有从任何类型到任何类型的映射。到目前为止,我已经从标准库中取得了一些成功 using Coq.FSets.FMapList
,但我只能通过执行以下操作来创建键为自然数的映射。
Require Import Coq.FSets.FMapList.
Require Import Coq.Structures.OrderedTypeEx.
Module Import NatMap := FMapList.Make(Nat_as_OT).
(* whatever I want to do with my NatMap *)
我知道 NatMap := FMapList.Make(Nat_as_OT).
声明我想使用键为 Nat_as_OT
的地图。然而,FMapList.Make
将只接受一个 OrderedType
作为参数。有办法让我自己制作 OrderedType
吗?或者有更好的创建地图的方法吗?
您不会轻易找到从任何类型到任何类型的映射,因为要使这样的映射起作用,您至少需要能够区分用于键的类型的两个元素。如果你只有这个能力(测试两个元素是否相同),那么映射可以以一种相当低效的方式实现:你基本上处理一个对 (key, value)
的列表和检索与键关联的值的成本平均而言,与地图中已处理的键数成正比。
如果你想稍微有点效率,通常的技巧是有散列键,但你需要能够计算散列值,所以你的类型不能完全是任意的。
最后,有可能使用基于具有顺序的类型的地图。在这种情况下,很容易实现 map 是这样一种方式,即检索一个键的值,平均成本是键数的对数。
现在,如何创建 OrderedType
对象?您需要实例化模块类型 MiniOrderedType
。因此,对于您的类型,您需要说明什么函数将扮演 eq
、lt
的角色,并显示 MiniOrderedType
模块类型中列出的各种重要属性(参见 this file). There are several example of this construction in this example file).
a map from any type to any type in Coq
为了完善 Yves 的答案,Coq 中唯一从任何类型 A
到任何类型 B
的映射是函数 space A -> B
(或A -> option B
)
也就是说,一旦添加了功能扩展性,这对于地图来说并不是一个糟糕的类型,但当然它缺少一些可以通过一些努力添加的基本操作。