如何在Isabelle中定义常量集?例如{1,2,3}之类的东西(给它一个更有趣的转折,1,2,3为实数),或者{x \ in N:x< m},其中m是某个固定数字 - 或者可能更难,集合{N,R,C},其中N是自然数,R是实数,C是复数。
我想在所有情况下都必须像
???
但是用正确的东西替换{{1}}的各种尝试都失败了。
不知怎的,我发现的所有教程都谈到了在集合上定义函数 - 但我找不到像这样的简单例子来学习。
答案 0 :(得分:1)
definition
命令定义一个常量。它采用单个方程,其符号在左侧定义,例如definition "x = 5"
或definition "f = (λx. x + 1)"
。为了提高可读性,函数参数可以出现在等式的左侧,例如, f x = x + 1
。
问题是你正在使用⟷
('if if only if'运算符,即布尔运算的相等性)。当你有布尔人时,使用它而不是简单的=
是一个好主意,因为它保存了括号:你可以写'Px⟷x=2∨x= 5'而不是'P x =( 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 ⇒ real) set
或nat set set
。只是说set
会给你一个错误消息'无法解析类型',因为set
是一个类型构造函数,它需要一个类型参数而你没有给它。
关于集合{ℕ,ℝ,ℂ},这是我在上面定义的常量B
作为示例。伊莎贝尔没有ℂ
,因为那只是UNIV :: complex set
。 (UNIV
是所讨论类型的所有值的集合)。请注意,在这种情况下,ℕ和are是自然数字和实数的集合,作为复数的子集。