Coq 在模块实现中使用模块签名定义

Coq 在模块实现中使用模块签名定义,coq,Coq,我不太熟悉Coq中的模块,但最近我问了一个问题。我有以下代码 Module Type Sig. Parameter n : nat. Definition n_plus_1 := n + 1. End Sig. Module ModuleInstance <: Sig. Definition n := 3. End ModuleInstance. 模块类型Sig。 参数n:nat。 定义n加1:=n+1。 结束信号。 模块ModuleInstance您需要将定义放入一个单独的“模块函子

我不太熟悉Coq中的模块,但最近我问了一个问题。我有以下代码

Module Type Sig.
Parameter n : nat.
Definition n_plus_1 := n + 1.
End Sig.

Module ModuleInstance <: Sig.
Definition n := 3.
End ModuleInstance.
模块类型Sig。
参数n:nat。
定义n加1:=n+1。
结束信号。

模块ModuleInstance您需要将定义放入一个单独的“模块函子”(基本上是一个模块级函数:这些模块将其他模块作为参数)中,以便
Sig
仅包含参数:

Module Type Sig.
  Parameter n : nat.
End Sig.

(* this is the module functor *)
Module SigUtils (S:Sig).
  Definition n_plus_1 := S.n + 1.
End SigUtils.

Module ModuleInstance <: Sig.
  Definition n := 3.
End ModuleInstance.

Module ModuleInstanceUtils := SigUtils ModuleInstance.
模块类型Sig。
参数n:nat。
结束信号。
(*这是模函子*)
模块信号(S:Sig)。
定义n加1:=S.n+1。
结束信号。
Module ModuleInstance有时可以使用
Include
,它支持非常有限的递归链接特例。 与该答案类似,您应该将定义放在模块函子中,但是您可以
将其包含在签名的其余部分和实现模块中。这允许重用定义来缩短声明,并将它们作为同一模块的一部分

Require Import Omega.

Module Type Sig.
  Parameter n : nat.
End Sig.

(* this is the module functor *)
Module SigUtils (S:Sig).
  Definition n_plus_1 := S.n + 1.
End SigUtils.

Module ModuleInstance <: Sig.
  Definition n := 3.
  Include SigUtils.
End ModuleInstance.
Print ModuleInstance.

Module Type Sig2 <: Sig.
  Include Sig.
  Include SigUtils.
  Parameter n_plus_1_eq: n_plus_1 = 1 + n.
End Sig2.

Module ModuleInstance2 <: Sig2.
  Include ModuleInstance.

  Lemma n_plus_1_eq: n_plus_1 = 1 + n.
  Proof. unfold n_plus_1. omega. Qed.

  Lemma n_plus_1_neq: n_plus_1 <> 2 + n.
  Proof. unfold n_plus_1. omega. Qed.
End ModuleInstance2.

Print ModuleInstance2.
需要导入欧米茄。
模块类型Sig。
参数n:nat。
结束信号。
(*这是模函子*)
模块信号(S:Sig)。
定义n加1:=S.n+1。
结束信号。
模块ModuleInstance它抱怨“正确”,即
ModuleInstance
应提供签名中定义的所有字段。另一个主题是签名中对
定义的解释应该是什么。