簡體   English   中英

Coq中的Modus Ponens和Modus Tollens

[英]Modus Ponens and Modus Tollens in Coq

我想對這些簡單的推理規則采用Ltac策略。

在Modus Ponens中,如果我有H:P->QH1:P ,則Ltac mp H H1Q作為H2 : Q添加到上下文中。

在Modus Tollens中,如果我有H:P->QH1:~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.

這里, PtoQP參數再次是輸入假設的名稱, Q是要添加到上下文的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM