【发布时间】:2017-05-03 03:01:11
【问题描述】:
作为 Idris 的一个练习,我试图证明这个属性:
multCancel : (a:Nat) -> (b:Nat) -> (c:Nat) -> (S a) * b = (S a) * c -> b = c
我得出的结论是,作为一个中间步骤,我需要证明这样的事情:
lemma1 : {x:Nat} -> {y:Nat} -> {z:Nat} -> (x + x) + (x * z) = (y + y) + (y * z) -> (x * (S (S z))) = (y * (S (S z)))
lemma1 {x=x} {y=y} {z=z} prf = ?todo
当然,我已经证明了:
plusDouble : (a:Nat) -> (a + a) = a*2
plusDouble a =
rewrite multCommutative a 2 in
rewrite plusZeroRightNeutral a in Refl
所以我相信我基本上只需要将(x + x) 替换为(x*2),然后调用分配性即可证明lemma1。我不知道如何进行此替换。
我以为我可以简单地做一些类似
rewrite plusDouble x in ...
但这显然行不通,因为我要替换的子表达式在 prf 和目标中。
有一些通用的方法吗?或者在这种特殊情况下您会推荐什么?
【问题讨论】:
标签: dependent-type idris theorem-proving