Coq中模参数的特殊化

Coq中模参数的特殊化,coq,Coq,我有一个模块,我需要专门化它的一个参数。我想使用自然数,而不是任意的通常的decidabletypefull。我如何在Coq中获得这种行为 我定义了一些模块: Module PRO2PRE_mod (SetVars FuncSymb PredSymb PropSymb: UsualDecidableTypeFull). (* ... *) End PRO2PRE_mod. 然后我专门化了最后一个参数PropSymb Require Import Arith.PeanoNat. Module m

我有一个模块,我需要专门化它的一个参数。我想使用自然数,而不是任意的通常的decidabletypefull。我如何在Coq中获得这种行为

我定义了一些模块:

Module PRO2PRE_mod
(SetVars FuncSymb PredSymb PropSymb: UsualDecidableTypeFull).
(* ... *)
End PRO2PRE_mod.
然后我专门化了最后一个参数PropSymb

Require Import Arith.PeanoNat.
Module m2 : UsualDecidableTypeFull.
Definition t:=nat.
Definition eq := @eq nat.
Definition eq_refl:=@eq_refl nat.
Definition eq_sym:=@eq_sym nat.
Definition eq_trans:=@eq_trans nat.
Definition eq_equiv:Equivalence eq := Nat.eq_equiv.
Definition eq_dec := Nat.eq_dec.
Definition eqb:=Nat.eqb.
Definition eqb_eq:=Nat.eqb_eq.
End m2.
本模块需要PropVar的专门化:

Module SWAP_mod
(SetVars FuncSymb PredSymb : UsualDecidableTypeFull).

Module PRE := PRO2PRE_mod SetVars FuncSymb PredSymb m2.
Import PRE.

Theorem test : m2.t.
try exact 0. (* ERROR HERE! *)
Abort.
End SWAP_mod.

如何在最后一个模块中使用关于自然数的定理?(我想我对使用模块有些不了解……也许我们需要以某种方式将类型'm2.t'强制为类型'nat'?)

实际上,在
m2
的定义中使用
:UsualDecidableTypeFull
完全隐藏了
m2
的实现细节。从外部看,
m2.t
是一种未知类型

有时候,这正是你想要的。例如,您可能希望抽象出模块中定义的类型,以便用户在不使用您在模块中为其提供的函数的情况下无法操作此类型的值。因此,您可以确保它们不会破坏某些不变量

但是,在您的情况下,您需要记住,
m2.t
实际上是
nat
,您至少有以下两个选项:


  • 使用
    模块m2使界面透明事实上,在
    m2
    的定义中使用
    :UsualDecidableTypeFull
    完全隐藏了
    m2
    的实现细节。从外部看,
    m2.t
    是一种未知类型

    有时候,这正是你想要的。例如,您可能希望抽象出模块中定义的类型,以便用户在不使用您在模块中为其提供的函数的情况下无法操作此类型的值。因此,您可以确保它们不会破坏某些不变量

    但是,在您的情况下,您需要记住,
    m2.t
    实际上是
    nat
    ,您至少有以下两个选项:


    • 使用
      模块m2使界面透明,太棒了!请你澄清一下,为什么需要隐藏模块的一部分?我添加了一个关于使用模块接口进行抽象的通用语句,我希望它更清晰。太好了!你能澄清一下,为什么需要隐藏模块的一部分?我添加了一个关于使用模块接口进行抽象的通用语句,我希望它更清楚。
      
      Module m2 : UsualDecidableTypeFull with Definition t := nat.