将字符串输出到Isabelle / HOL

时间:2016-01-18 15:00:58

标签: isabelle

我想将字符串输出到Isabelle / HOL理论的文件中。

我提出的解决方案涉及在ML级别进行文件和字符串操作。

例如,让我们假设以下Isabele / HOL代码定义了一种非常简单的表达式语言的抽象语法:

datatype Exp = expid string
   | exppar Exp
   | expplus Exp Exp
   | expminus Exp Exp
   | expnum int 

我想将这种简单语言的漂亮表达输出到文件中。例如,表达式如:

definition exp_exmp :: "Exp"
where
   "exp_exmp ≡ expplus 
      (exppar (expminus (expnum 2) (expid ''x''))) 
      (exppar (expplus (expid ''y'') (expnum 5)))"

我设法通过使用Isabele / HOL的代码生成功能在ML级别执行此操作:

export_code exp_exmp expid str_int in SML module_name Example file "example.sml"

为了方便字符串操作,我在ML中定义了漂亮的打印功能。所以我最终得到了代码:

ML_file "example.sml"

ML {*   
   open Example;
   fun charsToStr [] = ""
      | charsToStr (c::cs) = (str c)^charsToStr cs
   fun wrExp (Expid i) = charsToStr i
      | wrExp (Exppar e) = "(" ^ wrExp e ^ ")"
      | wrExp (Expnum n) = charsToStr (str_int n)
      | wrExp (Expplus (e1, e2)) =
         wrExp e1 ^"+"^wrExp e2
      | wrExp (Expminus (e1, e2)) =
         wrExp e1 ^ "-" ^ wrExp e2
   val file = TextIO.openOut("exmp.txt");
   TextIO.output (file, wrExp exp_exmp);
   TextIO.closeOut(file);
*}

在这样做时,导入理论"~~/src/HOL/Library/Code_Char"对于简化字符串和字符串的Isabelle / HOL表示与ML的表示之间的必要转换至关重要。

这是最好的方式吗?

0 个答案:

没有答案