【问题标题】:Coq - unify types from module functors with same parameters?Coq - 统一来自具有相同参数的模块仿函数的类型?
【发布时间】:2020-05-25 22:11:04
【问题描述】:

我怎样才能让 Coq 识别出两种类型实际上是相同的类型?

小例子

Module Type S.
End S.

Module F (s : S).
Inductive foo : Type := a.
End F.

Module G (s : S).
Include F s.
End G.

Module H (s : S).
Include F.
End H.

Module I (s : S).

Module G := G s.
Module H := H s.

(* This is a type error - but the foos are the same! *)
Axiom bar : forall g : G.foo, forall h : H.foo, g = h.

End I.

在上面的 Coq 文件中,我想声明一个公理,要求 G s 中的类型 fooH s 中的类型 foo 相同。显然,事实确实如此。但是我可以让 Coq 识别它吗?

【问题讨论】:

    标签: module coq


    【解决方案1】:

    这是不可能的。归纳类型之间没有结构对等。通过使用Include 两次,您将创建两种不同的类型。他们碰巧同名,但这只是巧合。

    更一般地说,模块系统对归纳类型的支持很差。任何时候你尝试一些花哨的东西,Coq 都会抱怨“内核还没有识别出一个参数可以被归纳类型实例化。”

    根据经验,我建议始终在模块函子之外定义归纳类型。我想你的类型foo 会依赖于模块s 的一些属性,所以你必须让它更通用一点:

    Module Type S.
    Axiom t : Type.
    End S.
    
    Inductive foo (t : Type) : Type := a : t -> foo t.
    
    Module F (s : S).
    Definition foo := foo s.t.
    End F.
    

    【讨论】:

    • “通过两次使用 Include,您将创建两种不同的类型。”... 这让我大吃一惊。你知道为什么选择这样的设计,甚至一开始就需要这样的设计吗?这似乎完全不合理。
    • 替代方案似乎不太合理。你甚至可以通过什么机制来实现它?
    • 考虑到宇宙层次结构的所有令人讨厌的细节,我什至不确定人们是否对两个归纳类型族等价的含义有清晰的理论理解。 (请记住,这两种类型的宇宙约束可能不同。)因此,情况并不令人满意,但不会很快改变。
    • @Li-yaoXia 虽然我承认对 CIC 和其他 Coq 理论知之甚少 - 从软件工程师的角度来看,包括一个模块应该只公开对其内容的访问,而不是完全复制它。基本上每一种现代编程语言都已经实现了这样的系统。例如在 Haskell 中,在不同位置的模块中引用相同的定义与在不同的模块中引用相同的定义是有区别的。
    • 如果您只想公开对模块内容的访问,请使用Import。但是你不能做Import F,因为F 不是一个模块,它是一个模块函子。因此,您首先必须创建一个模块,例如 Module F' := F s. Import F'.。但是很明显,您正在创建两个不同的模块F',一个在G,一个在H
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2020-07-18
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多