定理的Coq语法包括否定和三个args的情况

时间:2016-04-11 16:05:53

标签: coq coq-tactic

鉴于以下对三个参数的否定和定义的定义,我可以很容易地证明不同的情况,但我想用一些使用Coq以某种方式写出这个证据。 Forall b1 b2 b3:bool其中一个为false,返回true,三个为true,返回false。我如何在Coq中编写这个前提,这样我就可以使用split这样的策略来破解连接等?

Definition negb (b:bool) : bool :=
match b with
| true => false
| false  => true
end.

Definition andb3 (b1:bool) (b2:bool) (b3:bool) : bool :=
  match b1 with
    | true =>
      match b2 with
        | true => b3
        | false => false
      end
    | false => false
  end.

Definition nandb3 (b1:bool)(b2:bool)(b3:bool):bool :=
 negb (andb3 b1 b2 b3).


Example nandb1: (nandb3 true false true) = true.
Proof. reflexivity. Qed.

Example nandb2: (nandb3 false true true) = true.
Proof. reflexivity. Qed.

2 个答案:

答案 0 :(得分:1)

您可以使用'当且仅当'配方,如下所示。 如果您向后阅读该语句,它会说:如果nandb3给出错误,那么唯一可能的情况是所有输入都为真。直接阅读完全是微不足道的。

Lemma nandb3_property : forall b1 b2 b3,
  b1 = true /\ b2 = true /\ b3 = true <->
  nandb3 b1 b2 b3 = false.
Proof.
  intros b1 b2 b3.
  destruct b1; destruct b2; destruct b3; intuition.
Qed.

然后我们只是对破坏做了一点帮助,其余的工作都采用intuition策略。

答案 1 :(得分:0)

在math-comp中提供了一个解决方案,基本上你定义了自己的归纳And3并证明了Anton所概述的等价。然后,您可以使用大小写和构造函数来处理3个目标。参见:

https://github.com/math-comp/math-comp/blob/master/mathcomp/ssreflect/ssrbool.v#L757