快手 eqBoolArrowA_correct 定理
Quick Chick eqBoolArrowA_correct theorem
通过软件基础的 Quick Chick 课程我被困在以下定理中:
Class Eq A :=
{
eqb: A -> A -> bool;
}.
Instance eqBoolArrowA {A : Type} `{Eq A} : Eq (bool -> A) :=
{
eqb f1 f2 :=
(andb (eqb (f1 false) (f2 false)) (eqb (f1 true) (f2 true)))
}.
Theorem eqBoolArrowA_correct : forall (f1 f2 : bool -> bool -> nat),
(eqb f1 f2) = true <-> true = true.
Proof.
intros. split.
- destruct (f1 =? f2).
+ intro. assumption.
+ intros H. discriminate H.
- intros _. destruct (f1 =? f2).
+ reflexivity.
+
这里我们得到:
1 subgoal (ID 164)
f1, f2 : bool -> bool -> nat
============================
false = true
证明 true = true -> (eqb f1 f2) = true
似乎是不可能的,因为 (eqb f1 f2)
可能是假的,在这种情况下我们在空上下文中得到 false = true
,这是无法证明的。
这个定理不正确还是我遗漏了什么?
该定理无效。
任何命题P <-> true = true
等价于P
,eqb f1 f2 = true
对于所有函数f1, f2 : bool -> A
是无效的(至少当A
有两个或更多居民)。
通过软件基础的 Quick Chick 课程我被困在以下定理中:
Class Eq A :=
{
eqb: A -> A -> bool;
}.
Instance eqBoolArrowA {A : Type} `{Eq A} : Eq (bool -> A) :=
{
eqb f1 f2 :=
(andb (eqb (f1 false) (f2 false)) (eqb (f1 true) (f2 true)))
}.
Theorem eqBoolArrowA_correct : forall (f1 f2 : bool -> bool -> nat),
(eqb f1 f2) = true <-> true = true.
Proof.
intros. split.
- destruct (f1 =? f2).
+ intro. assumption.
+ intros H. discriminate H.
- intros _. destruct (f1 =? f2).
+ reflexivity.
+
这里我们得到:
1 subgoal (ID 164)
f1, f2 : bool -> bool -> nat
============================
false = true
证明 true = true -> (eqb f1 f2) = true
似乎是不可能的,因为 (eqb f1 f2)
可能是假的,在这种情况下我们在空上下文中得到 false = true
,这是无法证明的。
这个定理不正确还是我遗漏了什么?
该定理无效。
任何命题P <-> true = true
等价于P
,eqb f1 f2 = true
对于所有函数f1, f2 : bool -> A
是无效的(至少当A
有两个或更多居民)。