[英]Disjunctive Syllogism tactic in Coq?
我正在學習命題邏輯和推理規則。 析取三段論規則指出,如果我們的前提中有(P 或 Q),並且也有(非 P); 然后我們可以到達Q。
我一生都無法弄清楚如何在 Coq 中做到這一點。 假設我有:
H : A \/ B
H0 : ~ A
______________________________________(1/1)
我應該使用什么策略來達到
H1 : B.
另外,如果有人能與我分享基本推理規則的 Coq 策略等價物,例如 modus tollens 或分離式介紹等,我會很高興。是否有我可以使用的插件?
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.
我希望這有幫助。 我不確定是否需要一些額外的解釋 - 隨意請求澄清,我會更新我的答案。
根據Anton Trunov的回答,Disjunctive Syllogism的更簡單版本如下:
(* Helper tactics. *) Ltac oe1 P_or_Q not_P := destruct P_or_Q ; [ contradiction | ].
Ltac oe2 P_or_Q not_Q := destruct P_or_Q ; [ | contradiction ].
(* Main tactic *) Ltac oE AorB H := oe1 AorB H || oe2 AorB H.
根據False disjunct是在右邊還是在左邊,幫助策略每個都在一個案例上工作,主要策略嘗試兩者並返回任何一個成功。
我想你可能對Coq如何運作有錯誤的期望? 證明這一點的一般方法基本上是關於不同可能性的真值表:
Lemma it: forall a b, (a \/ b) /\ ~a -> b.
Proof.
intuition.
Show Proof.
Qed.
(fun (a b : Prop) (H : (a \/ b) /\ ~ a) =>
and_ind
(fun (H0 : a \/ b) (H1 : ~ a) =>
or_ind (fun H2 : a => let H3 : False := H1 H2 in False_ind b H3)
(fun H2 : b => H2) H0) H)
如果查看生成的證明項,您會發現Coq實際上是將構造函數拆分為boolean。 我們可以手動執行此操作並獲得相同的證明條件:
Lemma it: forall a b, (a \/ b) /\ ~a -> b.
Proof.
intros a b H.
induction H.
induction H.
contradict H. exact H0.
exact H.
Qed.
雖然例如modus ponens對應於Coq中的一個apply
,但我不認為這是“內置”的任何直接方式。
之后,您可以使用此引理(並且我確定標准庫中的某個地方有相應的版本)通過apply
來推導您的其他假設。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.