sml - 使用 SML 和 HOL 推理规则从第一原理证明定理
问题描述
我正在尝试[] |- p /\ q <=> q /\ p :thm
使用带有 HOL 推理规则的 SML 来证明该定理。这是 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
和q
作为假设,通过thm2
和引入thm3
,而你可以并且应该从 中获得它们thm1
。
您需要的第一个定理类似于p /\ q ==> p
. 我通过浏览描述找到了适当的规则(第 2.3.24 节)。它被称为CONJUNCT1
。
使用它,我们可以得到p
一个定理thm1
:
val thmp = CONJUNCT1 thm1;
相同的想法可以q
作为定理从thm1
:
val thmq = CONJUNCT2 thm1;
然后您可以将您的想法应用于thm5
:
val thm5 = CONJ thmq thmp;
这里重要的是我们不使用p
派生自p
(thm2
)和q
派生自q
(thm3
),而是p
派生自p /\ q
和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;
推荐阅读
- c++ - 用于存储不同类型对象的 C++ 分配器
- c - 如何在不使用循环的情况下多次打印?
- meteor - 如何在 Meteor 中集成 React Router?
- r - 分组时指定变量名
- flutter - Flutter 1.22 以变量为键的国际化
- tensorflow - 是否可以将不同的权重子集发送给不同的客户?
- google-apps-script - 如何重置谷歌表格计数器?
- node.js - 没有catch块nodeJS的promise错误
- python - 如何使用 postgres\sqlalchemy 以最快的方式一次提交多条记录?
- javascript - Chart.js 过滤表时出现故障