在Agda中,是否可以定义具有方程的数据类型?

时间:2014-10-28 02:33:11

标签: agda algebraic-data-types

我想描述整数:

data Integer : Set where
    Z : Integer
    Succ : Integer -> Integer
    Pred : Integer -> Integer
    ?? what else

上面没有定义整数。我们需要Succ(Pred x)= x和Pred(Succ x)= x。但是,

    spReduce : (m : Integer) -> Succ (Pred m) = m
    psReduce : (m : Integer) -> Pred (Succ m) = m

无法添加到数据类型。更确切地说,更好地定义整数,

data Integers : Set where
    Pos : Nat -> Integers
    Neg : Nat -> Integers

但我很好奇是否有办法将方程式添加到数据类型。

2 个答案:

答案 0 :(得分:5)

我会通过定义record

来解决这个问题
record Integer (A : Set) : Set where
  constructor integer
  field
    z : A
    succ : A -> A
    pred : A -> A
    spInv : (x : A) -> succ (pred x) == x
    psInv : (x : A) -> pred (succ x) == x

此记录可用作某种类型A的行为类似于Integer的证据。

答案 1 :(得分:2)

您希望做的是通过使用Integers标识Succ (Pred m)的等价关系将m类型定义为商类型.Agda不会再支持 - 有一个实验库试图这样做(通过强制所有函数通过一个需要代表不变性证明的辅助函数来定义商类型),但后来有人发现实现不是水密的足够,因此可能导致不一致(基本上是通过访问其中一个本来应该无法从外部访问的假设),您可以看到详细信息this message

  

我们不确定这个黑客是否健全。现在,感谢Dan   Doel,我知道事实并非如此。

     

[...]

     

鉴于这些观察结果,很容易证明上面的假设   不健全:

我认为你现在最好的选择(如果你想/需要坚持使用相同的松散表示来收紧它)是为你的类型定义Setoid ..