使用字符串作为Agda中的键映射?

时间:2017-03-05 21:09:21

标签: types module functional-programming agda dependent-type

我在弄清楚如何在Agda中使用String键正确制作Map时遇到了一些麻烦。我有以下内容:

import Data.AVL.IndexedMap

Var = String

data Type where -- ...

alwaysType : Var -> Set
alwaysType _ = Type

open Data.AVL.IndexedMap alwaysType (StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder) 

这给出了错误:

String != Σ String _Key_90 of type Set
when checking that the expression
StrictTotalOrder.isStrictTotalOrder strictTotalOrder has type
Relation.Binary.IsStrictTotalOrder .Agda.Builtin.Equality._≡_
__<__91

打开Map模块的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

请注意,标准库的Data.AVL已更新为接受严格的总订单,而不是基于命题相等性。

这几天很简单:

open import Data.String.Properties
open import Data.AVL strictTotalOrder

答案 1 :(得分:2)

Data.AVL.IndexedMap模块用于(有限)映射,其中键和值具有一系列类型,与给定键关联的值与值共享索引。

这不是您想要的,因为您希望所有密钥都是String。所以只需使用Data.AVL(即带有非索引键的版本):

open import Data.String using (String)
open import Function using (const)

Key = String

postulate
  Value : Set

open import Relation.Binary using (StrictTotalOrder)
open import Data.AVL (const Value) (StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder)

不幸的是,这仍然没有成功:

.Relation.Binary.List.Pointwise.Rel
(StrictTotalOrder._≈_ .Data.Char.strictTotalOrder)
(Data.String.toList x) (Data.String.toList x₁)
!= x .Agda.Builtin.Equality.≡ x₁ of type Set
when checking that the expression
StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder
has type IsStrictTotalOrder .Agda.Builtin.Equality._≡_ __<__10

这是因为Data.String.strictTotalOrder使用逐点相等(在构成的{​​{1}}的{​​{1}}列表上),Char需要命题平等。因此完全相同的示例适用于例如String键:

Data.AVL

因此,下一步需要将转换为open import Data.Nat using (ℕ) open import Function using (const) Key = ℕ postulate Value : Set import Data.Nat.Properties open import Relation.Binary using (StrictTotalOrder) open import Data.AVL (const Value) (StrictTotalOrder.isStrictTotalOrder Data.Nat.Properties.strictTotalOrder) 类型的内容。我现在就把它留给别人,但是我很高兴以后再看,有空的时候,如果你不能让它工作,也没有其他人接受它。

编辑添加:这是一种(可能非常过于复杂)的方式,将StrictTotalOrder.isStrictTotalOrder Data.String.strictTotalOrder IsStrictTotalOrder (_≡_ {A = String}) _从标准库转换为使用命题平等的东西:

StrictTotalOrder