Coq 我可以介绍声音构造器等价吗?

Coq 我可以介绍声音构造器等价吗?,coq,injective-function,Coq,Injective Function,假设我有一个归纳的类型 Inductive foo := | a : foo | b : foo | c : foo. 但我真正想要的是用c来“识别”b——也就是说,我希望能够将它们视为书写同一事物的两种不同方式——并且能够将其中一种重写为另一种 我可以把它作为一条公理来介绍: Axiom b_equiv_c : forall P : foo -> Prop, P b <-> P c. 然后让我来定义一个命题是否定义得很好 Definition wd_wrt_e

假设我有一个
归纳的
类型

Inductive foo :=
  | a : foo
  | b : foo
  | c : foo.
但我真正想要的是用
c
来“识别”
b
——也就是说,我希望能够将它们视为书写同一事物的两种不同方式——并且能够将其中一种重写为另一种

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

Axiom b_equiv_c : forall P : foo -> Prop, P b <-> P c.
然后让我来定义一个命题是否定义得很好

Definition wd_wrt_equiv_foo (P : foo -> Prop) : Prop :=
  forall f f' : foo, equiv_foo f f' -> (P f <-> P f').
definitionwd_wrt_equiv_foo(P:foo->Prop):Prop:=
forall f':foo,equiv_foo f'->(P f P f')。
但这是令人不快的。这意味着,对于我自己的归纳定义命题,我需要添加一个额外的构造函数,使用
equiv_foo
来证明良定义属性。(我怀疑仅仅为某个命题主张上述属性是不合理的。)


我能不能告诉Coq“这个东西,以及使用它构造的任何东西,可能不是内射的”

至少从您描述的情况来看,您当前使用等价关系的解决方案似乎是最好的解决方案


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

为什么不将
c
定义为
符号或
定义
用于
b
?实际问题稍微复杂一些。我有一个
归纳的
,它只是一个枚举,还有一个
归纳的
,有两个构造函数包装该枚举。对于一些枚举值,我希望这两个构造函数是等价的。这不是最后一句话,因为商和HoTT似乎都是Coq中活跃的开发领域。希望在几个月后,有一种方法能够在不使用setoid或等效构造的情况下真正实现这一点。
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').