Idris交互式证明器不会在假设上执行重写

时间:2016-01-27 16:57:27

标签: proof idris

(我知道现在已经弃用了交互式证明器以支持详细说明,但我还没有更新。很快!)

我在证明者(以及其他人)中目前有以下假设:

x : Nat
c : Nat
m : Nat
lte : LTE c m
pma : x + (m - c) = (x + m) - c
p : Part (S c) (plus x (minus m c))

pma是使用我自己编写的函数创建的,给出了自然数 x y z 和证明z≤y,产生 x +(y - z)=(x + y) - z 的证明。

Part n x是自然数xn个片段(每个片段是自然数)的分区类型,其中顺序很重要。

我想要做的是使用p重写pma的类型以产生新的假设:

p' : Part (S c) (minus (plus x m) c)

然而,我试过了:

let p' = rewrite pma in p

还有:

let p' = rewrite (sym pma) in p

因为我永远无法记住rewrite的工作方式,并且在两种情况下我都得到了:

rewrite did not change type letty

我在哪里滑倒?我想这可能是因为plus+之间以及minus-之间存在一些差异,但我很确定我之前在样张中交替使用它们。我缺少的表达式之间是否存在其他差异?

我正在使用Idris版本0.9.18-,如果有帮助的话。

1 个答案:

答案 0 :(得分:2)

对于pma : x + (m - c) = (x + m) - crewrite和{{1}的某些选择,您可以E1 + (E2 - E3)使用E1类型E2的类型}。但是,你有

E3

该表单的。但 的格式为p : Part (S c) (plus x (minus m c)) 。所以我们需要解除你的平等

P (E1 + (E2 - E3))

E1 + (E2 - E3) ~> (E1 + E2) - E3

这正是replace的作用:

P (E1 + (E2 - E3)) ~> P ((E1 + E2) - E3)

所以在你的特定情况下,给出

replace : {a:_} -> {x:_} -> {y:_} -> {P : a -> Type} -> x = y -> P x -> P y
replace Refl prf = prf

然后

pma : x + (m - c) = (x + m) - c

,特别是

replace {Part (S c)} pma : Part (S c) (x + (m - c)) -> Part (S c) ((x + m) - c)