与SOME运算符的let语句

时间:2014-03-31 21:34:41

标签: isabelle

我发现自己经常想写这种形式的表达

let x = SOME x. x ∈ e1 
in e2
是的;让x成为e1e2的任意成员。它相当冗长,两次绑定x似乎有点奇怪。是否有更简洁的方式来表达这一点?

2 个答案:

答案 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"