isabelle-选择任意但固定的元素

isabelle-选择任意但固定的元素,isabelle,Isabelle,如何从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:

如何从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
但是给出了一个语法错误

我的第二次尝试是:

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集
,而不是预期的类型
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?确切的值并不重要,它必须在每次执行函数时都不同。

因此得到
int set
的原因是您从
int set
中选择了一个元素。在第二次尝试中,您使用了嵌套集,而不是使用“平面”集

除了你的具体问题,我建议你看看
有限集
理论中的
折叠
区域设置。它提供了一个用于折叠集合的组合器(假定操作员通勤)。

您可以定义

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}
的某个固定元素(正如我们刚才证明的),它总是同一个元素,但你不知道是哪一个。你可以把它想象成“当宇宙诞生时,它为某个x选择了一个值。x∈ {3,4,5},或者
3
4
,或者
5
,但它永远不会告诉你它是哪一个。”


我不知道你到底想做什么,但我不认为这是你真正想做的。也许您可以更详细地了解如何使用该元素?

例如,所选元素将传递给一个将值加倍的函数。我需要知道所选的值。在C++中,我将创建一个集合的列表,选择一个随机索引并返回那个索引的值。你到底想证明什么?我想描述一个数据流网络,并证明如果这个网络满足一些性质,其他一些性质也将是有效的。当我想查看数据如何在网络中流动时,元素的选择是相关的。