Isabelle 带运算符的let语句

Isabelle 带运算符的let语句,isabelle,Isabelle,我发现自己经常想写这种形式的表达 let x = SOME x. x ∈ e1 in e2 就是,;让x成为e2中e1的任意成员。它相当冗长,而且必须绑定x两次似乎有点奇怪。有没有更简洁的方法来表达这一点?我检查了e2语法中的let x=e1()的处理方式,发现我可以复制该机制来提供一个新的let x∈ e2中的e1语法。这是我的代码(我刚刚把let改名为lett): 作为快速测试: value "let x ∈ {2::int,3} in x+x" 我检查了e2语法中的let x=e1的

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

let x = SOME x. x ∈ e1 
in e2

就是,;让
x
成为
e2
e1
的任意成员。它相当冗长,而且必须绑定
x
两次似乎有点奇怪。有没有更简洁的方法来表达这一点?

我检查了e2语法中的
let x=e1()的处理方式,发现我可以复制该机制来提供一个新的
let x∈ e2中的e1
语法。这是我的代码(我刚刚把
let
改名为
lett
):

作为快速测试:

value "let x ∈ {2::int,3} in x+x"

我检查了e2
语法中的
let x=e1的处理方式(),发现我基本上可以复制该机制来提供一个新的
let x∈ e2中的e1
语法。这是我的代码(我刚刚把
let
改名为
lett
):

作为快速测试:

value "let x ∈ {2::int,3} in x+x"

有一个比从HOL复制
let
的设置更简单的解决方案,即通过为
letbind
提供另一个产品来扩展
let
的现有语法翻译

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"

有一个比从HOL复制
let
的设置更简单的解决方案,即通过为
letbind
提供另一个产品来扩展
let
的现有语法翻译

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"