我发现自己经常想写这种形式的表达
let x = SOME x. x ∈ e1
in e2
是的;让x
成为e1
中e2
的任意成员。它相当冗长,两次绑定x
似乎有点奇怪。是否有更简洁的方式来表达这一点?
答案 0 :(得分:3)
有一个比从HOL复制let
的设置更简单的解决方案,即通过为let
提供另一个产品来扩展letbind
的现有语法翻译。
abbreviation Let_SOME :: "'a set => ('a => 'b) => 'b"
where "Let_SOME s f == let x = SOME x. x ∈ s in f x"
syntax
"_bindSOME" :: "[pttrn, 'a] => letbind" ("(2_ ∈/ _)" 10)
translations
"let x ∈ a in e" == "CONST Let_SOME a (%x. e)"
这比您的独立解决方案更有优势,您可以将传统let
绑定与新绑定混合,如
term "let x = 5; y ∈ {1,2}; z = 6 in x + y + z"
答案 1 :(得分:1)
我检查了处理let x = e1 in e2
语法的方式(http://isabelle.in.tum.de/library/HOL/HOL/HOL.html),发现我可以大部分复制该机制以提供新的let x ∈ e1 in e2
语法。这是我的代码(我刚刚将let
重命名为lett
):
nonterminal lettbinds and lettbind
syntax
"_bind" :: "[pttrn, 'a] => lettbind" ("(2_ ∈/ _)" 10)
"" :: "lettbind => lettbinds" ("_")
"_binds" :: "[lettbind, lettbinds] => lettbinds" ("_;/ _")
"_Lett" :: "[lettbinds, 'a] => 'a" ("(let (_)/ in (_))" [0, 10] 10)
definition Lett :: "'a set ⇒ ('a ⇒ 'b) ⇒ 'b"
where "Lett s f ≡ let x = SOME x. x ∈ s in f x"
translations
"_Lett (_binds b bs) e" == "_Lett b (_Lett bs e)"
"let x ∈ a in e" == "CONST Lett a (λx. e)"
快速测试:
value "let x ∈ {2::int,3} in x+x"