[英]Modus Ponens and Modus Tollens in Coq
我想對這些簡單的推理規則采用Ltac策略。
在Modus Ponens中,如果我有H:P->Q
和H1:P
,則Ltac mp H H1
將Q
作為H2 : Q
添加到上下文中。
在Modus Tollens中,如果我有H:P->Q
和H1:~Q
,那么Ltac mt H H1
會將H2:~P
加到上下文中。
我已經為modus ponens寫了一個,但是在先例也是一個含義的復雜情況下它不起作用。
Ltac mp H0 H1 := let H := fresh "H" in apply H0 in H1 as H.
編輯:我在另一個看似無關的問題中找到了Modus Ponens的答案( 在Coq中重寫假設,保持暗示 ),其中一個“dumbed-down”版本的apply
是用generalize
。
Ltac mp H H0 := let H1 := fresh "H" in generalize (H H0); intros H1.
不過,我仍然會欣賞Modus Tollens的答案。
這是一個解決方案:
Ltac mt PtoQ notQ notP :=
match type of PtoQ with
| ?P -> _ => pose proof ((fun p => notQ (PtoQ p)) : ~ P) as notP
end.
這種策略要求用戶輸入兩個輸入假設和輸出假設的明確名稱。 我使用type of PtoQ
構造的類型從輸入含義中提取類型P
,然后提供一個明確的術語(fun p => notQ (PtoQ p)
,類型為P -> False
,在定義上等於~ P
。顯式類型歸屬: ~ P
用於使上下文看起來更漂亮,沒有它Coq會將輸出假設的類型顯示為P -> False
。
順便說一句,我會使用類似的東西來實現模式的ponens策略:
Ltac mp PtoQ P Q :=
pose proof (PtoQ P) as Q.
這里, PtoQ
和P
參數再次是輸入假設的名稱, Q
是要添加到上下文的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.