2015-08-30 36 views
4

我是新來的輔酶Q,我試圖證明這一點......如何證明b = c if(andb b c = orb b c)in coq?

Theorem andb_eq_orb : 
    forall (b c : bool), 
    (andb b c = orb b c) -> (b = c). 

這是我的證明,但我碰到困難時,我得到的目標(假=真 - >假=真)。

Proof. 
intros b c. 
induction c. 
destruct b. 
reflexivity. 
simpl. 
reflexivity. 

我不知道如何重寫該表達式,所以我可以使用反身性。但即使我這樣做,我也不確定它會導致證明。

我能夠解決證明,如果我開始與假設b = c雖然。即...

Theorem andb_eq_orb_rev : 
    forall (b c : bool), 
    (b = c) -> (andb b c = orb b c). 
Proof. 
intros. 
simpl. 
rewrite H. 
destruct c. 
reflexivity. 
reflexivity. 
Qed. 

但我不知道如何解決如果我開始與具有布爾函數的假設。

+0

人的是一個非常長的一段時間,因爲我這樣做,但你就不能讓它區分出來'B',然後使用'simpl'和'reflexivity'?假設「b =真」,然後證明它,然後假設「b =假」並證明它。 –

回答

3

您不需要歸納,因爲bool不是遞歸數據結構。只需通過bc的值的不同情況。使用destruct來做到這一點。在兩種情況下,假設H將是true = false類型,您可以使用inversion H完成證明。在另外兩種情況下,目標將是true = true型,可以通過reflexivity來解決。

Theorem andb_eq_orb : forall b c, andb b c = orb b c -> b = c. 
Proof. destruct b,c; intro H; inversion H; reflexivity. Qed. 
+0

謝謝,我認爲這是最好的答案。倒置戰術似乎是他做這件事的最佳方式。 http://www.cis.upenn.edu/~bcpierce/sf/current/Prop.html#lab257 – Albtzrly

1

你會想要使用intro策略。這會將false = true移動到您的證明背景中,作爲您可以用來重寫的假設。

+0

謝謝,幫助。從那裏我重寫了這個假設。 '重寫H. reflexivity.' – Albtzrly

1

這可能不是最有效的方法。

在步驟induction c.(其中它的卡住):

______________________________________(1/2) 
b && true = b || true -> b = true 
______________________________________(2/2) 
b && false = b || false -> b = false 

可以使用在[BOOL] rewrite和基本定理[1],以簡化的術語如b && trueb,和b || truetrue

這可以將其降低到兩個「微不足道」的子目標:

b : bool 
______________________________________(1/2) 
b = true -> b = true 
______________________________________(2/2) 
false = b -> b = false 

這是使用assumption幾乎微不足道的證據,但它是一個symmetry路程。您可以try如果symmetry會使他們配合使用:

try (symmetry;assumption); try assumption. 

(有人誰真正知道勒柯克可以賜教如何try這個更簡潔)

將其組合在一起:

Require Import Bool. 
Theorem andb_eq_orb : forall b c, andb b c = orb b c -> b = c. 
Proof. 
destruct c; 

try (rewrite andb_true_r); 
try (rewrite orb_true_r); 
try (rewrite andb_false_r); 
try (rewrite orb_false_r); 
intro H; 
try (symmetry;assumption); try assumption. 
Qed. 

一第二種方法是蠻力並使用「真值表」方法。這意味着你可以將所有變量分解爲它們的真值,並簡化爲:destruct b, c; simpl.。這再次給了4個瑣碎的影響,最多一個symmetrytry

4 subgoal 
______________________________________(1/4) 
true = true -> true = true 
______________________________________(2/4) 
false = true -> true = false 
______________________________________(3/4) 
false = true -> false = true 
______________________________________(4/4) 
false = false -> false = false 

將其組合在一起:

Theorem andb_eq_orb1 : forall b c, andb b c = orb b c -> b = c. 
Proof. 
destruct b, c; simpl; intro; try (symmetry;assumption); try assumption. 
Qed. 

第一種方法是比較麻煩的,但它不涉及枚舉所有的真理錶行(我認爲)。

+0

這是爲了幫助我沒有意識到我可以導入和使用庫中的定理。 – Albtzrly

+0

雖然有一個問題,如果我在歸納b之後不使用auto,我將如何解決false = true - > false = true?由於我是初學者,我想確保我理解汽車正在做的所有步驟。還有'誘導b。 auto'。功能與「歸納法」不同; auto'。分號是什麼? – Albtzrly

+0

哦,我想我明白了。這是介紹。重寫H. reflexivity.' – Albtzrly

相關問題