Isabelle语法翻译:强制eta扩展?

时间:2014-04-25 09:30:49

标签: syntax isabelle

Isabelle的List理论为filter设置了语法翻译:

syntax
  -- {* Special syntax for filter *}
  "_filter" :: "[pttrn, 'a list, bool] => 'a list"    ("(1[_<-_./ _])")

translations
  "[x<-xs . P]"== "CONST filter (%x. P) xs"

确实term "filter (λ x. ¬(P x)) l"很好地打印

"[x←l . ¬ P x]"  :: "int list"

但如果表达很简单,例如ilter (λ x. P x) l,eta-contraction似乎发生了,我得到了显示

"filter P l" :: "int list"

我可以在某种程度上强制使用漂亮的语法(即[x←l . P x])吗?

1 个答案:

答案 0 :(得分:2)

您可以通过安装适当的print_translation来避免eta收缩。 HOL源中的绑定器和元组有几个示例,例如THE中的HOL.thy。它们很容易适应filter,例如:

print_translation {*
  [(@{const_syntax filter}, fn _ => fn [Abs abs, xs] =>
    let val (x, t) = Syntax_Trans.atomic_abs_tr' abs
    in Syntax.const @{syntax_const "_filter"} $ x $ t $ xs end)]
*}  -- {* To avoid eta-contraction of body *}