类型上的模式匹配,以实现Coq中存在类型的构造函数的相等性

我是我的名字

假设我的数据类型还存在一个存在量化组件的小问题。这次我想定义两个类型的值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的案例,还是有其他方法可以实现这种区分?

我在Google上搜索了很多,但不幸的是,我主要是偶然发现了有关依赖模式匹配的帖子。

我还尝试使用生成一个(布尔值)方案Scheme Equality for ext,但是由于类型参数的原因,该方案未成功。

加莱

我想做的是以某种方式区分存在类型实际上是相同的情况和不存在的情况之间的区别。

这是不可能的,因为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其他更强大的语言(例如,配备归纳递归的语言)将为您提供更多的表达能力。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Coq中sig类型元素的相等性

使用 Coq 中的匹配表达式分解构造函数的相等性

Haskell构造函数类型模式匹配

Coq 中模式匹配时的类型检查器行为

Scala - 模式匹配 - 构造函数无法实例化为预期类型

如果参数与模式匹配,则为额外的类型构造函数

Agda模式如何与相同类型的构造函数匹配?

Scala中的模式匹配问题:“错误:构造函数无法实例化为预期的类型”

在Rascal模式匹配中推断构造函数关键字参数的类型

枚举类型的COQ相等

错误:在类型上找不到匹配的构造函数

如果Coq中两个归纳类型的构造函数表达式相等,是否可以根据它们的对应参数进行重写?

Coq中的相互递归类型的“决定相等性”?

模式匹配Coq中单个子句中的多个构造函数

实现派生类构造函数时出错:“没有重载函数的实例与指定类型匹配

Haskell函数中针对类型类实例的模式匹配

类型构造函数实现Fn吗?

Coq为内射函数定义类型构造函数

Haskell中类型匹配的模式

构造函数中的类型约束

类中构造函数的类型

在Coq中为共归类型流定义一个“头”(不匹配模式)

在类型上找不到匹配的构造函数。您可以使用Arguments或FactoryMethod指令来构造类型

如何按类型构造函数比较相等值?

是否存在JavaScript技术来检查>,<,> =,<=操作中的类型相等性?

Coq使用强制类型定义构造函数的困难

如何理解Coq类型构造函数var(t:T)

Coq:如何引用由特定构造函数生成的类型?

Coq无法区分依存类型归纳命题的构造函数