'struct' 是否有类似 include 命令,类似于 'sig' 的 'include'?
Is there an include-like command for 'struct', similar to 'include' for 'sig'?
此问题与 Isabelle/jEdit 中的 Isabelle/ML 如何使用分段和 Sidekick 有关。
考虑两个 Isar 命令,section
和 ML
。这些命令充当 jEdit Sidekick 插件树中的分段命令。
一个结果是我可以在 THY 文件中使用多个 ML{*...*}
语句来记录、组织和讨论 ML 代码,而不是使用 ML_file
命令导入 ML。有理由不这样做,但它很有用。
但是有一个问题。我不知道如何分解结构中多个函数的定义。
下面,我展示了三个 THY 文件,以展示我尝试过的不同内容。我在这里问我的问题:"Is there a way to break up a structure, to end up with one structure, so I have one name space for a set of functions?"
我首先想要一个名字 space, Foo
这是我希望最终结果的样子:
ML{*
Foo.val1;
Foo.val2
*}
拆掉我的签名不是问题。我可以使用 include
轻松做到这一点,但我不知道 structure
有任何类似 include
的语句。所以,如果我的签名 Foo
中有 50 个函数,我就会有一个又大又长的 ML{*...*}
命令。
theory i150312ba__sig_with_2_sig_includes___one_struct
imports Complex_Main
begin
section{* FOO_1, FOO_2, FOO *}
ML{*signature FOO_1 =
sig
val val1 : string
end*}
ML{*signature FOO_2 =
sig
val val2 : string
end*}
ML{*signature FOO =
sig
include FOO_1
include FOO_2
end*}
section{* Foo *}
ML{*structure Foo : FOO =
struct
val val1 = "val1"
val val2 = "val2"
end*}
section{* One namespace, but had to define 'Foo' all at once *}
ML{*
Foo.val1;
Foo.val2
*}
end
一个有 2 个结构的签名,但是我有 2 个名字 spaces
我明白了:
ML{*
Sig.S1.val1;
Sig.S2.val2
*}
所以下面的例子也不行:
theory i150312bb__sig_with_two_structures
imports Complex_Main
begin
section{* FOO_1, Foo_1 *}
ML{*signature FOO_1
=sig
val val1 : string
end*}
ML{*structure Foo_1 : FOO_1
=struct
val val1 = "val1"
end*}
section{* FOO_2, Foo_2 *}
ML{*signature FOO_2
=sig
val val2 : string
end*}
ML{*structure Foo_2 : FOO_2
=struct
val val2 = "val2"
end*}
section{* FOO_, Foo_ *}
ML{*signature FOO_
=sig
structure S1 : FOO_1
structure S2 : FOO_2
end*}
ML{*structure Foo : FOO_
=struct
structure S1 = Foo_1
structure S2 = Foo_2
end*}
section{* Nested namespaces; no good *}
ML{*
Foo.S1.val1;
Foo.S2.val2
*}
两个外部结构命名不同,内部结构命名相同
我有结构 Foo_1_2
和 Foo_2_2
。两者包含不同的结构,但具有相同的名称 Foo
。我尝试 open
他们两个,但最后一次使用 open
优先,所以这不起作用:
ML{*
Foo.val2;
Foo.val1 (*Not visible.*)
*}
理论:
theory i150312bc__outside_name_different__inside_name_the_name
imports Complex_Main
begin
section{* FOO_1, Foo_1, FOO_1_2, Foo_1_2 *}
ML{*signature FOO_1 =
sig
val val1 : string
end
structure Foo_1 : FOO_1 =
struct
val val1 = "val1"
end
signature FOO_1_2 = sig
structure Foo : FOO_1
end
structure Foo_1_2 : FOO_1_2 = struct
structure Foo = Foo_1
end
open Foo_1_2;
*}
section{* FOO_2, Foo_2, FOO_2_2, Foo_2_2 *}
ML{*signature FOO_2 =
sig
val val2 : string
end
structure Foo_2 : FOO_2 =
struct
val val2 = "val2"
end
signature FOO_2_2 = sig
structure Foo : FOO_2
end
structure Foo_2_2 : FOO_2_2 =
struct
structure Foo = Foo_2
end
open Foo_2_2;
*}
section{* The last 'open' takes priority *}
ML{*
Foo.val2;
Foo.val1 (*Not visible.*)
*}
相当于include
的结构级是open
:
structure Foo1 =
struct
val val1 = "val1"
end
structure Foo2 =
struct
val val2 = "foo2"
end
structure Foo =
struct
open Foo1
open Foo2
end
此问题与 Isabelle/jEdit 中的 Isabelle/ML 如何使用分段和 Sidekick 有关。
考虑两个 Isar 命令,section
和 ML
。这些命令充当 jEdit Sidekick 插件树中的分段命令。
一个结果是我可以在 THY 文件中使用多个 ML{*...*}
语句来记录、组织和讨论 ML 代码,而不是使用 ML_file
命令导入 ML。有理由不这样做,但它很有用。
但是有一个问题。我不知道如何分解结构中多个函数的定义。
下面,我展示了三个 THY 文件,以展示我尝试过的不同内容。我在这里问我的问题:"Is there a way to break up a structure, to end up with one structure, so I have one name space for a set of functions?"
我首先想要一个名字 space, Foo
这是我希望最终结果的样子:
ML{*
Foo.val1;
Foo.val2
*}
拆掉我的签名不是问题。我可以使用 include
轻松做到这一点,但我不知道 structure
有任何类似 include
的语句。所以,如果我的签名 Foo
中有 50 个函数,我就会有一个又大又长的 ML{*...*}
命令。
theory i150312ba__sig_with_2_sig_includes___one_struct
imports Complex_Main
begin
section{* FOO_1, FOO_2, FOO *}
ML{*signature FOO_1 =
sig
val val1 : string
end*}
ML{*signature FOO_2 =
sig
val val2 : string
end*}
ML{*signature FOO =
sig
include FOO_1
include FOO_2
end*}
section{* Foo *}
ML{*structure Foo : FOO =
struct
val val1 = "val1"
val val2 = "val2"
end*}
section{* One namespace, but had to define 'Foo' all at once *}
ML{*
Foo.val1;
Foo.val2
*}
end
一个有 2 个结构的签名,但是我有 2 个名字 spaces
我明白了:
ML{*
Sig.S1.val1;
Sig.S2.val2
*}
所以下面的例子也不行:
theory i150312bb__sig_with_two_structures
imports Complex_Main
begin
section{* FOO_1, Foo_1 *}
ML{*signature FOO_1
=sig
val val1 : string
end*}
ML{*structure Foo_1 : FOO_1
=struct
val val1 = "val1"
end*}
section{* FOO_2, Foo_2 *}
ML{*signature FOO_2
=sig
val val2 : string
end*}
ML{*structure Foo_2 : FOO_2
=struct
val val2 = "val2"
end*}
section{* FOO_, Foo_ *}
ML{*signature FOO_
=sig
structure S1 : FOO_1
structure S2 : FOO_2
end*}
ML{*structure Foo : FOO_
=struct
structure S1 = Foo_1
structure S2 = Foo_2
end*}
section{* Nested namespaces; no good *}
ML{*
Foo.S1.val1;
Foo.S2.val2
*}
两个外部结构命名不同,内部结构命名相同
我有结构 Foo_1_2
和 Foo_2_2
。两者包含不同的结构,但具有相同的名称 Foo
。我尝试 open
他们两个,但最后一次使用 open
优先,所以这不起作用:
ML{*
Foo.val2;
Foo.val1 (*Not visible.*)
*}
理论:
theory i150312bc__outside_name_different__inside_name_the_name
imports Complex_Main
begin
section{* FOO_1, Foo_1, FOO_1_2, Foo_1_2 *}
ML{*signature FOO_1 =
sig
val val1 : string
end
structure Foo_1 : FOO_1 =
struct
val val1 = "val1"
end
signature FOO_1_2 = sig
structure Foo : FOO_1
end
structure Foo_1_2 : FOO_1_2 = struct
structure Foo = Foo_1
end
open Foo_1_2;
*}
section{* FOO_2, Foo_2, FOO_2_2, Foo_2_2 *}
ML{*signature FOO_2 =
sig
val val2 : string
end
structure Foo_2 : FOO_2 =
struct
val val2 = "val2"
end
signature FOO_2_2 = sig
structure Foo : FOO_2
end
structure Foo_2_2 : FOO_2_2 =
struct
structure Foo = Foo_2
end
open Foo_2_2;
*}
section{* The last 'open' takes priority *}
ML{*
Foo.val2;
Foo.val1 (*Not visible.*)
*}
相当于include
的结构级是open
:
structure Foo1 =
struct
val val1 = "val1"
end
structure Foo2 =
struct
val val2 = "foo2"
end
structure Foo =
struct
open Foo1
open Foo2
end