
- •Часть 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.2. Списковые структуры.
Полезный метод изучения строк – рассматривать строки как последовательность входящих в них подстрок. Например, Паскаль-программа – это строка, составленная из слов, пробелов и специальных символов. И мы знаем, что человеку будет крайне сложно в ней разобраться, если границы между синтаксическими единицами не будут выделены соответствующим образом. В данном случае важны и границы подстрок и порядок их появления и возможность изменения этого порядка.
Существует структура, представляющая из себя упорядоченный набор объектов, которая называется списком. Список записывается как последовательность, разделенная запятыми ограниченная угловыми скобками.
Например, для строки
†this is a list example†
список литералов
<†th†, †is †, †is †, †a †, †list example†>
предлагает нам вариант нарезки данной строки. Выражение Pascal произведет один и тот же OUTPUT, если будет использована данная строка или список, полученный в результате ее разбиения на подстроки.
WRITE(‘this is a list example’);
WRITE(‘th’, ‘is ‘, ‘is ‘, ‘a ‘, ‘list example’);
Спискам, как и строкам, могут быть присвоены имена, например:
L = <†th†, †is †, †is †, †a †, †list example†>
M = <†this is a list example†>
Приведенные списковые представления строк также являются строками, включая угловые скобки, маркеры границ строк, символы равенства и имена списков. Символы и слова даже в математике используются разными способами и в разных контекстах имеют разное значение. В нашем случае угловые скобки имеют совершенно другой смысл, чем при рассмотрении синтаксиса с помощью BNF.
Если элемент x находится в списке K, мы обозначаем факт как принадлежности списку как
x K, если список K не имеет ни одного вхождения объекта x, мы говорим, x K.
Например, †is † L, но †is † M.
Список L содержит пять подстрок, которые могут быть обозначены следующим образом:
L1 = †th†
L2 = †is †
L3 = †is †
L4 = †a †
L5 = †list example†
В то время M как содержит только одну строку
M1 = †this is a list example†
Мы будем использовать индексы для именования элементов списков, используя 1 для обозначения первого элемента и т.д. L можно назвать 5-список, M - 1-список. Список без элементов, 0-список, называется пустым списком и обозначается <>. Необходимо отличать список, содержащий в себе одну строку, от этой строки. Например, M – 1-список с первым и единственным элементом M1 и
M = <M1>, но M M1
Также необходимо иметь ввиду, что
<††> <>
потому что <††> это 1-спиоск, первый элемент которого пустая строка, а <> - 0-список и первый элемент там отсутствует.
Элементами списков могут быть не только строки, но и символы и другие списки. Например, список
C = <c, h, a, r, a, c, t, e, r>
Является списком символов и это не то же самое, что строка †character†
Следующий список является списком списков
<M, M> = <<†this is a list example†>, <†this is a list example†>>
где элементами 2-списка являются 1-списки М, рассмотренные выше.
Список может иметь элементы различных видов, например
Q = <A, <A>, †A†>
Содержит элементы, которые являются соответственно символом, списком и строкой.
Элемент данного списка Q2 содержит единственный элемент – символ A.
(Q2)1 = A