這可能不是最有效的方法。
在步驟induction c.
(其中它的卡住):
______________________________________(1/2)
b && true = b || true -> b = true
______________________________________(2/2)
b && false = b || false -> b = false
可以使用在[BOOL] rewrite
和基本定理[1],以簡化的術語如b && true
到b
,和b || true
到true
。
這可以將其降低到兩個「微不足道」的子目標:
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個瑣碎的影響,最多一個symmetry
到try
:
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.
第一種方法是比較麻煩的,但它不涉及枚舉所有的真理錶行(我認爲)。
人的是一個非常長的一段時間,因爲我這樣做,但你就不能讓它區分出來'B',然後使用'simpl'和'reflexivity'?假設「b =真」,然後證明它,然後假設「b =假」並證明它。 –