[英]How do I convince coq that (A/\B)/\C == A /\ B /\ C?
在我的證明中,我偶然發現了我的假設中存在A /\\ B /\\ C
問題,我需要證明(A /\\ B) /\\ C
這些在邏輯上完全相同,但是coq不能用assumption.
解決這些問題assumption.
。
我一直在通過應用公理來解決這些問題,但是有更優雅(和正確)的方法來處理這個問題嗎?
所以我的方式是通過定義我的引理,
Lemma conj_assoc : forall A B C, A /\ (B /\ C) <-> (A /\ B) /\ C.
這是另一個意味着另一個。
intros. split.
然后將這分為兩個目標。
A /\\ (B /\\ C) -> (A /\\ B) /\\ C
(A /\\ B) /\\ C -> A /\\ (B /\\ C)
證明這些中的每一個大致相同。 對於(1),
intro Habc.
從左手大小得到假設。 destruct Habc as [Ha Hbc]. destruct Hbc as [Hb Hc].
得到個人的假設。 auto
使用這些假設。 我留給你研究(2),但它非常相似。
然后是Qed.
如果您有A /\\ B /\\ C
作為假設,並且您的目標是(A /\\ B) /\\ C
,則可以使用戰術tauto
。 這種策略解決了命題演算中的所有重言式。 還有一個策略firstorder
可以firstorder
解決一些公式。
如果你有A /\\ B /\\ C
並且想要將(A /\\ B) /\\ C
作為參數傳遞給引理,那么你需要多做一些工作。 一種方法是將(A /\\ B) /\\ C
為中間目標並證明:
assert ((A /\ B) /\ C). tauto.
如果A
, B
和C
是大表達式,你可以使用復合策略匹配假設H : A /\\ B /\\ C
並將tauto策略應用於它。 這是一種嚴厲的方法,在這種情況下過度殺傷,但在更復雜的情況下非常有用,在這種情況下,您希望自動化具有許多類似情況的證明。
match type of H with ?x /\ ?y /\ ?z =>
assert (x /\ (y /\ z)); [tauto | clear H]
end.
有一種更簡單的方法,即應用執行轉換的已知引理。
apply and_assoc in H.
您可以通過瀏覽庫文檔找到該引理。 你也可以搜索它。 這不是最容易搜索的因素,因為它是等價的,搜索工具適用於影響和平等。 您可以使用SearchPattern (_ /\\ _ /\\ _).
尋找forall x1 … xn, ?A /\\ ?B /\\ ?C
形式的forall x1 … xn, ?A /\\ ?B /\\ ?C
(其中?A
, ?B
和?C
可以是任何表達式)。 您可以使用SearchRewrite (_ /\\ _ /\\ _)
來查找forall x1 … xn, (?A /\\ ?B /\\ ?C) = ?D
形式的forall x1 … xn, (?A /\\ ?B /\\ ?C) = ?D
。 不幸的是,這並沒有找到我們所追求的東西,這是forall x1 … xn, (?A /\\ ?B /\\ ?C) <-> ?D
形式的引理forall x1 … xn, (?A /\\ ?B /\\ ?C) <-> ?D
。 工作是什么
Coq < SearchPattern (_ <-> (_ /\ _ /\ _))
and_assoc: forall A B C : Prop, (A /\ B) /\ C <-> A /\ B /\ C
作為一般提示,如果你有類似的東西,你懷疑是顯而易見的,請檢查標准庫。 方法如下: Locate "/\\".
產生一個響應,為我們解決Notation
,
Notation Scope
"A /\ B" := and A B : type_scope
(default interpretation)
現在我們可以發出命令SearchAbout and.
看看范圍是什么,並發現and_assoc
見證了你感興趣的含義。事實上,你可以從你的intuition
中得到啟示: intuition
策略可以利用這個含義本身。
Lemma conj_example : forall A B C D,
(A /\ B) /\ C -> (A /\ (B /\ C) -> D) -> D.
Proof. intuition. Qed.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.