
- •Часть 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.1.1. Конкатенация строк.
Выходные данные программы обычно представляют собой строку символов, создаваемую выполнением операторов WRITE. Оператор WRITE, где <список вывода> является <строкой символов>, помещает новую строку вслед за текущими данными в OUTPUT.
Операция конкатенации в CF Pascal задается оператором WRITE и заключается в помещении строки символов в OUTPUT. Конкатенацией двух строк является третья строка, полученная присоединением второй строки к первой. Например:
C= †character†
S= †string†
C&S=†characterstring†
S&C=†stringcharacter†
S&S=†stringstring†
Для пустой строки справедливо следующее тождество:
† † & S = S & † † = S
Операция конкатенации является бинарной (два операнда, оба - строки), инфиксной (символ операции помещается между операндами), ассоциативной ((C&B)&S = C&(B&S)) и не является коммутативной (S&C C & S).
5.1.2. Подстроки.
Строки W = †WRITE(Any, ‘string’)† и строка S = †string† имеют некоторое отношение, а именно символы встречаются внутри W. Говорят, что строка S является подстрокой W.
Строка P является подстрокой Q, если и только если существует строки X и Y, такие что
Q= X & P & Y
В случае с S и W мы можем записать
W = †WRITE(Any, ‘† & S & †’)†
Где согласно определению подстроки
X = †WRITE(Any, ‘†
Y = †’)†
Или для строки T = †tring†
S = †s† & T
T- подстрока S и согласно определению подстроки
X = †s†
Y = ††
или
S = †s† & T & ††
Пустая строка избавляет нас от необходимости вводить специальные правила для случаев, когда подстрока находится на первом месте или завершает строку. Также, пустая строка является подстрокой любой строки.
5.1.3. Композиция строк.
Оператор WRITE может выполнять другую операцию, присоединяя значение переменной типа CHAR к строке, которая является текущим значением OUTPUT. Это операция композиции, обозначаемая знаком . Композиция строки и символа – добавление символа к концу строки.
†strin† g = †string†
Композиция обеспечивает нам способ превращения символа в строку
† † g = †g†
Это общее тождество, связывающее символ и 1-строку содержащую этот символ.
Композиция с пустой строкой настолько полезна, что пустую строку принято опускать и получается унарная префиксная версия композиции:
g = †g†
Аналогично конкатенации операция композиции является бинарной (первый операнд – строка, второй - символ), инфиксной, ассоциативной и не является коммутативной.
Следующие варианты недопустимы для композиции
-
Вариант
Причина
a b
Первый операнд – символ
†x†
Операнд 1-строка, а не символ
N ††
Оба операнда выбраны неверно
5.1.3. Декомпозиция строк.
Если оператор WRITE реализует конкатенацию и композицию строк, то оператор READ выполняет разбиение строк. При каждом выполнении оператора READ с одной переменной строка символов в INPUT разделяется на две части. Первый символ в INPUT становится значением символьной переменной, которая используется в выражении READ, а оставшиеся символы становятся текущей строкой для ввода.
Строковые операции голова (head) и хвост (tail) точно описывают то, что происходит при выполнении выражения READ. Глова (Θ) и хвост (Λ) – унарные префиксные операции, определенные на непустых строках.
Θ S – первый символ в строке S
Λ S – подстрока S полученная удалением первого символа
Например для:
S = †string†
T = †tring†
Θ S = s
Λ S = †tring† = T
Θ T = t
Λ T = †ring†
Поскольку хвост строки – строка, он может служить предметом дальнейшей декомпозиции, например:
Θ (Λ T) = r
Λ(Λ T) = †ing†
Λ (Λ(Λ T)) = †ng†
Θ (Λ (Λ(Λ T))) = n
К-й символ строки может быть извлечен К-1 операциями хвост, к результату которых применена операция голова.
Следует выделить следующие моменты:
Операции голова и хвост не определены на пустых строках
Результат операции голова – символ, операции хвост – строка.
Поскольку голова строки – символ, мы можем превратить его в строку с помощью композиции, далее с помощью конкатенации с хвостом получим исходную строку.
Θ †string† = s
Λ †string† = †tring†
(Θ †string†) = †s†
((Θ †string†)) & (Λ †string†) = †s† & †tring† = †string†
Этот пример описывает фундаментальное тождество, связывающее операции конкатенации, композиции и декомпозиции, а именно: для любой непустой строки S справедливо следующее:
((Θ S)) & (Λ S) = S
Следующая таблица обобщает наши знания о строковых операциях.
-
Операция
Символ
Пример
конкатенация
&
†me† & †you† = †meyou†
композиция
†plural†s = †plurals†
символ в 1-строку
v = †v†
голова
Θ
Θ†feet† = f
хвост
Λ
Λ†rattle† = †attle†