Isabelle中如何声明字符和字符串文字?我想在Isabelle教程的trie示例中使用一个字符节点值(声明为'v option
)。
datatype ('a,'v)trie = Trie "'v option" "('a * ('a,'v)trie)list"
答案 0 :(得分:3)
有char
类型(代表8位字符)和string
类型(定义为字符列表)。字符和字符串文字还有一些语法和漂亮的打印设置:
typ string
(* char list *)
term "''foobar''"
(* ''foobar'' :: char list *)
value "hd ''foobar''"
(* CHR ''f'' :: char *)
请注意,字符串文字必须用两个单引号''
分隔。必须将字符文字输入为CHR ''c''
。这当前适用于大多数可打印的ASCII字符,但不在0x7F
之上。
有些函数nat_of_char
和char_of_nat
可以在这些8位字符及其ANSI代码之间进行转换(重新命名为nat
)。
还有类型String.literal
,它本质上是string
的类型克隆,隐藏了基础列表的性质。这主要用于代码生成,因为目标语言(例如Scala)可能提供专用的字符串类型(而不仅仅是字符列表)。 string
和String.literal
之间的转换时间为implode
和explode
。
请注意,如果您想使用字符串导出代码,则应该导入~~/src/HOL/Library/Code_Char.thy
以将Isabelle的字符类型转换为目标语言的字符类型。即使这样,使用string
导出代码也会导致代码使用字符列表;你需要在你的Isabelle代码方程中明确使用String.literal
,以便在SML,Scala和OCaml中获得正确的字符串类型。
对于Isabelle的字符类型的一般化有一些想法,以支持多字节字符,但这仍然是将来。