我可以介绍合理的构造函数等价性吗?

Can I introduce sound constructor equivalence?

假设我有一个 Inductive 类型

Inductive foo :=
  | a : foo
  | b : foo
  | c : foo.

但我真正想要的是 "identify" bc - 也就是说,我希望能够将它们视为编写同一事物的两种不同方式 -并能够将一个重写为另一个。

我可以把它作为公理介绍:

Axiom b_equiv_c : forall P : foo -> Prop, P b <-> P c.

但这显然不合理:

Theorem whoops : False.
Proof.
  assert (b <> c) as H. { discriminate. }
  apply (b_equiv_c (fun x => x <> c)) in H.
  contradiction H.
  reflexivity.
  Qed.

有没有其他方法可以做到这一点,或者类似的方法?我怀疑答案是否定的,因为它与 Inductive 构造函数是内射的相矛盾。

当前解决方法

我有关系

Inductive equiv_foo : foo -> foo -> Prop :=
  | equiv_foo_refl (f : foo) : equiv_foo f f
  | equiv_foo_sym (f f' : foo) : equiv_foo f f' -> equiv_foo f' f
  | equiv_foo_b_c : equiv_foo b c.

然后让我定义一个命题是否是明确定义的。

Definition wd_wrt_equiv_foo (P : foo -> Prop) : Prop :=
  forall f f' : foo, equiv_foo f f' -> (P f <-> P f').

但这很不愉快。这意味着,对于我自己的归纳定义的命题,我需要添加一个额外的构造函数,它采用 equiv_foo 来证明定义明确的 属性。 (我怀疑仅针对某些命题断言上述 属性 是不合理的。)

我可以不告诉 Coq "this thing, and anything constructed using it, may not be injective" 吗?

你目前使用等价关系的解决方法似乎是最好的解决方案,至少从你所描述的来看是这样。

这看起来像是商类型或同伦类型理论的用例,但我不知道将此类系统与 Coq 集成有什么工作。