【问题标题】:Why does rewrite not change the type of the expression in this case?在这种情况下,为什么 rewrite 不会改变表达式的类型?
【发布时间】:2018-06-09 22:36:18
【问题描述】:

在 (*1) 中可以阅读下一个

rewrite prf in expr

如果我们有prf : x = y,并且expr 所需的类型是x 的某个属性,rewrite ... in 语法将在所需的expr 类型中搜索x 并将其替换为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,其中xplus y kyplus k y。并且重写应该在expr(即S (plus y k) = plus y (S k))中搜索x(即plus y k)并将x替换为y(即plus k y)。结果(res)应该是S (plus k y) = plus y (S k)

但这不起作用。

我有来自 idris 的下一个答案

将 plus y k 重写为 plus k y 并没有改变 letty 类型

我猜 rewrite 只是为了改变结果表达式的类型。因此,它在 let 表达式的主体中不起作用,而仅在它的“in”部分中起作用。这是正确的吗?

(*1)http://docs.idris-lang.org/en/latest/proofs/patterns.html

PS。教程中的示例工作正常。我只是想知道为什么我尝试使用 rewrite 的方式不起作用。

【问题讨论】:

    标签: idris


    【解决方案1】:

    尽管文档中没有明确说明,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)
    

    【讨论】:

    • 非常感谢您的解释和链接。
    【解决方案2】:

    不幸的是,您没有提供使您的代码行为不端的确切行,不知何故,您一定做了一些奇怪的事情,因为根据您上面概述的推理,代码运行良好:

      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
    

    【讨论】:

    • 马库斯,谢谢你的回答。我已经编辑了帖子。请查看完整代码。
    • 还有一件事。它在in 子句中工作。如果我写res = rewrite prfXeqY in expr,它不起作用。
    • 我可以想象 rewrite 在 let 子句中的行为不像预期的那样,因为它是 replace 周围的某种魔法并且可能会感到困惑,但我没有这个说法的来源。
    • 是的,我同意。我认为这是因为 rewrite 是所谓的“语法糖”,它的行为不像通常的功能(正如我所期望的那样)。如果您要回答几句解释(因此,人们会看到可以理解的答案),我会接受它,因为现在我认为这个问题没有更多内容了。感谢您帮助我理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2014-03-24
    相关资源
    最近更新 更多