Functional programming 如何用“replace”完成交换性的证明?

Functional programming 如何用“replace”完成交换性的证明?,functional-programming,proof,agda,idris,Functional Programming,Proof,Agda,Idris,在文档中,提到了如何使用replace来完成证明,但它最终使用了rewrite,这似乎是为您编写replace的语法糖。我对理解如何明确地使用它感兴趣 如果我理解正确,它可以用来重写sk=S(加k0)为S(加k0)=S(加k0),给出k=+k0的证明,然后可以通过自反性证明。但是如果我们把它作为replace{P=\x=>sx=S(加k0)}{x=k}{y=plusk0}rec,我们现在需要一个sk=S(加k0)的证明,这就是我们想要证明的。简而言之,我不确定确切的P应该是什么。啊,回想起来,这

在文档中,提到了如何使用
replace
来完成证明,但它最终使用了
rewrite
,这似乎是为您编写
replace
的语法糖。我对理解如何明确地使用它感兴趣


如果我理解正确,它可以用来重写
sk=S(加k0)
S(加k0)=S(加k0)
,给出
k=+k0
的证明,然后可以通过自反性证明。但是如果我们把它作为
replace{P=\x=>sx=S(加k0)}{x=k}{y=plusk0}rec
,我们现在需要一个
sk=S(加k0)
的证明,这就是我们想要证明的。简而言之,我不确定确切的
P
应该是什么。

啊,回想起来,这是相当明显的。如果我们让:

P = \x => S x = S (plus k 0)
然后,我们可以证明它的
x=(加上k0)
(通过自反性)。现在,如果我们让
y=k
,那么通过使用
replace
,我们得到了
sk=S(加k0)
的证明,这就是我们需要的。或者,换句话说:

plusCommZ : (m : Nat) -> m = plus m 0
plusCommZ Z = Refl
plusCommZ (S k) = replace 
  {P = \x => S x = S (plus k 0)}
  {x = plus k 0}
  {y = k}
  (sym (plusCommZ k))
  Refl

完成证明。我们可以用
P=\x=>sx=sk

用另一种方法来做,现在,替换如何被证明是一个谜(是的,我已经看到了定义)。
sym
在这里不是真的必要:
replace{P=\x=>sk=sx}(pluscommzk)Refl
(这本质上是
cong(pluscommzk)