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

Types Agda:证明当值相等时,它们的构造函数参数相等,types,logic,agda,dependent-type,formal-verification,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的“绿色goo”有关,即在返回构造函数时具有函数?解决方案的基础是将pf为refl的

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

justEq : ∀ {A} -> (x y : A) -> (just x ≡ just y) -> (x ≡ y)
justEq x y pf = {!!}
我不知道怎么写这个。对我来说,这是直观的公理化,但编译器不接受refl作为它的证明

我经常要证明这类事情,例如,如果两个非空列表相等,那么它们的头是相等的


一般的做法是什么?这是否与Conor McBride的“绿色goo”有关,即在返回构造函数时具有函数?

解决方案的基础是将
pf
refl
的模式匹配在一起
y
x
(因为
refl
的类型)

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

justEq x .x refl = refl

您在
pf
上尝试过模式匹配吗?emacs只是将其扩展到
refl
。。。我可能忽略了明显的问题,但我不认为这有什么帮助。我觉得
cong
在这里很有用,但我不知道如何编写一个只需要x到
x
的函数,因为它本质上是局部的。是如何通过
cong
@user3237465来定义
justEq
:我怀疑会有一个很好的解决方案。不错!
justEq x .x refl = refl