使用 SML 和 HOL 推理规则从第一原理证明定理

2024-04-10

我正在尝试证明这个定理[] |- p /\ q <=> q /\ p :thm将 SML 与 HOL 推理规则结合使用。这是 SML 代码:

val thm1 = ASSUME ``p:bool /\ q:bool``;
val thm2 = ASSUME ``p:bool``;
val thm3 = ASSUME ``q:bool``;
val thm4 = CONJ thm2 thm3;
val thm5 = CONJ thm3 thm2;
val thm6 = DISCH ``(q:bool/\p:bool)`` thm4;
val thm7 = DISCH ``(p:bool/\q:bool)`` thm5;
val thm8 = IMP_ANTISYM_RULE thm6 thm7;

上述代码的结果是:

val thm8 =  [(p :bool), (q :bool)] |- (q :bool) /\ (p :bool) <=> p /\ q: thm

我究竟做错了什么?


你的最终定理的问题是你仍然有p and q作为假设,通过引入thm2 and thm3,而你可以而且应该从thm1.

你需要的第一个定理是这样的p /\ q ==> p。我通过浏览找到了合适的规则描述 http://sourceforge.net/projects/hol/files/hol/kananaskis-11/kananaskis-11-description.pdf/download(第 2.3.24 节)。它被称为CONJUNCT1.

使用它,我们可以得到p作为定理thm1:

val thmp = CONJUNCT1 thm1;

同样的想法可以得到q作为定理thm1:

val thmq = CONJUNCT2 thm1;

然后你可以将你的想法应用到thm5:

val thm5 = CONJ thmq thmp;

The 重要的事情这是我们不使用的p源自p (thm2) and q源自q (thm3) 反而p源自p /\ q and q源自p /\ q(环境show_assumes := true;可能有助于更清楚地看到这一点)。

最后,我们将您的想法应用到thm7:

val thm7 = DISCH ``p /\ q`` thm5;

获得所需结果的前半部分,但没有任何无关的假设。

后半部分以类似的方式获得:

val thm9 = ASSUME (``q /\ p``);
val thmp2 = CONJUNCT2 thm9;
val thmq2 = CONJUNCT1 thm9;
val thm6 =  DISCH ``q /\ p`` (CONJ thmp2 thmq2);

然后你的想法thm8完美运行:

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

