如何定义此数据类型的语法和翻译?
How do I define syntax and translations for this datatype?
所以目前我有以下数据类型:
datatype ('a) action = Action (name: string) "int option" "int option" "'a option" "bool option" "string option"
我想定义语法,以便术语 example(3, 4, True)
将被翻译成 Action ''example'' (Some 3) (Some 4) None (Some True) None
。
到目前为止我所做的如下:
syntax
"_example" :: "[int, int, bool] ⇒ 'a action" ("3example'((_), (_), (_)')" [60, 60, 60] 60)
translations
"_example a b c" ⇌ "CONST Action ''example'' (Some a) (Some b) None (Some True) None"
不幸的是,伊莎贝尔抱怨右侧包含太多变量。
Error in syntax translation rule: rhs contains extra variables
("_example" a b c) ↝
("\<^const>Scratch.action.Action" ("_String" ''example'')
(Some a) (Some b) None (Some True) None)
我见过在左侧使用变量的其他语法,并且它们的翻译有效。我可以知道为什么我的不起作用,我该如何解决这个问题?
提前致谢!
您的示例中有几个问题可以解释您收到的错误消息:
- 给定一个 AST 重写规则(lhs,rhs),它必须满足 rhs 也必须出现在 lhs 中。由于您通过
⇌
同时定义了两个 AST 重写规则,即解析规则 (⇀
) 和打印规则 (↽
),结果是变量 c
不会出现在打印规则的 lhs 中。我猜 c
的预期目的是在 rhs 而不是 True
. 中使用它
- 在处理 rhs 时,Isabelle 假设
Some
和 None
是 变量 而不是常量,因此您需要使用 CONST
前缀来强制执行常量处理(例如,CONST None
和 CONST Some a
)。
-
''example''
等字符串文字也被视为变量。在这种情况下,添加 CONST
是行不通的,因此您可以改用 [CHR 0x65, CHR 0x78, CHR 0x61, CHR 0x6d, CHR 0x70, CHR 0x6c, CHR 0x65]
,这很麻烦。我不知道还有其他选择。
- 在 mixfix 注释中使用块缩进时需要添加最外层的括号,即您需要编写
"(3example'((_), (_), (_)'))"
而不是 "3example'((_), (_), (_)')"
。
因此,对于您的特定示例,我的建议是使用如下缩写:
abbreviation example :: "[int, int, bool] ⇒ 'a action" ("(3example'((_), (_), (_)'))" [60, 60, 60] 60) where
"example(a, b, c) ≡ Action ''example'' (Some a) (Some b) None (Some c) None"
有关语法转换和 mixfix 注释的更多信息,请分别参阅 The Isabelle/Isar Reference Manual
中的第 8.5 节和第 8.2 节
所以目前我有以下数据类型:
datatype ('a) action = Action (name: string) "int option" "int option" "'a option" "bool option" "string option"
我想定义语法,以便术语 example(3, 4, True)
将被翻译成 Action ''example'' (Some 3) (Some 4) None (Some True) None
。
到目前为止我所做的如下:
syntax
"_example" :: "[int, int, bool] ⇒ 'a action" ("3example'((_), (_), (_)')" [60, 60, 60] 60)
translations
"_example a b c" ⇌ "CONST Action ''example'' (Some a) (Some b) None (Some True) None"
不幸的是,伊莎贝尔抱怨右侧包含太多变量。
Error in syntax translation rule: rhs contains extra variables
("_example" a b c) ↝
("\<^const>Scratch.action.Action" ("_String" ''example'')
(Some a) (Some b) None (Some True) None)
我见过在左侧使用变量的其他语法,并且它们的翻译有效。我可以知道为什么我的不起作用,我该如何解决这个问题?
提前致谢!
您的示例中有几个问题可以解释您收到的错误消息:
- 给定一个 AST 重写规则(lhs,rhs),它必须满足 rhs 也必须出现在 lhs 中。由于您通过
⇌
同时定义了两个 AST 重写规则,即解析规则 (⇀
) 和打印规则 (↽
),结果是变量c
不会出现在打印规则的 lhs 中。我猜c
的预期目的是在 rhs 而不是True
. 中使用它
- 在处理 rhs 时,Isabelle 假设
Some
和None
是 变量 而不是常量,因此您需要使用CONST
前缀来强制执行常量处理(例如,CONST None
和CONST Some a
)。 -
''example''
等字符串文字也被视为变量。在这种情况下,添加CONST
是行不通的,因此您可以改用[CHR 0x65, CHR 0x78, CHR 0x61, CHR 0x6d, CHR 0x70, CHR 0x6c, CHR 0x65]
,这很麻烦。我不知道还有其他选择。 - 在 mixfix 注释中使用块缩进时需要添加最外层的括号,即您需要编写
"(3example'((_), (_), (_)'))"
而不是"3example'((_), (_), (_)')"
。
因此,对于您的特定示例,我的建议是使用如下缩写:
abbreviation example :: "[int, int, bool] ⇒ 'a action" ("(3example'((_), (_), (_)'))" [60, 60, 60] 60) where
"example(a, b, c) ≡ Action ''example'' (Some a) (Some b) None (Some c) None"
有关语法转换和 mixfix 注释的更多信息,请分别参阅 The Isabelle/Isar Reference Manual
中的第 8.5 节和第 8.2 节