
- •Часть II. Программное исчисление.
- •Программы как математические объекты
- •5. Семантика cf pascal.
- •Глава 5 знакомит нас с концепцией значения программ. Для точного описания этой идеи используются такие математические структуры как строки, списки, множества, отношения и функции.
- •5.1. Строки символов.
- •5.1.1. Конкатенация строк.
- •5.1.2. Подстроки.
- •5.1.3. Композиция строк.
- •5.1.3. Декомпозиция строк.
- •5.2. Списковые структуры.
- •5.2.1. Списковые операции.
- •5.2.2. Описание файлов с помощью списков.
- •5.3. Множества
- •5.3.1. Правила описания множеств.
- •5.3.2. Операции над множествами.
- •5.3.3. Отношения и функции.
- •5.4. Значение программ.
- •5.4.2. Прямое определение значения программы.
- •5.5. Заключение
5. Семантика cf pascal.
Глава 5 знакомит нас с концепцией значения программ. Для точного описания этой идеи используются такие математические структуры как строки, списки, множества, отношения и функции.
Знать значение программы – значит быть способным определить выход программы для любого заданного входа. Если для некоторого X на входе программа выдает Y на выходе, то такая пара формирует часть значения функции. Множество всех пар X,Y для которых программа выполняется корректно, является полным значением программы.
Если какие-то входные данные X0 вызывают аварийное завершение или бесконечное выполнение, то X0 н принадлежит значению программы.
Для некоторых программ значения выражаются довольно просто.
PROGRAM Copy (INPUT, OUTPUT);
{Writes first character in INPUT to OUTPUT}
VAR
Ch: CHAR;
BEGIN
READ(Ch);
WRITELN(Ch);
END.
Значение этой программы содержит пары, такие что входная строка не пуста (содержит символы или маркеры конца строки) а выходная строка содержит первый символ входной. Если первый символ входной строки является маркером конца строки, то выходная строка будет содержать символ пробела и такие пары также принадлежат значению программы.
Но большинство программ не могут иметь таких простых и удобных описаний. Они оперируют бесконечным количеством вариантов входных данных и правила определения выходных данных достаточно сложны. Собственно правилом, определяющим выход для данного входа, является сама программа, сложные программы обычно склонны иметь большое и сложное значение. Нам потребуется некоторый математически аппарат для работы с программами, такой как строки списки, множества, отношения и функции.
5.1. Строки символов.
Строки символов – математические объекты, , имеющие имена, над ними определены операции и отношения.
Новые идеи: строка символов, символьный литерал, строковый литерал, пустая строка, конкатенация, композиция, декомпозиция, подсписок.
Строковый литерал (или просто строка) - последовательность символов, чье начало и конец помечены специальным символом – маркером строки.
Строка, не имеющая символов, 0-строка, называется пустой строкой. Примеры строк:
†† - 0-строка
†□† - 1-строка
†string† - 6-строка
†□string□† - 8-строка
Символьные литералы мы помечаем горизонтальным штрихом над символом, например S для изображения пробелов используем специальный символ □.
Строковые и символьные литералы не одно и то же, их не нужно путать. 1-строка не то же самое, что символ, который в ней размещается. Например, □ – символ, †□† - 1-строка.
Строковым литералам удобно присваивать имена, например: S = †string†. Строка может иметь несколько имен, но одно имя использовать для нескольких строк некорректно. Имена лучше всего использовать для именования не каких-то определенных строк, а тех, значение которых мы можем предположить.
CF Pascal предлагает три операции для манипулирования строками:
-
Оператор CF Pascal
Строковая операция
WRITE(‘ABC’)
Конкатенация
WRITE(Ch)
Композиция
READ(Ch)
Декомпозиция
Эти операции над строками образуют базис для работы со строками как математическими объектами.