Isabelle-字符和字符串文字支持

Isabelle-字符和字符串文字支持,isabelle,theorem-proving,Isabelle,Theorem Proving,如何在Isabelle中声明字符和字符串文本?我想在Isabelle教程的trie示例中使用字符节点值(声明为'v option) 有表示8位字符的char类型和定义为字符列表的string类型。还有一些用于字符和字符串文本的语法和漂亮的打印设置: typ string (* char list *) term "''foobar''" (* ''foobar'' :: char list *) value "hd ''foobar''" (* CHR ''f'' :: char *) 请

如何在Isabelle中声明字符和字符串文本?我想在Isabelle教程的trie示例中使用字符节点值(声明为
'v option


有表示8位字符的
char
类型和定义为字符列表的
string
类型。还有一些用于字符和字符串文本的语法和漂亮的打印设置:

typ string
(* char list *)

term "''foobar''"
(* ''foobar'' :: char list *)

value "hd ''foobar''"
(* CHR ''f'' :: char *)
请注意,字符串文字必须用两个单引号分隔。字符文字必须输入为
CHR“c”
。这目前适用于大多数可打印的ASCII字符,但不适用于
0x7F
以上的字符

有函数
nat\u of_char
char\u of_nat
在这些8位字符和它们的ANSI代码之间进行转换(称为
nat

还有类型
String.literal
,它本质上是
String
的一个类型克隆,隐藏了底层列表的性质。这对于代码生成来说非常有趣,因为目标语言(例如Scala)可能提供专用的字符串类型(而不仅仅是字符列表)。
string
string.literal
之间的转换使用
内爆
分解

请注意,如果要使用字符串导出代码,可能应该导入
~/src/HOL/Library/code\u Char.thy
以将Isabelle的字符类型转换为目标语言的字符类型。即使如此,使用
字符串导出代码将导致代码使用字符列表;您需要在Isabelle代码表达式中显式使用
String.literal
,以便在SML、Scala和OCaml中获得正确的字符串类型

有一些关于将Isabelle的字符类型推广到支持多字节字符的想法,但这仍在将来

typ string
(* char list *)

term "''foobar''"
(* ''foobar'' :: char list *)

value "hd ''foobar''"
(* CHR ''f'' :: char *)