我想描述整数:
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
但我很好奇是否有办法将方程式添加到数据类型。
答案 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
..