簡體   English   中英

Coq中的條件證明策略

[英]Conditional Proof Tactic in Coq

我相信標題是很容易解釋的: https : //en.wikipedia.org/wiki/Conditional_proof

我想采取一種策略,假設一個命題,然后繼續尋找另一個命題,如果成功的話,我發現第一個命題隱含着第二個命題,並將其作為上下文中的假設。

因此,例如Ltac cp PQ創建一個子目標Q並將P置於上下文中。 如果我確實可以到達子目標Q,那么將釋放子目標並將P->Q添加到上下文中。 我該如何實現?

編輯:很明顯,在證明assert (P->Q). intro.同時assert (P->Q). intro. assert (P->Q). intro. 做這項工作,但我不能將它們組合成Ltac戰術,它給出了No focused proof (No proof-editing in progress).

要定義新策略,您需要將其與;

Ltac cp P Q := assert (P -> Q); [ intro | ].
  (* Use intro in the first subgoal of assert *) 

已經有這樣一種策略,它被稱為enough ,因為“足以顯示P”。 假設P ,您現在可以使用P完成證明。 完成后,您必須證明P

如果很容易完成,則可以使用by (與assert相同)。 我經常enough (bla bla) by (subst; auto).做得enough (bla bla) by (subst; auto). 或類似的東西,這使我bla bla目標。

您可能還會發現此策略很有用,即,如果您不想在enough語句中鍵入整個復雜的前提:

Ltac postpone_antecedent H :=
  match type of H with  ?A -> _ =>
    let Q := fresh in enough A as Q ; [specialize (H Q) | ]
  end.

暫無
暫無

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

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