证明后继者对等式的替代性质

2024-05-04

我试图理解归纳类型《精益中的定理证明》第 7 章 https://leanprover.github.io/theorem_proving_in_lean/#07_Inductive_Types.html.

我给自己设定了一个任务,证明自然数的后继具有优于相等的替换性质:

inductive natural : Type
| zero : natural
| succ : natural -> natural

lemma succ_over_equality (a b : natural) (H : a = b) :
  (natural.succ a) = (natural.succ b) := sorry

经过一些猜测和相当详尽的搜索后,我能够通过几种可能性来满足编译器的要求:

lemma succ_over_equality (a b : natural) (H : a = b) :
  (natural.succ a) = (natural.succ b) :=
    eq.rec_on H (eq.refl (natural.succ a))
    --eq.rec_on H rfl
    --eq.subst H rfl
    --eq.subst H (eq.refl (natural.succ a))
    --congr_arg (λ (n : natural), (natural.succ n)) H

我不明白我刚刚给出的任何证明实际上是如何起作用的。

  1. 的完整定义是什么eq(感应)类型?在 VSCode 中我可以看到类型签名eq as eq Π {α : Type} α → α → Prop,但我看不到单独的(归纳)构造函数(类似物zero and succ from natural)。我能在源代码中找到的最好的看起来不太对劲 https://github.com/leanprover/lean/blob/41bf46dbba2c1846ebcb9319f326170c41f17fd4/tests/lean/quot_abuse2.lean.
  2. Why is eq.subst很高兴接受证明(natural.succ a) = (natural.succ a)提供证明(natural.succ a) = (natural.succ b)?
  3. What is 高阶统一 https://stackoverflow.com/questions/41946310/how-to-prove-a-b-%E2%86%92-a-1-b-1-in-lean它如何应用于这个特定的例子?
  4. 我输入时出现的错误是什么意思#check (eq.rec_on H (eq.refl (natural.succ a))),即[Lean] invalid 'eq.rec_on' application, elaborator has special support for this kind of application (it is handled as an "eliminator"), but the expected type must be known eq.rec_on : Π {α : Sort u} {a : α} {C : α → Sort l} {a_1 : α}, a = a_1 → C a → C a_1

  1. eq is defined https://github.com/leanprover/lean/blob/f59c2f0ef59fdc1833b6ead6adca721123bd7932/library/init/core.lean#L145 to be

    inductive eq {α : Sort u} (a : α) : α → Prop
    | refl : eq a
    

    这个想法是,任何一项都等于其自身,而两项相等的唯一方法就是它们是同一项。这可能感觉有点像 ITT 的魔法。其美妙之处在于自动生成的递归器:

    eq.rec : Π {α : Sort u_2} {a : α} {C : α → Sort u_1}, C a → Π {a_1 : α}, a = a_1 → C a_1
    

    这就是平等的替代原则。 “如果 C 成立 a,且 a = a_1,则 C 成立 a_1。” (如果 C 是类型值而不是 Prop 值,则有类似的解释。)

  2. eq.subst正在证明a = b连同证明succ a = succ a。注意eq.subst基本上是重新表述eq.rec多于。假设该财产C,对变量 x 进行参数化,是succ a = succ x. C成立于a通过反身性,并且因为a = b,我们有那个C持有b.

  3. 当你写的时候eq.subst H rfl,精益需要弄清楚属性(或“动机”)是什么C应该是。这是高阶统一的一个例子:未知变量需要与 lambda 表达式统一。在第 6.10 节中对此进行了讨论https://leanprover.github.io/theorem_proving_in_lean/theorem_proving_in_lean.pdf https://leanprover.github.io/theorem_proving_in_lean/theorem_proving_in_lean.pdf,以及一些一般信息https://en.wikipedia.org/wiki/Unification_(computer_science)#Higher-order_unification https://en.wikipedia.org/wiki/Unification_(computer_science)#Higher-order_unification.

  4. 你要求 Lean 代替a = b into succ a = succ a,而不告诉它你想证明什么。你可能试图证明succ b = succ b, or succ b = succ a, 甚至succ a = succ a(通过无处替换)。精益无法推断动机C除非它有这个信息。

