Pascal中的“集合”运算符

时间:2019-02-23 23:00:18

标签: pascal

我读到set of中的Pascal运算符代表数学上的“ 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将包含这两个“技能”,但是幂集如何表示呢?

1 个答案:

答案 0 :(得分:3)

slob基本上是(全部)技能组的子集,是(全部)技能组的能力组的元素。


在Pascal中,set of A(其中A是一些序数类型)是一种表示数学类型为A的元素集的类型。更准确地说,此类型的每个值都是这样的数学集合。例如,在Delphi(Pascal的现代版本)中,您拥有

TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut)

枚举和相应的TFontStyles = set of TFontStyle集类型。虽然类型TFontStyle的值只是fsBoldfsItalicfsUnderlinefsStrikeOut之一,但类型TFontStyles的值是一组字体样式(或属性),例如[fsBold, fsUnderline]。如果将标签的Font.Style属性设置为此值,则标签的字体将为粗体和下划线。

您似乎理解了这一点,所以让我专注于您似乎很困惑的“功率集”概念。

使用数学语法,考虑集合

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)的 ,与类型{{1} }是A本身的元素。


您具体问过

  

我们从skill命令中得到什么?

您将值slob := [videogames, eating]分配给变量[videogames, eating]。这是类型slob的值,并且此特定值包含成员set of skillvideogames

在后台,Delphi中的设置值使用多个字节表示(每种设置类型都有特定的大小),并且该设置中的每个可能元素都由一个特定的位表示。在Delphi中,仅当eating的值不超过256个时,才允许类型set of A。如果A有这么多值(例如AA),则这要求byte具有256位(因此,有2 ^ 256 = 1.16×10 ^类型为set of A的77个可能值。

有时人们会奇怪为什么他们不能声明类型set of A。但是整数是一个32位值,因此有2 ^ 32 = 4294967296这样的值。假设类型set of integer的值将因此需要4294967296字节或4 GB。对于单个变量来说,这是一个巨大的内存!