如何从Isabelle中的一组中选择任意但固定的元素?所选元素将用作集合中的随机元素以供进一步处理,但不得进一步使用其他元素。
我的第一次尝试是:
theory Scratch
imports Main Orderings
begin
value "(let el ∈ {3::int, 4, 5} in el)"
end
但是语法错误。
我的第二次尝试是:
theory Scratch
imports Main Orderings
begin
value "(let el = (SOME x . x ∈ {{3::int, 4},
{5::int, 6} ,
{7::int, 8}})
in el)"
end
提供类型int set
而非预期类型int
。
修改1
一个新的例子:
theory Scratch
imports Main Orderings
begin
fun add :: "int set ⇒ int" where
"add st = (let el = (SOME x . x ∈ st) in el + (10::int))"
value "add {3::int, 4, 5, 6}"
end
代码的结果是:
"(SOME u. 3 = u ∨ 4 = u ∨ 5 = u ∨ 6 = u) + 10"
:: "int"
而不是整数值。如何写add
以使结果为13,14,15或16?确切的值无关紧要,每次执行函数时都必须不同。
答案 0 :(得分:2)
您获得int set
的原因是您从int set set
中选择了一个元素。在第二次尝试中,您使用的是嵌套集,而不是使用“平面”集。
除了您的具体问题,我建议您查看folding
理论中的Finite_Set
语言环境。它提供了一个用于折叠集合的组合器(假设操作员通勤)。
答案 1 :(得分:1)
您可以定义
definition "el = (SOME x. x ∈ {(3::int), 4, 5})"
然后你可以证明。
lemma "el ∈ {3,4,5}"
unfolding el_def by (rule someI_ex) auto
逻辑上,el
是{3, 4, 5}
的一些固定元素(正如我们刚刚证明的那样),并且总是相同的元素 - 但你不知道哪一个。您可以将其视为“当宇宙存在时,它选择了SOME x. x ∈ {3,4,5}
的值,3
,4
或5
,但它永远无法分辨你是哪一个。'
我不知道你想要做什么,但我不认为这是你真正想要做的。也许你可以详细了解一下你想用这个元素做些什么?