如果(和b c=orb b c)在coq中,我如何证明b=c?

如果(和b c=orb b c)在coq中,我如何证明b=c?,coq,proof,proof-of-correctness,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) 我不确定我将如何重写这个表达式,以便使用反身性。但即使我这样做,我也不确定这是否会带来证据 如果我从假设b=c开始,我就能够解决这个问题。即 Theorem andb_eq_orb_rev : fo

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

Theorem andb_eq_orb :
  forall (b c : bool),
  (andb b c = orb b c) -> (b = c).
这是我的证明,但当我到达目标时,我会被卡住(false=true->false=true)

我不确定我将如何重写这个表达式,以便使用反身性。但即使我这样做,我也不确定这是否会带来证据

如果我从假设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.

但是,如果我从具有布尔函数的假设开始,我不知道如何解决。

你会想使用
介绍
策略。这将把
false=true
移动到您的验证上下文中,作为一个假设,然后您可以使用它来重写

这可能不是最有效的方法

在步骤
感应c.
(卡住的地方):

您可以使用[bool][1]中的
rewrite
和基本定理来简化术语,例如
b&&true
b
,以及
b | true
true

这可以将其简化为两个“琐碎”的子目标:

b : bool
______________________________________(1/2)
b = true -> b = true
______________________________________(2/2)
false = b -> b = false
使用
假设
,这几乎是微不足道的证明,除了它距离对称性
只有一步之遥。如果
symmetry
将使用以下方法使它们匹配,则可以
尝试

try (symmetry;assumption); try assumption.
(真正了解Coq的人可能会告诉我如何更简洁地
尝试

综合起来:

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.
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.
第二种方法是使用“真值表”方法对其进行暴力处理。这意味着您可以将所有变量分解为它们的真值,并进行简化:
destruct b,c;简单。
。这又给出了四个无关紧要的含义,最多有一个
对称性
尝试

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
综合起来:

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.
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.

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

您不需要归纳,因为
bool
不是递归数据结构。只需检查
b
c
值的不同情况。使用
destruct
执行此操作。在两种情况下,假设
H
的类型为
true=false
,您可以使用
反转H
完成证明。在另外两种情况下,目标类型为
true=true
,可以通过
自反性解决

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.

老兄,我这么做已经有很长一段时间了,但是你不能在
b
上用
siml
自反性
?比如,假设
b=true
然后证明它,然后假设
b=false
并证明它。这是为了帮助我,我不知道我可以从库中导入和使用定理。但是有一个问题,如果我在归纳b之后不使用auto,我将如何解决false=true->false=true?因为我是一个初学者,所以我想确保我理解auto正在执行的所有步骤。同样
归纳法b。自动
。与
归纳b不同的功能;自动
。分号是干什么的?哦,我想我知道了。这是
intro。重写H.自反性。
仅为记录,布尔类型不是递归的(只有两个基本构造函数,
true
false
),因此您只需
解构b
,使用
归纳法不会提供更多信息。谢谢,这很有帮助。从那里我用假设重写了<代码>重写H.自反性。
谢谢,我认为这是最好的答案。倒装战术似乎是最好的方法。