在(* 1)中可以阅读下一个
rewrite prf in expr
如果我们有
prf : x = y
,并且expr所需的类型是x
的某个属性,则rewrite ... in
语法将搜索所需类型{x
中的expr
1}}并将其替换为y
。
现在,我有下一段代码(您可以将其复制到编辑器并尝试ctrl-l)
module Test
plusCommZ : y = plus y 0
plusCommZ {y = Z} = Refl
plusCommZ {y = (S k)} = cong $ plusCommZ {y = k}
plusCommS : S (plus y k) = plus y (S k)
plusCommS {y = Z} = Refl
plusCommS {y = (S j)} {k} = let ih = plusCommS {y=j} {k=k} in cong ih
plusComm : (x, y : Nat) -> plus x y = plus y x
plusComm Z y = plusCommZ
plusComm (S k) y =
let
ih = plusComm k y
prfXeqY = sym ih
expr = plusCommS {k=k} {y=y}
-- res = rewrite prfXeqY in expr
in ?hole
下面是洞的样子
- + Test.hole [P]
`-- k : Nat
y : Nat
ih : plus k y = plus y k
prfXeqY : plus y k = plus k y
expr : S (plus y k) = plus y (S k)
-----------------------------------------
Test.hole : S (plus k y) = plus y (S k)
问题。
在我看来,评论行中的expr
(来自* 1)等于S (plus y k) = plus y (S k)
。 prf
等于plus y k = plus k y
,x
为plus y k
,y
为plus k y
。重写应在x
中搜索plus y k
(即expr
)(即S (plus y k) = plus y (S k)
,并将x
替换为y
(即{ {1}})。结果(plus k y
)应为res
。
但这不起作用。
我有来自idris的下一个答案
重写加y k加上k y没有改变类型letty
我猜测重写只是为了改变结果表达式的类型。因此,它不是在S (plus k y) = plus y (S k)
表达式的主体内工作,而是仅在它的'in'部分中。这是对的吗?
(* 1)http://docs.idris-lang.org/en/latest/proofs/patterns.html
PS。来自tutoral的例子很好。我只是想知道为什么我尝试使用重写的方式不起作用。
答案 0 :(得分:2)
虽然未在文档中明确说明,rewrite
是Elab
战术脚本(defined around here)的语法含糖调用。
为什么你的例子不起作用:"所需类型expr
"没有找到;仅使用res = rewrite prfXeqY in expr
,目前还不清楚,res
应该具有哪种类型(甚至统一者可以使用let res = … in res
解决此问题。)如果指定了所需的类型,它按预期工作:
res = the (S (plus k y) = plus y (S k)) (rewrite prfXeqY in expr)
答案 1 :(得分:0)
不幸的是,你没有提供使你的代码行为异常的确切行,不知怎的,你必须做一些奇怪的事情,因为你在上面概述了你的推理,代码效果很好:
let
ih = plusComm k y -- plus k y = plus y k
px = plusCommS {k=k} {y=y} -- S (plus y k) = plus y (S k)
in rewrite ih in px