【问题标题】:Replace subexpression in equality proof in Idris在 Idris 中替换等式证明中的子表达式
【发布时间】: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


    【解决方案1】:

    重写功能在后台使用replace : (x = y) -> P x -> P y;它正在弄清楚P 应该是什么(据我所知)。

    要将x + x 替换为x*2,您可以使用等式x + x = x*2。要将x*2 替换为x + x,您可以使用等式x*2 = x + x;在你的情况下是sym prf。你需要两个替换来实现两者。

    当重写工具(或推理)无法弄清楚时,您可以显式提供P,例如replace {P = \x' => x' + (x * z) = (y + y) + (y * z)} (plusDouble x) prf。当您需要重写 x + x 的某些站点但不是全部时,这特别有用。

    【讨论】:

      【解决方案2】:

      好的,所以我发现我不必总是使用重写规则来简化目标,而是可以扩展它以匹配我作为参数得到的证明。

      【讨论】:

      • 您介意解释一下“扩展”是什么意思吗?我有一个类似的问题,所以我对更详细的答案感兴趣。
      • 我的意思是,用作重写规则的等式左侧在某种意义上“更复杂”。例如,你可以做rewrite plusZeroRightNeutral right in someProofMatchingRight(这就是我所说的目标简化)但你也可以做rewrite sym $ plusZeroRightNeutral right in someProofMatchingZeroPlusRight(这就是我所说的目标扩展)。也许有一个更准确的术语,idk。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2018-04-01
      • 2020-02-25
      • 2011-12-16
      相关资源
      最近更新 更多