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]
)吗?
答案 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 *}