我可以介绍合理的构造函数等价性吗?
Can I introduce sound constructor equivalence?
假设我有一个 Inductive
类型
Inductive foo :=
| a : foo
| b : foo
| c : foo.
但我真正想要的是 "identify" b
和 c
- 也就是说,我希望能够将它们视为编写同一事物的两种不同方式 -并能够将一个重写为另一个。
我可以把它作为公理介绍:
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 集成有什么工作。
假设我有一个 Inductive
类型
Inductive foo :=
| a : foo
| b : foo
| c : foo.
但我真正想要的是 "identify" b
和 c
- 也就是说,我希望能够将它们视为编写同一事物的两种不同方式 -并能够将一个重写为另一个。
我可以把它作为公理介绍:
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 集成有什么工作。