Я изучаю классы типов в Coq с книгой Software Foundations.
Запуск следующего:
Class Eq A :=
{
eqb: A -> A -> bool;
}.
Notation "x =? y" := (eqb x y) (at level 70).
Instance eqBool : Eq bool :=
{
eqb := fun (b c : bool) =>
match b, c with
| true, true => true
| true, false => false
| false, true => false
| false, false => true
end
}.
Compute (true =? false).
Я получаю сообщение = false : bool
, как и ожидалось.
Но если я сделаю следующее вместо этого,
Class Eq A :=
{
eqb: A -> A -> bool;
eqb_refl: forall (x : A), eqb x x = true;
}.
Notation "x =? y" := (eqb x y) (at level 70).
Instance eqBool : Eq bool :=
{
eqb := fun (b c : bool) =>
match b, c with
| true, true => true
| true, false => false
| false, true => false
| false, false => true
end
}.
Proof.
intros []; reflexivity.
Qed.
Compute (true =? false).
Я получаю сообщение = (let (eqb, _) := eqBool in eqb) true false : bool
.
Кажется, я не могу упростить это выражение и не уверен, что пошло не так и где.
Как я могу определить приведенный выше класс типов с помощью дополнительной гипотезы и при этом иметь возможность использовать определенный мной экземпляр (т.е. получить то же сообщение, что и раньше)?
Большое спасибо!