在Isabelle中定义有限集

在Isabelle中定义有限集,isabelle,Isabelle,如何在Isabelle中定义常量集?例如{1,2,3}(给它一个更有趣的扭曲,1,2,3是实数),或者{x\in N:x

如何在Isabelle中定义常量集?例如{1,2,3}(给它一个更有趣的扭曲,1,2,3是实数),或者{x\in N:x 我想在所有情况下都是这样的

definition a_set :: set
  where "a_set ⟷ ??? "
但是用正确的东西替换
的各种尝试都失败了


不知怎的,我找到的所有教程都谈到了在集合上定义函数,但我找不到像这样的简单例子来学习。

使用
definition
命令定义常量。它采用一个在左侧定义符号的等式,例如
定义“x=5”
定义“f=(λx.x+1)”
。为了提高可读性,函数参数可以出现在等式的左侧,例如
fx=x+1

问题是您正在使用
(“当且仅当”运算符,即布尔数相等)。当你有布尔值时,最好使用它而不是简单的
=
,因为它可以保存括号:你可以写'px'⟷ x=2∨ x=5'而不是'px=(x=2∨ x=5。(与逻辑连接词相比,
=
运算符绑定的强度更大∨
,绑定更弱)

只是另一种专门针对布尔人的书写方式。这意味着,如果定义的内容不返回布尔值,
不起作用。只需使用常规的
=

definition A :: "real set" where
  "A = {1, 2, 3}"
或者,举另一个例子:

definition B :: "complex set set" where
  "B = {ℕ, ℝ, UNIV}"
注意HOL是一个类型化逻辑;这意味着你不能只是这样做

definition a_set :: set
因为没有所有集合的类型。只有一种类型的所有集合的元素具有特定的类型,例如
nat set
(real⇒ 实际)设置
或确实
nat设置
。只说
set
会给您一条错误消息“无法解析类型”,因为
set
是一个类型构造函数,需要一个类型参数,而您没有给它任何类型参数


关于布景{ℕ, ℝ, ℂ}, 这是上面定义的常量
B
I,作为示例。没有
UNIV::complex set
UNIV
是所讨论类型的所有值的集合)ℕ 及ℝ 在这种情况下,自然数和实数的集合是复数的子集。

答案很好,thx!但不知何故,一个稍微复杂的集合定义,如
定义a::“nat set”其中“a={n∈ℕ . 这里请注意我的答案:这是一个代码生成失败的示例,
value
返回到其他方法,并且输出不是非常有用。尽管有时看起来很有用,但Isabelle实际上无法发挥神奇的作用。计算表达式需要Isabelle为所有涉及的常量建立代码方程d、 由于常数涉及对无限集合(自然数)的集合理解,因此没有可用的代码方程。当然,您的示例非常简单,但代码生成器不知道这一点。顺便说一下ℕ 在中,存在冗余,因为您的集合类型为
nat set
,所以
与UNIV
相同。您可以简单地编写:
“A={n。在这种情况下,让评估工作的通常方法是提供一个代码等式,例如,在您的情况下,
引理A_code[code]:“A={0,1}”by(auto simp:A_def)
。然后
起作用。