如何在coq中证明b = c if(andb b c = orb b c)?

时间:2015-08-30 00:29:13

标签: coq proof proof-of-correctness

我是coq的新手,我正试图证明这一点......

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

这是我的证明,但是当我到达目标时我会陷入困境(false = true - > false = true)。

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.

但如果我从具有布尔函数的假设开始,我无法弄清楚如何解决。

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

您想要使用intro策略。这会将false = true移动到您的证明上下文中,然后您可以使用它来重写。

答案 2 :(得分:1)

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

induction c.步骤(卡住的地方):

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

您可以在[bool] [1]中使用rewrite和基本定理来简化b && truebb || truetrue等术语。

这可以减少到两个"平凡的"子目标:

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

这是使用assumption的几乎无足轻重的证明,除了距离symmetry一个。如果try使用以下内容匹配,您可以symmetry

try (symmetry;assumption); try assumption.

(真正了解Coq的人可能会告诉我如何更简洁地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.。这再次给出了四个微不足道的含义,最多只有一个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.

第一种方法比较麻烦,但它不涉及枚举所有真值表行(我认为)。