使用 SML 和 HOL 推理规则从第一原理证明定理 的相关文章

  • 当证明已经完成但给出“无法完善任何待定目标”错误时,为什么我不能在 Isabelle 中明确说明我的情况?

    我正在阅读具体语义的第五章 我在处理这个玩具示例证明时遇到了一些错误 lemma shows ev Suc 0 我知道这超出了需要 因为by cases 神奇地解 决了所有问题并给出了完整的证明 但我想明确说明这些情况 我试过这个 lemm
  • 当我们定义柯里化风格的函数时,我们可以声明参数的类型吗?

    如果我定义一个带有元组样式参数的函数 我可以定义参数类型和返回类型 fun hello name String code int String hello 但如果我使用咖喱风格 我只能这样做 fun hello name code hell
  • 我可以注释“fun”声明的完整类型吗?

    在学习环境中 我可以选择哪些选项来为函数提供类型签名 标准 ML 没有像 Haskell 那样的顶级类型签名 以下是我考虑过的替代方案 模块签名 需要单独的签名文件 或者在与模块本身相同的文件内的单独块中定义的类型签名 这需要使用模块 在任
  • 如何阅读 Coq 对 proj1_sig 的定义?

    In Coq sig定义为 Inductive sig A Type P A gt Prop Type exist forall x A P x gt sig P 我读为 sig P 是一种类型 其中 P 是一个接受 A 并返回 Prop
  • SML:为什么函数总是采用一个参数使语言变得灵活

    我 从一本 SML 书中 了解到 SML 中的函数总是只接受一个参数 一个元组 接受多个参数的函数只是一个接受一个元组作为参数的函数 通过函数绑定中的元组绑定来实现 我明白这一点 但在这之后 书上说了一些我不明白的话 this point
  • ML 中 ref 函数的用法

    考虑到 ref 运算符 我很难理解它的应用以及以下指令的含义 1 在这个定义中我定义什么 val ref x ref 9 val x 9 int 2 我在这里用 ref x ref 12 做什么 val x ref 8 val x ref
  • 输出在 REPL 中被 # 符号截断

    我编写了一个按预期工作的函数 但我不明白为什么输出是这样的 功能 datatype prop Atom of string Not of prop And of prop prop Or of prop prop XOR A And Not
  • 使用 prolog 显示布尔逻辑失败的原因

    假设我有以下布尔逻辑 Z A or B and A or C 是否可以使用序言 可能与某些库一起 来找出 Z 为假的原因并以以下格式返回答案 Z 为假 因为 A 或 b 和 c 为假 如果我替代some已知值 或全部 例如 c true 它
  • 如何在标准 ML 中检查整数的以 2 为底的表示形式? [复制]

    这个问题在这里已经有答案了 我正在尝试在 SML 中实现重复平方算法 我希望它是尾递归的 目标是将所有 x k 相乘 其中 k 是 2 m 2 m 是 n 的二进制表示形式中的 1 例如 对于 x 25 计算 x 1 x 8 x 16 因为
  • 权重偏左堆:自上而下版本合并的优点?

    我正在自学 它要求推理并实现一个偏向权重的左堆 这是我的基本实现 3 4 b functor WeightBiasedLeftistHeap Element Ordered Heap struct structure Elem Elemen
  • Objective C 中的惰性数据类型

    在 SML 中 可以采用以下方式对惰性编程进行建模 Have a datatype to wrap a computation datatype a susp Susp of unit gt a A function to hold the
  • 标准机器学习中的部分总和?

    我是函数式编程的新手 我有一项任务来计算列表的部分和 例如 psum 1 1 1 1 1 val it 1 2 3 4 5 整数列表 这是到目前为止我的代码 然而 在函数 psum2 L 中 我不知道如何遍历每个值并将它们相加 所以我只是打
  • 标准机器学习语法

    我是标准机器学习的新手 并尝试编写以下代码 fun whilestat test stmt1 fn x gt if test x then stmt1 x whilestat test stmt1 else x 问题是它给了我以下错误 w
  • 基于 SML 的文件查找

    有没有办法使用 SML Basis 库在特定位置打开文件 也就是说 使用操作系统调用来更改位置 而不是扫描文件并丢弃数据 这很棘手 不幸的是 不直接支持搜索 此外 文件位置仅对于二进制文件是透明的 即您使用BinIO结构 1 对于该结构体
  • StandardML 中的 y 组合器

    我知道我可以用 SML 编写 y 组合器 如下所示 首先声明一个新的数据类型来绕过由于循环而导致的类型不匹配 datatype a mu Roll of a mu gt a val unroll fn Roll x gt x 现在您可以轻松
  • 将其参数应用于自身的函数?

    考虑以下 SML 函数 fn x gt x x 这会产生以下错误 新泽西州标准 ML v110 72 stdIn 1 9 1 12 Error operator is not a function circularity operator
  • 将命令行参数传递给 SML 脚本

    如何将命令行参数传递给 SML 脚本 我知道有一个CommandLine arguments 正确类型的函数 unit gt string list 但像这样调用解释器 sml script name sml an argument ano
  • 要统一的类型变量出现在类型中

    我有一个函数可以从两个列表重建一棵树 我返回所有分支的列表 但收到一个我不明白的错误 但我认为这与返回类型有关 错误是这样的 Can t unify a with a list Type variable to be unified occ
  • 证明后继者对等式的替代性质

    我试图理解归纳类型 精益中的定理证明 第 7 章 https leanprover github io theorem proving in lean 07 Inductive Types html 我给自己设定了一个任务 证明自然数的后继
  • 通过 Emacs 评估 ghci 或 Hugs 中的缓冲区

    在 Emacs 中使用 sml mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C c C b 现在我只想用 Haskell 做同样的事情 Haskell 模式似乎不支持这一点 所以我想知道 使用 Emacs 和

