coq - Coq中的析取三段论策略?
问题描述
我正在学习命题逻辑和推理规则。析取三段论规则指出,如果我们的前提中有(P 或 Q),并且还有(不是 P);然后我们可以到达Q。
我一生都无法弄清楚如何在 Coq 中做到这一点。假设我有:
H : A \/ B
H0 : ~ A
______________________________________(1/1)
我应该使用什么策略来达到
H1 : B.
另外,如果有人可以与我分享基本推理规则的 Coq 策略等价物,我会很高兴,比如 modus tollens 或 disjunctive Introduction 等。是否有我可以使用的插件?
解决方案
Coq 没有内置这种策略,但幸运的是您可以定义自己的策略。请注意
destruct H as [H1 | H1]; [contradiction |].
H1 : B
就像你问的那样,放在上下文中。所以你可以为这个组合策略创建一个别名:
Ltac disj_syllogism AorB notA B :=
destruct AorB as [? | B]; [contradiction |].
现在我们可以很容易地模仿析取三段论规则,如下所示:
Section Foo.
Context (A B : Prop) (H : A \/ B) (H0 : ~ A).
Goal True.
disj_syllogism H H0 H1.
End Foo.
让我展示一些自动化程度较低的方法:
Ltac disj_syllogism AorB notA B :=
let A := fresh "A" in
destruct AorB as [A | B]; [contradiction (notA A) |].
这种方法不要求 Coq 找到矛盾,它直接提供给contradiction
策略(notA A
术语)。或者我们可以在策略中使用一个明确的术语pose proof
:
Ltac disj_syllogism AorB notA B :=
pose proof (match AorB with
| or_introl a => False_ind _ (notA a)
| or_intror b => b
end) as B.
我希望这有帮助。我不确定是否需要一些额外的解释——请随时要求澄清,我会更新我的答案。
推荐阅读
- c - 使用 execle 和 putenv 后跟 execl 有什么区别?
- ios - 如何将阴影添加到 UIImageView 本身而不是其图层
- azure - 使用 jenkins 中的 openid connect 插件自动将 Jenkins 与 Azure AD 集成
- methods - Orientdb size() 从 IF() 内部返回不同的结果
- javascript - 使用按钮作为切换来更改文本并用另一个变量替换一个变量
- python - 尝试使用 ibpy 在正常交易时间 (rth) 之外发送订单
- r - 如何在windows上使用带有knitr的unicode字符串
- javascript - 如何访问 Kendo UI 的可过滤 itemTemplate 中的方法?
- database - Oracle Enterprise Manager Database Express 12c 日语登录页面
- c - scanf 格式字符串无法识别