在 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。因此,对于您的类型,您需要说明什么函数将扮演 eqlt 的角色,并显示 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)

也就是说,一旦添加了功能扩展性,这对于地图来说并不是一个糟糕的类型,但当然它缺少一些可以通过一些努力添加的基本操作。