快手 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等价于Peqb f1 f2 = true对于所有函数f1, f2 : bool -> A是无效的(至少当A有两个或更多居民)。