如何在Isabelle中使用附加参数定义绑定器的语法?

时间:2018-01-21 21:06:34

标签: syntax isabelle

我想在Isabelle中定义一个语法结构,其形式为c ? x. p,其中cp是值,x是变量。此构造应转换为Input c (λx. p)。看起来这不能通过binder注释来完成,因为这个构造有一个额外的参数c,而且不能绑定多个变量。我该如何定义这样的构造?

1 个答案:

答案 0 :(得分:1)

可以使用低级syntaxtranslations工具。假设c的类型为channelpInput c (λx. p)的类型为process,且所需的优先级为100,则可以定义构造如下:

syntax
  "_Input" :: "channel ⇒ pttrn ⇒ process ⇒ process"
  ("(3_ ? _./ _)" [101, 0, 100] 100)
translations
  "c ? x. P" ⇌ "CONST Input c (λx. P)"

Isabelle / Isar参考手册的8.2.1小节中描述了这些语法定义。要理解上述解决方案,另请参阅第8.2.2和8.2.3小节可能会有所帮助,这部分解释了更高级别的infixinfixlinfixr,并且binder构造可以转换为低级定义。另外,查看$ISABELLE_HOME/src/HOL/Set.thy中集合理解结构的定义可能很有用。