我想在Isabelle中定义一个语法结构,其形式为c ? x. p
,其中c
和p
是值,x
是变量。此构造应转换为Input c (λx. p)
。看起来这不能通过binder
注释来完成,因为这个构造有一个额外的参数c
,而且不能绑定多个变量。我该如何定义这样的构造?
答案 0 :(得分:1)
可以使用低级syntax
和translations
工具。假设c
的类型为channel
,p
和Input 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小节可能会有所帮助,这部分解释了更高级别的infix
,infixl
,infixr
,并且binder
构造可以转换为低级定义。另外,查看$ISABELLE_HOME/src/HOL/Set.thy
中集合理解结构的定义可能很有用。