(我知道现在已经弃用了交互式证明器以支持详细说明,但我还没有更新。很快!)
我在证明者(以及其他人)中目前有以下假设:
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
是自然数x
到n
个片段(每个片段是自然数)的分区类型,其中顺序很重要。
我想要做的是使用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-,如果有帮助的话。
答案 0 :(得分:2)
对于pma : x + (m - c) = (x + m) - c
,rewrite
和{{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)