让我说我的数据类型与存在量化组件有一个小问题。这次我想定义两个类型ext
的值相等的时间。
Inductive ext (A: Set) :=
| ext_ : forall (X: Set), option X -> ext A.
Fail Definition ext_eq (A: Set) (x y: ext A) : Prop :=
match x with
| ext_ _ ox => match y with
| ext_ _ oy => (* only when they have the same types *)
ox = oy
end
end.
我想要做的是以某种方式区分存在类型实际上是相同的情况和它不存在的情况。这是JMeq的案例,还是有其他方法来完成这种案例区分?
我搜索了很多内容,但不幸的是我偶然发现了关于依赖模式匹配的帖子。
我还试图用Scheme Equality for ext
生成一个(布尔)方案,但由于类型参数,这并没有成功。
答案 0 :(得分:3)
我想要做的是以某种方式区分存在类型实际上是相同的情况和不存在的情况。
这是不可能的,因为Coq的逻辑与单位公理相容,后者说同构类型是相等的。因此,尽管(unit * unit)
和unit
在语法上是不同的,但它们无法通过Coq的逻辑来区分。
可能的解决方法是为您感兴趣的类型提供代码的数据类型,并将其存储为存在性。像这样:
Inductive Code : Type :=
| Nat : Code
| List : Code -> Code.
Fixpoint meaning (c : Code) := match c with
| Nat => nat
| List c' => list (meaning c')
end.
Inductive ext (A: Set) :=
| ext_ : forall (c: Code), option (meaning c) -> ext A.
Lemma Code_eq_dec : forall (c d : Code), { c = d } + { c <> d }.
Proof.
intros c; induction c; intros d; destruct d.
- left ; reflexivity.
- right ; inversion 1.
- right ; inversion 1.
- destruct (IHc d).
+ left ; congruence.
+ right; inversion 1; contradiction.
Defined.
Definition ext_eq (A: Set) (x y: ext A) : Prop.
refine(
match x with | @ext_ _ c ox =>
match y with | @ext_ _ d oy =>
match Code_eq_dec c d with
| left eq => _
| right neq => False
end end end).
subst; exact (ox = oy).
Defined.
然而,这显然限制了你可以在ext
中打包的那种类型。其他更强大的语言(例如配备Induction-recursion)会给你更强大的表现力。