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').