为什么在这种情况下重写不改变表达式的类型?

2024-03-18

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

rewrite prf in expr

如果我们有prf : x = y,并且 expr 所需的类型是以下属性x, the rewrite ... in语法将搜索x在所需的类型中expr并将其替换为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). And prf等于plus y k = plus k y where x is plus y k and y is plus k y。重写应该搜索x(即对于plus y k) in expr(即S (plus y k) = plus y (S k)并且应该替换x with y(即与plus k y)。和结果(res) 应该S (plus k y) = plus y (S k).

但这是行不通的。

我有伊德里斯的下一个回答

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

我猜重写只是为了改变结果表达式的类型。所以,它在体内不起作用let表达,但仅限于它的“in”部分。它是否正确?

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

附言。教程中的示例效果很好。我只是想知道为什么我尝试使用重写的方法不起作用。


尽管文档中没有明确说明,rewrite是语法糖调用Elab战术脚本(定义在此处 https://github.com/idris-lang/Idris-dev/blob/f92ecd25d48a9120abfbb7d6af81f9b194ab98f1/src/Idris/Elab/Rewrite.hs).

为什么你的例子不起作用:“所需的类型expr“ 未找到;仅res = rewrite prfXeqY in expr单独来看,不清楚是哪种类型res应该有(甚至统一者could解决这个问题let res = … in res.) 如果您指定所需的类型,它将按预期工作:

res = the (S (plus k y) = plus y (S k)) (rewrite prfXeqY in expr)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在这种情况下重写不改变表达式的类型? 的相关文章

随机推荐

  • 每个构建类型的 resConfigs

    我怎样才能覆盖resConfigs每个构建类型 我读到口味允许这样做 但我不使用它们 我只想为我的调试构建另一组受支持的语言 这是我尝试过的 buildTypes debug resConfigs de en allow also germ
  • 附加数据框中所有行中的单词或字符列表

    有没有一种方法可以在不使用 for 循环的情况下附加数据框中不同行中存在的列表 我可以通过使用 for 循环来实现这一点 但我想以更有效的方式实现这一点 可能不使用 for 循环 d col1 1 2 3 4 5 col2 a a b c
  • 如何转义url中的#符号?

    我有 符号作为参数传递到我的 URL 中 但它会丢弃 后面的所有参数值 请建议我解决方案 以下是我的网址 GetConnectiont customerID customer1 activenode Sv50 parent server f
  • 在 Python Pandas Dataframe 中动态添加列的数据处理

    我有以下问题 假设这是我的 CSV id f1 f2 f3 1 4 5 5 1 3 1 0 1 7 4 4 1 4 3 1 1 1 4 6 2 2 6 0 所以 我有可以按 id 分组的行 我想创建一个如下所示的 csv 作为输出 f1 f
  • 修改ggplot2 Y轴以使用整数而不强制执行上限[重复]

    这个问题在这里已经有答案了 我正在尝试修改 ggplot2 中的轴 以便它是一个小数点 并且每个整数都有一个标签 但是 我想这样做没有上限 以便它会自动调整不同计数的数据 我的问题和问题之间的区别这里提出的问题 https stackove
  • 在 Linux 中的类路径上使用 javac 和多个特定的 jar(波浪号在冒号后不扩展)

    我正在尝试通过类似于以下的命令编译一个使用两个 jar 文件 trove 和 apache commons 集合 的 java 源文件 javac cp m2 repository gnu trove trove 3 0 0 trove 3
  • 如何获取ASCII后面的二进制代码(C#)

    我试图找出如何将控制台的输入转换为二进制 如何在 C 中进行这样的转换 先感谢您 string s Console ReadLine byte bytes Encoding ASCII GetBytes s 请注意 控制台使用的编码实际上不
  • pgsql 返回表错误:列引用不明确

    我不断收到此错误 列引用 人 不明确 我需要返回一个表 个人整数 当我使用 SETOF 整数时它工作正常 但在这种情况下它不起作用 我的另一个函数 recurse 完美地返回一组整数 CREATE OR REPLACE FUNCTION t
  • 来自基类的用户定义转换运算符

    介绍 我知道 不允许用户定义的与基类之间的转换 MSDN 给出了对此规则的解释 你不需要这个运算符 我确实了解用户定义的转换to不需要基类 因为这显然是隐式完成的 但是 我确实需要转换from一个基类 在我当前的设计 非托管代码的包装器 中
  • Matplotlib 轴位置和颜色条对齐

    我正在尝试将多个颜色条与使用其中之一生成的子图对齐gridspec or fig add subplots 我想添加颜色条fig add axes在 matplotlib v2 02 中 因为它允许详细的对齐控制 但是 我需要获取图形位置才
  • 熊猫从日期时间列中获取第二个最小值[重复]

    这个问题在这里已经有答案了 我有一个带有日期时间列的数据框 我可以通过使用获得最小值 df Date min 我怎样才能得到第二个 第三个 最小值 Use nlargest or nsmallest 对于第二大的 series nlarge
  • Symfony2 和控制器中的 DRY 方法

    我正在使用 Symfony2 为我的公司开发一个小型 CMS 我真的很喜欢这个框架 我喜欢表单类并重用它们 毕竟这都是关于表单的 但是 是的 有一个 但是 我感觉我在做同样的事情 复制并粘贴到所有控制器中 我们讨厌的代码重复 随着所有业务逻
  • MbUnit:比较双打的最优雅的方式?

    The code Assert AreEqual 9 97320998018748d observerPosition CenterLongitude produces Expected Value Actual Value 9 97320
  • 安全地向 RESTFUL API 提供凭据

    我创建了一个 RESTful 服务器应用程序 它可以在有用的 URL 例如 www site com get someinfo 上处理请求并提供服务 它是在春天建造的 但是 这些访问受密码保护 我现在正在构建一个客户端应用程序 它将连接到这
  • Angular 6 生产版本“无法绑定到‘disabled’,因为它不是‘div’的已知属性”

    我的应用程序在使用 JIT 编译器时似乎可以工作 但是当我尝试使用 AOT 编译器时ng build prod然后它抛出一个错误 ERROR in Can t bind to disabled since it isn t a known
  • 很难理解express.js中的“next/next()”

    这是一个例子 Configuration app configure function app set views dirname views app set view engine jade app use express bodyPar
  • 在asp.net mvc中通过slug进行路由

    我有一个控制器操作 如下所示 public ActionResult Content string slug var content contentRepository GetBySlug slug return View content
  • navigator.webkitPersistentStorage.requestQuota 是否适用于 IndexedDB?

    使用今天最新版本的 Android Chrome 我可以使用以下命令请求持久性 IndexedDB 存储吗 navigator webkitPersistentStorage requestQuota var requestedBytes
  • 使用 Liquid 按字母顺序对帖子进行排序

    有没有办法使用 Jekyll 按字母顺序对多个帖子进行排序 我现在有这样的事情 for post in site categories threat li a href post title a li endfor 它有效 但帖子很混乱 我
  • 为什么在这种情况下重写不改变表达式的类型?

    在 1 中可以阅读下一篇 rewrite prf in expr 如果我们有prf x y 并且 expr 所需的类型是以下属性x the rewrite in语法将搜索x在所需的类型中expr并将其替换为y 现在 我有下一段代码 您可以将