我有一個簡單的定理,我想證明使用案例證明。下面給出一個例子。使用Coq的案例證明
Goal forall a b : Set, a = b \/ a <> b. Proof intros a b. ...
我該如何解決這個問題。而且,究竟如何使用兩個可能的平等值(True或False)來定義證據?
任何幫助,將不勝感激。 謝謝,
我有一個簡單的定理,我想證明使用案例證明。下面給出一個例子。使用Coq的案例證明
Goal forall a b : Set, a = b \/ a <> b. Proof intros a b. ...
我該如何解決這個問題。而且,究竟如何使用兩個可能的平等值(True或False)來定義證據?
任何幫助,將不勝感激。 謝謝,
我很確定Set
s的等同性在coq中是不可判定的。原因(根據我的理解)應該是它不是一個歸納定義的集合(因此,對您而言沒有案例分析......),也不是一個封閉的集合:每次定義新的數據類型時,您創建一個新的Set
居民家庭。因此,證明您顯示的目標的術語需要更新以反映這些新的居民。
由於@hardmath在他的評論中提到,你可以使用Classical
假設(Axiom classic : forall P:Prop, P \/ ~ P.
)來證明你的目標。
正如@Robin Green在評論中提到的那樣,你可以證明這種類型的目標是可以相等的。爲此,您可能需要從decide equality
策略中獲得幫助。請參閱:http://coq.inria.fr/distrib/V8.4/refman/Reference-Manual011.html#@tactic121
爲了詳細解釋這個答案,有兩種主要的方法可以證明這個結果對於某些類型T(這裏T是'Set')。如果T有一個已知的相等的可判定程序,那麼只需使用該程序是可判定的證據即可。如果不這樣做,人們不得不求助於古典邏輯; Coq的默認邏輯是直觀的。 – 2013-03-05 19:19:38
您的問題涉及Coq的一個有趣方面:命題(即Prop
的成員)和布爾(即bool
的成員)之間的差異。詳細解釋這種差異會有點過於技術性,所以我會試着專注於你的特殊例子。
粗略地說,Coq中的Prop
不像True
或False
那樣評估,就像普通的布爾值一樣。相反,Prop
s有推理規則可以結合推斷事實。使用這些,我們可以證明一個命題是成立的,或者表明它是矛盾的。讓事情微妙的是,還有第三種可能性,即我們無法證明或反駁這個命題。發生這種情況是因爲Coq是建設性邏輯。其中最爲衆所周知的後果之一是,在Coq中不能證明被排除在中間的(forall P : Prop, P \/ ~ P
)之類熟悉的推理原則:如果您斷言P \/ ~ P
,這意味着您要麼能夠證明P
或證明~ P
。如果不知道哪一個成立,你就無法斷言。
事實證明,對於一些命題,我們可以證明P \/ ~ P
成立。例如,要顯示forall n m : nat, n = m \/ n <> m
並不困難。遵循上述說法,這意味着對於每一對自然數,我們都能夠證明它們是平等的或證明它們不是。另一方面,如果我們將nat
更改爲Set
,就像在您的示例中一樣,那麼我們將永遠無法證明該定理。要明白爲什麼,請考慮自然數對的Set
nat * nat
。如果我們能夠證明你的定理,那麼它會遵循那個nat = nat * nat \/ nat <> nat * nat
。同樣,通過上述評論,這意味着我們要麼能夠證明nat = nat * nat
或nat <> nat * nat
。然而,由於兩種類型之間存在雙射,所以我們不能說假設nat = nat * nat
是矛盾的,但是因爲類型在語法上不是相同的,所以假設它們是不同的也是可以的。從技術上說,命題nat = nat * nat
的有效性是Coq邏輯的獨立。
如果你真的需要,你所提到的,那麼你需要斷言排中作爲公理(Axiom classical : forall P, P \/ ~ P.
),這將讓你產生\/
證明,而無需任何一方的明確證據和推理的事實案例。那麼你將能夠用類似
intros a b. destruct (classical (a = b)). left. assumption. right. assumption.
希望這有助於證明你的例子定理。
你正在使用什麼版本的Coq?你是否要求基於同義反復論證'A \ /〜A',或者你是否想到一個假設你具體分離的例子:a = b \/a <> b'? – hardmath 2013-03-05 06:43:06