types - Agda:证明当值相等时,它们的构造函数参数也相等

标签 types logic agda dependent-type formal-verification

我正在尝试编写以下函数:

justEq : ∀ {A} -> (x y : A) -> (just x ≡ just y) -> (x ≡ y)
justEq x y pf = {!!}

我不知道怎么写。对我来说,它是直观到公理化的程度,但编译器不接受 refl 作为它的证明。

我经常必须证明这类事情,例如,证明如果两个非空列表相等,则它们的头相等。

一般的方法是什么?这与 Conor McBride 的“green-goo”有关,即在构造函数的返回中包含函数吗?

最佳答案

解决方案的基础是对 pf 进行模式匹配,refl 一起,并使用点线模式表示 y 等于 x(因为 refl 的类型!)。

justEq : ∀ {A} -> (x y : A) -> (just x ≡ just y) -> (x ≡ y)
justEq x .x refl = {!!}

此时,由于 y = .x 等式,右侧孔的类型已统一为 (x ≡ x)模式匹配,这意味着您可以使用 refl 作为类型正确的值,给出

justEq x .x refl = refl

关于types - Agda:证明当值相等时,它们的构造函数参数也相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30879801/

相关文章:

c++ - 如何解决 MSVC 2012 中的 `using K = ...`?

haskell - 不同类型的case表达式导致Haskell

德尔福型类型转换

c - 为什么给定的 'C' 代码片段中 x 的值为 28?

c# - 在我的方法中无法计算随时间推移的两倍

php - 使用 PHP 对照数组中的值检查值并返回键

generic-programming - Agda中的Arity泛型编程

agda - Agda 中的空函数是相等的(没有函数外延性)

c++ - Armadillo 是否支持 bool 和 8 位类型的矩阵和立方体?

由于定义等式约束,Agda 不允许我用匹配类型的术语填充类型化的空洞