一般来说,“手动”进行替换(使用eq.rec, subst等)很困难,因为高阶统一非常挑剔且昂贵。您经常会发现使用以下策略会更好rw(改写):

lemma succ_over_equality (a b : natural) (H : a = b) :
  (natural.succ a) = (natural.succ b) := by rw H

如果你想变得聪明,你可以利用 Lean 的方程编译器,事实上,“唯一”的证明a=b is rfl:

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

证明后继者对等式的替代性质 的相关文章

  • 有限的数字如何运作? (依赖类型)

    我对依赖类型语言感兴趣 有限数对我来说似乎非常有用 例如 安全地索引固定大小的数组 但这个定义对我来说并不清楚 Idris 中有限数的数据类型可以如下 Agda 中可能类似 data FiniteNum Natural gt Type wh
  • 使用 GHC.TypeLits 和单例的长度索引列表的复制函数

    我正在尝试使用来自的机器为长度索引列表编写一个复制函数GHC TypeLits 单身人士 and 限制条件 The Vect类型和签名replicateVec如下 data Vect Nat gt Type gt Type where VN
  • 如何获得类型依赖于隐式参数的方法参数?

    trait JsonOps J type ObjectFields def partitionObjectFields fields ObjectFields fieldNames List String ObjectFields Obje
  • 如何在 Idris 中表达范围有效性?

    我正在尝试在 Idris 中构建一个简单的调查表单 目前正在努力验证用户输入 该输入以字符串形式出现 所提出问题的类型 目前我有以下几种类型 data Question Type where QCM numOptions Nat gt qu
  • 根据参数值返回不同类型的通用函数

    我有一个保存寄存器的结构 我想要我的read register函数返回一个u8 for Register V0 and Register V1 but a u16 for Register V2 and Register V3 我不确定如何
  • 代表自由团体的好方法是什么?

    很容易表示自由岩浆 二叉叶树 自由半群 非空列表 和自由幺半群 列表 并且不难证明它们实际上就是它们所声称的那样 但自由团体似乎要棘手得多 似乎至少有两种方法可以使用通常的方法List Either a 表示 将要求编码为类型 如果您有Le
  • 为什么我们需要容器?

    作为借口 标题模仿了标题为什么我们需要单子 https stackoverflow com questions 28139259 why do we need monads 有容器 http www sciencedirect com sc
  • 类型参数和索引之间的区别?

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

    我正在尝试 Z3 其中结合了算术 量词和等式的理论 这似乎不是很有效 事实上 在可能的情况下用所有实例化的基础实例替换量词似乎更有效 考虑以下示例 其中我对函数的唯一名称公理进行了编码f需要两个参数Obj并返回解释的排序S 该公理指出 每个
  • 显示 (head .unit ) = Agda 中的 head

    我试图证明 Agda 中的一个简单引理 我认为这是正确的 如果向量有两个以上元素 则取其head继采取init与取其相同head立即地 我将其表述如下 lem headInit l xs Vec suc suc l gt head init
  • 用约翰·梅杰的等式重写

    约翰 梅杰的等式带有以下重写引理 Check JMeq ind r JMeq ind r forall A Type x A P A gt Prop P x gt forall y A JMeq y x gt P y 很容易将其概括为 Le
  • 由 Scala 宏生成时,依赖类型似乎“不起作用”

    为这个挥手的标题道歉 我不完全确定如何简洁地表达这个问题 因为我以前从未遇到过这样的事情 背景资料 我有以下特征 其中类型U是为了举行无形可扩展记录 https github com milessabin shapeless wiki Fe
  • 什么是依赖类型?

    有人可以向我解释依赖类型吗 我对 Haskell Cayenne Epigram 或其他函数式语言缺乏经验 因此您可以使用的术语越简单 我就越感激 考虑一下 在所有像样的编程语言中 您都可以编写函数 例如 def f arg result
  • 应该如何理解“引理”函数的一般类型?

    也许这是一个愚蠢的问题 这是引用自the 哈索主义 paper https personal cis strath ac uk conor mcbride pub hasochism pdf 解决这个问题的一种方法是对引理进行编码 由下式给
  • Z3:执行矩阵运算

    我的情况 我正在开展一个项目 需要 证明正确性3D 矩阵变换 http rodrigo silveira com 3d programming transformation matrix tutorial UU65YicWsYZ涉及矩阵运算
  • 证明后继者对等式的替代性质

    我试图理解归纳类型 精益中的定理证明 第 7 章 https leanprover github io theorem proving in lean 07 Inductive Types html 我给自己设定了一个任务 证明自然数的后继
  • 是否可以将一位的位向量转换为 SMTLib2 中的布尔变量?

    我想要一个布尔变量来测试 例如 位向量的第三位是否为 0 位向量的理论允许提取 1 位作为位向量 但不是布尔类型 我想知道我是否可以出演这个角色 谢谢 更新 如果我的问题不清楚 我很抱歉 但 Nikolaj Bjorner 的答案是如何测试
  • 无法证明与路径相关类型的等价性

    为什么最后一个summon编译失败 我该怎么做才能让它编译 import java time LocalDateTime LocalTime trait Circular T type Parent given localTimeCircu
  • Haskell 单例:我们可以通过 SNat 获得什么

    我正在尝试使用 Haskell 单例 在论文中使用单例进行依赖类型编程 http cs brynmawr edu rae papers 2012 singletons paper pdf并在他的博客文章中单例 v0 9 发布 https t
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi

随机推荐

  • 查找返回的 mysql 结果中的行数(nodejs)

    当使用 felixge 的 mysql for node js 时 如何向结果对象询问返回的行数 我有一个相当昂贵的查询 所以我不想运行COUNT 首先 只是为了第二次运行查询 如果是选择查询 则只需获取返回数组的长度即可 connecti
  • 如何获取 Visual Studio 2017 的离线安装程序?

    我最近尝试安装视觉工作室 2017 但没有离线安装程序 如何获取它的离线安装程序 我也尝试安装Xamarin 尽管我有最新的安卓软件开发工具包 它要求我下载安卓软件开发工具包再次 如何纠正 提前致谢 要生成离线安装程序 您首先需要下载相应的
  • 如何在 NetBeans 中执行“git Blame”?

    NetBeans 内置了对 git 的支持 我可以做一个git blame在 NetBeans 内 如果是这样 怎么办 I googled https www google nl search q netbeans git blame它 但
  • 为什么 Resources.Load 返回 null?

    我的项目有多个精灵 位于 Assets Sprites 中 我想使用 C 脚本加载它们 我已经测试过这个 Sprite myFruit Resources Load
  • 使用服务器帐户模拟用户以访问其 Google 云端硬盘时出现 401 未经授权错误

    我正在用 Java 编写一个后端进程 它将模拟用户并在其 Google Drive 上添加 删除文档 服务器帐户似乎验证正确 但是当我尝试冒充用户时 我得到一个401 Unauthorized error 请参阅下面的详细信息 配置 我已配
  • Python:Tkinter Treeview 可搜索

    相当直接的问题 尽管我用了最好的谷歌搜索 但我找不到任何相关内容 我有一个 Python 应用程序 它使用 Tkinter Treeview 小部件作为表格 这对于我需要使用它的用途来说效果很好 但最终会在一些树中出现几百个项目 无论如何
  • 如何将 NHibernate 和 DTO 与 RIA 服务结合使用

    我将 NHibernate 与 RIA 服务和 Silverlight 4 一起使用 我创建 DTO 来通过 RIA 服务传输数据 而不是分发我的域层对象 根据 Martin Fowler 的分布式对象设计第一定律 不要分发您的对象 DTO
  • Azure 上的 Laravel 应用程序:用户“azure”@“localhost”的访问被拒绝

    我正在将 Laravel 应用程序部署到 Azure Web 应用程序 Mysql 到目前为止我执行了以下步骤 1 在应用程序中激活Mysql 2 连接到 BitBucket 存储库并确保代码已同步 3 创建 env文件并设置数据库变量如下
  • android:clickable="true" 意味着它不可点击?

    我有一个 ListView 其中包含一些自定义部分 每个部分都有自己的标题视图 我希望列表中的元素可单击 但显然不希望节标题可单击 所以在我添加的节标题的 xml 中android clickable false 调试时我注意到节标题仍然响
  • 如何仅使用 XAML 标记在单击另一个控件时打开 WPF 弹出窗口?

    我有两个控件 一个 TextBlock 和一个 PopUp 当用户在文本块上单击 MouseDown 时 我想显示弹出窗口 我认为我可以使用弹出窗口上的 EventTrigger 来完成此操作 但我不能在 EventTrigger 中使用设
  • 在主窗体上使用 BeginInvoke 调用的网络任务未执行

    我使用 Visual Studio 2013 构建了一个具有单个表单的 C 应用程序 并且该应用程序有两个更新屏幕的例程 更新屏幕的例程需要在主线程上运行 因此我自己的线程 不与屏幕交互 在需要更新时调用主窗体上的 BeginInvoke
  • Lua中如何在另一个表的表成员中搜索

    我正在编写一个 lua 程序 它有一个表 该表是另一个表的成员 当我向该成员表添加新日期时 一切正常 但是 当我想在该表中搜索时 无论我给出什么键 我总是会将最后一行添加到表中 如何在该成员表中正确搜索 Stream name functi
  • 防止 iOS 上的反射(objc/运行时)

    我正在开发一个处理敏感数据的静态库 使用该库的开发人员必须不能在该库上使用反射 在Android上 我们通过开发一个来解决这个问题aar文件与service并运行service进入单独的进程 当服务运行到另一个进程中时 开发人员不能使用反射
  • 当用户在单元格中输入触发器时执行子例程

    Excel 中的示例数据 A B C 1 9 5 2 4 y 3 3 1 9 4 66 4 5 5 9 我想做的是当我进入Y在 B 列中 我想要 一些东西 执行 我不认为If Active Cell Y将在这里工作 因为当我进入Y然后按 E
  • 如何对搜索引擎关键词进行聚类?

    从 Google Analytics 中 我有一个 长 关键字列表 人们在搜索引擎中使用这些关键字来查找我的网站 我想找到 核心关键词 假设的例子 java online training learning java scala train
  • 使用rvest或httr登录网页上的非标准表单

    我正在尝试使用 rvest 来抓取需要在表单上输入电子邮件 密码登录的网页 rm list ls library rvest Trying to sign into a form using email password url lt ht
  • 如何通过 Grunt 运行节点脚本?

    我希望通过我的 gruntfile 运行节点命令 我只需要运行 node index js 作为任何其他任务之前的第一个任务 我尝试四处寻找但没有找到答案 我相信这可能很简单 但我不确定如何做 我需要加载 nmp 任务吗 这就是我的 Gru
  • 如何在 Android 中从 JPEG 创建动画 GIF(开发)

    我正在寻找一种简单的方法create本机 Android 应用程序中的动画 GIF 源文件应为 JPEG 来自相机或其他文件 输出应在设备上保存为 GIF 我不想知道如何播放动画或动画 GIF 文件 需要明确的是 我想知道如何将单个图像逐帧
  • 写入结果电子表格时,AGGREGATE 公式不会自动计算

    我有一个使用 OPENPYXL v2 5 10 库开发的 python 3 7 脚本 用于从多个 Excel 工作簿中获取数据 处理该数据 然后写入单独的 Excel 工作簿 结果工作簿包含大约 100 个命名范围和大量公式 所有这些都按预
  • 证明后继者对等式的替代性质

    我试图理解归纳类型 精益中的定理证明 第 7 章 https leanprover github io theorem proving in lean 07 Inductive Types html 我给自己设定了一个任务 证明自然数的后继