随机推荐

  • ADO.Net (Azure AD) 错误“不支持关键字:身份验证”

    我正在尝试通过 C 代码使用 Azure AD 凭据连接到 Azure 数据库 代码如下 它在我的系统上运行良好 但是当我将它部署到32位VM时 它显示错误 不支持关键字 身份验证 VM 安装了 Net Framework 4 5 但未安装
  • 仅 Detox 测试启动画面

    我正在我的 React Native 项目上运行 detox 并且只能测试启动屏幕 启动屏幕进入登录屏幕 但排毒代码不允许我测试此元素 测试代码 describe Splash gt beforeEach async gt await de
  • java - 如何检查我的对象是否属于给定类的类型?

    我的方法获取 Class 作为参数 我必须检查我的变量是否属于 class 类型 Volvo v1 new Volvo Class aClass v1 getClass check aClass 在里面我需要做类似的事情 v2 instan
  • 输出到另一个窗口

    有没有办法直接在 VB NET 中打开窗体并在第二个监视器中最大化 也就是说 如果显示两个监视器 默认情况下第二个窗口中的表单加载会最大化吗 假设一个程序是用两种形式编写的 并且一台计算机连接了两个显示器 我希望 FormA 默认显示在 M
  • PyCharm:无法使用 docker-compose 创建远程 python 解释器

    尝试在 PyCharm 中创建 docker compose python 解释器时出现错误 解析 Users belek Projects project docker compose yml 时出错 进程docker compose c
  • 按一列中的因素拆分/子集数据框[重复]

    这个问题在这里已经有答案了 我的数据是这样的 例如 ID Rate State 1 24 AL 2 35 MN 3 46 FL 4 34 AL 5 78 MN 6 99 FL Data structure list ID 1 6 Rate
  • 致命错误:AST 文件格式错误或损坏 - Xcode

    在最新版本的 Xcode 中构建我的应用程序时出现此错误 致命错误 AST 文件格式错误或损坏 无法加载模块 Users me Library Developer Xcode DerivedData ModuleCache XYZYIE6Z
  • CMake FindThreads.cmake 找不到我的 pthreads.h 标头

    我在用着android cmake http code google com p android cmake 编译 Android 应用程序 这实质上创建了一个 CMake 工具链文件 用于使用 Android NDK 提供的工具链 As
  • Markdown 中的 RTL

    是否有任何现有的 Markdown 插件规范包含对 RTL 语言的支持 我希望是这样的 This paragraph is left to right lt This paragraph is right to left 或者其他什么 我可
  • Jquery Sortable,通过拖出删除当前Item

    我的问题 sortable 事件 out 当我在列表中拖动某些内容或对列表进行排序时触发 但我只想在拖出项目时启动该功能 My code document ready function ust div1 sortable out funct
  • 正则表达式最多匹配 4 个空格

    我有一个正则表达式来匹配一个人的名字 到目前为止 我有 a zA Z s 但我想添加一个检查以允许最多 4 个空格 我该如何修改它才能做到这一点 Edit 我的意思是字符串中任意位置有 4 个空格 不要尝试使用正则表达式验证名称 人们可以随
  • 如何使用 Bincode 在 Rust 中序列化 Enum,同时保留 Enum 判别式而不是索引?

    我一直在使用 bincode 在 Rust 中序列化枚举 但我面临一个问题 我收到枚举变体的索引而不是其指定的判别式 这是我尝试序列化的枚举的示例 derive Debug PartialEq Eq Serialize Deserializ
  • 在错误位置寻找模块的代码

    我使用 build dojotoolkit org 我的第一次尝试 创建了一个包含 3 层的多层构建 dojo js dojox js dijit js 每个 js 文件都上传到自己的文件夹中 dojo dojox dijit 当我运行代码
  • pip - 即使安装成功后也没有名为“pip”的模块

    我正在尝试在 Windows 10 系统上安装 pip 我得到了 get pip py 文件并运行了命令 python get pip py 这是终端的快照 python get pip py Collecting pip Using ca
  • 限制视图中的字符/单词 - Ruby on Rails

    我正在使用 Ruby on Rails 构建的一个非常简单的博客应用程序的主页上显示最近的评论 我想限制评论表的 正文 列中显示的字符数 我假设我可以在 的代码末尾添加一些内容 但我还不知道那会是什么 因为我对 Ruby 和 Rails 都
  • HttpClient 中的角度变化检测

    我有一个HttpClient正在更新后端数据的服务 在后端处理期间 我通过执行以下操作来显示加载状态this isLoading true 成功处理后 我将删除该加载状态subscribe 通过使用this isLoading false
  • 为什么 ng-click 不起作用?

    为什么这个简单的 ng click 示例不起作用 我已经在生产中使用 Angular 几个月了 但是这个笨蛋让我感到困惑 http plnkr co edit 9Rp5JD p preview http plnkr co edit 9Rp5
  • 我不能通过 C# 中的句柄设置窗口的透明度吗?

    我正在尝试设置所有窗口的透明度 我有以下代码 public partial class Form1 Form DllImport user32 dll static extern int SetWindowLong IntPtr hWnd
  • 如何解决 TypeError: __init__() 缺少 1 个必需的位置参数:'update_queue'?

    我想创建一个 Telegram 机器人来检查网站上是否有新帖子 目前出于测试目的每 15 秒检查一次 如果是这样 它应该将包含帖子内容的消息发送到 Telegram 频道 为此 我已经有了以下 代码骨架 格式和添加方面的精细工作稍后再说 i
  • 使用 SML 和 HOL 推理规则从第一原理证明定理

    我正在尝试证明这个定理 p q lt gt q p thm将 SML 与 HOL 推理规则结合使用 这是 SML 代码 val thm1 ASSUME p bool q bool val thm2 ASSUME p bool val thm