在这种情况下,为什么重写不会改变表达式?

时间:2018-06-09 22:36:19

标签: idris

在(* 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 yxplus y kyplus 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的例子很好。我只是想知道为什么我尝试使用重写的方式不起作用。

2 个答案:

答案 0 :(得分:2)

虽然未在文档中明确说明,rewriteElab战术脚本(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