[英]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.