在 Idris 中证明如果 n = m 且 m = o,则 n + m = m + o?

2024-01-08

我正在尝试通过查看一些练习来提高我的伊德里斯技能软件基础 https://softwarefoundations.cis.upenn.edu/lf-current/toc.html(最初是为 Coq 设计的,但我希望对 Idris 的翻译不会太糟糕)。我遇到了问题“练习:1 星 (plus_id_exercise)” https://softwarefoundations.cis.upenn.edu/lf-current/Basics.html#lab31内容如下:

删除“已承认”。并填写证明。

Theorem plus_id_exercise : ∀ n m o : nat,
  n = m → m = o → n + m = m + o.
Proof.
  (* FILL IN HERE *) Admitted.

我在 Idris 中翻译了以下问题:

plusIdExercise : (n : Nat) ->
                 (m : Nat) ->
                 (o : Nat) ->
                 (n == m) = True ->
                 (m == o) = True ->
                 (n + m == m + o) = True

我正在尝试进行个案分析,但遇到了很多问题。第一种情况:

plusIdExercise Z Z Z n_eq_m n_eq_o = Refl

似乎可行,但我想说的是:

plusIdExercise (S n) Z Z n_eq_m n_eq_o = absurd

但这不起作用并给出:

When checking right hand side of plusIdExercise with expected type
        S n + 0 == 0 + 0 = True

Type mismatch between
        t -> a (Type of absurd)
and
        False = True (Expected type)

Specifically:
        Type mismatch between
                \uv => t -> uv
        and
                (=) FalseUnification failure

我想说这种情况永远不会发生,因为 n == m,但 Z (= m) 永远不会是任何数字 (n) 的后继。我能做些什么来解决这个问题吗?我的做法正确吗?我有些困惑。


我认为翻译并不完全正确。 Coq 中陈述的引理在自然数上不使用布尔相等,它使用所谓的命题相等。在 Coq 中,您可以要求系统为您提供有关事物的更多信息:

Coq < About "=".
eq : forall A : Type, A -> A -> Prop

以上的意思是=(它是语法糖eqtype) 接受某种类型的两个参数A并产生一个主张,不是布尔值。

这意味着直接翻译将是以下片段

plusIdExercise : (n = m) -> (m = o) -> (n + m = m + o)
plusIdExercise Refl Refl = Refl

当你对等式类型的值进行模式匹配时,Idris 本质上会根据相应的方程重写项(它大致相当于 Coq 的rewrite战术)。

顺便说一下,你可能会发现伊德里斯的软件基础 https://github.com/idris-hackers/software-foundations项目有用。

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

在 Idris 中证明如果 n = m 且 m = o,则 n + m = m + o? 的相关文章

  • 上下文无关语言问题(泵引理)

    我知道这与编程没有直接关系 但我想知道是否有人知道如何将泵引理应用于以下证明 显示L a n b n c m n m 不是上下文无关的语言 我对应用泵送引理非常有信心 但这一点真的让我很恼火 你怎么认为 编辑 我完全把你引入了错误的轨道 当
  • Isabelle/HOL 验证器核心

    Question Isabelle HOL验证器的核心算法是什么 我正在寻找方案元循环评估器级别的东西 澄清 我只对Verifier 而不是自动定理证明的策略 Context 我想从头开始实现一个简单的证明验证器 纯粹出于教育原因 而不是用
  • 在 Coq 中实现向量加法

    在某些依赖类型语言 例如 Idris 中实现向量加法相当简单 根据维基百科上的例子 import Data Vect default total pairAdd Num a gt Vect n a gt Vect n a gt Vect n
  • Haskell 版本的 Idris !-表示法(爆炸表示法)

    我最近有幸学习了一些 Idris 我发现非常方便的一件事是 符号 https idris2 readthedocs io en latest tutorial interfaces html highlight do 20notation
  • 类型参数和索引之间的区别?

    我是依赖类型的新手 对两者之间的区别感到困惑 似乎人们通常说类型是由另一种类型参数化 and 按某个值索引 但是 在依赖类型语言中 类型和术语之间不是没有区别吗 参数和指数之间的区别是根本性的吗 您能否举例说明它们在编程和定理证明中的含义差
  • 证明二叉树中重复调用 successor() 的效率?

    我需要 CLRS 算法书中关于此练习的提示 证明无论我们从高度为 h 的二叉搜索树中的哪个节点开始 k对 Tree Successor 的连续调用O k h time Let x是起始节点并且z是之后的结束节点k连续调用 TREE SUCC
  • 证明多线程算法的正确性

    多线程算法尤其难以设计 调试 证明 Dekker 算法是一个很好的例子 说明设计正确的同步算法有多么困难 Tanenbaum 的现代操作系统的 IPC 部分充满了示例 有人对此有很好的参考 书籍 文章 吗 谢谢 如果没有保证 就不可能证明任
  • 仅数学证明助理

    大多数证明助手都是具有依赖类型的函数式编程语言 他们可以证明程序 算法 相反 我感兴趣的是最适合数学且仅适合数学 例如微积分 的证明助手 你能推荐一个吗 我听说过 Mizar 但我不喜欢源代码被关闭 但如果它最适合数学 我会使用它 Agda
  • 异质平等的一致性

    我正在尝试使用异构相等来证明涉及此索引数据类型的语句 data Counter Set where cut i j Counter suc i j 我能够使用以下方式编写我的证明Relation Binary HeterogenousEqu
  • 在 Idris 中证明如果 n = m 且 m = o,则 n + m = m + o?

    我正在尝试通过查看一些练习来提高我的伊德里斯技能软件基础 https softwarefoundations cis upenn edu lf current toc html 最初是为 Coq 设计的 但我希望对 Idris 的翻译不会太
  • 如何实现参数化元组的“Show”接口?

    I have Coord将 n 维大小转换为给定大小限制的坐标类型的函数 Coord 2 3 Fin 2 Fin 3 import Data Fin import Data List Size Type Size List Nat Coor
  • 如何查找 Coq 证明策略的定义或实现?

    我正在看this https github com coq coq blob cdfe69d6da6b32338ba74c9f599c74389089c9dd theories Numbers Natural Abstract NAdd v
  • 理解 `k : Nat ** 5 * k = n` 签名

    以下函数编译 onlyModByFive n Nat gt k Nat 5 k n gt Nat onlyModByFive n k 100 但有什么作用k以其代表Nat 5 k n syntax 另外 我该如何称呼它 这是我尝试过的 但我
  • 证明具有 n 个叶子的二叉树的高度至少为 log n

    我已经能够创建一个证明 显示树中的最大总节点数等于 n 2 h 1 1 并且从逻辑上我知道二叉树的高度是 log n 可以绘制它出来看看 但我很难构建一个正式的证明来证明一棵有 n 片叶子的树 至少 有 log n 我遇到或能够组合在一起的
  • 在Refl中使用重写

    我正在使用 Idris 学习第 8 章类型驱动开发 我有一个关于 rewrite 如何与 Refl 交互的问题 此代码作为重写如何在表达式上工作的示例显示 myReverse Vect n elem gt Vect n elem myRev
  • 使用异质等式 =

    到目前为止我所拥有的是 module Foo postulate P P postulate NP NP complexityProof P NP complexityProof complexityProof rhs 但在尝试加载文件时
  • 查找元素彼此相距最远的子集

    我有一个面试问题 我似乎无法弄清楚 给定一个大小为 N 的数组 找到大小为 k 的子集 使得子集中的元素彼此相距最远 换句话说 最大化元素之间的最小成对距离 Example Array 1 2 6 10 k 3 answer 1 6 10
  • 如何在构造微积分中提取Sigma的第二个元素?

    我尝试这样做 A gt B A gt gt t r gt x a gt B x gt r gt r gt t B t A x A gt y B x gt x x A gt y B x gt y 请注意 由于该函数返回的值取决于 sigma
  • 为什么在这种情况下重写不改变表达式的类型?

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

    我试图证明关于以下函数的命题 Program Fixpoint division m nat n nat measure m nat match lt nat 0 n with false gt 0 true gt match leq na

随机推荐