Pascal 中的 "set of" 运算符
The "set of" operator in Pascal
我读到 Pascal
中的 set of
运算符代表数学“Power Set”,但我似乎无法理解。
比如我有下面这段代码:
program setDemo(output);
type
skill = (cooking, cleaning, driving, videogames, eating);
var
slob: set of skill;
begin
slob := [videogames, eating];
end.
我们从 slob := [videogames, eating]
命令中得到了什么?我猜 slob
将包含这两个 "skills",但它如何由幂集表示?
基本上,作为(所有)技能集的一个子集,slob
是(所有)技能集的力量集的一个元素。
在 Pascal 中,set of A
,其中 A
是某种序数类型,是一种表示类型为 A
的元素的数学集的类型。更准确地说,这种类型的每个值都是这样一个数学集。例如,在 Delphi(Pascal 的现代版本)中,您有
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut)
枚举和对应的TFontStyles = set of TFontStyle
集合类型。 TFontStyle
类型的值只是 fsBold
、fsItalic
、fsUnderline
或 fsStrikeOut
之一,而 TFontStyles
类型的值是一组字体样式(或属性),例如 [fsBold, fsUnderline]
。如果将标签的 Font.Style
属性 设置为此值,标签的字体将是粗体和下划线。
你似乎明白这一点,所以让我把重点放在 'power set' 概念上,你似乎对此感到困惑。
使用数学语法,考虑集合
A = {cooking, cleaning, driving, gaming, eating}
技能。 A 的幂集,有时表示为 P(A) 或 2^A,是 A 的所有子集的集合。(因此,它是一个成员为集合的集合。)下面列出了该集合的一些成员:
{} (=the empty set)
{cooking}
{driving}
{cooking, cleaning}
{cleaning, gaming, eating}
{cooking, cleaning, driving, eating}
{cooking, cleaning, driving, gaming, eating} (=A)
P(A)总共由2^|A|组成= 2^5 = 32 个元素。实际上,在 A 的给定子集中,cooking
是其中的一部分或不是(2 个选项),并且对于这些选项中的每一个,cleaning
是子集的一部分或不是(2 个选项),依此类推。组合总数因此变成2×2×...×2 = 32.
现在,给定 Pascal 枚举
skill = (cooking, cleaning, driving, gaming, eating)
set of skill
是一种类型,其值是 skill
值的集合,例如 [cooking, cleaning]
或 [cleaning, gaming, eating]
(使用 Pascal 语法)。显然,每个这样的值——A 的 子集 ——是 P(A) 的 元素,与每个值的方式大致相同skill
类型的是 A 本身的一个元素。
你问的具体,
What do we get from slob := [videogames, eating]
command?
您将值 [videogames, eating]
分配给变量 slob
。这是一个 set of skill
类型的值,这个特定值包含成员 videogames
和 eating
.
在幕后,Delphi 中的集合值使用多个字节表示(每个集合类型都有特定的大小),集合中的每个可能元素由特定位表示。在 Delphi 中,仅当 A
的值不超过 256 个时才允许类型 set of A
。如果 A
有这么多值(假设 A
是 byte
),这需要 set of A
有 256 位(所以有 2^256 = 1.16 × 10^ set of A
).
类型的 77 个可能值
有时人们想知道为什么他们不能声明类型 set of integer
。但是一个整数是一个 32 位的值,所以有 2^32 = 4294967296 个这样的值。因此,假设类型 set of integer
的值将需要 4294967296 字节或 4 GB。对于单个变量来说,这是一个巨大的内存量!
我读到 Pascal
中的 set of
运算符代表数学“Power Set”,但我似乎无法理解。
比如我有下面这段代码:
program setDemo(output);
type
skill = (cooking, cleaning, driving, videogames, eating);
var
slob: set of skill;
begin
slob := [videogames, eating];
end.
我们从 slob := [videogames, eating]
命令中得到了什么?我猜 slob
将包含这两个 "skills",但它如何由幂集表示?
基本上,作为(所有)技能集的一个子集,slob
是(所有)技能集的力量集的一个元素。
在 Pascal 中,set of A
,其中 A
是某种序数类型,是一种表示类型为 A
的元素的数学集的类型。更准确地说,这种类型的每个值都是这样一个数学集。例如,在 Delphi(Pascal 的现代版本)中,您有
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut)
枚举和对应的TFontStyles = set of TFontStyle
集合类型。 TFontStyle
类型的值只是 fsBold
、fsItalic
、fsUnderline
或 fsStrikeOut
之一,而 TFontStyles
类型的值是一组字体样式(或属性),例如 [fsBold, fsUnderline]
。如果将标签的 Font.Style
属性 设置为此值,标签的字体将是粗体和下划线。
你似乎明白这一点,所以让我把重点放在 'power set' 概念上,你似乎对此感到困惑。
使用数学语法,考虑集合
A = {cooking, cleaning, driving, gaming, eating}
技能。 A 的幂集,有时表示为 P(A) 或 2^A,是 A 的所有子集的集合。(因此,它是一个成员为集合的集合。)下面列出了该集合的一些成员:
{} (=the empty set)
{cooking}
{driving}
{cooking, cleaning}
{cleaning, gaming, eating}
{cooking, cleaning, driving, eating}
{cooking, cleaning, driving, gaming, eating} (=A)
P(A)总共由2^|A|组成= 2^5 = 32 个元素。实际上,在 A 的给定子集中,cooking
是其中的一部分或不是(2 个选项),并且对于这些选项中的每一个,cleaning
是子集的一部分或不是(2 个选项),依此类推。组合总数因此变成2×2×...×2 = 32.
现在,给定 Pascal 枚举
skill = (cooking, cleaning, driving, gaming, eating)
set of skill
是一种类型,其值是 skill
值的集合,例如 [cooking, cleaning]
或 [cleaning, gaming, eating]
(使用 Pascal 语法)。显然,每个这样的值——A 的 子集 ——是 P(A) 的 元素,与每个值的方式大致相同skill
类型的是 A 本身的一个元素。
你问的具体,
What do we get from
slob := [videogames, eating]
command?
您将值 [videogames, eating]
分配给变量 slob
。这是一个 set of skill
类型的值,这个特定值包含成员 videogames
和 eating
.
在幕后,Delphi 中的集合值使用多个字节表示(每个集合类型都有特定的大小),集合中的每个可能元素由特定位表示。在 Delphi 中,仅当 A
的值不超过 256 个时才允许类型 set of A
。如果 A
有这么多值(假设 A
是 byte
),这需要 set of A
有 256 位(所以有 2^256 = 1.16 × 10^ set of A
).
有时人们想知道为什么他们不能声明类型 set of integer
。但是一个整数是一个 32 位的值,所以有 2^32 = 4294967296 个这样的值。因此,假设类型 set of integer
的值将需要 4294967296 字节或 4 GB。对于单个变量来说,这是一个巨大的内存量!