Отношения и функции.

 

Любое множество 2-списокв или пар называется отношением. Отношения будут особенно полезны при обсуждении значения программ.

Слово «отношение» может означать правило сравнения, «эквивалентность» или «является подмножеством» и т.д. Формально отношения, которые являются множествами 2-списков, могут описать эти неформальные правила точно, путем включения точно тех пар, чьи элементы состоят в нужной связи друг с другом. Например, отношение между символами и 1-строками содержащими эти символы задается следующим отношением:

 

C = {<x, Ñx>: x - символ} = {<a, †a†>, <b, †b†>, …}

 

Поскольку отношение это множество, пустое отношение также возможно. Например, соответствие между четными натуральными числами и их нечетными квадратами – таких не существует. Более того, операции над множествами применимы к отношениям. Если s и r отношения, то существуют

s È r, s – r, s Ç r

поскольку это множества упорядоченных пар элементов.

 

Частный случай отношения – функция, отношение со специальным свойством, отличающееся тем, что каждый первый элемент находится в паре с уникальным вторым элементом. Отношение r является функцией, если и только если для любого

 

<x, y> Î r и <x, z> Î r, то y = z.

 

В таком случае каждый первый элемент может служить именем для второго в контексте отношения. Например, описанное выше отношение C между символами и 1-строками является функцией.

 

Операции над множествами также применимы к функциям. Хотя результат операции над множествами упорядоченных пар, которые являются функциями, будет обязательно другим множеством упорядоченных пар, а следовательно отношением, но не всегда функцией.

Если f,g –функции, то f Ç g, f – g тоже функции, но f È g, может быть а может и не быть функцией. Например, определим отношение голова

 

H = {< Θ y, y>: y - строка} = {<a, †a†>, <a, †aa†>, …}

 

И возьмем отношение C, описанное выше. Тогда из факта, что C Í H:

C Ç H = C

является функцией,

 

H - С = {< Θ y, y>: y – строка как минимум из 2 символов}

является отношением, но не функцией,

 

C – H = {}

является пустой функцией, и

C È H = H

является отношением.

 

Множество первых элементов пар отношения или функции называется областью определения (domain), а множество вторых элементов пар называется областью значений (range). Для элементов отношения , скажем <x, y> Î r, x называется аргументом r, а у называется значением r.

 

Когда <x, y> Î r и и y является единственным значением для x, value-нотация:

y=r(x)

читается, как «y является значением r для аргумента x» или, более кратко, «y является значением r для x» (функциональная форма записи).

 

Зададим произвольное отношение r и аргумент x, тогда существуют три варианта их соответствия:

  1. x Ï domain(r), в таком случае r не определено на x
  2. x Î domain(r), и существуют различные y, z, такие что <x, y> Î r и <x, z> Î r. В этом случае r неоднозначно определено на x
  3. x Î domain(r), и существует уникальная пара <x, y> Î r. В этом случае r однозначно определено на x и y=r(x).

 

Таким образом, функция – это отношение, которое однозначно определено для всех элементов его области определения.

 

Выделяют три специальные функции:

 

Пустая функция {}, не имеет аргументов и значений, то есть

domain({}) = {}, range({}) = {}

Функция эквивалентности (identity function), функция I такая,

что если x Î domain(r), тогда I(x) = x.

 

Постоянная функция, область значений которой задается 1-множеством, то есть всем аргументам соответствует одно и то же значение.

 

Поскольку отношения и функции являются множествами, они могут быть описаны перечислением элементов или заданием правил. Например:

 

r = {<†ball†, †bat†>, <†ball†, †game†>, <†game†, †ball†>}

 

является отношением, поскольку все его элементы - 2-списки

 

domain(r) = {†ball†, †game†}

range (r) = {†ball†, †game†, †bat†}

 

Однако, r не является функцией, потому что два разных значения встречаются в паре с одним аргументом †ball†.

 

Пример отношения, определенного с помощью правила:

 

s = {<x, y>: слово x непосредственно предшествует слову y

в строке †this is a relation that is not a function†}

 

