我想将字符串输出到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的表示之间的必要转换至关重要。
这是最好的方式吗?