Оператор "набор" в Паскале - PullRequest
       9

Оператор "набор" в Паскале

0 голосов
/ 24 февраля 2019

Я читал, что оператор 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 голосов
/ 24 февраля 2019

По сути, будучи подмножеством набора (всех) навыков, slob является элементом набора мощности набора (всех) навыков.


В Паскале, 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 метки это значение, шрифт метки будет выделен жирным шрифтом и подчеркнут.

Похоже, вы понимаете это, поэтому позвольте мне вместо этого сосредоточиться на концепции «набора мощности», которая вам кажетсячтобы запутаться.

Используя математический синтаксис, рассмотрим набор

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.

Теперь, учитывая перечисление Паскаля

skill = (cooking, cleaning, driving, gaming, eating)

set of skill - это тип, значения которого являются наборамиskill значений, таких как [cooking, cleaning] или [cleaning, gaming, eating] (с использованием синтаксиса Паскаля).Очевидно, что каждое такое значение - подмножество A - является элементом P (A), во многом так же, как каждое значение типа skill является элементомсамого А1058 * в переменную slob.Это значение типа set of skill, и это конкретное значение содержит элементы videogames и eating.

. Под капотом заданное значение в Delphi представляется с использованием количества байтов (каждый набортип имеет определенный размер), и каждый возможный элемент в наборе представлен определенным битом.В Delphi тип set of A разрешен, только если A имеет не более 256 значений.Если A имеет столько значений (скажем, если A равно byte), для этого требуется set of A, чтобы иметь 256 бит (так что существует 2 ^ 256 = 1,16 × 10 ^ 77 возможных значений типа set of A).

Иногда люди задаются вопросом, почему они не могут объявить тип set of integer.Но целое число - это 32-разрядное значение, поэтому существует 2 ^ 32 = 4294967296 таких значений.Таким образом, значение гипотетического типа set of integer потребует 4294967296 байт или 4 ГБ.Это огромный объем памяти для одной переменной!

...