【问题标题】:How can I "specialize" a polymorphic type in Coq?如何在 Coq 中“专门化”一个多态类型?
【发布时间】:2022-05-01 01:27:16
【问题描述】:

(注意,我的目标是了解更多关于 Coq 的信息,不一定要解决这个特定问题。IRL,我希望在这种情况下我会重构以删除有问题的类型。)

我有一个这样定义的类型:

Inductive natprod : Type := pair (n1 n2 nat).

我想让我的产品类型多态,所以我现在定义

Inductive prod {X Y : Type} : Type := pair (x : X) (y : Y).

但是,我不能在同一个模块中同时定义prodnatprod,因为它们都有构造函数pair。但是我有一堆natprod的函数和定理,所以我不想扔掉natprod。相反,我基本上想说“当我写natprod 时,我的意思是prod nat nat。”

所以我尝试了这个:

Definition natprod := prod nat nat.

但是,我收到以下错误:

Illegal application (Non-functional construction): 
The expression "prod" of type "Type" cannot be applied to the term
 "nat" : "Set"

我怎样才能做我想做的事?

【问题讨论】:

    标签: coq


    【解决方案1】:

    事实证明,问题在于XY 被定义为prod 的隐式参数。我们可以通过强制它们显式来解决这个问题:

    Definition natprod := @prod nat nat.
    

    或者,

    Notation natprod := (@prod nat nat).
    

    更像是一个宏,不需要在证明中展开。

    【讨论】:

    • 我会考虑制作XY不是prod 的隐式参数。您应该将它们设为prod 的显式参数和pair 的隐式参数。
    • 这在语法上会是什么样子? Inductive prod (X Y : Type) : Type := pair {X} {Y} (x : X) (y : Y)?
    • Inductive prod (X Y : Type) : Type := pair (x : X) (y : Y). Arguments pair {X Y} x y.
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2021-06-05
    • 1970-01-01
    • 2019-11-30
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多