如果(和b c=orb b c)在coq中,我如何证明b=c?
我是coq的新手,我正试图证明这一点如果(和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
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.自反性。
谢谢,我认为这是最好的答案。倒装战术似乎是最好的方法。