对于' struct'是否有类似于包含的命令,类似于' include'对于' sig'?

时间:2015-03-13 04:51:04

标签: sml ml isabelle

这个问题与在Isabelle / jEdit中如何与Isabelle / ML一起使用切片和Sidekick有关。

考虑两个Isar命令,sectionML。这些命令充当jEdit Sidekick插件树中的分段命令。

一个结果是我可以在THY文件中使用多个ML{*...*}语句来记录,组织和讨论ML代码,而不是使用ML_file命令导入ML。有理由不这样做,但它可能很有用。

但是有一个问题。我不知道如何打破结构中多个函数的定义。

下面,我展示了三个THY文件,以显示我尝试过的不同内容。我在这里问我的问题:“有没有办法打破一个结构,最终得到一个结构,所以我有一个名称空间用于一组函数?”

我首先想要一个名字空间,Foo

以下是我希望我的最终结果如下:

ML{* 
  Foo.val1;
  Foo.val2
*} 

打破我的签名不是问题。我可以使用include轻松完成此操作,但我不知道include的任何structure类似语句。所以,如果我的签名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个结构的sig,但后来我有2个名称空间

我明白了:

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_2Foo_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.*)
    *}

1 个答案:

答案 0 :(得分:5)

等同于include的结构级别为open

structure Foo1 = 
struct
  val val1 = "val1"
end

structure Foo2 = 
struct
  val val2 = "foo2"
end

structure Foo = 
struct
  open Foo1
  open Foo2
end