Это отношение также может быть задано перечислением:

 

s = {<†this†, †is†>, <†is†, †a†>, <†a†, †relation†>, <†relation†, †that†>,

<†that†, †is†>, <†is†, †not†>, <†not†, †a†>, <†a†, †function†>}

 

Следующее правило определяет функцию:

f = {<x, y>: первый экземпляр слова непосредственно предшествующий слову y

в строке †this is a relation that is also a function†}

которая также может быть задана перечислением:

f = {<†this†, †is†>, <†is†, †a†>, <†a†, †relation†>,

<†relation†, †that†>, <†that†, †is†>, <†also†, †a†>}

 

Значение программ.

 

Отношения и функции жизненно необходимы для описания для описания значения программ. Используя эти понятия, разрабатывается нотация для описания значения программ. Для простых программ значение будет очевидным, но эти простые примеры послужат освоению теории в целом.

 

Новые идеи: box-нотация, программа и значение программы.

 

Множество пар ввод-вывод для всех возможных нормальных запусков программы называется значением программы. Также может быть использованы понятия функция программы и отношение программы. Важно различать значение программы и элементы значения. Для конкретного входа Паскаль-машина, управляемая Паскаль-программой может произвести конкретный выход. Но значение программы это гораздо больше, чем способ выражения результата одного частного выполнения. Оно выражает все возможные выполнения Паскаль-программы на Паскаль-машине.

Программа может принимать вход разбиты на строки и производить выход разбитый на строки . Таким образом пары в значении программы могут быть парами списков состоящих из строк символов.

 

Box-нотация.

 

Любая Паскаль-программа – строка символов, передаваемая для обработки Паскаль-машине. Например:

 

P = †PROGRAM PrintHello (INPUT, OUTPUT); BEGIN WRITELN(‘HELLO’) END.†

 

Представляет одну из первых программ, рассмотренных в начале части I, в виде строки.

Также эту строку можно записать, опустив маркеры строки, как

 

P = PROGRAM PrintHello (INPUT, OUTPUT);

BEGIN

WRITELN(‘HELLO’)

END.

 

Строка P представляет синтаксис программы, а ее значение мы будем записывать как P. Значение P это множество 2-списков (упорядоченных пар) списков символьных строк, в которых аргументы представляют входные данные программы, а значения представляют выходные данные программы, то есть

 

P = {<L, M>: для входного списка строк L, P выполняется корректно

и возвращает список строк M}

 

Box-нотация для значения программы держит синтаксис и семантику программы, но ясно разграничивает одно от другого. Для программы PrintHello, приведенной выше:

 

P = {<L, M: L – любой список строк, а M – 1-список <†HELLO†> } =

{<L, <†HELLO†>>: L – любой список строк }

 

Помещая текст программы в box:

 

P = PROGRAM PrintHello (INPUT, OUTPUT); BEGIN WRITELN(‘HELLO’) END

 

Поскольку P - функция,

 

PROGRAM PrintHello (INPUT, OUTPUT); BEGIN WRITELN(‘HELLO’) END (L) = <†HELLO†>

 

для любого списка строк L.

 

Box-нотация скрывает способ которым программа управляет Паскаль-машиной и показывает только то что сопутствует выполнению. Термин «черный ящик» часто используется для описания механизма рассматриваемого только извне в терминах входов и выходов. Таким образом эта нотация подходит для значения программы с точки зрения ввода-вывода. Например, программа R

PROGRAM PrintHelloInSteps (INPUT, OUTPUT);

BEGIN

WRITE(‘HE’);

WRITE (‘L’);

WRITELN(‘LO’)

END.

 

Имеет то же значение что и P, то есть R = P.

 

Программ R также имеет CFPascal имя PrintHelloInSteps. Но поскольку строка †PrintHelloInSteps† является частью строки R, лучше не использовать PrintHelloInSteps в качетсве названия программы R в box-нотации.

 








Дата добавления: 2016-12-08; просмотров: 1599;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.017 сек.