如何定义此数据类型的语法和翻译?

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)

我见过在左侧使用变量的其他语法,并且它们的翻译有效。我可以知道为什么我的不起作用,我该如何解决这个问题?

提前致谢!

您的示例中有几个问题可以解释您收到的错误消息:

  1. 给定一个 AST 重写规则(lhsrhs),它必须满足 rhs 也必须出现在 lhs 中。由于您通过 同时定义了两个 AST 重写规则,即解析规则 () 和打印规则 (),结果是变量 c不会出现在打印规则的 lhs 中。我猜 c 的预期目的是在 rhs 而不是 True.
  2. 中使用它
  3. 在处理 rhs 时,Isabelle 假设 SomeNone 变量 而不是常量,因此您需要使用 CONST 前缀来强制执行常量处理(例如,CONST NoneCONST Some a)。
  4. ''example'' 等字符串文字也被视为变量。在这种情况下,添加 CONST 是行不通的,因此您可以改用 [CHR 0x65, CHR 0x78, CHR 0x61, CHR 0x6d, CHR 0x70, CHR 0x6c, CHR 0x65],这很麻烦。我不知道还有其他选择。
  5. 在 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 节