我很难弄清楚如何编写此代码。
例如,我有一个签名A
,一个仿函数C
将a: A
作为参数,为了能够使用C
,我定义了一个模块{{ 1}}实现签名B
A
并支持我输入Require Import String.
Module Type A.
Parameter toto : string -> nat.
End A.
Module C (Import a : A).
...
End C.
Module B <: A.
Definition toto (s: string) := foo s.
End B. (* COQ error *)
然后在foo: string -> string list-> nat.
处,End B.
发出错误说{} {}}
或另一种方式:
Coq
我会在signature components for label toto do not match: types differ.
我理解这个问题是因为我没有在Module B.
Definition too (s : string) := foo s.
End B.
Module Export D := C B.
的定义中提供D
参数。
所以我的问题是我不知道如何在这种情况下提供参数string list
。
在我的真实代码中,我使用toto
和string list
类型而不是Section
。
Record
然后我打开Module
Record A : Type := mkA { too : string -> nat}.
您能否帮我写一下或了解如何才能正确地在模块中编写仿函数Section
?有没有办法在模块中定义/声明变量Section B.
Variable l: string list.
Definition too (s: string) := foo s l.
Definition A := mkA too.
End B.
?在B
中定义后,我会将其提取到string list
。
答案 0 :(得分:1)
你可以随时这样做:
Require Import String.
Parameter foo: string -> list string -> nat.
Module Type A.
Parameter toto : string -> nat.
End A.
Module B <: A.
Variable (* or Parameter, or Axiom *) ls : list string.
Definition toto (s: string) := foo s ls.
End B.
但据我所知,只会使ls成为公理......另一种解决方案是延迟提供ls:
ModuleType HasListString.
Parameter ls : list string.
End HasListString.
Module B(LS: HasListString) : A.
Definition toto (s: string) := foo s LS.ls.
End B.
这可能不是你需要的。没有背景,很难给你更好的建议。