Книга
Книга
ПРЕДИСЛОВИЕ РЕДАКТОРОВ ПЕРЕВОДА
Чтобы представить себе, хотя бы в самых общих чертах, те направления, в которых развивается современная вычислительная наука, полезно взглянуть на названия сборников широко известной серии Lecture Notes in Computer Science, выпускаемой западногерманским издательством Springer-Verlag и содержащей материалы многих международных конференций по информатике. И тогда перед нами предстанет довольно любопытная картина: наряду с такими близкими программисту названиями, как «Параллельные алгоритмы и архитектуры» или «Программы как объекты данных», чуть ли не на каждой пятой обложке можно увидеть термины «логический вывод», «логическое программирование», «компьютерная логика», «логики программ» и т. д. Математическая логика, возникшая почти 100 лет назад в связи с внутренними потребностями математики, нашла применение в теоретическом (и практическом) программировании, и, судя по всему, взаимодействие этих двух наук в недалеком будущем сможет принести новые плоды.
Причины, по которым программисты обратились к математической логике, а логики заинтересовались программированием, имеют довольно глубокие корни. Следует, наверное, вспомнить, что математическая логика занимается построением формальных языков, предназначенных для представления таких фундаментальных понятий, как функция, отношение, аксиома, доказательство, и изучением основанных на этих языках логических и логико-математических исчислений. Именно в недрах математической логики были найдены математически точные понятия алгоритма и вычислимой функции, развита семантика формальных языков и теорий, построены системы логического вывода — и все это, заметим, было сделано в 30—40-х годах, т. е. еще в «докомпьютерную эру».
Программирование также имеет дело с формальными языками — языками программирования, являющимися средствами общения человека и компьютера. В своем стремлении сделать эти средства удобными и естественными для человека вычислительная наука нс могла пройти мимо тех языков описания
вычислимых функций и отношений, которые были созданы в рамках математической логики с учетом многовекового математического опыта. В результате появились принципиально новые языки функционального и логического программирования: Лисп, Рефал, ML, Миранда, Пролог и другие — особенно активно разрабатываемые в последнее десятилетие. С другой стороны, языки высокого уровня нуждаются в детально проработанной семантике, которая выходит на первый план при написании трансляторов. И здесь идеи и аппарат математической логики, уже занимавшейся проблемами семантики, оказались весьма кстати. Поначалу для формализации смысла программ использовалось известное логикам еще с 30-х годов бестиповое лямбда-исчисление А. Чёрча, а затем абстрактным базисом денотационной семантики стала мощная и элегантная теория областей, развитая Д. Скоттом. Важное значение приобретает теория логического вывода, причем не только в задачах искусственного интеллекта, но и как средство рассуждения о программах и доказательства их свойств (скажем, правильности относительно спецификации) или, наоборот, как метод построения правильных программ (например, путем их извлечения из конструктивных доказательств).
Приложения математической логики можно, конечно, перечислять и дальше, особенно если учесть, что в последнее время огромную роль стали играть задачи представления и обработки знаний, активно ведутся работы по параллельным вычислениям и сложностным проблемам. Однако эти и другие направления уже выходят за рамки того, с чем читатель сможет познакомиться в данном сборнике.
Составляя сборник, продолжающий известную серию «Математическое обеспечение ЭВМ», мы стремились представить в нем перечисленные выше направления работами, принадлежащими крупным зарубежным ученым и интересными как для специалистов в области теоретического и практического программирования, так и для логиков.
Функциональное программирование, точнее, "два его различных течения представлены статьями Дж. Бэкуса и С. Л. Пейтона Джоунза. Краткое введение в круг основных идей и понятий лямбда-исчисления и комбинаторной логики, написанное Дж. Р. Хиндли, поможет читателю глубже понять эти и другие статьи сборника. Работа Дж. Бэкуса является продолжением и развитием знаменитой лекции «Можно ли избавить программирование от фон-неймановского стиля? Функциональный стиль и его алгебра программ», прочитанной Бэкусом в 1977 году при вручении ему Тьюринговской премии. Хотя русский перевод этой лекции войдет в книгу «Лекции лауреатов премии Тьюринга* (М.: Мир, план.), переводчик для удобства читателей написал
к статье Бэкуса небольшое дополнение, в котором коротко изложил наиболее важные идеи упомянутой лекции. Логическое программирование представлено в сборнике статьей Д. Миллера и статьей Дж. А. Гогена и Ж. Мезегера. Методам обращения с отношением равенства, играющим важную роль как в функциональном и логическом программировании, так и в более общем контексте автоматического доказательства теорем, посвящен обзор Ж- Юэ и Д. Оппена. В статье К. А. Гоуда обсуждается проблема извлечения программ из доказательств. Читателя, конечно же, заинтересует и прекрасно написанная статья Д. Скотта, в которой впервые в столь доступной форме излагается созданная им теория областей. Завершает сборник обзорная статья советских авторов, посвященная тем приложениям математической логики, которые уже нашли практическое воплощение в языках программирования и методах разработки программного обеспечения.
Мы выражаем искреннюю признательность Д. Скотту и Дж. Р. Хиндли, любезно приславшим для русского издания существенно переработанные и дополненные варианты своих статей, а также всем остальным авторам, которые выразили заинтересованность в появлении данного сборника.
М. В. Захарьяи^ев, Ю. И. Янов
АЛГЕБРА ФУНКЦИОНАЛЬНЫХ ПРОГРАММ: МЫШЛЕНИЕ ФУНКЦИОНАЛЬНОГО УРОВНЯ, ЛИНЕЙНЫЕ УРАВНЕНИЯ И ОБОБЩЕННЫЕ ОПРЕДЕЛЕНИЯ1)
ДЖ. БЭКУС
ВВЕДЕНИЕ
В [10] мы описали функциональный стиль программирования (FP-стиль), в котором свободные от переменных программы строятся из примитивных программ с помощью рекурсивных определений и небольшого набора комбинирующих форм (функционалов). Все программы, написанные в FP-стиле, являются строгими функциями (одного аргумента), отображающими множество объектов в себя. Множество объектов представляет собой замыкание некоторого фиксированного набора атомов относительно декартова произведения. В нашей предыдущей работе говорилось, что FP-системы обладают следующими свойствами:
чрезвычайно простая семантика;
существование замкнутых нерекурсивных представлений для многих функций, которые обычно определяются с помощью рекурсии;
программы образуют четкую иерархическую структуру, в которой из программ высокого уровня можно комбинировать программы еще более высокого уровня;
основные комбинирующие формы являются операциями мощной алгебры программ, которая позволяет выполнять преобразования программ и решать уравнения для рекурсивно определенных программ.
В этой статье рассматриваются три вопроса, связанные с FP- системами: первый из них касается пункта (с), а два других — пункта (d). После краткого описания FP-систем и алгебры программ в § 1 проводится сравнение двух стилей программирования и исследования программ: FP-стиля и лямбда-стиля (который используется в языках, основанных на лямбда-исчислении, в частности в Лиспе и в ISWIM, см. [22]).
*) John Backus. The algebra of functional programs: function level reasoning, linear equations, and extended definitions —Leet Notes in Comp. Sci, 1981, v 107, p 1—43-
© by Springer-Verlag, 1981
© перевод на русский язык, А. В. Манцивода, 1991
Использование лямбда-абстракции — основной операции формирования программ в лямбда-стиле — приводит к тому, что основной упор делается на объекты и рассуждения объектного уровня, в то время как соответствующие операции FP-стиля делают акцент на программах как функциях, на структуре этих программ, а также на рассуждениях функционального уровня. Таким образом, лямбда-стиль затушевывает функциональную структуру программ, а основное внимание уделяется объектам и операциям объектного уровня, тогда как FP-стиль акцентирует внимание на программной структуре функционального уровня.
В § 2 обобщаются и значительно упрощаются результаты из [10], относящиеся к решению уравнений, рекурсивно определяющих функции. В этом параграфе вводятся понятия формы, программной FP-схемы и линейной формы. Кроме того, показывается, как взаимодействие линейных форм с комбинирующей формой «условие» позволяет получить общее решение всех линейных уравнений вида
(D f = p->q; ш .
где р и q— произвольные функции, а Н — любая линейная форма.- Несколько теорем частично характеризуют линейные формы на основании их структуры. Эти теоремы обосновывают существование больших классов линейных форм и методов построения сложных линейных форм из более простых, а также расширяют и модифицируют предварительные результаты из статьи [10]. Основным результатом является теорема о линейном расширении, которая дает решение уравнения (1) в виде бесконечного условия
(2) f = р -> q; . . .; Н"р Hnq; . . . ,
где Ht является предикатным преобразователем Н (формой, ассоциированной с каждой линейной формой Н). Это решение Дает необходимые и достаточные условия определенности и позволяет исследовать функцию.
В § 3 предлагается новый способ определения FP-функций, который позволяет исправить основной недостаток стандартных определений, используемых в [10]: трудность восприятия определений функций, свободных от переменных. В этом параграфе вводятся определения функций, использующие функциональные переменные, которые воспринимаются так же легко, как обычные определения функций объектного уровня, содержащие объектные переменные для обозначения аргументов или их частей. Определив понятия дистрибутивной и обратимой форм, мы аккУратно вводим обобщенные определения. Мы показываем, как
на основе обобщенного определения получить соответствующее стандартное определение, свободное от переменных, и доказать, что они оба определяют одну и ту же функцию. Далее мы показываем, что обобщенное определение оказывается полезным алгебраическим законом, описывающим определяемую функцию,— законом, который выполняется для всех значений функциональных переменных определения.
В работу входят
Краткое описи чс FP-стиля функционального программирования.
Описание алгебры FP-программ.
Сравнение двух стилей функционального программирования: FP-стиля и лямбда-стиля. Функциональный или объектный уровень структурирования и рассуждений?
Формы.
Линейные формы и решение линейных функциональных уравнений.
Обобщенные определения.
Другие работы на эту тему.
Благодарности.
Литература.
КРАТКОЕ ОПИСАНИЕ FP-СТИЛЯ
ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ
Более полное описание функционального программирования можно найти в [10]. FP-программа— это функция из множества объектов в множество объектов. Объектами являются: (а) ± — «дно», или «неопределенность»; (Ь) атомы; (с) кортежи, построенные из атомов или других кортежей (но не из ±); 0 обозначает пустой кортеж. В отличие от [10] здесь 0— кортеж, но не атом. FP-программа — это либо (а) примитивная функция, либо (Ь) функциональная форма, которая формирует из своих параметров — программ или объектов—новую программу (существует лишь небольшое число таких функциональных форм), либо (с) определяемая функция вида
Def f = E(f, gH ..gn) , где E — функциональное выражение, зависящее от параметров gi, ..., gn и, возможно, от определяемого функционального символа f и построенное из функциональных форм. Смысл этого стандартного определения (в дальнейшем мы обсудим обобщенные определения) заключается в том, что при вычислении аппликации f:x (обозначающей результат применения функцииf к объекту х) нужно в первую очердь заменить функциональный
символ f его определением E(f, gh gn). В следующих примерах звездочками помечены те места, которые отступают от определений из [10] или расширяют их.
Примеры объектов
Атомы*. 1.4 A ACD 23 Х2 *Т (истина) F (ложь)
Кортежи*. A (A, (B,C,D), (В,С)) 0 (пустой кортеж)
(Заметим, что <А, _L> = _L кортежем не является.)
Примеры примитивных функций
(Все функции FP-програмирования являются строгими, то есть f: _L = _L для любой функции f. При описании примитивных функций подразумевается, что их значения на неопределенных аргументах равны ±.)
Функции-селекторы*. 1: <А, В, С> = А 2: <А, В, С> = В и т. д. Любое целое число i обозначает функцию-селектор, выбирающую i-й элемент своего аргумента, если таковой существует. В противном случае ее значение равно J_.
tl (хвост) tl: 0 = J_ tl:(A>=0 tl: (A,B,C) = (B,C)
Арифметические операторы (+, —, и т. д.): + *.(4,5) = 9
* : <4,5> = 20
null (равенство 0): пц11:0=Т null:(A) = F
(*) cz (присоединение слева): cz:(A,0) = (A)
cz :(А,(В,С)) = (А,В,С)
(*) zd (присоединение справа): zzd : (0 , А) = (А)
=) :«А,В>,С> = <А,В,С)
eq (равенство): eq:(A,B) = F eq : ((C,D),(C,D)) = Т
id (тождественная функция): id:x = x для всех объектов х
and (логическое «и»): and:(T,F) = F and:(T,T) = T
distl (распределение слева):
distl :<A,<B,C,D» = <(A,B>,(A,C),<A,D)>
distr (распределение справа): distr : ((A,B),C} = «A,Q,(B,C)) e
ad (прибавление единицы): ad: 3 = 4
sb (вычитание единицы): sb: 9 = 8
Примеры функциональных форм
(Действие функции, построенной с помощью функциональной формы из некоторых параметров, выражается через действие этих параметров.)
Композиция*, fog, где f о g ; х = f: (g : х)
Конструкция*, [f ,g], где где [fb ..., fn]: x = (f,: x, ...,Условие; (p-—>-f; g), где ' f : x,Конструкция*, [f ,g], где где [fb ..., fn]: x = (f,: x, ...,Условие; (p-—>-f; g), где ' f : x,[f ,g]: х = (f ,x,g : x); [fb ..., fn], fn: x).[f ,g]: х = (f ,x,g : x); [fb ..., fn], fn: x).еслиеслиеслиеслир : х = Т,р : х = F,р : х = Т,р : х = F,
Конструкция*, [f ,g], где где [fb ..., fn]: x = (f,: x, ...,
Условие; (p-—>-f; g), где ' f : x,
Конструкция*, [f ,g], где где [fb ..., fn]: x = (f,: x, ...,
Условие; (p-—>-f; g), где ' f : x,
[f ,g]: х = (f ,x,g : x); [fb ..., fn], fn: x).
[f ,g]: х = (f ,x,g : x); [fb ..., fn], fn: x).
если
если
если
если
р : х = Т,р : х = F,
р : х = Т,р : х = F,
в противном случае.
Константа; х, где
- J x, x:y=<- J x, x:y=<если у N= ±, если у = ±.если у N= ±, если у = ±.
- J x, x:y=<
- J x, x:y=<
если у N= ±, если у = ±.
если у N= ±, если у = ±.
(Отметим, что параметром константы является объект, в частности, функция ± всегда равна ±.)
Применить-ко-всем; af, где
af: (хь ..., Xn) = (f:xh ..., f:xn), af : 0 = 0.
(*) Правая свертка; /i, где
/f: (х) = x/f: (хь ..., xn) = f: (xb /f: (х2, ..., хп».
(Если f имеет правую единицу и, определение расширяется: Д:0 = и.)
(*) Левая свертка; \f, где
\f: (х) = х \f: (хь ..., Xn) = f: ( \f(xb ..., Xn-^.Xn),
(Если f имеет левую единицу и, определение расширяется: \f:0 = u.)
Примеры FP-программ
,11,2] :(А,В,С> = (А,<В,С>,В>
(null°tl—> 1; 11) :(А> = А
(null = 11 -> 1; И):(А,В) = (В)
Def last = null ° 111; last ° Н
last :(A;B> = (nullotl -> 1; last = tl): (A,B)
= last ° tl : (А, В) так как null ° tl: (А, В) = F
= last:(tl:(A,B» = last:(B)
= (nullotl-^ 1; last о tl) :(B)
= 1 : (В) так как null ° tl: (В) = T
= B
/с: о о : «А, В),(С, D» = /с: : (=> : «А, В), (С, D»)
= /c=:(A,B,(C,D))
= c=:(A,/c=:(B,(C,D»> = c=:(A,c=:(B,<C,D)» = cz:(A,(B,C,D)) = (A,B,C,D)
(Таким образом, /с<о— конкатенация.)
Семантика FP-программ
Для понимания неформальной семантики FP-программ нужно уметь найти значение f : х для любой FP-функции f и любого объекта х. ДляЧ существуют четыре возможности: f может быть (1) примитивной функцией, (2) функциональной формой, (3) определяемой функцией, (4) чем-то иным. Если это примитивная функция, то f: х можно найти с помощью ее описания. Если это функциональная форма, то ее описание позволяет найти f: х, используя значения g : х параметров g функциональной формы. Если это определяемая функция Deff = E(f, gi, . ., gn), то для вычисления f:x необходимо вычислить E(f, gi, - gn):x. Для этого можно вновь воспользоваться данными правилами. Если ни один из перечисленных вариантов не подходит, то f: х = ±.
Подчеркнем, что все FP-функции и «конструктор кортежа» являются строгими: f : JL = JL, <. .. ± .. .> = ±. (*) Одна важная деталь FP-семантики, которая не была затронута в [10],— это соотношение между описанной выше операционной семантикой рекурсивных определений и наименьшей неподвижной точкой правой части такого определения, рассматриваемой как непрерывный функционал. Если бы все FP-функции были строгими, операционная семантика рекурсивно определенной функции и соответствующая наименьшая неподвижная точка были бы различными, поскольку первая связана с вычислениями по правилу «снизу вверх», а оно обычно .не является корректным правилом вычисления наименьшей неподвижной точки. Тем не менее в [38] Уильямс показывает, что, если все функции строгие, правило «снизу вверх» позволяет найти наименьшую неподвижную точку. Уильямс отмечает, что в системах, которые изучались в [23] ив [14], условные выражения рассматриваются как функции (не являющиеся строгими, поэтому в таких системах правила «снизу вверх» не будут корректными), в то время как в FP-системах условные выражения рассматриваются как (нестрогие) функционалы. Более подробное обсуждение этой кроблемы см. в [38].
ОПИСАНИЕ АЛГЕБРЫ ЕР-ПРОГРАММ
Применение FP-программ к объектам представляет собой исчисление функциональных программ. Соответствующая алгебра FP-программ содержит как переменные (значениями которых являются FP-программы), так и операции — FP-функциональные формы. Законы этой алгебры соответствуют универсально квантифицированным равенствам указанного исчисления.
Так, алгебраический закон [f, g] °h — [f°h, g ° h] означает, что для всех функций f, g и h и для всех объектов х
([f,g]°h): х = [f о h,g ° h]: х
Таким образом, закон утверждает, что выражения [f, g] °h и [f°h, goh] обозначают одну и ту же функцию, какими бы ни были функции f, g и h. Заметим, что, когда мы пишем f = g, имеется в виду, что значения f : х и g : х либо оба определены и равны, либо оба не определены (равны ±).
Для обоснования законов алгебры необходимо доказать соответствующие высказывания в исчислении. В частности, чтобы проверить только что приведенный закон, нужно доказать, что данное равенство в исчислении выполняется для всех f, g, h и х. (Это доказательство приводится в [10].)
В дополнение к законам, которые выполняются для всех объектов х, нам потребуется формулировать законы, которые выполняются только в некоторой ограниченной области. Такие законы формулируются в виде ограниченных законов. Так, ограниченное утверждение
р >= g
означает, что для любого объекта х либо р : х = Т и f : х = g : х, либо р : х ^= Т. Аналогично, ограниченное утверждение
p->->q
означает, что для любого объекта х либо р : х = Т = q : х, либо р : х ^= Т. Например, утверждение, что равенство
Hf.gH
выполняется только тогда, когда g определено, можно сформулировать в виде ограниченного закона
TOgr^-> 1 o[f,^]=f,
поскольку Т ° g : х = Т, если g : х ^= ±.
Основные правила FP-алгебры формулируются в виде ее законов. Двадцать четыре закона приводятся в [10]. Читатель мо-
жет легко получить и другие. Вот несколько таких законов (часть мы формулируем в менее общей форме, чем в [10], в тех случаях, когда обобщение очевидно). Мы сохраняем нумерацию из [10] и дополнительно формулируем один закон, которого там нет. *
\Lg\°h = \toh,goh\
И °[gi, • •gn] = Mgi,/fo[fe • •gnj] для n>2
Tog^I = [f,g] = f•
(p^f', g)°h = p°h^foh\ goh
П2 h ° ^p—> f; g) = p-^hof; hog
.1 МЛр^-g; h}\ = P->\LgY [M]
.l p ->(v >r; s); (Z-»u; u) = (p-->q; A-^-(p->r; uY (p>s; v)
На этом наше краткое описание FP-алгебры программ заканчивается. В следующих параграфах приводятся примеры использования сформулированных законов для доказательства различных теорем.
3. СРАВНЕНИЕ ДВУХ СТИЛЕЙ
ФУНКЦИОНАЛЬНОГО ПРОГРАММИРОВАНИЯ:
FP-СТИЛЯ И ЛЯМБДА-СТИЛЯ. ФУНКЦИОНАЛЬНЫЙИЛИ ОБЪЕКТНЫЙ УРОВЕНЬ СТРУКТУРИРОВАНИЯ
И РАССУЖДЕНИЙ?
Мы кратко описали FP-стиль— один из двух принципиально различных стилей функционального программирования. Второй стиль ассоциируется с такими языками, как Лисп и ISWIM (см. [22]), и основан на лямбда-исчислении (см. [15]). Лисп — почти такой же древний язык, как Фортран. Тем не менее это прежде всего функциональный язык, причем один из самых мощных существующих сейчас языков. Большинство его пользователей видят в FP-стиле лишь слабый, ограниченный отголосок общего функционального подхода, представленного лямбда- стилем или языками, основанными на лямбда-исчислении (такими, как Лисп).
В этом параграфе мы отметим некоторые основные различия между FP- и лямбда-стилями функционального программирования. Мы попробуем обосновать, что (а) FP-стиль позволяет получить «структурированные» функциональные программы, в т° время как лямбда-стиль — неструктурированные, и что (Ь) FP-стиль соответствует рассуждениям на «функциональном» Уровне, тогда как лямбда-стиль — рассуждениям на «объект-
ном» уровне. В общем, мы утверждаем, что FP-стиль дает возможность рассуждать о программных структурах, об истинности утверждений и о преобразованиях на более высоком уровне общности, чем это позволяет лямбда-стиль.
Что мы понимаем под структурой программы? В традиционном фон-неймановском языке программа называется «структурированной», если она имеет одну входную и одну выходную точки и построена из подпрограмм того же типа с помощью небольшой совокупности операций формирования программ (ОФП). Например, программа
р = if a then (while b do c) else d построена из выражения а и двух программ (while b do с) и d с помощью ОФП if-then-else. Ее первая подпрограмма построена с помощью ОФП while-do. Следовательно, структура р задается операцией if-then-else, в композиции с операцией while- do в первом программном аргументе.
В этом смысле FP-программы также полностью структурированы. Например, программа
f = p—>q; ho[r,s]
строится из трех программ — р, q и h о [г, s] — с помощью ОФП (или функциональной формы) условие. Третья из этих программ построена с помощью ОФП композиция из h и программы, полученной применением ОФП конструкция к программам г и s.
Если суть ЕР-стиля заключается в использовании операций формирования программ для построения структурированных программ на функциональном уровне, то в лямбда-стиле акцент переносится на объектоформирующие операции и чаще используется построение объектов, чем построение функций. Например, аналог программы (1) в лямбда-стиле будет выглядеть так:
f = Хх. (р : х —> q : х; h(r : х, s : х)) .
В (1) мы просто скомбинировали функции р, q, h, г и s, чтобы сформировать функцию f. В (2) мы располагаем теми же первичными функциями и хотим получить тот же результат, но ведем себя совершенно иначе: начинаем с введения объекта х, затем строим объекты р : х, q : х, г : х и s : х, после этого комбинируем г : х и s : х, чтобы получить объект h(r : х, s : х), и, наконец, с помощью объектоформирующей операции условие собираем вместе р : х, q : х и h(r : х, s : х), дабы получить «результат»— снова объект. И только теперь мы применяем основную
операцию лямбда-стиля, формирующую программу. Этой операцией является лямбда-абстракция. Буквы Хх перед полученным объектом означают, что мы преобразовали его в нужную функцию.
Как показывает последний пример, типичный метод построения функции f в лямбда-стиле заключается в том, чтобы сразу спуститься с уровня функций (с помощью которых строится f) на объектный уровень, после чего скомбинировать объекты в желаемый «объект-результат». Затем, абстрагируясь от исходных первичных объектов (то есть объектных переменных), можно вернуться на функциональный уровень. Этот метод — «сначала вниз, затем снова вверх», — связанный с объектоформирующими операциями, избегает использования ОФП, хотя такое использование — более прямой путь к желаемому результату. Следовательно, этот подход затушевывает «структуру» программы.
Ясно, что именно применение лямбда-абстракции как универсальной ОФП характеризует объектно-ориентированный, скрывающий структуру программы лямбда-стиль. Если функция f отображает объекты в объекты и построена с помощью лямбда-абстракции, т. е. f = Хх.Е, то переменная х должна быть объектной переменной (поскольку аргумент f — объект) и выражение Е также должно обозначать объект (так как результат— также объект).
Относительная неструктурированность программ лямбда- стиля усложняет распознавание даже самых простых соотношений между программами. Например, распознать истинность следующего простого тождества в лямбда-стиле
Ky.((^x.(f: x,g: х)): (h: у)) =
= Zy.(%x.(f: (h : x)): yAx.(g : (h : x)): y) труднее, чем убедиться в верности более структурированного ЕР-закона
[f ,g] о h = [f о Н, g о h] ,
хотя это то же самое равенство, сформулированное на функциональном уровне (без лишнего применения функций к «абстрактным» объектам, которое требуется для лямбда-абстракции и которое сводит утверждение р функциях к подутверждениям об объектах). Есть и вторая причина, по которой тождество (3) трудно рассматривать как содержательное тождество' на функциональном уровне: если упростить его' путем удаления х, обе части редуцируются к
АуД: (h : y),g : (h: у))и функциональная связь просто исчезает.
Более простая структура FP-программ приобретает особое значение, когда теоретическое программирование становится математической дисциплиной, которую используют практики. Такая дисциплина может оказаться полезной при наличии набора аккуратно доказанных общих законов и теорем о программах. Чем проще структура программы, тем легче программисту понять, что общая структура его программы является частным случаем одной или нескольких теорем, которые могут помочь ему доказать корректность программы или сделать ее более эффективной.
Если распознать применимость даже такого простого закона, как (4), сформулированного в лямбда-стиле, то шансов использовать более важные теоремы остается совсем мало. Например, Уильямс в [38] доказывает следующую теорему: для всех п ^ О и для всех функций f, а, b и с
[f ,2 о a]n [b,c] = [ \ f о [Ь,с, а о с, ..., anl о с],ап о с] .
Далеко не каждый сможет распознать применимость этой теоремы, если его программа и сама теорема сформулированы в лямбда-стиле, поскольку утверждение теоремы весьма сложно.
Мы увидели, что лямбда-стиль имеет тенденцию скрывать функциональную структуру программ. Необходимость спускаться с функционального уровня на объектный уровень ведет к излишнему увеличению роли «объектных» рассуждений. Как в FP-, так и в лямбда-стиле рассуждения на объектном уровне иногда оказываются необходимыми: чтобы показать, что f = f', достаточно показать, что для любого объекта х выражения f : х и Г : х обозначают один и тот же объект. Но часто такое мышление неоправданно и влечет за собой потерю связи с важными тождествами функционального уровня. Рассмотрим, например, следующие определения объектного уровня для f и f':
f : х — 4х + g(3x), где g : х = even (х) -> х; 2п ,
Е : х = even (Зх) -> 7х; Юх .
Доказательство тождества f : х = Е : х на объектном уровне потребует рассмотрения нескольких случаев и проведения различных вычислений. Если, с другой стороны, функция f описана на функциональном уровне (с использованием обозначения Шк для функции «умножить на к»)* мы получаем
f = + о [m4,g о т3], где g — even -> id; m^ или’
f = -j- о [m4,(even -> id; m2) о m3] .
Каждый, кто знаком с теоремами FP-программирования, (а) сразу обнаружит, что первое выражение для f является формой,
линейной относительно g, и использует свойства таких форм, чтобы получить желаемый результат (см. ниже), а также (Ь) увидит, что к выражению для f можно применить простую теорему*
h ° [i,(р —> q; г) о j] = р о j —> h ° [i,q ° j]; h о [i, г ° j] , которая в нашем случае дает
f = even о m3 ^ + ° [m4, id ° тз1 > + ° lm4>тз ° тз1 или, после упрощений,
f = even о т3 -> т7; т10
Это чрезвычайно простой пример, поэтому рассуждения объектного уровня, необходимые для доказательства истинности равенства f: х = Р : х для любого х, также несложны. Но если вместо подпрограмм Шк будут использованы подпрограммы, требующие более серьезных вычислений, рассуждения объектного уровня могут оказаться намного сложнее. Надежда лишь на то, что исследователь воспользуется тождествами функционального уровня в рамках FP-подхода. Рассуждения на объектном уровне можно сравнить с попыткой доказать тождество (а + Ь)с = = ас + Ьс для данных чисел а, b и с арифметически, а не алгебраически._
Стоит отметить еще одно различие между лямбда-стилем и FP-стилем. В Языках первого стиля приходится использовать функции нескольких аргументов, в то время как все FP-функции одноместны. Если (в- лямбда-стиле) h(x, у) —функция двух аргументов, а значения функции g(x)—пары <у, z>, то потребуются определенные усилия, чтобы описать функцию f, где f:x = h(y, z) и g : х = <у, z>, или, с применением функции-селектора и лямбда-абстракции,
f = Xx.h(l : (g : х), 2 :Jg : х)) .
В FP-стиле функция h оказалась бы функцией на парах h : <у, z> и поэтому определение f имело бы вид
f = hog .
Следовательно, использование n-местных функций в лямбда-стиле оказывается еще одним важным фактором, который делает программу менее четкой, затушевывает ее функциональную структуру и порождает мышление на объектном уровне. (ОФП конструкция играет большую роль в том случае, если используются только одноместные функции: именно она применяется Для построения подпрограммы, которая формирует аргумент Функции, определенной на кортежах; например, если функция
h определена на парах, то функция f = h ° [г, з] соответствует функции f : х = h (г : х, s : х).)
Итак, применение лямбда-абстракции как основной операции формирования программы скрывает функциональную структуру программы. Необходимость спуска к объектоформирующим операциям приводит к излишне усложненным рассуждениям объектного уровня, в которых не используются теоремы функционального уровня. Между тем возможность применения этих теорем стала бы очевидной, если бы программа имела четкую и ясную функциональную структуру.
Здесь нужно подчеркнуть, что мы вовсе не предлагаем FP- стиль как панацею. Когда объектный уровень необходим, как это часто и бывает (например, если доказательство зависит от частных свойств примитивных функций), тогда лямбда-выражения оказываются полезными. Более того, определения функций на объектном уровне, с использованием переменных, часто воспринимаются легче, чём определения в FP-стиле, свободные 6т переменных. (Сейчас мы приступили к изучению определений функционального уровня, использующих функциональные переменные вместо объектных, которые относительно просты для понимания; см. параграф об обобщенных определениях.)
Лямбда-абстракция является более мощным средством, чем любая ОФП, которая используется в FP-стиле. С помощью лямбда-абстракции можно определить все эти ОФП, а также бесконечно много других. Но здесь прослеживается аналогия со взаимоотношениями между Фортраном и традиционными «структурированными» языками. С помощью операторов Фортрана IF и GO ТО вполне можно смоделировать «структурные» ОФП и создать сколь угодно много других ОФП, которые будут в высшей степени «неструктурными». Следовательно, точно так же, как можно писать «структурированные» программы на Фортране, можно писать структурированные программы на Лиспе и ISWIM. Но подобно тому, как легче увидеть структуру программы, написанной на Паскале, чем на Фортране, лучше писать «структурированные» функциональные программы в FP-стиле, чем на Лиспе или на ISWIM, поскольку FP и Паскаль организованы так, чтобы подчеркнуть программную структуру, тогда как Лисп и Фортран скорее скрывают ее.
Пожалуй, было бы преувеличением сказать, что языки лямбда-стиля— это «фортраны» функциональных языков программирования, поскольку они мощнее Фортрана. Но мы пользуемся Лиспом почти так же давно, как Фортраном, и он, как и другие языки лямбда-стиля, ведет к созданию неструктурированных программ (что было отмечено выше). Видимо, пора приступить
к созданию нового поколения функциональных языков — языков, ориентированных на структуры и на мышление функционального уровня.
ФОРМЫ
Введение
В дальнейшем нам понадобится сделать ряд общих утверждений о больших классах функциональных выражений. Предположим, нам надо сказать, что Hfg— это произвольное функциональное выражение, содержащее две функции f и g и обладающее свойством
(Hfg) о h = H(f о h)(g о h)
для любых функций f, g, h. Чтобы делать такие общие утверждения, нам нужно будет строить выражения, подобные Hfg, но вместо конкретных функций f и g включающие символы переменных f и g. Построив такую форму Н fg, мы сможем рассматривать большой класс функций Hfg, которые получаются, когда переменные f и g заменяются конкретными функциями f и g.
Таким образом, формы — это схемы FP-программ, с помощью которых мы сможем рассматривать наиболее общие вопросы. Мы определим множество FP-форм для некоторого множества функциональных переменных V, причем будем считать, что множество объектов, множество функциональных символов и множество функциональных переменных V попарно различны.
Определение
Пусть V = {f i ... fn} — множество (функциональных) переменных. Будем говорить, что Е является формой для V или что Efi ... fn—форма, если выполняется ровно одно из следующих условий:
Efi . . . fn = г длй некоторой FP-функции г;
Efi ... fn = fi для некоторой переменной fj из V;
Существуют такие формы Еь .. . , Ek из V и такая FP- Функциональная форма Гек параметрами, что
Efi...fn = r(Ei, ..., Ек)
(в данной работе предполагается, что Г — это либо композиция, либо конструкция, либо условие, либо правая или левая свертка, либо применить-ко-всем).
Если Efi ... fn — форма, будем обозначать через Efi ... fn Функцию, полученную в результате замены каждой переменной
fi функцией fi. Допустима также запись EEi .., Еп, обозначающая форму, полученную в результате замены каждой переменной формой Ej.
Пример
Пусть Efg = f° [г, g°h]. Тогда Epq— функция р° [г, q°h], Е*(а -> b; с) d — функция (а->Ь; с) ° [г, d oh], а Е [Д г ] h — форма [f, г] ° [г, Ь°Н] для {f}. Заметим, что Efg можно рассматривать как форму для {Д g^ или для {Д g^ h} или для любого множества функциональных переменных, содержащего {Д g}. Эта неоднозначность определения множества переменных не вызовет затруднений. Ясно, что множество переменных для некоторой формы всегда содержит все переменные, явно входящие в эту форму.
Формы, зависящие от одной переменной. Композиция форм
Если Gf и Hf—формы, зависящие от одной переменной, то композицией G и Н, которая обозначается через GH, называется результат замены переменной f в G на форму НД т. е. GHf = = G(Hf). Например, если
GW = r , Hf = p^qJ , то
GHf = (p-^qJ)or , HG/ = p-*g; f ° г .
Нужно быть осторожным, чтобы не спутать композицию функций и композицию форм, особенно когда композиция функций используется для построения форм. Так, форма GHf = = (p-^q; f) ° г отличается от формы Gf ° Hf = f ° г о (р -> q; f). Композицию GGf формы G с самой собой будем обозначать через G2f, форму GGGf— через G3f, и т. д.
Равенство и упорядочение форм
Если ЕД ... fn и ЕД ... fn — две различные формы, то будем говорить, что они равны, т. е, Е = F, если
ЕД...1П = ЕД..ЛП
для всех функций Д, ... , fn. Аналогично, Е ^ F, если
ЕД..ЛП<ЕД..ЛП
для всех fi, ..., fn. Таким образом, наши алгебраические законы — это просто утверждения о равенстве или упорядочении форм.
ЛИНЕЙНЫЕ ФОРМЫ
И РЕШЕНИЕ ЛИНЕЙНЫХ ФУНКЦИОНАЛЬНЫХ
УРАВНЕНИЙ
Введение
В [10] мы получили общие решения двух типов рекурсивных уравнений, определяющих функции: теоремы о рекурсии и об итерации. Здесь мы дадим более простое и более универсальное описание значительно более широкого класса рекурсивных уравнений — линейных уравнений — и построим для этого класса общее решение. Нам кажется, что такой подход позволит внести большую ясность в вопросы решения рекурсивных уравнений.
Как ив [10], наше решение линейных уравнений включает необходимые и достаточные условия определенности получаемой функции и пошаговое описание ее поведения. Поэтому это решение может оказаться полезным для изучения или упрощения определяемой функции.
В следующих пунктах мы введем понятие линейной формы, зависящей от одной переменной. (Это понятие тесно связано с понятием линейных программных схем (см. § 7), хотя первое понятие определено математически, а второе — синтаксически.) Мы покажем, что базисные FP-функциональные формы — композиция, конструкция и условие — являются линейными (по каждой переменной) и что если G и Н — линейные формы, то линейна и их композиция GH, поэтому класс линейных форм весьма велик. Мы также сформулируем две теоремы, частично характеризующие линейные формы по их структуре, и расширим класс известных линейных форм: включим в него формы, содержащие несколько вхождений одной переменной.
После этого мы сформулируем основной результат — теорему о линейном расширении, которая дает решение всех линейных уравнений вида
Z = P-q; Н/ ,
где р и q— произвольные функции, а Н—любая линейная форма. Решение уравнения (А) принимает вид бесконечного условия * .
f = p->q; H?p->Hnq; ... ,
где Ht/ — форма, связанная с любой линейной формой НД которая называется ее предикатным преобразователем. (Напомним, что Hn+1q = H(Hnq) .) '
В [38] Уильямс распространил этот результат на два важных класса нелинейных уравнений, подобных (А), в которых форма Н является либо устойчивой относительно переполнения, либо p-q-дистрибутивной. Он показал, что оба класса имеют решения, очень похожие на (В).
Более слабая форма теоремы о линейном'расширении приводится в [11]. В этой работе определение линейности предусматривает чуть более слабые ограничения, поэтому теорема о линейном расширении помимо линейности Н нуждается в гипотезе о том, что Н± =_L. Своим представлением о поведении предикатного преобразователя Ht для Н в области, в которой определена форма Н1, я в значительной степени обязан М. Арнольду (см. [3]).
Линейные формы
Сформулируем условия, при которых можно формально решить рекурсивное уравнение вида
f = p-^q; Ш .
Обычно для решения (1) в качестве наименьшего решения берут НшЕп±, где Ef = р —q; Hf (см. [21]). Мы покажем, что в качестве решения удобнее взять ИшЕп(р — >q; ±). Для этого нужно найти следующие аппроксимирующие функции:
f0 = р > q; ± ,
fi = Elo=P^q; H(p-»q; ±) ,
f2 = p->q; H(p->q; H(p-*q; ±))
и т. д. Если Н(р—>q; ±) не поддается преобразованиям, то найти решение (1) будет трудно. Если же для любых рь q и г существует такая функция рц-Ь что
H(pi->q; ±) = Pi+1Hq; Нг ,
то, дважды используя (2) и полагая р = р0, получаем
f2 = p-*q; Pi->Hq; p2->H2q; Н2 ±
и в общем случае
fn = p-^q; Pi-*Hq; ■ • pn^Hnq; нп±
Это показывает, что функция
f = р -> q; ...; pn -> Hnq; . .. ,
где бесконечное условие представляет собой
lim (рq; ..pn-»Hnq; ±) ,
П —> оо
могла бы быть решением (1). Однако (4) будет пределом fn из (3) только в том случае, если
для любого объекта х существует такое п, что если р,: х = F для всех i ^ п, то Нп ± : х = ±.
В противном случае найдется такой объект х, что fn : х всегда будет задаваться последним термом в (3) и, следовательно, (4) на х никогда не сойдется к пределу fn из (3). Чтобы понять, почему это так, рассмотрим следующий пример. Пусть Hf = г для некоторой фиксированной функции г. Равенство pi+i = F для любого pi удовлетворяет (2), и мы получаем следующий частный случай (3):
fn = p_^q; F^Hq; F->Hnq; Hn±
= p->q; F->r; . ..; F->r; r
= p->q; r .
Таким образом, limfn = p->q; г, в то время как (4) должно было бы дать
f = p->q; F—>г; .F->r; .
= р -> q; ± .
Эти рассуждения обосновывают следующее определение линейных форм.
Определение (линейные формы). Форма Hf называется линейной, если существует форма Htf (называемая предикатным, преобразователем Н), удовлетворяющая следующим двум условиям:
(L1) для всех функций а, Ь, с
H(a->b; c) = Hta->Hb; Нс ;
(L2) для любого объекта х, если H_L:x^ -1, то
Htf: х = Т
для всех функций f.
Форма Ht отображает pi в pi+i в (2); таким образом, (L1) соответствует (2). Условие (L2) необходимо для выполнения (5).
Примеры основных линейных форм
Сейчас мы покажем, что все основные формы Hf, построенные из одной базисной FP-функциональной формы (композиции, конструкции или условия) и имеющие не более одного вхождения переменной f, линейны,
Hf = r . Тогда для Htf = T
(LI) H(a->b; c) = r = T->r; r = Hta~>Hb; Нс .
(L2) Если Н±:х=#±,тох#=± (так как г — строгая функция) и
Hta : х = Т : х = Т .
Hf = rof. Тогда для Htf = / = ID/*
(L1) Н (а_> b; с)=го (а —► Ь; с)=а -^го Ь; го c=Hta->Hb; Нс .
(L2) Н ± : х = ± для любых х, так как г — строгая функция.
Hf = f о г. Тогда для Htf = Hf
(L1) Н(^-^ b; c)=(a->b; с) о г=а о г->Ь ° г; с о r=Hta->Hb; Нс .
(L2) Н ± : х= ± для любых х.
Hf = [g, И- Тогда для Htf = f = IDf
(LI) Н (a—>b; c)=[g, (а—>b; с)]—a—>[g, b]; [g, c]=Hta—з^НЬ; Нс .
(L2) Н ± : х = ± для любых х.
Аналогично, [.../...] — линейная форма с Ht = ID.
Hf = p—>q; f. Тогда для Htf = p->T; f
(LI) H(a-*b; c) = p->q; a—>b; c = (p->T; a)->(p->q; b); (p—>q; c)_=Hta->Hb; He .
(L2) Если Н1:х^=1,тор:х = Тих^ ±, следовательно,
Hta : x = (p —► T; a): x = T._
Аналогично, p-> f; q — линейная форма c Htf = p -> f; T, a f-^q; h — линейная форма c Htf = IDf.
Таким образом, все три основные FP-функциональные формы с одним вхождением единственной переменной линейны, в какой позиции ни находилась бы переменная.
Композиция линейных форм
Сейчас мы покажем, что если формы G и Н линейны, то и их композиция GH также линейна и (GH)t = GtHt. (Следующей леммой и доказательством теоремы о композиции я обязан Джону Г. Уильямсу.) Нам потребуется следующая лемма.
Лемма. Если Н —линейная форма, то для любой функции g H±=Htp^HT; Т .
Доказательство. Пусть даны р и х. Мы покажем, что обе части равенства в лемме дают на х один и тот же результат. Рассмотрим два случая.
Случай 1: НJ_ : х ^ ±. Поскольку форма Н линейна,. Htp : :х = Т в силу (L2). Следовательно, (Htp->HJ_; ±):х = = Н± : х и равенство на х выполняется.
Случай 2: HJ_:x=±. Тогда для Htp : х существуют три возможности: либо это Т, либо F, либо что-то другое. Если это Т, то (Htp —> Н ±; ±): х = Н ± : х; если это F, то (Htp -> Н ± ; ±): х = ± = Н ± : х; наконец, если это что-то другое, то(Htp > -> Н ±; ±): х = ± = Н ± : х. Таким образом, во всех трех случаях равенство выполняется. □
Теперь мы можем доказать следующую теорему.
Теорема о композиции. Если G и Н — линейные формы с предикатными преобразователями Gt и Ht соответственно, то GH является линейной формой с предикатным преобразователем (GH)t = GtHt.
Доказательство. Сначала покажем, что GtHt удовлетворяет условию (L1). Пусть даны а, b и с. Тогда
(LI) GH(a->b; с) = G (Hta -> Hb; Нс) = G.tHta -> GHb; GHc
Здесь (L1) использовано дважды: сначала для Н, а затем для G. Таким образом, (L1) выполняется. Чтобы доказать, что выполняется (L2), нужно показать, что если GHJ_:x^±, то GtHta : х = Т для любой функции а. Пусть дано такое х, что GH±:x=#J_ (если такого х нет, то (L2) выполняется тривиально), и пусть дана некоторая функяия а. Рассмотрим два случая.
Случай 1: GJ_:x^=±. Тогда в силу (L2) Gtp : х = Т для любой функции*р и, следовательно, GtHta : х = Т.
Случай 2: GJ_ : х = ±. По предыдущей лемме H±=Hta->H±;T .
Добавляя с обеих сторон G и используя (L1), получаем GHТ= GtHta->GHT; GT ,
поскольку форма G линейна. Теперь в силу выбора х получаем GH J_ : х =# ± и (в случае 2) G ± : х = ±. Поэтому из. справедливости приведенного. выше равенства следует, что GtHta: ' х = Т, что и требовалось доказать. □
Примеры композиций линейных форм
Используя теорему о композиции и линейность основных форм с одним вхождением переменной, получаем, что все формы НД построенные с помощью композиции, конструкции и условия и имеющие единственное вхождение Д являются линейными. Например, если
=Gf=[i,f], Ff = M,
то FGHf = h ° [i, f о j] и форма FGH линейна, поскольку она является композицией линейных форм. Более того, (FGH)tf = = f ° j = ID(ID(Htf)), поскольку Gt = Ft = ID. Аналогично, если
V = P-q; f, то форма
IHf = p—*q; f °j
линейна и (IH)tf = p->T; foj=ItHtf.
Частичная характеризация линейных форм
Мы уже знаем, что существует много линейных форм НД в которых переменная f встречается лишь однажды. К сожалению, до сих пор не найден тест, позволяющий определить, является ли форма Hf с несколькими вхождениями f линейной (а многие такие формы являются линейными). С такими тестами, по-видимому, следует подождать до тех пор, пока не будет проведена классификация форм. Тем не менее мы можем сформулировать необходимые и достаточные условия линейности формы Н в том случае, если она имеет вид
Hf-p-^Gf .
(Для того чтобы Н была линейной, достаточно, чтобы Е и G были линейными; можно ограничиться и немного более слабыми условиями.) Мы можем также сформулировать достаточные условия линейности Н, если
Hf = [Ef ,Gf]
(достаточно, чтобы Е и G были линейными и имели предикатные преобразователи, различающиеся только на константу). Хотя не доказано, что это условие является необходимым, оно, по-видимому, близко к необходимому: можно показать, что если форма Н имеет указанный вид и линейна, то для всех а, b и с должно выполняться условие
[Е (а-^ Ь; с), G(a->b; с)] = [(Hta-> Eb; Ec),(Hta->Gb; Gc)]
К сожалению, это еще не значит, что каждая из форм Е и G удовлетворяет условию (L1). Кроме того, как показывает достаточное условие линейности, формы Е и G не обязательно имеют одинаковые предикатные преобразователи, на что, как может показаться, указывает последнее равенство.
Для форм Н, построенных другими способами, полезных результатов пока нет. Таким образом, мы не располагаем тестом на линейность для следующих типов форм:
Hf = EfoGf ;
Hf = Ef-^Ff; Gf ;
Hf = /Ef ;
Hf = a(ED .
В том важном случае, когда Hf = Ef°Gf, линейности H добиться довольно трудно (разве что одна из форм является линейной, а вторая не зависит от f).
В [11] мы начали развивать другой подход к исследованию линейности форм с несколькими вхождениями переменной. Мы рассматривали формы, зависящие от двух и более переменных (например, Hfg), линейные по каждой переменной в отдельности, а затем выясняли, является ли форма Gf = Hff линейной.
Обобщим все известные нам условия линейности формы Hf. Если форма Н построена лишь с помощью композиции, конструкции и условия и имеет лишь одно вхождение f, то она линейна. Если Hf = р -> Ef; Gf, то форма Н линейна в том и только в том случае, если форма Е линейна при истинном р, а форма G — при ложном р. Если Hf = [Ef, Gf], а Е и G имеют вид p-^r; Е7 и q-^s; Gzf соответственно, причем Ez и Gz линейны, a Ez~Gp то форма Н линейна (более простое следствие: если Е и G линейны и Et = Gt, то форма Н линейна). Ниже мы сформулируем еще несколько теорем, обосновывающих эти результаты. Начнем со случая
Hf = p->Ef;Gf .
Нам потребуется следующее определение.
Определение. Форма Hf называется ^-линейной (т. е. линейной в области, в которой р истинно), если она имеет такой предикатный преобразователь Htf, что (И') для всех а,Ь,с
р > > Н (а -> Ь; с) = Hta -> Hb; Нс ;
(L2Z) для любого объекта х, если р:х —Т и Н ± :x^=J_, то Hta:x = T для всех функций а.
Теорема 1 (о линейных формах-условиях). Если Hf=p->-Ef; Gf, то форма Hf является линейной тогда и только тогда, когда форма Е р-линейна, форма G (not ° р)-линейна и Htf = р-> Etf; Gtf.
Доказательство. Достаточность. Пусть форма Е р-линейна, а форма G (поп о р)-линейна. Тогда
Н (а —► Ь; с) = р —> Е (а —> b; с); G (а -> Ь; с)
= р—> (Eta-> Eb; Ес); (Gta->Gb; Gc)
По закону V.1 для всех р, q, г, s, t, u, v
p(q —* r; s); (t -> u; v) = (p -> q; t) -> (p -> r; u); (p -> s; v)
Применяя этот закон к предыдущей формуле, получаем
H(a-->b; c) = (p->Eta; Gta)-> (р-> Eb; Gb); (р->Ес; Gc) = (p^Eta; Gta)—>Hb; He .
Таким образом, H удовлетворяет (L1) для Htf —p-^Etf; Gtf. Теперь предположим, что H_L:x^=±. Возможны два случая: р : х = Т или р : х = F, иначе Н ± : х = JL Если р : х = Т, то E_L : х #= 1 и, следовательно, Eta : х = Т для всех а. Поэтому Hta : х = Т для всех а. Аналогично, если р : х = F, то Gta : х = = Т и Hta : х = Т для всех а, значит, (L2) выполняется. Таким образом, форма Н линейна и имеет предикатный преобразователь Ht.
Необходимость. Пусть форма Н линейна и имеет предикатный преобразователь Ht. Тогда по определению Н
H(a->b; c) = Hta->Hb; Нс
= Hta-> (р-> Eb; Gb); (р™>Ес; Gc) .
Используя закон V. 1, получаем
Н(а ->b; c) = (Hta->p; р) -> (Hta -> Eb; Ес); (Hta->Gb; Gc) = р(Hta-> Eb; Ec); (Hta->Gb; Gc) .
(Последнее равенство следует из того, что, когда Hta не определено, обе части равенства дают неопределенность.) В силу определения Н
H(a->b; c) = p^E(a->b; с); G(a->b; с) .
Из (Ь) и (с) следует, что
р ->~> Е (а b; с) = Hta -> Eb; Ес ;
not о р ^ -> G(a ->b; c) = Hta ^Gb; Gc .
Таким образом, Е и G удовлетворяют условию (ЕЕ) для р-ли- нейности и (not о р)-линейности при Et = Gt = Ht. Пусть теперь х удовлетворяет условиям р : х = Т и Е ± : х ^ ±. Тогда Н ± : х ^ ± в силу определения Н. Следовательно, Hta : х = = Eta : х = Т для всех функций а. Таким образом, Е удовлетворяет условию (L2') для р-линейности при Et = Ht. Аналогично, G удовлетворяет условию (L2') для (not о р)-линейности. Форма Hta = р-> Eta; Gta = p->Hta; Hta удовлетворяет указанным условиям.□
Для доказательства следующей теоремы нам потребуется лемма.
Лемма. Для любых a, b, с, d, е, р, q, г, s выполняется равенство
[(р -> г; а —> b; c),(q —> s; а —> d; е)] = Ppqa -> [(р —> г; b),(q —> s; d)];
[(рг; c),(q-* s; е)] ,
где Ppqa = р & q-> Т; а и р & q = and о [р, q].
Набросок доказательства. Воспользуемся законами IV. 1 (в общем виде, приведенном в [10]) и V. 1, а также тем, что q = = T-^q; q. Будем преобразовывать левую часть равенства с помощью этих законов до тех пор, пока не получим правую часть: — Р [г, (Ч s; а -> d; е)]; [(а —> b; с), (q s; а -> d; е)]
= p->(q->[r,s]; [r,(a-*d; е)]); (q—*[(a->b; c),s]; [(a-*b; c),(a->d; e)]) = P^(q^[r,s]; (a—>[r,d]; [r,e)));
(q->(a ->[b,s]; [c,s]); (a —* [b,d]; [c,e]))
[Положим [r,s] = T—>• [r,s]; [r,s] и применим V. 1]
= P->■ ((qT; a)->(q->[r,s]; [r,d]>; (q->[r,sj; [r,e]));
((q->a; a)(q[b,s]; [b,d]); (q->[c,sj; [c,e])) = (p->(q-*f; a); (q^>a; a))->
-^(p^(q^[r,sj; [r,d]); (q->[b,sj; [b,d]));
(p —> (q —* [r,s]; [r,e]); (q^[c,s]; [c,e]))
= (p&q->f; a)-->(p-^[r,(q-*s; d)]; [b,(q->s; d)]);
(p->[r,(q-^s; e)]; [c,(q-^s; e)])
= Ppqa-> [(p-> r; b),(q->-s; d)]; [(p->r; c),(q->s; e)]. □
Теорема 2 (о линейных формах-конструкциях). Пусть выполняются условия
Hf = [E7.G71 ;
Е7 = р-*г; Ef ;
G7 = q->s; Gf ;
Е и G — линейные формы с Et и Gt ;
Et = Gt ._
Тогда Hf — линейная форма с Htf = р & q Т; Etf.
Доказательство. Согласно нашему предположению,
Н(а—>b; c) = [(p->r; Eta-->Eb; Ec),(q->s; Gta—>Gb; Gc)].
Используя предыдущую лемму со следующими уточнениями вида (элемент теоремы-^ переменная леммы): (р~>р)(г->- -> г) (Eta -> a) (Eb->b) (Ес-^с) (q-^ q) (s ->s) (Gta -> а) [поскольку Et = Gt] (Gb->d) и (Gc->e), получаем
H (a -> b; c) = Ppqa ^[(p ->r; Eb),(q->s; Gb)]; [(p->r; Ec),(q->s; Gc)] = (p&q)—>T; Eta)^[Ezb,Gzb]; [Ezc,Gzc] = Hta >Hb; He .
Таким образом, H и Ht удовлетворяют (L1). Предположим теперь, что H±:x^=_L. Тогда в силу (a) Ez±:x^=_L hG'I: : х =# -L. Следовательно, в силу (Ь) и (с) р и q должны иметь на х булевы значения. Далее, Ez — линейная форма, имеющая предикатный преобразователь
EV = p^T; Etf , поскольку Ezf—композиция линейной формы p-^r; f и линейной формы Ef (форма Е линейна в силу (d)). Следовательно, поскольку Е'± : х =#-L, из (L2) получаем Eta : х=Т. Таким образом, либо р : х = Т, либо Eta : х = Т. Аналогично, либо q : х = = Т, либо Gta : х = Eta : х = Т. (Оба этих равенства выполняются для произвольной функции а.) Значит, если р & q : х = = Т, то Hta : х = Т для любой функции а, и если р & q : х = F, то Eta : х = Т для любой функции а. Поэтому Hta : х = Т для любой функции а и (L2) выполняется.□
Следствие. Если Hf = [Ef, Gf] и формы Е и G линейны, причем Et = Gt, то Н — линейная форма с Ht = Et = Gt.
Доказательство. Достаточно положить в теореме 2 р = q = = F.□
Это завершает нашу частичную характеризацию линейных форм.
Решение линейных функциональных уравнений
Итак, мы определили линейные формы и частично охарактеризовали их. Теперь приступим к нашей основной задаче — покажем, что линейное уравнение
f = P^q: Щ ,
где Н — линейная форма, имеет общее решение вида
f = P^q;H?p^Hnq; .
При этом в качестве правой части выступает lim fn, где
fn = p->q;H?p^Hnq; Т .
Под решением (6) мы подразумеваем наименьшую неподвижную точку формы Е, где Е/ = р -> q; Н/.
Поскольку операционное правило «снизу вверх» для ЕР-оп- ределений в общем случае не является корректным правилом вычисления наименьшей неподвижной точки формы Е (см. [23] и [14]), можно предположить, что FP-функция f, введенная с помощью определения
Def f = р —> q; Ш , окажется менее определенной, чем наименьшая неподвижная точка Е. Тем не менее, когда все функции в Е являются строгими (что верно для ЕР), правило «снизу вверх» оказывается корректным. Манна с соавторами, а также Кадью не рассматривают этот случай, потому что программы, с которыми они работают, используют нестрогую функцию «условие», в то время как все FP-функции являются строгими, а «условие» вводится сюда как нестрогий функционал. Проблема корректного соответствия между ЕР и семантикой наименьшей неподвижной точки была впервые поставлена и решена Уильямсом. Более подробное обсуждение этой проблемы можно найти в [38]. В доказательстве теоремы о линейном расширении мы используем стандартные понятия и рассуждения об упорядочении объектов и функций, .о пределах возрастающих последовательностей функций, о наименьших неподвижных точках непрерывных функционалов и т. д. При этом мы следуем работе [23], в которой читатель может найти подробности и указания на литературу. Для того чтобы применить этот подход к ЕР-програм- мированию, определим основное упорядочение ЕР-объектов х и у:
х^у тогда и только тогда, когда х = ± или х = у.Будем рассматривать FP-форму Ef как функционал и примем
без доказательства, что все FP-формы Е/ являются непрерывными функционалами. В дальнейшем мы существенно ограничим рассмотрение стандартных вопросов.
Как уже отмечалось, для того чтобы решить (6), мы хотим найти наименьшую неподвижную точку f для
Ef==p^q;Hf .
Мы знаем, что f = Hm En_L, но удобнее начинать с р—> q; ±, чем с J_. Таким образом, мы хотим показать, что наименьшая неподвижная точка Е является пределом последовательности (Ю)fn = En(p ->q; Т) .
Ясно, что
(И)± С р -> q; ± < Е _L = р -> q; Н ± .
Поэтому
EnT^En(p-->q; ±)<Еп+1± .
Следовательно, получается, что Hm Еп± = Нт En (р-> q; _L) = = решение (6). Располагая этим фактом, мы можем доказать следующие лемму и теорему.
Лемма о линейной аппроксимации. Если форма Н линейна и
Ef = p ^q; Н/ ,
то для всех п ^ 0
En(p->q; ±) = p-->q; . . Н?р ->Hnq; L •
Доказательство проведем с помощью индукции по п. Для п = 0 равенство (14) выполняется: обе части равны р—>q; ±, поскольку F°f = f для любой формы F. Предположим, что (14) выполняется для п ^ 0, и докажем, что оно выполняется и для n + 1. Имеем
En+,(p->q; ±) = E(En(p -q; ±)) по определению композиции = Е (р --> q; . . .; Н?р -> Hnq; ±) по индукционному предположению
= p->q; Н(р—>q; . Hrtp->Hnq; ±) по (13) — р > q; Htp—>Hq; .Н^рНп+.^; Н± ис-
пользуем п раз (L1) для Н = p->q; Htp->Hq; И', *'р ^Hn+Iq; Т
Последнее равенство следует из предыдущего, поскольку замена H_L на ± ничего не меняет для любого объекта х, для ко-
торого Н ± : х = ±. С другой стороны, еслиН ± : х =# ±, то, согласно (L2), Htp:x=T. Таким образом, в этом случае значение En+1(p->-q; 1) на х равно Hq : х и безразлично, какая функция занимает последнюю позицию. Следовательно, для п + 1 равенство (14) выполняется на любом х, если оно выполняется для п. □
Теперь мы можем доказать следующую теорему.
Теорема о линейном расширении. Пусть Н — линейная форма. Тогда наименьшим решением уравнения
(15)(15)f = p^q; Hf
(15)
(15)
является
(16)(16)f = р -^ q;f = р -^ q;H?p^Hnq; ...H?p^Hnq; ...
(16)
(16)
f = р -^ q;
f = р -^ q;
H?p^Hnq; ...
H?p^Hnq; ...
Доказательство. Мы показали (см. (9), (10), (И), (12)), что наименьшее решение (15)—это f = lim En(p -> q; ±). В силу леммы о линейной аппроксимации
En(p->q; ±) = p->q; ...; Н?р Hnq; ±
По определению бесконечных условий (8) правая часть (16) представляет собой предел En(p—>-q; _L); следовательно, она равна f, то есть наименьшему решению (15), что и требовалось доказать. □
Для того чтобы понять, что данный подход к линейным формам и теорема о линейном расширении представляют собой обобщение подхода, развитого в [ 10], достаточно рассмотреть теорему о рекурсии из [10]. Она утверждает, что уравнение
f = p^q; Qf , где Qf = ho[ijoj] ,
имеет решениеf = р q;имеет решениеf = р q;pojn^Qnq; . . . .pojn^Qnq; . . . .
имеет решение
f = р q;
имеет решение
f = р q;
pojn^Qnq; . . . .
pojn^Qnq; . . . .
Результаты, полученные в данной работе, показывают, что форма Q линейна, поскольку она является композицией базисных линейных форм, и что
QtW°j •
Следовательно, теорема о рекурсии представляет собой частный случай теоремы о линейном расширении для конкретной линейной формы Q: ее утверждение сводится к тому, что для ^ = Q выполняется теорема о линейном расширении.
Наше обсуждение линейных форм показывает, в частности, что для решения уравнения (15), где Н имеет вид
Hf = a-^f ob;ho[(e->d; fog), (i->j; ko[m,fog])]
иHtf = a—>fob; e&i->T; fog,
можно применить теорему о линейном расширении, хотя Н?р и Hnq, по-видимому, окажутся очень сложными (если параметры формы Н не будут подобраны специальным образом).
ОБОБЩЕННЫЕ ОПРЕДЕЛЕНИЯ
Одна из самых серьезных проблем FP-программирования заключается в том, что определения функций, не содержащие переменных, трудны для восприятия. Рассмотрим, например, функцию f, которая на объектном уровне задается так:
f: <x,<y,z)) = «x,y),(x,z)) ■
Соответствующее FP-определение на функциональном уровне имеет вид
Def f = [[1,1 о 2], [1,2 о 2]] .
Это определение не только более туманно, чем (1), но и определяет некоторое расширение функции (1). Например, согласно (2),
f: (a,(b,c,d),e) = «a,b),(a,c)) ,
в то время как в соответствии с (1) эта функция на таком аргументе не определена.
Таким образом, со стандартными FP-определениями связаны две серьезные проблемы: (А) композиции функций-селекторов, заменяющих переменные, воспринимаются труднее, чем (1), и (В) FP-определение не ограничивает должным образом область определения функции, если не добавить к нему соответствующее громоздкое условие.
Мы предлагаем новый тип FP-определений: так называемые обобщенные определения, которые (а) воспринимаются так же легко, как (1), и (Ь) правильно ограничивают область определения. В то же время сохраняется функциональный уровень и определение одновременно является алгебраическим законом для определяемой функции. Например, обобщенное определение
xdef f o[x,[y,2]] = [[x,z/],[x,z]]
задает ту же функцию, что и (1): функция не определена, если се аргумент имеет не тот вид, который указан в (1).
Ключевое различие между (1) и (3) заключается в том, что в (3) х, у и z — это функциональные переменные, а в (1) это объектные переменные. Хотя (3), как и (2), — определение функционального уровня, понять его (при наличии некоторых навыков) не сложнее, чем (1).
Обобщенное определение (3) верно для всех функций х, у и z; таким образом, оно не только определяет f, но и является очень полезным алгебраическим законом для f. В большинстве FP-программ g, в которых используется функция f, она встречается в контексте вида
f o[r,[S,t]J,
где г, s и t — некоторые функции, с помощью которых в программе g формируются три части аргумента функции f. При изучении свойств g обобщенное определение можно использовать как алгебраический закон и заменить в программе g функцию f ° [г, [s, t] ] функцией [[г, s], [г, t]] (по аналогии с применением закона (1), позволяющего заменить объект f : <х, <у, z>> объектом <<х, уХх, z>>). Очевидно, что при исследовании свойств программ намного удобнее иметь возможность заменять одну подпрограмму другой, чем возможность заменять один объект другим.
Еще одно важное свойство, которым должны обладать обобщенные определения, — это легкость их преобразования в стандартные, свободные от переменных FP-определения. Мы аккуратно введем обобщенные определения и докажем, что с их помощью можно описать те и только те функции, которые можно определить стандартным образом. Благодаря этому условию обобщенное определение играет роль универсального алгебраического закона для определяемой функции.
Перед тем как рассмотреть эти определения в общем виде, приведем еще несколько примеров (вместе со стандартными определениями тех же функций). Рассмотрим
xdef last о cz о [д-,;/] = null о z/ ->х; last оу .
Функция last определена лишь тогда, когда у—последовательность; в противном случае last «увидит» неопределенность и выдаст неопределенность. Если же у — последовательность, last «увидит» непустую последовательность, первый элемент которой задается функцией х. Таким образом, х обозначает функцию, задающую первый элемент аргумента last, а у обозначает Функцию, задающую хвост аргумента. Это обобщенное определение эквивалентно стандартному определению
Def last = р (null о tl1; last о tl); Т ,
где р = eq о [cz ° [1, tl], id] — предикат, формально необходимый для того, чтобы функция last была определена только на непустых последовательностях (в данном примере это не обязательно).
Еще один пример: xdef f о [х,х] = g о х .
Эта функция определена на парах равных элементов. Соответствующее стандартное определение имеет вид
Def f--=eqo[[l,l],id] ->go 1; T .
Заметим, что обобщенные определения можно преобразовать в определения объектного уровня заменой «о» на «:» и квадратных скобок на угловые скобки. Тогда последний пример принимает вид f: (%, х) = g : х .
Как показывает последний пример, обобщенное определение функции f имеет вид
xdef f о Ex^-.Xn = Ff^-.-Xn ,
где Е и F — соответствующим образом ограниченные формы, зависящие от Xi, ..., хп (форма F может иметь дополнительную переменную, которая заменяется на f, если определение рекурсивно). Этот пример также показывает, что на (4) накладываются два неявных ограничения, которые мы можем сформулировать явно.
Ограничение 1. Если для некоторых функций Xj ... хп и некоторого объекта у выполняются условия (Exi ... хп) :у=± и (FfXl ... хп): у =И= -L, то (f ° Exi ... xn): у = _L. Другими словами, функция f должна быть строгой, даже если (4) говорит о другом.
Ограничение 2. Для любого объекта z, который нельзя получить как (Exi . . . хп) : у = z ни для каких функций Xi, . . . , хп и ни для какого объекта у (т. е. функция f в (4) никогда не «увидит» такое z), выполняется f:z=l. Другими словами, функция f должна быть определена только на тех аргументах, которые f может «увидеть» в (4).
Совершенно не очевидно, что определение (4) с ограничениями 1 и 2 вообще определяет какие-то функции. Тем не менее мы убедимся, что это так. Сначала определим а) дистрибутивные формы, Ь) обратимые формы, с) предикаты области рЕ для дистрибутивных и обратимых форм Е.
После этого уточним понятие обобщенного определения: будем говорить, что (4) является обобщенным определением, если
форма Е%1 ... хп дистрибутивна и обратима,
форма Ef^i . . . хп дистрибутивна по хх . . . хп и, кроме того, (4) определяет такую наименьшую функцию f, что, во-первых, для любых функций fi, . . . , fn
foEf1...fn = ToEf1...fn->Fff1...fri; Т
(здесь уже содержится ограничение 1) и, во-вторых, удовлетворяется ограничение 2.
Наконец, мы докажем теорему об обобщенном определении, утверждающую, что любая функция, удовлетворяющая (5) и ограничению 2, удовлетворяет также следующему уравнению (и наоборот):
f = pE->Ffs1...sn; 1 ,
где ре — предикат области для Е, a Si . . . sn— некоторые «обратные функции», связанные с Е.
Таким образом, теорема об обобщенном определении утверждает, что обобщенное определение (4) определяет ту же функцию, что и стандартное определение (6), прямо полученное из обобщенного определения.
(Обсуждение обобщенных определений в данной работе затрагивает часть результатов, которые должны появиться в статье автора и С. В. Смоляра. В этой статье определения будут расширены таким образом, чтобы допустить введение новых функциональных переменных в предикаты, входящие в правую часть определения. Область определения этих переменных зависит от предикатов, в которые они вводятся.)
Дальнейшее (более строгое) изложение сопровождается примерами, иллюстрирующими новые определения и понятия.
Формальное описание и обоснование расширенных определений. Определения и примеры
Дистрибутивные формы
Форма Е%1 ... xnvi ...Vm называется дистрибутивной по переменным, V1 . . . Um, если
(Ef,...fngl...gm) ° h = Efb-.fn (gl О h)...(gm ° Ю
Для любых функций fi . .. fn, подставленных вместо недистрибутивных переменных Xi . . . хп, для любых функций gi . .. gm, подставленных вместо дистрибутивных переменных Ui ... vm, и для
любой функции h. Если форма Ел^ ... хп дистрибутивна по всем переменным хх ... хп, будем называть ее просто дистрибутивной.
Примеры дистрибутивных форм
Формы, дистрибутивные по х и у;
Ext/ = ro[gox,z/] ,
Еху = р о х—> h о х; g о [х,у] ,
Qxy = [z,y] (для некоторого объекта z).
Формы, дистрибутивные по у (но не по х):
Еху = хоу ,
Рху = Х°[М°У1 ,
Gxy = [х о z,h о у^ .
Формы, дистрибутивные при условии, что р является постоянной функцией (в противном случае недистрибутивные ни по одной переменной):
Еху = р> х; у ,
Fxt/= [р ,g ° x,h ° z/J .
Недистрибутивная форма:
Gx = ax
Как показывают эти примеры, форма Exi ... xnvi ... vm является дистрибутивной только тогда, когда переменные или функции в Е, которые непосредственно «видят» аргумент Е, — это либо дистрибутивные переменные, либо постоянные функции. Заметим, что форма Еху = х дистрибутивна как по х, так и по у. Ясно, что если форма E%i ... хп дистрибутивна, а формы Ei, ... , Еп дистрибутивны по vi, ..., Um, то форма EEi ... Ет дистрибутивна по vi, . .. , vm.
Обратимые формы
Форма Е%1 ... хп называется обратимой по Xi, если существует такая обратная функция s$ (для Xi в E%i ... хп), что для любых функций fb ... , fn
ToEf1...fn->->sioEf1...fn = fi
(Напомним, что Т — строгая функция, поэтому необходимо, чтобы форма Efi . .. fn была определена.) Если форма E%i ... хп обратима по всем переменным Xi, ..., хп (с обратными функциями Si . .. sn), будем называть ее просто обратимой.
Примеры обратимых форм
Форма
Еху = [х,у}
имеет обратную функцию Si = 1 (по х) и s2 = 2 (по уУ ФормаFxy= с= о [х,^/]
имеет обратные функции Si = 1 и s2 = tl. Форма
Gxyz = Yx,cio\ylz\A
имеет обратные функции Si = 1, s2=l°2 и s3 = tl°2. ФормаНх =[х,х]
имеет две различные обратные функции по х*. s1 = 1 и s' = 2. Форма
Ixyz = distl ° [х, [#, г]] имеет обратные функции s1 = 1 о 1 или s'=lo2, s2 = 2ol и s3 = 2o2.
Предикаты области для форм
Пусть Exi ... хп — дистрибутивная и обратимая форма с обратными функциями sb ..., sn. Тогда предикат
pE = eq = [Esr..sn,id]
называется предикатом области для формы Exi ... хп и обладает следующим свойством: если для объекта х существуют такие функции f! ... fn и такой объект у, что х = (Efi ... fn) : у, то рЕ : х = Т.
Примеры предикатов области
Форма
^xy=Yx,y\
имеет предикат рЕ = eq ° [ [ 1, 2], id]. Отметим, что рЕ : z=_L для объекта z, являющегося атомом или кортежем длины 1, рЕ : z=
= Т для пар и рЕ : z = F для более длинных кортежей. Форма
Vxy = [х,у,х]
имеет два различных предиката области (поскольку существуют две обратные функции по х, а именно s^l и s' = 3):
pF = eq ° [[1,2, l],id] ,
Pf = eq ° [[3,2,3], id] .
Разумеется (по определению предикатов области), использование различных обратных функций для различных вхождений х в F недопустимо. Следовательно,
eq о [[1,2,3] ,id]
не является предикатом области для формы F.
Заметим, что pF : <u, v> = F, в то время как рЕ : (u,v) = ±. Поэтому с предикатом области может возникнуть некоторая путаница. Но мы будем использовать предикаты области только для ограничения области определения функции, т. е. только в контексте
PE>f- ± -
При таком использовании никакой путаницы не возникнет. Мы покажем, что если рЕ и р^— два предиката области для формы Е, то
Ре^С -L Ре ’ -^ •
Поскольку форма Е имеет различные предикаты области только в том случае, если она имеет различные обратные функции по некоторой переменной, достаточно доказать следующую теорему.
Теорема. Пусть Ехг..хп — дистрибутивная и обратимая форма с обратными функциями s,,. .. ,sn. Пусть sk и sk — обратные функции по хк, и пусть е = Esr..sk...sn и ef = Esr..sk...sn. Далее, пусть рЕ ™ eq о [е,id] и р^. = eq о [e',id]. Тогда для любой функции f
PE-*f; ±=рЕ-И; I-
Доказательство. Достаточно показать, что для любого объекта у рЕ : у — Т тогда и только тогда, когда рЕ:у = Т. По соображениям симметрии достаточно провести доказательство лишь в одну сторону. Поэтому предположим, что рЕ : у = Т, и
докажем, что р^.: у = Т. Если рЕ : у = Т, то, по определению рЕ, е : у ^ у или
еоу = у .
В силу дистрибутивности Е
e = y = E(s1ov)...(skoy)...(sn = 7) .
Поскольку sk — обратная функция для Е,
Toeoy->->s,koE(s|oy)...(skoy)...(snoy)==skoy ,
или, с учетом (Ь),
Т о е о у -> -> s'k ° е о у = sk о у .
Но из (а) следует, что
s'koeoy = s'oy .
Поскольку в силу (а) е°у = у, получаем Тоеоу = Тоу = Т (так как у=#1 в силу рЕ:у = Т). Поэтому ограничение (d) можно опустить. Из (d) и (е) получаем
Sk о у = s'k о у .
Следовательно, в (Ь) можно заменить sRoy на skoy;
eoy = E(s1oy)...(skoy)...(snoy) = e/oy .
Из (а) и (g) получаем, что е'°у = у, поэтому е': у = у. Значит, р'Е : у=Т, что и требовалось доказать.□
Обобщенные определения
Пусть форма Exi ... хп дистрибутивна и обратима, а форма Ffxt ... хп дистрибутивна по %ь . .. , хп. Тогда
xdef f о Exr..xn = Ffxr..xn
называется обобщенным определением функционального символа f. Функция f, определенная посредством (7), является наименьшей функцией, которая для любых функций fi ... fn удовлетворяет условию
f о Efr..fn = Т ° Efr..fn-> Fffr..fn; Г ,
а также удовлетворяет следующему условию:
для любого объекта z, для которого f : z #= ±, существуют такие функции f,,...,fn и такой объект у, что z = (£(,...(„): у .
Если выполняются условия (8) и (9), то функция f удовлетворяет ограничениям 1 и 2, сформулированным во время предварительного обсуждения.
Примеры обобщенных определений
Обобщенное определение
xdef g о [х,у\ = eqO о х^ у, g о [sb о х, mult о \у,х] ]
(где sb — вычитание единицы, a mult — умножение) определяет итеративную функцию, для которой g° [id, 1] дает факториал. Стандартное определение функции g таково:
Def g = eq о [ [1,2], id](eqO о 12; g о [sb о 1 ,mult о [2,1] ]); Т .
Теорема об обобщенных определениях
Прежде чем перейти к основной теореме, докажем несколько лемм.
Лемма 1 (об ограниченной подстановке). Пусть
форма Exr..xnur..um дистрибутивна по ир...,ит;
p->~>gk = gk для некоторого к из [1...ш].
Тогда для любых функций f1,... ,fn, gx,. . . , gm
p-->^Efl..^ig|...gk...gm = Ef|...fMgr.^ .
Доказательство. Пусть даны функции fb ..., fn, gb ... , gm и пусть для gk и gk выполняется (b). Пусть х— произвольный объект, для которого р : х = Т. Тогда, согласно (Ь), имеем gk о х = g' о х ив силу дистрибутивности Е
(Efl-fng,-gk-gm)°X
= Efr..fn (g, о x)...(gk о X)...(gm о X)
= Efr..fn (g, о x)...(g'k = X)...(gm о X)
-(E^Agl-gk-gm)0* •
Таким образом, (с) выполняется для любого х, для которого р : х = Т, что и требовалось доказать.□
Лемма 2. Пусть
Е%1 ... хп — дистрибутивная и обратимая форма с обратными функциями sb ... , sn;
форма Ffx} ... хп дистрибутивна по хь ..., хп.
Тогда для любых функций f, fi ... fn
f = Et1..Jn^-»(Fts]...sJ-(Ef]..Jll) = Ftt1...fI] ;
T,Et]...ri] ^(Esr..s„), (Ef.-.-f,,) — ЕГ....Г,, .
Доказательство. Пусть даны функции fi ... fn и e = Efi ... fn. Тогда, поскольку форма E обратима,
T о e->-> sk о e = fR
и, так как форма F дистрибутивна по хх ... хп,
(Ffs1...sn)oe = Ff(s1oe)...(snoe) .
Применяя к (f) и (е) п раз лемму 1, получаем
foe —(Ffs1...sn)oe = Fff1...fn .
Отсюда следует равенство (с), а равенство (d) представляет собой частный случай (с), поскольку форма Е дистрибутивна. □
Лемма 3. Пусть T°f->->gof = w°f. Тогда g of = w °f.
Доказательство. Пусть дан объект х. Если f: х определено, то по условию gof:x=w°f:x. Если же f: х = ±, то обе части заключения равны _L.□
Лемма 4. Пусть
E%! ... хп— дистрибутивная и обратимая форма с обратными функциями sb ..., sn;
рЕ — предикат области для формы Е, т. е. рЕ = eq о ° [ES] .'.. sn, id].
Тогда для любых функций fi ... fn
pEoEf1...fn = ToEf1...fn .
Доказательство. Пусть даны функции fi ... fn, и пусть е = = Ef] ... fn. Тогда
pEo6 = eqo [Esr..sn,id] ое
= eqo [(Esr..sn)oe,e]
= eqo[E(s1oe)...(snoe),e] .
Пусть Hxi ... х„у = eq ° [Exi ... хп, yV Тогда форма Н дистрибутивна и в силу (d)
рЕ ° е = Н (s, ° e)...(sn ° е) е .
Поскольку форма Е обратима,
(О Т о е ->-> sk о е = fk .
Применяя п раз лемму 1 к (f) и к правой части (е), получаем
Toe -> > рЕ о е = Hfr..fne = eq о [е ,е] = Т о е .
Согласно лемме 3,
рЕое = Тое .□
Теорема об обобщенных определениях. Пусть
Ел^ ... хп— дистрибутивная и обратимая форма с обратными функциями sb .sn;
форма Ffxt ... хп дистрибутивна no хь ..., xn;
Ре—предикат области для Е.
Тогда f удовлетворяет (10) для любых функций fb ... , fn и f удовлетворяет (11) тогда и только тогда, когда f удовлетворяет (12), где
foEf1...fn = T = Ef1...fn^Fff,...fn; ±
если f: х =/= ±', то существуют такие функции fp ... ,fn и такой объект у, что х = (Efr..fn) : у ;
f = pE->Ffsr..sn; ±
Доказательство. Необходимость. Пусть f удовлетворяет (10) и (11), пусть Hf = Ffsi ... sn и пусть e' = Esi ... sn. Тогда, поскольку функция f удовлетворяет (10) для любых fi ... fn, она удовлетворяет (10) для si . . . sn. Следовательно,
f oe^foe^Hf; T .
Поскольку ± = ± о е', по лемме 2 Т о е' > Ш о е' = Hf, в (d) можно заменить Hf на Hf °е' (так как ограничение Ье' всегда выполняется). Наконец, по лемме 4 Тое/ = рЕ°е/. Таким образом, (d) мбжно представить в виде
f о е'= рЕ о е'-> Hf о е'; 1°е' .
Поскольку рЕ = eq ° [е', id] (0 pE->^e' = id .
Мы хотим воспользоваться леммой об ограниченной подстановке, чтобы заменить в (е) е' на id, для этого нам нужна дистрибутивная форма. Рассмотрим Wx = рЕ ° х Hf ° х\ J_o%. Форма W дистрибутивна и (е) принимает вид
f ° е' = We' .
Применяя лемму 1 к обеим частям (g) и используя (f), получаем Ре->-> f ° id = Wid, т. е. (в силу определения W и свойств id)
рЕ —f = pE-Hf; Т .
Теперь покажем, что
для всех объектов х, если f :х=#±, то pFJx = T .
Пусть f : х #= ±. Тогда в силу (11) х = (Eft .. . fn) : у для некоторых функций fi . . . fn и объекта у. Поскольку f : х ^ -L, то х J_ (f— строгая функция), и поэтому (T°Efi .. Лп):у = Т. Следовательно, по лемме 2 (e'<>Efi ... fn) : у = (Efi ... fn)y. Но (е' ° Efi . . . fn) : у = е': (Efi . . . fn : у) = е': х. Поэтому е':х=х и рЕ : х = Т. Следовательно, (i) справедливо.
Обращением (i) будет следующее утверждение:
для всех х, если рЕ : х ^ Т, то f : х = JL.
Из (h) и (j) следует, что для любого объекта х выполняет равенство
f = pE-^Hf; ± ,
так как если рЕ : х = Т, то (к) выполняется в силу (h), а в противном случае оно выполняется в силу (j). Это и завершает первую часть доказательства.
Достаточность. Пусть функция f удовлетворяет (12). Покажем, что она удовлетворяет (10) и (11) для любых fi, . .., fn. Пусть даны некоторые fb . . . , fn, и пусть, как и раньше, е = = Efi . . . fn и Hf = Ffst . .. sn. Рассмотрим композицию е с обеими частями равенства (12) и применим к правой части полученного равенства закон II. 1:
f о е = рЕ о е Hf о е; ±°е .
Поскольку 1ое=1 и в силу леммы 4 рЕ°е —Т°е, равенство (1) принимает вид
f о е = Т ° е-> Hf о е; I .
По лемме 2
Т о е ->-> Hf о е = Fffr..fn .
Поскольку Hfoe в (т) всегда удовлетворяет ограничениям из (п), из равенства (ш) с учетом (п) следует
f oe = Toe->Fffr..fn; Т .
Таким образом, функция f удовлетворяет условию (10) для произвольных fj, .. ., fn. Пусть теперь f: х =/= ±. Тогда в силу (12) Ре : х = Т и, следовательно, (Esi ... sn) : х = х. Поэтому существуют такие функции Si, ... , sn и такой объект х, что х = = (ES! ... sn) : х, т. е. функция f удовлетворяет условию (11).□
7. ДРУГИЕ РАБОТЫ НА ЭТУ ТЕМУ
Здесь невозможно даже упомянуть все работы, связанные с доказательством теорем о программах, или хотя бы те из них, которые связаны с преобразованиями программ из одного вида в другой без изменения их смысла. Я думаю, что из-за сложности традиционных фон-неймановских языков программисты едва ли смогут когда-либо пользоваться доказательствами и методами преобразований программ, написанными на этих языках, без помощи автоматических систем. Во всяком случае, дух большинства работ по технике доказательства для фон-неймановских языков (восходящий к аксиоматическому подходу, разработанному Хоаром, см. [20]) значительно отличается от предложенного здесь подхода. Поэтому мы обсудим лишь те работы, в которых рассматривают доказательства или преобразования чисто функциональных программ.
В большинстве своем эти работы посвящены рекурсивно определенным функциям и основаны на работах Чёрча [15], Карри [16], Клини [21] и Скотта [34]. Среди самых ранних работ в этой области можно назвать статьи де Баккера [17], Бёрстол- ла [13], Флойда, Манны с соавторами [24], Маккарти [26], Морриса [28], Наура [30] и Парка [31]. Результаты этих работ обобщаются в [23].
В отличие от большинства работ о доказательствах и методах преобразований для рекурсивно определенных программ, в данной работе мы попытались предложить единый подход к нерекурсивно и рекурсивно определенным программам на основе общей алгебраической системы, которая позволяет формулировать полезные общие теоремы об Обоих типах функций.
В последнее время резко возросло число работ, посвященных связи функциональных языков с новой архитектурой вычислительных машин. Поскольку эти работы слабо связаны с данной статьей, я оставлю их обсуждение на будущее.
Раймонд [32, 33] независимо (и раньше нас) разработал интересную алгебру функций, во многом пересекающуюся с FP- алгеброй. Но использовал он эту алгебру несколько иначе (один из его результатов — обобщение хорошо известной теоремы о факторизации, см. [7]). Два менее существенных отличия заключаются в том, что (а) его множество функционалов, по-ви- димому, затрудняет запись выражений вида f ° [g] и (b) он включает в свое множество функционалов оператор sb который «зависит от контекста». Тем не менее следствия его аксиомы во многом совпадают с FP-алгобраическими законами из [10]. Его алгебра построена на более абстрактном базисе, в то время как FP-алгебра, разработанная несколько позже, выросла из FP-исчисления, предложенного в [9]. Когда разрабатывалась алгебра, описанная в [10], автору не были известны работы Раймонда.
Существует интересная и еще не до конца изученная связь между линейными формами, о которых идет речь в данной статье, и линейными рекурсивными схемами из [37]. Мы определили линейные формы Н через семантические свойства Н и частично охарактеризовали эти формы на основе их структуры. В то же время Уокер и Стронг структурно охарактеризовали линейные схемы, используя совершений иной подход. Тем не менее, по-видимому, существует взаимно однозначное соответствие между нашими линейными формами и их линейными схемами. Мы стремимся формально решить линейные уравнения, чтобы облегчить рассуждения об определяемых ими функциях. Они стремятся охарактеризовать свои схемы, как схемы потоков и, в частности, показывают, что многие нелинейные схемы, как и линейные, являются потоковыми. Схемы потоков имеют в значительной степени иную природу, чем решение уравнений в нашем смысле; многие схемы" потоков обозначают бесконечно ветвящиеся разворачивающиеся процессы, которые не имеют простых формальных решений. Тем не менее в [38] приводятся полезные формальные решения двух классов нелинейных уравнений.
По-видимому, одна из самых изящных работ о преобразованиях функциональных программ — это статья Бёрстолла и Дарлингтона [4]. С помощью методов «свертки» и «развертки» им часто удается доказать эквивалентность двух рекурсивно определенных функций проще, чем позволяют другие методы. Оказалось, что их метод и наш алгебраический подход прекрасно
дополняют друг друга. Хотя их метод в основном работает на объектном уровне, он обычно допускает очень простой переход на функциональный уровень. Использование алгебраических законов и теорем иногда может помочь уточнить рассуждения, которые используются на определенных шагах преобразований* Аккуратно применяя алгебраический подход, можно уточнить области выполнения равенств. Поскольку алгебраические равенства сохраняют свойство терминальности (т. е. равенство f = g означает, что f и g либо одновременно определены, либо одновременно не определены), возможно, удастся разработать алгебраический вариант метода свертки и развертки, который будет сохранять это свойство (в отличие от существующего метода свертки и развертки).
Алгебраический подход может иногда помочь преодолеть и еще одну трудность, связанную с методом свертки и развертки. Иногда легче определить конечную функцию (т. е. цель множества преобразований), чем придумать правильные определения и подстановки (связывающие начальные и конечные функции), формирующие базис метода. В этом случае можно воспользоваться теоремой о линейном расширении или ее обобщением на некоторые нелинейные случаи (см. [38]), чтобы решить уравнения, описывающие начальные и конечные функции, а затем использовать полученные результаты для доказательства нужных соотношений между ними. Этот подход может также помочь найти, в каких случаях предложенная конечная функция не эквивалентна начальной. Обнаружение таких случаев часто оказывается наиболее сложным. После того как функция подобрана, доказательство эквивалентности часто не составляет труда, а сделать сам выбор сложно.
В [12] Бёрдж приводит интересные многопараметрические функционалы в лямбда-стиле, которыми удобно пользоваться для построения программ на функциональном уровне и которые выходят за рамки обычных функционалов, используемых в лямбда-стиле (например, map, maplist). Такие функционалы особенно полезны в области потоков, где Бёрдж в качестве объектов использует потоковые функции, а поэтому и комбинирует функции вместо объектов.
Помимо уже названных существует множество работ, посвященных автоматическому доказательству свойств функциональных программ с помощью различных методов доказательства и проверки. Важные результаты в этой области получены Милнером и его коллегами по LCF ([27]), Гуттагом, Горовицем и Массером по доказательству теорем о лисповских функциях ([18]), а также Бойером и Муром ([8]). Кроме того, многое делается для создания более хороших языков и разработки ос-
новополагающих принципов, которые облегчили бы исследование программ. В этой области можно назвать работу [19] группы ADJ о семантике исходной алгебры, а также работы Бёр- столла и Гогена [5], [6] об использовании теории для создания спецификаций, работы Арбиба и Мейниса [1], [2] о частично аддитивной семантике и канонических неподвижных точках и, наконец, работы Тёрнера [35], [36] о языке SASL.
В этих работах развиваются совершенно разные подходы, и пока рано обсуждать их связь с данной статьей. Тем не менее сделаем несколько замечаний. Большинство этих работ основаны на более сильных теориях, чем та теория ограниченных равенств, которую развиваем мы, и, следовательно, в их рамках можно доказать теоремы, которые не удается доказать в нашей алгебре (см., например, [8], [27]). Тем не менее системы автоматического доказательства теорем о равенствах, обсуждаемые, в частности, в [18] и [29], могут оказаться полезными для доказательства утверждений в нашей алгебре.
По-видимому, существует тесная связь между частично аддитивными функциями из [1] и функциями на множествах, предложенными Мартином в работе [25], где стиль, аналогичный FP, развивается в новой области. Мы предполагаем изучить эту связь в будущем.
Представляет интерес также анализ некоторых результатов объектного уровня с точки зрения функционального уровня. В частности, результаты по типам данных в [18] ив других работах и результаты по FP-алгебре программ, по-видимому, хорошо дополняют друг друга. Возможно, это позволит упростить теорию типов данных.
БЛАГОДАРНОСТИ
Мне приятно поблагодарить Джона Г. Уильямса за полезные обсуждения, а также за то, что он указал мне ряд ошибок в более ранних вариантах этой работы. Я уже говорил о своей признательности Д. Уильямсу и М. Арнольду зД их вклад в работу о линейных формах и равенствах.
ЛИТЕРАТУРА
Arbib М. A., Manes Е. G. The pattern-of-calls expansion is the canonical fixpoint for recursive definitions. Tech. Rep. Math, and Statistics, Univ, of Mass., Amherst, Mass., Jan. 1979.
Arbib M. A., Manes E. G. Partially additive categories and flow-diagram semantics. J. Algebra 62, 1, Jan. 1980.
Arnold M. (Private communication) May, 1980.
Burstall R. M., Darlington J. A transformation system for developing recursive programs. J ACM 24, 1, Jan. 1977.
Burstall R. М., Goguen J. A. Putting theories together to make specifications. Proc. International Joint Conference on Artificial Intelligence, Cambridge, Mass., 1977.
Burstall R. M., Goguen J. A. The semantics of Clear, a specification language. Proc 1979 Copenhagen Winter School on Abstract Software Specification Copenhagen, Feb. 1980.
Bohm C., Jacopini G. Flow diagrams. Turing machines, and languages with only two formation rules CACM 9,5, May 1966.
Boyer R. S., Moore J. S. A computational logic. Academic Press, New York, 1979.
Backus J. Programming language semantics and closed applicative languages. Conf, record, ACM Symp. on Principles of Programming Lan- gauges, Boston, Mass., Oct. 1973.
Backus J. Can programming be liberated from the von Neumann style? A functional style and its algebra of programs. CACM 21,8, Aug. 1978.
Backus J. On extending the concept of «program» and solving linear functional equations. Draft paper distributed at Summer Workshop on Programming Methodology, Univ, of Calif, Santa Cruz, Aug. 1979.
Burge W. H. Even more structured programming. Tech. Rept. RC4604 IBM Thos. J. Watson Research Center, Yorktown Hts, NY, Oct. 1973.
Burstall R. M. Proving properties of programs by structural induction. Computer J. 12,1, Feb. 1969.
Cadiou J. M. Recursive definition of partial functions and their computations. PhD Thesis, Computer Science Dept., Stanford Univ., Stanford, Calif., Mar. 1972.-,
Church A. The calculi of lambda-conversion. Princeton Univ. Press, Princeton, NJ., 1941.
Curry H. B., Feys R Combinatory logic. North-Holland, Amsterdam, 1958 (second printing 1968).
deBakker J. W., Scott D. A theory of programs. (Unpublished memo.) Aug. 1969.
Guttag J. V., Horowitz E, Musser D. R. Abstract data types and software validation. CACM 21,12, Dec. 1978.
Goguen J. A., Thatcher J W., Wagner E G., Wright J. B. Initial algebra semantics and continuous algebras JACM 24,1, Jan. 1977.
Hoare C. A. R. An axiomatic basis for computer programming. CACM 12,10, Oct. 1969.
KJeene S. C Introduction to metamathematics. D. van Nostrand, Princeton, NJ., 1952. ДИмеется перевод: Клини С. К. Введение в метаматематику.— М.: ИЛ, 1957.]
Landin Р. J. The mechanical evaluation of expression. Computer J. 6,4, 1964.
Manna Z., Ness S, Vuillemin J. Inductive methods for proving properties of programs. CACM 16,8, Aug. 1973.
Manna Z , Pnueli A. Formalization of properties of functional programs. JACM 17,3, July 1970.
Martin J. J. Typed functional programming systems. Tech. Rept. Comp. Sci. Dept., Virginia Polytechnic Inst, and State Univ. Blacksburd, VA., 1980.
McCarthy J A basis for a mathematical theory of computation (in) Computer Programming and Formal Systems, P. Braffort and D. Hirsh- berg (eds.), North-Holland, Amsterdam, 1963.
Milner R Models of LCF. Mathematical Centre Tracts 82, Univ, of Edinburgh, 1976.
Morris J. H., Jr. Another recursion induction principle. CACM 14,5, May 1971.
Musser D. R. Convergent sets of rewrite rules for abstract data types. Tech. Rept, Univ, of So. Calif. Information Seis. Inst, Marina del Rey, Calif., Dec. 1978
Naur P. Proof of algorithms by general snapshots. BIT 6, 1966.
Park D. Fixpoint induction and proofs of program properties (in) Machine Intelligence 5, B. Meltzer and D. Michie (eds).
Raymond F. H. Note sur l’algebra des fonctions. R. A. I. R. O. R-3, Dec. 1975.'
Raymond F. H. Note sur la suppression des etiquettes en programmation. R.A. I.R.O. 11,1, 1977.
Scott D. Outline of mathematical theory of computation. Proc. Fourth Annual Princeton Conf, on Information Sciences and Systems, Princeton Univ. 1970.
Turner D. A. SASL language manual. Tech. Rept., Univ, of Kent, Canterbury, Aug. 1979.
Turner D. A. A new implementation technique for applicative languages. Software-Practice and Experience 9, 1979.
Walker S. A., Strong H. R. Characterizations of flowchartable recursions. J. Computer and System Sciences 7,4, Aug. 1973.
Williams J. H. On the development of the algebra of functional programs. Tech. Rept. RJ2983, IBM Research Lab., San Jose, Calif., Oct. 1980.
ДОПОЛНЕНИЕ ПЕРЕВОДЧИКА
В 1977 году Джону Бэкусу за выдающиеся результаты, достигнутые в области императивных языков программирования и фон-неймановских вычислительных машин, была присуждена Тьюринговская премия. Каждый лауреат этой премии по традиции читает лекцию, расширенный вариант которой затем публикуется в журнале Communications of the ACM.
Каж ни странно, Тьюринговская лекция очередного лауреата была посвящена тотальной критике положения, сложившегося в программировании, — причем именно в тех его разделах, за успешную работу в которых ему и была присуждена престижная премия:
«Императивные языки программирования становятся все более громоздкими, но не более сильными. Они оказываются «толстыми» и «рыхлыми» из-за своих фундаментальных наследственных пороков: примитивного стиля программирования «сло- во-за-шаг», унаследованного от их общего предка — фон-нейма- новского компьютера; порочной связи с семантикой переходов состояний; разграничения программирования на мир выражений и мир операторов; неспособности эффективно использовать мощь комбинирующих форм для построения новых программ из уже существующих; наконец скудости полезных математических свойств, позволяющих рассуждать о программах».
«В то время как разбухание языков приводит лишь к минимальному увеличению их возможностей, небольшие и элегантные языки — такие, как Паскаль,— остаются популярными. Но мы остро нуждаемся в мощной методологии, способной помочь нам мыслить о программах, и нет ни одного императивного языка, который близко подходил бы к осуществлению этой цели».
Конечно, удивительно слышать подобную речь из уст человека, стоящего у истоков именно фон-неймановского стиля программирования, главы группы, разрабатывавшей в свое время первый императивный язык программирования высокого уровня — Фортран, придумавшего фундаментальные конструкции, которые по наследству переходили от одного языка к другому И
захватили сегодня весь программистский мир. Недаром индекс цитирования этой статьи перешел всякие границы. Вот уже более десяти лет 1Га эту работу считает долгом сослаться каждый уважающий себя специалист, касаясь проблем оснований программирования. Очень жаль, что эта статья по ряду причин до сих пор не была опубликована на русском языке.
Что же заставило мэтра фон-неймановского стиля «предать» свое детище? Увы, причин для этого оказалось достаточно. Еще в конце 60-х годов ряд ведущих специалистов начал бить тревогу по поводу кризисных явлений в программировании (об этом упоминается в книге Д. Гриса «Наука программирования»). "Истинным бичом стали ошибки в программном обеспечении. Не так страшно, когда ошибки встречаются в программах-играх. Куда хуже, если ошибка обнаруживается в программной поддержке космического аппарата как раз во время его полета (к сожалению, такие прецеденты были — и с трагическим финалом). Еще одним проявлением кризиса стали несравнимые темпы роста производительности и других характеристик вычислительных машин с одной стороны (кто-то заметил, что если бы такими же темпами развивалось автомобилестроение, то люди сегодня ездили бы со скоростью сверхзвукового самолета, потребляя на 100 километров пути 1 миллиграмм бензина) и роста производительности труда программиста — с другой. За 30 лет развития программирования производительность труда программиста поднялась от силы в 10—15 раз.
В своей критике Бэкус постоянно подчеркивает, что императивные языки переняли основные пороки от своего «духовного предка» — фон-неймановского компьютера.
«В простейшем виде компьютер фон Неймана состоит из трех частей: центрального процессора (ЦП), памяти и соединяющей их трубки, которая может за один шаг переслать одно слово между ЦП и памятью... Я предпочитаю называть эту трубку «узким горлышком» (bottleneck) фон Неймана...
Оператор присваивания — это и есть «узкое горлышко» языков программирования, которое заставляет нас мыслить категориями «слово-за-шаг» совершенно так же, как это делает горлышко вычислительной машины».
И как вывод:
«Проблемой является не только и не столько узкое горлышко Для передачи информации, но и (что куда более важно) узкое интеллектуальное горлышко, в котором мы крепко засели со своими рассуждениями типа «слово-за-шаг» вместо того, чтобы подняться до мышления более общими концептуальными категориями решаемой в данный момент задачи».
Бэкус далек от того, чтобы обвинять в сложившейся ситуации Джона фон Неймана. «На самом деле, — пишет он, — можно сказать, что я беру на себя часть ответственности за создавшееся положение».
Выход, по его мнению, один: использование нестандартного программирования. В своей Тьюринговской лекции Бэкус впервые систематически излагает идею FP-стиля (Functional Programming Style). Статья, предложенная вашему вниманию в настоящем сборнике, значительно развивает эту концепцию. Изложение в ней ведется независимо от предыдущих работ. Единственное дополнение, на которое осмелился переводчик, — это полный набор алгебраических законов FP-стиля, приведенных в Тьюринговской лекции Джона Бэкуса.
Предварительно напомним определение: f ^ g, если для любого объекта х либо f : х = J_, либо f : х = g : х, и f = g, если f < g И g f.
В приведенных далее выражениях используются следующие функции и функциональные формы (в дополнение к определенным в статье): функция atom, истинная, если ее аргумент является атомом, и ложная в противном случае; функция length, возвращающая длину кортежа; функциональная форма bu (binary to unary), для которой по определению (bu f х) : у = f: <х, у> (где х—- параметр-объект).
Композиция и конструкция
Li. [Л:...Тп]о£^=[А°£,...Тп°£]
а/о^,,... ,gn] = [f og,,.. . J ogn]
//о^....^^
= fo[gi,//°[g2,...,gn]] если n>2
= f °[gl J°[g2. • • • J Hgn-bgn]...]]
If °£g] = g
f o[x,g]=(bu f xH
s ° [f!,. . ., fs,. .. , fn] ^ fs для любого селектора s, s ^ n
Tofj^so [fP •. • Jn] = fs Для всех i ^= s, 1 < i <n 1.5.1. [fl о 1 , . . . о n] О [g,, . . . , gn] = [f, о gv, . . . , f„ о gn] L6.tlo[f,]^0
tl°[fl, • ,fn] <[f2, . • • Tn] для n>2
Tof^^tloffJ^O и tlo[f1>...,fn] = [f2,...,fn] для n^2
1.7.
distl о [fjg!, . . . .gnJJ^Hf.gJ, • • • ,[f,gn]]
Т = f> distl о [f, 0] = 0
Аналогичный закон выполняется для distr.
1.8.
^ ° [f >[gi - • • • >^п] ] = [f ,51 > • ■ • .^п] nullog-><=o[f,g] = [f]
Аналогичный закон выполняется для cz.
[.9.
[...Л....1-Т
1.10.
cz ° Vf ° g, а/ ° А] = af ° cz о [g, ft]
1.11.
pair & not о null о 1 —cz о [ [ 1 о 1,2], distr о [tl о 1,2] ] s distr
где f &g = and о [f,g]; pair = atom—> F; eq о [length,2]
П.
Композиция и условие
11.1.
{p^f\g)Qh = p^h~>f^h\g^h
II.2.
hAp-^D-.g^P^-hVhhog
П.З.
or ° [p, not о p] > > and ° [p , p] -> f; and о [p, not о p] -> g; ft =
— p-*Vi^hgYh
П.3.1.
p^tp^Y gY h = p-^f- h
III
. Композиция и другие операции
III.1.
• x°f ^X
Т о f —>-> X О f = х
III.1.1
• ± ofsf о ± = ±
III.2.
fojd = id°f = f
Ш.З.
pair1 ° distr = [1 ° 1,2], кроме того, pair—> 1 °11=е2 и т. д.
Ш.4.
d(f ° g) = af о ag
Ш.5.
null о g > > nf ° g == 0
IV
. Условие и конструкция
IV. 1.
\Y,-..\p-g\h>,...,U
IV.1.1
. [fi,... Xpx->gx\... ;Pn-*gn;A), • • • ,fm] =-px -> [fi,..., gx,..., fm];..’.;
Pn [fl, . . . ,gn,. . - , fm] ; [fl. - ..,h,... ,frn]
Перевод лекции Джона Бэкуса вскоре будет полностью опубликован в книге «Лекции лауреатов премии Тьюринга» (тематический план издательства «Мир» на 1991 г., позиция 123).
А. В. Манцивода
ОБЛАСТИ В ДЕНОТАЦИОННОЙ СЕМАНТИКЕ )
д. с. скотт
Резюме. Задача теории областей заключается в построении моделей пространств, на которых определяются вычислимые функции. В денотационной семантике используются не только пространства высших типов (например, пространства функций), но и рекурсивно определенные пространства (например, рефлексивные области). Для того чтобы построить необходимые структуры, требуется много специальных конструкторов областей (или функторов). Можно предложить несколько вариантов категории областей, однако основная категория — это так называемые непротиворечиво полные алгебраические полные частичные порядки, имеющие наиболее простые свойства. Эта категория изучается в данной статье с новой и, как можно надеяться, с более простой точки зрения, объединяющей подходы многих авторов. Дается теоретико-множественное представление областей элементов с использованием структур, называемых информационными системами. Эти системы хорошо известны в математической логике, и их использование, по-видимому, хорошо согласуется с интуицией Многое из того, что раньше задавалось аксиоматически, теперь можно доказывать как теоремы. В качестве введения в данную тематику в статье неформально обсуждается несколько примеров.
1. ВВЕДЕНИЕ
Начну с нескольких личных замечаний. Мне становится не по себе при мысли о том, сколько людей, работающих в области программирования, заработали из-за меня головную боль, пытаясь постичь математические детали теории областей. Трудность изложения этой теории состоит в том, что получаемые результаты должны оправдывать уровень абстракции: очень часто усилия, необходимые для понимания абстракций, кажутся неоправданными— в особенности когда понятия оказываются незнакомыми или чересчур общими. Например, теория категорий, часто используемая в теории областей, многим кажется слишком абстрактной. С другой стороны, теория автоматов, которая часто выигрывает от использования теории категорий, достаточно
*) Scott D. S. Domains for denotational semantics. — Leet. Notes in Comp. Sci, 1982, v 140, p. 577—612.
© by Springer-Verlag, 1982
© перевод на русский язык, А А Воронков, 1991
Автор любезно прислал изменения и уточнения своей статьи, которые мы учли при подготовке русского перевода — Прим. ред.
абстрактна и во многих аспектах, по-видимому, достаточно бесполезна, однако уровень абстракции в ней весьма низок и мотивировки определений обычно прозрачны. В результате теория автоматов стала стандартным курсом для студентов. Мне кажется, что мы с Майклом Рабином внесли некоторый вклад в развитие этой теории, сформулировав несколько лет назад ряд основных концепций (многие из которых были известны и ранее) так, чтобы они были понятны всем, кто немного знаком с абстрактной алгеброй, логикой и теорией множеств. Для этой (вводной) части нашей статьи потребовалась не оригинальность, а лишь определенный склад ума и стиль изложения, которые позволили четко выделить идеи и проблемы (см. также оригинальную статью [18] и прекрасный исторический обзор в [10]).
Теория областей находится в худшем состоянии. Я чувствую, что сделал ошибку, воспользовавшись в 1969 году теорией решеток как способом изложения. Это было ошибкой постольку, поскольку речь шла о программировании. Решетки хорошо известны логикам и тем, кто интересуется универсальной алгеброй, и мне самому очень понравились найденные мной структуры. Однако для изучения специальной терминологии и хорошего понимания примеров требуется время. Не рассмотрев достаточно большого набора примеров, невозможно приобрести интуицию, которая необходима для построения нужных конструкций. Правда, некоторые приняли этот подход, и мотивировка теоретико-решеточных определений оказалась достаточно простой. Но для гораздо большего числа людей, с которыми я общался, необходимость изучения множества новых вещей стала серьезным препятствием к пониманию. К тому же эта теория решеток была не совсем стандартной, так как для адекватного описания пределов и непрерывности потребовались полные решетки и топологические понятия. На самом деле для полного обоснования можно было бы обойтись достаточно простой теоретико-множественной топологией, как в [20], однако этот раздел математики кажется программистам еще менее привлекательным. Это, опять же, вопрос подготовки. Неразумно было бы требовать, чтобы люди знали буквально все. Как бы то ни было, теоретико-решеточный подход отличается логической последовательностью и четкостью. Он подробно разрабатывается в книге [7], где также описывается связь этой теории с топологией. В книге приводится много ссылок на математическую литературу, чтобы установить связь с другими разделами математики. Но вот очевидную связь с теорией вычислимости нам пришлось опустить — из-за недостатка места и невозможности объять необъятное.
В курсе лекций [24] я попробовал воспользоваться другим способом изложения (который также объясняется в [25]). Однако я обнаружил, что использование систем окрестностей приводит в замешательство людей, не привыкших оперировать множествами множеств множеств множеств..., хотя здесь можно обойтись очень простой теорией множеств. Поэтому в этой лекции я хочу еще раз вернуться к самому началу и попробовать изложить дело просто и естественно. Основное понятие я назвал информационной системой. Это «статическое» понятие, соответствующее наборам информации о согласованных группах элементов. «Динамику» отражают отношения между различными системами и семантические определения значений различных конструкций языков программирования. (Обсуждение семантических определений см. в [8], [29], [30].) Строго говоря, системы окрестностей эквивалентны информационным системам, однако есть некоторые различия в том, какие свойства структур заданы аксиоматически, а какие неявно заложены в вид структур. Несмотря на простоту систем окрестностей, в них слишком многое задано неявно и слишком многое нужно извлекать из определений; информационные системы оказываются более гибкими при осуществлении важных построений. Это обнаруживается там, где на структуры накладываются условия замкнутости. Мне кажется, что на этот раз я нашел верное соотношение между аксиомами и определениями.
Еще несколько слов о теории категорий. Я чувствую, что она имеет большое значение для данной теории и для-семантики в целом. Но к ней нужно подходить очень осторожно, так как уже одно количество определений и аксиом может утомить самого терпеливого читателя. Эта теория особенно необходима там, где нужно обсуждать абстрактные математические идеи, не упуская из виду мотивацию. Это может оказаться очень трудным, если категории получаются слишком большими, но, конечно, все зависит от изложения. Теория категорий особенно полезна в тех случаях, когда нужно установить общие свойства структур и однозначно охарактеризовать конструкции. Однако часто бывает сложно установить существование некоторых конструкций, и при этом может оказаться быстрее воспользоваться прямым подходом, чем цитировать множество теорем. Но не одними конструкциями жив человек: чтобы работа принесла пользу, необходимо доказывать теоремы. Теория областей должна быть удобной для демонстрации корректности различных правил доказательства свойств рекурсивно определенных объектов и рекурсивно определенных областей, и я думаю, что теория категорий может в этом помочь. Шаг в правильном направлении представляет собой система LCF (см. [9]), однако эта
система не использует преимуществ общей теории категорий. На мой взгляд, вся эта область требует гораздо большего развития.
Основная цель теории областей в денотационной семантике состоит, по моему представлению, в построении математической модели системы типов (включая типы функциональных пространств) и в объяснении понятия вычислимости для этих типов. Существует много возможных теорий типов, однако считается, что теория областей должна давать обоснование рекурсивных определений для всех типов и, что еще более важно, рекурсивных определений самих типов. Мы увидим, к чему приводит следование этим целям. Представленная здесь модель — это лишь один из возможных подходов. В § 8 проводится сравнение с некоторыми другими методами. В сравнении различных типов моделей также может помочь теория категорий.
Одно из преимуществ теории областей заключается в том, что приобретают смысл типы, содержащие бесконечные элементы. За это приходится платить тем, что области наряду с тотальными элементами должны содержать частичные элементы. Более ранние представления предусматривали здесь использование теоретико-решеточных определений: для выражения того, что элемент х «менее определен» (то есть более частичен), чем у, но «содержится» в у, использовалось частичное упорядочение с отношениями вроде х ^ у. Однако для того, чтобы теория позволяла решить поставленные задачи, отношение ^ должно удовлетворять множеству аксиом. Вместо большой группы аксиом я хочу предложить конструкцию, которая с помощью небольшого числа аксиом задает «скелет» (или, точнее, «позвоночник») области. Затем для определения понятия элемента сама область определяется с помощью некоторого построения, берущего за основу «позвоночник». Этот новый подход обладает несколькими преимуществами:
можно дать простые определения основных понятий;
отдельные свойства доказываются как теоремы, а не вводятся как аксиомы;
можно подчеркнуть конструктивную природу определений;
можно сделать области более наглядными;
теория областей становится более удобной в приложениях, поскольку облегчается построение сложных областей.
Я надеюсь, что следующее (возможно, слишком краткое) изложение позволит читателю увидеть эти преимущества.
ИНФОРМАЦИОННЫЕ СИСТЕМЫ
Интуитивно, информационная система — это множество «предложений», которые можно формулировать о «возможных элементах» нужной области. Мы предполагаем, что имеется достаточно много предложений, чтобы различать разные элементы; следовательно, элемент можно абстрактно задать как множество истинных на нем предложений. У частичных элементов множества «небольшие», а у тотальных — «большие» (и даже максимальные). Чтобы уточнить эту довольно грубую идею, нужно объяснить с помощью достаточного, но небольшого набора аксиом, каким образом множество всех предложений, относящихся к области, можно объединить или, лучше сказать, структурировать как множество абстрактных предложений. К счастью, аксиоматика этой структуры очень проста и хорошо известна, что облегчает построение примеров.
Определение 2.1. Информационной системой называется структура
(2),A,Con, Н), где Ф— множество (множество объектов данных или предложений) , А — выделенный элемент множества Ф {наименее информативный элемент), Con — некоторое множество конечных подмножеств Ф {непротиворечивые множества объектов), а Н — бинарное отношение между элементами Con и элементами Ф {отношение следования для объектов). Что касается Con, то для всех конечных подмножеств и, о ^ Ф должны выполняться следующие аксиомы:
если и v Con, то zv е Con;
если X Ф, то {X} ез Con;
если и h- X, то w|J{^}eCon.
Что касается Н, для всех и, и ^ Con и всех X ^Ф должны выполняться следующие аксиомы:
и Н А;
если X ^ и, то и Н X;
если и Н X и для всех У ^ и имеет место и Н У, то и h- X.
Другими словами, Con как множество множеств (i) замкнуто относительно подмножеств, (ii) содержит все одноэлементные множества, и (iii) добавление к непротиворечивому множеству следующего из него объекта сохраняет непротиворечивость. О Ь, рассматриваемом как многоместное отношение, можно
сказать, что (iv)A следует из чего угодно, (v) Н рефлексивно и (vi)H транзитивно. (Последние два свойства сформулированы в виде, соответствующем многоместным отношениям на элементах множества ЗХ)
Удобнее всего представлять себе элементы множества ^ состоящими из конечных объектов данных, одни из которых более информативны, чем другие. Слово «конечные» здесь следует понимать как «полностью описанные»: относительно содержимогб Ф эти объекты данных можно распознать «за один шаг». Можно, конечно, ввести информационные системы, в которых объекты данных будут бесконечными множествами, но относительно Ф они будут конечными объектами данных.
Элемент А дает нулевую информацию. Объекты данных предназначены для того, чтобы задать информацию о возможных элементах конструируемой области, поэтому, используя только А, мы описываем наименее определенный элемент, который обычно обозначается через _L.
Однако не любая комбинация объектов данных описывает возможный элемент. Таким образом, возникает необходимость понятия непротиворечивости. Если неверно, что меСоп, то «предложения» из и не могут все одновременно выполняться на одном и том же элементе. Наконец, нужно согласиться, что в общем случае допустимые предложения редко бывают взаимно независимыми. Отсюда вытекает, что для записи зависимостей, существующих между предложениями, необходимо ввести отношение следования. Смысл отношения uV X можно сформулировать так: если все предложения из и истинны на некотором элементе, то и X истинно на этом элементе. При таком неформальном понимании выбранные аксиомы становятся самоочевидными.
Первый пример. Предположим, что Ф— множество неотрицательных целых чисел, где целое число п рассматривается как сокращение предложения п ^ х. Здесь х— определяемый элемент, о котором одно предложение дает лишь небольшую информацию. Мы можем отождествить А с 0 и взять в качестве Con множество всех конечных подмножеств Ф. Отношение следования можно формально определить способом, вытекающим из интуитивного понимания объектов данных:
{м0, ..., nk_x^ Н ш тогда и только тогда, когда либо т —О,либо для некоторого i < k справедливо пт^п^
(Напомним, что в обеих частях |— речь идет об одном и том же *•) Очевидно, что Н является отношением следования в смысле наших аксиом.
Второй пример. Первый пример может ввести в заблуждение, поскольку в нем все (конечные) множества объектов данных непротиворечивы. Его можно естественным образом модифицировать так, что это больше не будет выполняться. При этом, разумеется, получится несколько другая система. Идея заключается в том, чтобы взять в качестве Ф множество всех таких пар целых чисел (n, т), чго п ^ т, на этот раз имеющих значение п ^ х ^ т. Очевидно, что множество, содержащее два объекта данных (0,2) и (3,7), противоречиво. (Почему?)
Кстати, в Ф я упустил из виду А, поэтому необходимо включить в Ф несколько искусственную пару (0, оо) с очевидной интерпретацией. Под «очевидной интерпретацией» здесь понимается то, что и^ Con выполняется, если существует целое число, удовлетворяющее всем «предложениям» из и. Далее, и |— X можно определить следующим образом: если целое число удовлетворяет всем, предложениям из и, то оно удовлетворяет X. Понятие «удовлетворять» при нашем интуитивном прочтении объектов данных становится очевидным, и читатель может легко проверить выполнение всех аксиом для этого примера информационной системы.
Третий пример. Пусть Л и В—два фиксированных множества, и Ф состоит из упорядоченных пар (а, 6), а^А, Ь^В, плюс дополнительный объект А. Здесь «информация», содержащаяся в (а, 6), заключается в том, что а отображается в b некоторой функцией, которую требуется определить. При такой интерпретации конечное множество объектов данных непротиворечиво тогда и только тогда, когда их всех можно описать одной и той же функцией. Формально мы определим это так:
{(^о^о), • (^-1 ,^-i)} ^ Con тогда и только тогда,когда для всех i,j<k, если at=ah то bt = bp
В этом случае введение А сопряжено с некоторыми неудобствами, однако достаточно добавить, что если и непротиворечиво в соответствии с приведенным правилом, то u|J {А} также непротиворечиво, и что таким образом можно получить все непротиворечивые множества для этого примера. Возможно, лучше было бы использовать Ца, Ь)} вместо более простого (а, 6), тогда мы могли бы более естественно определить А = 0. С этой точки зрения можно рассматривать объект данных как (очень небольшой) фрагмент графика функции; непротиворечивые множества при этом будут соответствовать более крупным фрагментам графиков.
Определение отношения следования минимально:
и Н X тогда и только тогда, когда Х = \ или X ge и.
Эти примеры показывают, что иногда главную роль в структуре играет Con, иногда Н, а иногда оба этих понятия во взаимодействии. Объект А сам по себе не очень важен, однако иногда бывает полезно иметь объект, ведущий себя одинаково во всех системах.
Формулировка аксиомы транзитивности для Н уже подразумевает отношение между множествами из Con. Дадим теперь формальное определение.
Определение 2.2. Для и, v е Con будем писать и Н и, если и И X для всех X ^ и.
Предложение 2.3. Для всех и, и, w, и\ tf ^ Con
(О 0 Н {А};
из и Н v следует и U и ^ Con;
и V- и;
изиЬ-uuubw следует и Н w;
из и' зи^иЬи и v Зи' следует и' Н и';
из и 1— и и и J— У следует и Н и U и'-
Доказательство очевидно.□
Замечание. Мы не будем формулировать как результат тот факт, что свойства из предложения 2.3 можно было бы использовать в качестве аксиом. Другими словами, можно было бы определить |— как бинарное отношение на множестве Con, удовлетворяющее аксиомам 2.1 (i)—(ii) и 2.3 (i) — (vi). (На самом деле аксиома 2.3 (ii) является избыточной.) Тогда прежнее отношение следования можно было бы определить так:
и \— X тогда и только тогда, когда и Н {X}.
Прежние аксиомы из определения 2.1 при этом легко выводятся из новых аксиом.
Одно обозначение. Поскольку не всегда понятно, какая структура имеется в виду, когда мы упоминаем информационную систему, используя имя соответствующего множества объектов данных, удобнее обозначить всю информационную систему какой-нибудь буквой. Будем использовать обозначение
А = (2) а, Аа , Con д, 1— а)
и говорить, что А — информационная система (с указанными выше частями). При более неформальном обсуждении можно будет ограничиться записью без индексов, однако в случае использования нескольких разных систем могут возникнуть проблемы.
Мы определили информационную систему как математическую структуру. Единственное отличие от известных представлений операторов алгебраического замыкания или абстрактных отношений следования в духе Тарского — это упор на встроенное понятие непротиворечивости. Однако это очень незначительное отличие. Теперь поставим вопрос, для чего нужны информационные системы. Точнее, если информационная система — это позвоночник области, то каковы ее элементы? Это тема следующего параграфа.
ЭЛЕМЕНТЫ СИСТЕМЫ
Пусть А—информационная система, и пусть мы уже знаем, что значит быть элементом А. Предполагается, что объекты данных представляют собой предложения об элементах, поэтому если X принадлежит S)A, а х— элемент, то мы должны знать, что означает истинность X на х. Так как все, чем мы располагаем — это множество объектов данных S)A, мы должны предположить, что в нем содержится достаточно объектов, чтобы различать разные элементы. (Если объектов недостаточно, нужно изменить множество S)A.) Формально можно сказать, что для двух элементов х и у
х = у тогда и только тогда, когда все предложения X ^ S)A, истинные на х, истинны и на у, и обратно.
Если принять этот принцип, то элементы можно отождествлять с множествами истинных на них предложений; формально можно утверждать, что
х = ^Х ^Фх\Х истинно на хУ
При этом нс может возникнуть недоразумений, связанных с отождествлением объектов, которые следовало бы различать, так как мы предполагаем, что в системе имеется достаточно объектов данных. Если бы мы почему-либо чувствовали, что их нужно иметь больше, чтобы различать больше элементов, то следовало бы перейти к другой, большей информационной системе. Примем соглашение, что последнее равенство является тавтологией.
Итак, для простоты в качестве элементов можно взять просто множества объектов данных. Однако тут же возникает вопрос, какие это будут множества. Этот вопрос можно сформулировать иначе: каковы свойства истинности? Ответы на оба вопроса хорошо известны. Фактически мы уже использовали их в примерах предыдущего параграфа. Неформально можно ска* зать, что множество всех истинных на некотором возможном элементе предложений должно быть (i) непротиворечиво и (ii)
замкнуто относительно следования (т. е. дедуктивно замкнуто). Условие (i) очевидно, так как речь идет о возможных элементах, а не о невозможных. Условие (ii) приемлемо, поскольку следование должно сохранять истинность в соответствии с самим значением этого слова. Примем также и обратное предположение: любое множество, удовлетворяющее свойствам (i) и (ii), соответствует (частичному) элементу. Сформулируем формальное определение
Определение 3.1. Элементами информационной системы (^а^а^Сопд, На) называются такие подмножества х множества ^а, что (i) все конечные подмножества х принадлежат Сопд; (ii) если и^х инНа^, то X ^ х. Утверждение, что х является элементом этой системы, записывается в виде х^ |А|. Это множество элементов называется областью, которая определяется данной системой. Элемент, не содержащийся ни в каком строго большем элементе области, называется тотальным элементом; множество всех тотальных элементов обозначается через TotA.
Замечания. Любое подмножество Фх, удовлетворяющее условию 3.1 (i), можно назвать непротиворечивым. Замыкание любого непротиворечивого множества относительно следования дает элемент. Каждый элемент содержит ДА» так как наименее информативное предложение истинно на всех элементах. В каждой области существует наименьший элемент, содержащийся во всех остальных элементах. Назовем его ±А и дадим следующее формальное определение:
-La = {X ^ Фх | {Ад} На А^}.
В этом определении вместо {Аа} можно использовать пустое множество 0, поэтому мы часто будем писать просто НаАГ.
Элемент Ад часто называют дном области. Верха, или. максимального элемента, Та может и не быть. Существование такого элемента возможно тогда и только тогда, когда все конечные подмножества Фх непротиворечивы; в этом случае множество Та равно Фх. Такая возможность не исключена, однако в ней нет необходимости. Если элемент Т а существует, то он является единственным тотальным элементом области и обратно.
Вернем,ся к вопросу о соотношении аксиоматизации и построений. Мы сначала аксиоматизировали свойства структуры С®а,Аа,Сопа, 1—а), а затем из этой структуры построили область |А|. Главное преимущество этого подхода заключается и том, что аксиомы непротиворечивости и следования хорошо
известны, и в том, что определение свойства «быть элементом» прямо и естественно вытекает из нашего понимания свойств истинности.
Примеры. Вернемся к трем примерам информационных систем из предыдущего параграфа. (1) В первом примере в соответствии с формальным определением элементами являются или конечные множества ^п\п ^ mV или все множество (т. е. Т), На интуитивном уровне это соответствует тому, что выбранные предложения задают только нижние границы возможных элементов и, таким образом, ни один элемент не может быть «завершен», пока не станет бесконечным. (2) Во втором примере область не имеет верха и элементами являются множества вида
где числа m и р, m ^ р, заданы и, возможно, q = оо. Тотальные элементы здесь соответствуют неотрицательным целым числам, а частичные элементы — тем случаям, когда верхняя и нижняя границы не совпадают. (3) В третьем примере элементами являются графики (т. е. множества упорядоченных пар) частичных функций из Л в В (с добавлением к графику объекта А). Тотальные элементы соответствуют всюду определенным функциям (т. е. функциям, определенным на всем множестве Л).
Читатель может взять другие примеры информационных систем из собственного опыта и посмотреть, как выглядят соответствующие области. Примеры строятся очень легко. Конечно, математическая логика дает нам множество примеров информационных систем, в которых то, что мы называем элементами, обычно зовется теориями. Однако логики редко считают, что области, определенные известными им системами, достойны изучения сами по себе. В частности, не очень широко известно, что области, полученные из информационных систем, составляют (как будет показано ниже) богатую категорию. Слово «категория» здесь используется в смысле теории категорий. Применение этого понятия в данном случае весьма целесообразно, поскольку категория областей обладает очень хорошими свойствами замкнутости и тесно связана со многими известными в математике категориями.
ОБЛАСТИ КАК РЕШЕТКИ
И ТОПОЛОГИЧЕСКИЕ ПРОСТРАНСТВА
Я попытаюсь сделать этот параграф как можно более неформальным, тем более что § 2 и § 3 были вполне формальными (т, е, математическими). Основная цель параграфа заключает-
ся в том, чтобы сравнить наше новое изложение теории областей с ранее известными. (Некоторые альтернативы обсуждаются в конце статьи.)
Теоретико-решеточные рассуждения. Пусть А—информационная система. Поскольку мы определили элементы области |А| как множества, им можно придавать структуры, известные из обычной теории множеств. Например, теоретико-множественное отношение включения между множествами можно непосредственно применить к элементам. При этом возникает вопрос об интуитивном понимании включения х ^ у. Мы фактически уже упоминали это отношение. Оно означает, что любое истинное на х предложение (из имеющихся в информационной системе) истинно также на у (хотя обратное не всегда верно). Другими словами, возможно, что элемент х определен лишь частично, а элемент у — более полно, т. е. в него включено все, что истинно на х. Очевидно, если нас интересуют частичные элементы, то это основное и естественное отношение. Мы часто будем читать выражение х ^ у как «х аппроксимирует у».
Теперь мы подошли к одному из главных моментов нашего изложения. Поскольку мы определили отношение х ^ у через обычные математические понятия, это отношение, рассматриваемое как отношение над элементами, должно унаследовать все известные свойства обычного теоретико-множественного отношения. Нет смысла приводить их здесь: каждый, кто смог дочитать до этого места, знает, например, что отношение ^ рефлексивно и транзитивно. Будем говорить, что область |А| частично упорядочена по включению. Заметим, что этот (тривиальный) результат выводится из определений, а не задается как аксиома.
Рассмотрим теперь другое понятие. Элементы — это непротиворечивые, дедуктивно замкнутые множества объектов данных. Так? Любое подмножество непротиворечивого множества непротиворечиво, но в общем случае не любое подмножество замкнуто относительно следования. Так? Предположим, что х и у — два элемента. Легко убедиться (доказательство займет 2 наносекунды), что их пересечение х^\у также непротиворечиво и дедуктивно замкнуто. Следовательно, множество элементов области замкнуто относительно пересечения. Это означает, что область |А|, рассматриваемая как частично упорядоченное множество, является нижней полу решет кой.
Терминология не имеет особенного значения, но свойства Q в сочетании со свойствами ^ оказываются приятно «алгебраическими» (их запись заняла бы несколько строк). Эти свойства хорошо известны; пересечение П идемпотентно, коммута-
тивно и ассоциативно. Наименьший элемент области _L является нулем для П- Операция П монотонна относительно ^ и между ними существует следующая связь:
х с у тогда и только тогда, когда xf\y = x.
Перечисленные свойства представляют собой стандартную математическую аксиоматизацию свойств операции точной нижней грани (или пересечения) на частично упорядоченном множестве. (Напоминаем, однако, что для корректного определения операции на множестве необходимо также условие замкнутости относительно этой операции.)
А как насчет нижних граней подмножеств? Никаких проблем. Легко доказать, что для любого непустого подсемейства области |А| теоретико-множественное пересечение всех его элементов также является элементом области. Это свойство превращает |А| в (условно) полную нижнюю полурешетку. Даже если вы не имеете ни малейшего представления о том, о чем я сейчас рассказываю, это не страшно, так как свойства области выводятся непосредственно из определения, и нет никакой необходимости изначально знать их формулировки: вы их всегда сможете доказать (если это понадобится).
А как насчет точных верхних граней (или объединений)? Здесь возникают некоторые проблемы, так как в соответствии с нашими определениями они существуют не всегда. Посмотрим, что может произойти с двумя элементами х и у. Теоретико-множественное объединение этих двух элементов как подмножеств Фх не обязательно должно быть дедуктивно замкнутым или непротиворечивым, и даже если х U у непротиворечиво, оно может оказаться незамкнутым относительно следования. Поэтому получить точные верхние грани внутри |А| не так просто, как в области произвольных множеств, где ответом будет простое объединение.
Обозначим точную верхнюю грань (если она существует в |А|) через х LJ у. Что происходит в том случае, когда точная верхняя грань действительно существует? В соответствии с нашими знаниями о частично упорядоченных множествах элемент х [J у должен быть наименьшим элементом в |А|, который содержит (в смысле отношения ^) оба множества х и у. Мы только что говорили о точных нижних гранях семейств элементов: они существуют, если семейство непусто. Это наводит на мысль, что х U у существует тогда и только тогда, когда в |А| имеется по крайней мере один такой элемент 2, что х ^ 2 и у с г. Это равносильно непротиворечивости x\Jy в |А|. ДрУгими словами (более общо) точная верхняя грань семейства элементов существует тогда и только тогда, когда объединение
элементов этого семейства непротиворечиво. (В этом случае точная верхняя грань представляет собой дедуктивное замыкание объединения, т. е., вообще говоря, больше, чем простое теоретико-множественное объединение.) Можно предложить и аксиоматическое построение, но оно будет довольно сложным, поскольку верхние грани не всегда существуют. Если существует Та, то существуют все точные верхние грани и |А| является полной решеткой. (Аксиоматическая постановка с блеском обсуждается в [7].) Однако нужно добавить, что не любая полная решетка изоморфна некоторой области. Областям соответствуют так называемые алгебраические решетки. (В [7] обсуждается необходимая дополнительная аксиоматика.) Когда верх отсутствует, соответствующие областям частично упорядоченные структуры называются условно полными алгебраическими полными частичными порядками.
Существует, однако, важный частный случай, когда объединение в |А| непротиворечиво и фактически является точной верхней гранью области. Предположим, что имеется такая последовательность элементов, что
^0 с xv ^Х2 CZ (= хп ^Х^.^ . . . .
Можно сказать, что с возрастанием п элементы хп становятся «все лучше и лучше»; таким образом, в пределе они должны стремиться к чему-то еще лучшему. Пусть
У = U Хп-а -=0
В этом случае очевидно, что у—подмножество Фх- Однако является ли у элементом? Напомним, что непротиворечивость означает, что любое конечное подмножество у должно принадлежать Сопд. Фокус в том, что конечное подмножество у должно быть подмножеством одного из хП) так как последовательность хп является возрастающей. Но поскольку все члены этой последовательности являются элементами, они непротиворечивы. Следовательно, любое конечное подмножество у непротиворечиво.
Такие же рассуждения показывают, что множество у объектов данных замкнуто относительно следования, так как Ьд определяется как отношение между конечными (непротиворечивыми) множествами и объектами данных. Следовательно, поскольку хп—множество, замкнутое относительно Нд, таковым является и у. Другими словами, у действительно является элементом. Иначе говоря, область |А| замкнута относительно образования объединений возрастающих цепей элементов
и объединение является точной верхней гранью в смысле частичного порядка. Итак, мы опять доказали свойство замкнутости, а не предположили его. При этом необходимые свойства точной верхней грани вытекали из ее определения как объединения.
Последние рассуждения (как хорошо известно математикам) допускают обобщение на случай направленных семейств элементов. Термин «направленное», или, лучше, «направленное вверх», означает, что любое конечное число элементов семейства содержится в некотором большем элементе этого семейства. Любые цепи обладают этим свойством. Хороший пример использования направленных семейств элементов встречается в обсуждении конечных элементов области.
Как мы уже несколько раз отмечали, любое непротиворечивое множество объектов данных порождает элемент при замыкании относительно следования. В частности, любое множество ueCoii порождает некоторый элемент. Обозначим замыкание и относительно следования через
u = ^^SK\u\-KXY
(Это обозначение будет использоваться для любых непротиворечивых подмножеств Ф, но особенно важен случай конечно порожденных элементов.) Такое замыкание й всегда является элементом | А|. ‘ Совокупность всех таких элементов будем называть конечными элементами области. Вообще говоря, обозначение й .следовало бы снабдить индексом А, но как раз здесь удобнее его не употреблять.
Для всех элементов х области справедливо основное соотношение
х= U {w|w^ConA; и^х\
Это свойство можно сформулировать так: любой элемент области является пределом своих конечных аппроксимаций. Поскольку мы так часто используем слово «предел», нужно придать ему корректный математический смысл. Заметим, что в данном предельном представлении х объединение является йа- правленным. (Почему?)
Топологические рассуждения. Геометрически, топологическое пространство — это набор точек, сгруппированных в различные «окрестности». Таким образом, возникает понятие «близости» точек. В частности, окрестность некоторой точки в метрическом пространстве состоит из всех точек, удаленных от заданной на некоторое положительное расстояние; при этом близость ограничивается, но не сводится к нулю. Основная причина для того, чтобы оставить вокруг точки некоторое «пространство для ды-
хания», обнаруживается при определении непрерывности функций.
Функция f из одного топологического пространства в другое называется непрерывной, если для любой точки х первого пространства и любой окрестности точки f^x) во втором пространстве можно найти (в первом пространстве) окрестность точки х, обладающую следующим свойством: если ограничить функцию f на эту окрестность, то все ее значения будут лежать в заданной окрестности точки f(x). В метрическом случае можно сказать, что если мы не хотим, чтобы значения функции сильно удалялись от f(x), то, ограничивая расстояние от точки х, можно задать окрестность, на которой значения функции сколь угодно близки к Цх). Это удерживает функцию от сильных скачков: небольшие изменения х приводят лишь к небольшим изменениям f(x).
Понятие непрерывности становится очень прозрачным на более геометрических примерах, и геометрическая интуиция может дать нам достаточно много. Однако в теории областей пространства не являются реальными геометрическими пространствами, поэтому нужно слегка изменить наши представления. Геометрическое понятие точки обычно предполагает, что любые две точки абсолютно различимы: если точки х и у различны, то у них есть непересекающиеся окрестности. Это, очевидно, имеет место в метрическом случае, где две различные точки всегда удалены друг от друга на некоторое положительное расстояние. Однако уже на ранних стадиях изучения топологических пространств было обнаружено, что не все пространства являются метрическими, и были открыты более слабые свойства отделимости различных точек. Одна из наиболее слабых версий такого условия называется «Т0-аксиомой». Лучше всего сформулировать ее таким образом: если две точки имеют одни и те же окрестности, то они совпадают. Контрапозиция этого утверждения звучит несколько странно: если две точки различны, то существует окрестность, содержащая одну из них, но не содержащая другую. Странность этого утверждения в том, что невозможно решить, какая из точек лучше.
Мы уже использовали для областей понятие «быть лучше», которое оказалось очень тесно связанным со структурой окрестностей. Причина того, что наши области как пространства точек не являются «геометрическими» в обычном смысле .этого слова, заключается в наличии частичных элементов. Геометрические точки, в свою очередь, являются «совершенными», или полностью определенными: их нельзя сделать «лучше», чем они есть. Метрика в обычных пространствах измеряет нечто отличное от свойства «быть лучше», так как в них существуют
различные понятия аппроксимации. Таким образом, чтобы избежать недоразумений, при определении областей мы не должны забывать о наших специфических задачах.
Рассмотрим информационную систему А. Для любого и ^ Сопд определим соответствующую окрестность в |А|
[и]А = {хе|А||«с=х}.
Окрестностями элемента х назовем все такие множества вида [ц]А, что и ^ х. Заметим, что это равносильно тому, что й г х или /7 аппроксимирует х. В самом деле, окрестности находятся во взаимно однозначном соответствии с конечными элементами |А|. Окрестность группирует все элементы, которые несут некоторое общее конечное количество информации.
Если и с х и v ^ х, то легко видеть, что пересечение двух соответствующих окрестностей также будет окрестностью х. Это проверяется с помощью формулы
[«]А Г1 [у]А = [w и у]а-
Если и и v несовместны, пересечением будет также пустое множество 0. Так как любой элемент области |А| является объединением содержащихся в нем конечных элементов, легко доказать, что равны в точности те элементы, которые имеют одинаковые окрестности. Из этого следует, что |А|—топологическое To-пространство. Первой реакцией на эти сведения может оказаться вопрос: «Ну и что?». Лучшим ответом на такой скептицизм будет обсуждение в следующем параграфе понятия функции или отображения для областей. Мы воспользуемся крайне простой формой определения непрерывной функции и тем, что геометрическая интуиция помогает при доказательстве теорем. В § 6 мы покажем, что пространство всех непрерывных функций из одной заданной области в другую также является областью. Этот результат наиболее интересен с точки зрения топологии. Для теории областей представляет интерес то обстоятельство, что существует некоторая связь между геометрией и областями. Мы не будем вдаваться в подробности, а ограничимся лишь некоторыми замечаниями.
Перед тем как продолжить обсуждение, следует отметить (раз уж мы заговорили о топологии области), что объединения цепей элементов (или направленных множеств элементов) является топологическим пределом в соответствии с общепринятыми определениями. Таким образом, то, что по нашим интуитивным ощущениям было предельным процессом (постепенное улучшение при объединении), и в самом деле представляет собой переход к пределу в строгом математическом смысле. Это подтверждает, что мы на правильном пути.
Тотальные элементы пространства. Можно доказать, что в любой области любой элемент х можно расширить до тотального элемента /, который характеризуется тем, что это максимальный элемент относительно частичного порядка. (Таких элементов / может быть много, но всегда существует хотя бы один, обладающий свойством х ^ Л) Напомним, что множество всех тотальных элементов |А| обозначается через TotA. Поскольку TotA ^ I А |, это множество само является топологическим пространством. Предположим, что s и t— два различных тотальных элемента. Они должны быть несовместны, однако на самом деле можно доказать более сильное утверждение. Если для любого конечного непротиворечивого и г s' выполняется также иг t, то s г t. Однако это невозможно ввиду максимальности
Выберем такое и г Con, что и г s и неверно, что и г t. Множества и и t несовместны, так как иначе существовал бы элемент, содержащий их обоих. Отсюда следует, что и несовместно с некоторым о г Con, и г t. Таким образом, мы показали, что окрестности [w]A и [и]А не пересекаются.
Эти рассуждения показывают, что TotA — хаусдорфово пространство (или Т2-пространство). Мы не будем вдаваться в дальнейшие детали, а только отметим, что оно является вполне несвязным компактным хаусдорфовым пространством. (Эти пространства, хорошо известные в математической логике и теории булевых алгебр, также являются нульмерными.) Если предположить счетность множества СопА (а это не слишком смелое предположение), то все такие пространства естественным образом вкладываются в числовую прямую с сохранением топологической структуры. Возможно, это не слишком удивительный факт, но он показывает, что топологическая природа TotA, верхнего уровня To-пространства |А|, на самом деле является геометрической. Можно также показать, что любую непрерывную функцию из TotA в любое топологическое пространство можно продолжить до непрерывной функции на |А|. Таким образом, вся область в целом оказывается вполне «вместительным» пространством, тесно связанным с более привычными топологическими пространствами.
Замечание о структуре окрестностей. Топологические пространства можно определять различными способами, и, как правило, у них нет предпочтительной структуры окрестностей. (Например, с точки зрения топологии не очень важно, что для определения окрестностей на числовой прямой мы используем рациональные отрезки: вместо рациональных чисел можно взять «любое аналогичное плотное множество точек.) Однако определенные нами области имеют предпочтительные окрестности.
Множество конечных элементов области |А| можно определить топологически, и оно, как мы видели, определяет удобное множество окрестностей. (Причина этого заключается в нульмерности области. Существует теория для более высоких размерностей, но она приводит к непрерывным решеткам, и ее можно объяснить лишь подобно тому, как это сделано, например, в [7]. Это слишком длинная история для нашей статьи. Однако области более высоких размерностей не имеют предпочтительных множеств окрестностей.) После этих уточнений мы вплотную подходим к «алгебраической» аксиоматизации понятия структуры окрестностей.
Несколько исторических замечаний. В работе [26] изложение ведется с использованием эквивалентного понятия конечных элементов. В этой статье упоминается более ранняя работа Дэвида Парка на близкую тему. В [24] история поворачивается вспять и определяется теоретико-множественное представление областей как семейств множеств, содержащих наибольшую окрестность и замкнутых относительно пересечения любых двух множеств семейства, содержащих некоторое третье множество. Теоретико-множественная форма этого определения чрезвычайно проста, и в [24] подробно показано, как на этой основе можно построить теорию областей. Идея теоретико-множественного представления областей впервые была высказана в работе [20] (которая в виде технического отчета была доступна уже в 1971 г.). Эта идея легла в основу модели лямбда-исчисления, предложенной в [15]. (Обсуждение см. в [21], [22].) Однако дальнейшие исследования убедили автора, что подход с использованием информационных систем оказывается проще и лучше для многих существенных построений.
Предложенная здесь идея была намечена в [19], однако информационные системы обладают лучшей структурой, чем несколько более примитивные системы, использованные в этой работе. Следует упомянуть также событийные структуры из [14] и [32]. Здесь было бы полезно исследовать общую основу. Подход, использующий утверждения для построения областей, также сослужил хорошую службу в работе [6]. В нашей работе мы фактически распространили этот подход на все полные частичные порядки и прояснили некоторые аспекты, связанные с категориями. Кроме того, необходимо упомянуть так называемые «фильтрованные модели» Барендрегта с несколькими соавторами (ссылки см. в статье [12]). Нужно подчеркнуть, что все эти методы — включая предложенный в данной работе—- просто дают явные описания конечных элементов области. Роль конечных элементов была ясна Скотту еще в 1969 г. и исполь-
зовалась в нескольких представлениях конструкции 2)^ (см. [31]). Очень жаль, что теория решеток и топология усложняют понимание внутренней простоты этой концепции.
Интересная теория F-пространств, предложенная в [33] и [34], использует другую аксиоматизацию, занимающую промежуточное положение между топологической и теоретико-решеточной. Определенные таким образом области оказываются полными F-пространствами. Этот метод имеет много интересных аспектов, но автору кажется, что информационные системы настолько просты и интуитивно понятны, насколько это вообще возможно, и поэтому больше подходят для новых построений. Цель остальной части данной работы заключается в том, чтобы обосновать это утверждение.
АППРОКСИМИРУЕМЫЕ ОТОБРАЖЕНИЯ ОБЛАСТЕЙ
После того как мы дали математическое определение общего понятия множества или области, встает вопрос: как соотносятся между собой различные области? Очень часто ответ на этот важный вопрос удается получить, определив соответствующее понятие отображения между областями. Ответ может быть не единственным: для одного и того же набора областей можно ввести несколько понятий функции в зависимости от того, какие аспекты областей требуется выявить. Для рассматриваемых в данной работе областей существует два основных варианта, один из которых описывается в этом параграфе.
Для того чтобы понять, какими должны быть отображения, или функции, между областями, построенными из информационных систем, мы должны вернуться к способу определения элементов. Как мы видели в § 3, элемент — это непротиворечивое замкнутое множество объектов данных. Чтобы получить элемент, нужно строить все больше и больше его конечных непротиворечивых подмножеств. Заметим, что в эти конечные непротиворечивые множества должны объединяться различные объекты данных, так как для замыкания могут потребоваться множества произвольного размера в левой части отношения следования. Этот вид перехода от конечного множества к его замыканию и нужно обобщить для того, чтобы дать определение отображения.
Рассмотрим две области. Для того чтобы отобразить одну область в другую, на вход функции f подается некоторая информация о возможном элементе первой области. После этого функция f начинает порождать некоторый элемент в качестве выхода. Если входом является непротиворечивое множество и первой области, то частью выхода может оказаться непротиворечивое
множество у второй области. Можно сказать, что функция f определяет отношение вход-выход. Если оно выполняется при переходе от множества и из первой области к множеству у из второй, запишем это в виде и j и. Конечно, чтобы описать действие f полностью, необходимо указать все у, соответствующие данному и, поскольку даже очень маленькое количество информации на входе может дать очень большое количество информации на выходе. Но, поскольку любой элемент области является суммой своих конечных подмножеств (конечных аппроксимаций), достаточно ввести отношение отображения только между конечными множествами. Дадим формальное определение и сформулируем точные условия, которым должно удовлетворять отношение /.
Определение 5.1. Пусть А и В — две информационные системы. Аппроксимируемым отображением f:A-^B называется такое бинарное отношение между множествами СопА и Сопв, что
0/0;
если ufo и ufo', то uf^o\Jo');
если и'\-^u, ufo и с |— в ^\ то u'fo'.
При этом А называется источником, а В — целью отображения /.
Отношение ufo — это отношение перехода от входа к выходу, которое можно интерпретировать следующим образом: если вы можете дать по крайней мере и информации об аргументе, то отображение f может дать по крайней мере о информации о значении (а если вы будете достаточно терпеливы, то, возможно, даже больше). Условие (i) означает, что если нет никакой (нетривиальной) информации о входе, то не будет никакой информации и о выходе. Из условия (ii) следует, что все выходы при одном фиксированном входе непротиворечивы и что объединение двух выходных множеств также является выходным множеством, т. е. выход, соответствующий фиксированному входу, является кумулятивным. Условие (iii) гарантирует, что отношение отображения f согласовано с двумя отношениями следования: если справедливо некоторое отношение и*если его левая часть усилена, а правая часть ослаблена, то полученное отношение отображения также справедливо. Теперь посмотрим, что это означает для элементов.
Прежде чем вводить понятие значения функции, полезно заметить, что формулировку определения аппроксимируемого отображения можно упростить, если свести множество в правой части к его элементам. Отметим следующую эквивалентность: ufo тогда и только тогда, когда для всех Yeo справедливо uf^Y}-
Другими словами, аппроксимируемое отображение полностью определяется отношением, установленным между непротиворечивыми множествами слева и отдельными объектами данных справа.
Определение 5.2. Пусть /:А->В — аппроксимируемое отображение информационных систем, и пусть хе |А|—элемент первой системы. Определим образ х при отображении f (или значение функции f на х) следующим образом:
/ (х) = {К е 3)в | uf {К} для некоторого и^хУ
Можно использовать также эквивалентную формулу
/ (х) = U {у ^ ConB I ufv для некоторого и хУ
Заметим, что, в соответствии с определением 5.2, необходимо доказать, что образ элемента из |А| принадлежит |В|, чтобы оправдать использование обычного обозначения значения функции. Однако и непротиворечивость множества ^ху и его замкнутость относительно следования являются очевидными следствиями определения аппроксимируемого отображения.
Предложение 5.3. Пусть f, g:A-^B— два аппроксимируемых отображения информационных систем. Тогда
/ всегда отображает элементы в элементы (по определению 5.2);
f = g тогда и только тогда, когда для всех х е | А | / (х) = g (х);
f Е g тогда и только тогда, когда для всех хе|А|
Более того, аппроксимируемые отображения монотонны в том смысле, что
если х ^ у в | А |, •то f (х) с f (у) 6 I В I.
Все эти результаты вытекают из того, что для всех и е СопА и V Е СоПв
и^с тогда и только тогда, когда и^Цй).
Доказательство этого предложения очевидно, и оно полностью обосновывает использование обозначения значения функции. В связи с этим возникает вопрос, можно ли было сразу охарактеризовать аппроксимируемые отображения через элементы. Ответ будет положительным. В самом деле, аппроксимируемые отображения в точности соответствуют функциям на элементах, сохраняющим объединения цепей (в случае
счетных информационных систем; в общем случае нужно использовать направленные объединения). Это свойство можно назвать «непрерывностью», поскольку оно эквивалентно тому, что отображения между элементами являются непрерывными в топологическом смысле, когда |А| и |В| рассматриваются как топологические пространства (см. § 4). Причина использования термина «аппроксимируемое» объясняется в § 7.
Следующим шагом после обоснования идеи аппроксимируемых отображений как преобразований на элементах будет комбинирование отображений. Неудивительно, что композиция аппроксимируемых отображений является аппроксимируемой, что с математической точки зрения означает, что аппроксимируемые отображения составляют категорию. Интересные моменты возникают при комбинировании областей. Однако для более четкого понимания полезно посмотреть, как ведут себя композиции на уровне объектов данных и непротиворечивых множеств. Например, мы заметили, что в любой информационной системе отношение Н транзитивно на Con, и в определение 5.1 также входит условие транзитивности. Это веская причина для проведения параллелей, Поскольку, как мы увидим, первая идея (следование) является частным случаем второй (аппроксимируемое отображение).
Предложение 5.4. Пусть А — информационная система. Тогда следующее условие определяет аппроксимируемое отображение 1А : А -> А:
г/1Ау тогда и только тогда, когда и Нау для всех и, v г ЕЕ СОПА.
При этом
(п) 1А(х) = х
Зля всех х G | А |.
Другими словами, заданное отношение 'следования определяет тождественную функцию на области. Разумеется, тождественная функция является аппроксимируемым отображением.
Предложение 5.5. Пусть f:A-^B и g: В-+С— два аппроксимируемых отображения. Тогда следующее условие определяет аппроксимируемое отображение g°f;X-^C:
^(S"°f)^ тогда и только тогда, когда ufvuvgw для некоторого и е Сопв
для всех и е СопА и w г Сопс.
При этом
(g ° f) (х) = g (f W)
для всех х ^ | А |.
Другими словами, композиция отношений вход-выход действует следующим образом: задается вход первого отношения, получается некоторый выход, который задается в качестве входа второго отношения. Корректность этого правила на элементах (т. е. формула 5.5(ii)) следует из основной формулы 5.3 (v). Поскольку класс всех множеств и произвольных отображений составляет категорию (в формальном смысле этого слова), три приведенных предложения показывают, что совокупность информационных систем и аппроксимируемых отображений также составляют категорию: подкатегорию категории множеств. По ряду причин мы определили эту категорию с помощью объектов данных и непротиворечивых множеств, Поставив тем самым элементы в подчиненное положение. Однако можно пользоваться и элементами. Аксиомы категории можно проверить непосредственно при помощи основных определений типа 5.4 (i) и 5.5 (i), детали очевидны. Более интересны следующие вопросы: каковы условия замкнутости наших областей, и как строить новые области из уже имеющихся?
Перед тем как перейти к основным конструкциям суммы и произведения областей, рассмотрим еще один простой пример аппроксимируемых отображений: постоянные отображения.
Предложение 5.6. Пусть даны информационные системы А, В, С, D и зафиксирован элемент Ь^ |В|. Тогда существует единственное такое аппроксимируемое отображение const b : А-> В, что
(const b) (%) = b
для всех х^ |А|. При этом для всех аппроксимируемых отображений f : В С
f о (const b) = const f (6)
и для всех аппроксимируемых отображений g : D А
(Hi) (const b) о g = const b.
Доказательство очевидно, достаточно рассмотреть интерпретацию отображения входа-выхода и (const 6) и как и ^ Ь. Отметим, что наши обозначения страдают некоторой нечеткостью; например, в 5.6 (Hi) мы используем const b в двух смыслах: один раз как отображение из А и один раз как отображение из
D. Нам следовало бы указать два индекса, чтобы зафиксировать как источник, так и цель. Но это было бы слишком громоздко, поэтому для уточнения смысла мы обычно будем полагаться на контекст. (Можно задать такие формальные правила проверки типов, чтобы все индексы восстанавливались с помощью автоматической системы. Таким образом, эта нечеткость неопасна.)
Замечание о других категориях. Определенное здесь понятие аппроксимируемого отображения совпадает с понятием непрерывного отображения, если области рассматриваются топологически. С точки зрения операционных вычислений это понятие может оказаться слишком широким. У нас нет возможности обсуждать здесь вычислимость, однако некоторые обсуждения можно найти в [24]. Есть и другие категории, начиная с категорий Кана и Плоткина, развитых Берри и его соавторами, которые более важны для операционных вычислений. Следует отметить работы [И], [32], а также [4].
Особенно интересным аспектом последней работы является открытие новых декартово замкнутых категорий.
6. ПРОИЗВЕДЕНИЯ И СУММЫ ОБЛАСТЕЙ
В категории множеств произведение (декартово произведение) двух множеств по определению есть множество упорядоченных пар элементов. Можно использовать те же определения и в категории областей — при условии, что мы работаем с элементами областей. Недостаток такого подхода заключается в том, что определение области-произведения на основе объектов данных или отсутствует, или по крайней мере отодвигается на второй план. Поэтому мы построим произведение сразу для объектов данных, а затем покажем, как доказать, что такое произведение ведет себя на элементах именно так, как ожидалось.
Идея такого определения проста. Рассмотрим две области А и В. Объект данных X е S)A может давать информацию о возможном элементе хе |А|, а объект данных У е S)B — информацию о возможном элементе уе |В|. Как давать информацию о паре (х, у)? Первый совет: не сообщать все, что нам известно, сразу. Например, если потребуют, мы можем сказать, что знаем X о первой координате пары, и только потом, если потребуют и этого, сказать, что знаем У о второй координате. Суть в том, что объекты данных дают лишь частичную информацию, и для задания полной информации об элементе может потребоваться несколько объектов данных. Такой подход приводит к следующему формальному определению.
Определение 6.1. Пусть А и В — информационные системы. Назовем их произведением А X В информационную систему, для которой
Фх х в = {(X, Ав) | X е S)A} U {Аа , У) | Y е S)B};
Ад х в = (Ад, Ав);
(Hi) меСопдхв тогда и только тогда, когда fst меСопа и snd и е Сопв;
(iv') и |— ахв(Х\Ав) тогда и только тогда, когда fst и НаX'; (iv") и Нахв(Аа,У') тогда и только тогда, когда snd и Нв^- В (iii) и — любое конечное подмножество S)axb, в (iv') и (iv") и е= Сопд х в и
fst и = {X ее Фх I (X, Ав) ее и^snd м = {У е S>B |(Аа,У) <= tz}.
Заметим, что в 6.1 (i) два множества, входящих в объединение, представляют собой копии S)A и ^в соответственно. Однако у них есть общий элемент, объект (4а, Ав), который является наименее информативным элементом как для А, так и для В. Мы могли бы использовать все пары вида (X, У), но в этом случае непротиворечивое множество {(X, У)} оказалось бы дедуктивно эквивалентным множеству{(X,Ав),(Ад,У)} в соответствии с определением отношения Нах в- Такая избыточность не имеет особого смысла, хотя и позволяет объединить 6.1 (ivz) и (iv") в одно условие. Строго говоря, мы не должны были делать этого замечания, пока не проверили, что определение 6.1 корректно.
Предложение 6.2. Если X и В — информационные системы, то АХ В также является информационной системой. Имеются такие отображения
fst:AXB-^A и snd:AXB->B, что для аппроксимируемых отображений
f;C->X и g . С -> В существует одно и только одно аппроксимируемое отображение </, g>:C->AXB, для которого
^to(f,g) = f И sndo(f,g) = g.
Доказательство. Доказательство того, что 6.1 действительно определяет информационную систему, очевидно. Имеется шесть свойств, которые нужно проверить в соответствии с определением 2.1. Детали мы оставляем читателю. Далее, используя обозначения из определения 6.1, где fst и snd рассматриваются как
операции на непротиворечивых множествах меСопахв, мы переопределим их таким образом, чтобы получить аппроксимируе- мые-отображения, положив для у е СопА и ^еСопв
wfst^ тогда и только тогда, когда fst ц На у;
ц snd ay тогда и только тогда, когда snd^HB^;
s(f,g)u тогда и только тогда, когда s f (fstw) и sg(sndw),
Поскольку произведение А X В определено таким образом, что непротиворечивость и следование работают независимо на двух частях множества объектов данных, легко убедиться, что условия (1) — (3) определяют аппроксимируемые отображения с нужными свойствами.
Единственность отображения <f, g> вытекает из того, что если 2 и 2х — два элемента АХ В, для которых
1st (2) = fst (2') и snd (2) = snd (2'),
то 2 = 2х. Причина заключается в том, что fst и snd разбивают элементы на два множества объектов данных с опусканием скобок (см. определение 6.1). При этом не теряется никакой информации, поэтому если 2 и 2Z оба раза преобразуются в одни и те же элементы, то они совпадают.
В последней лемме речь идет о паре элементов, в то время как <f, g> — функция. Следовательно, если <f, g'> — другая функция, удовлетворяющая условиям данного предложения, то эти две функции должны быть поточечно равны. Для того чтобы убедиться, что они совпадают, достаточно воспользоваться предложением 5.3.□
Упорядоченные пары. Используя определение
(х, у) = (const (х), const (у)) ( ± с)
и применяя предложение 6.2 для подходящей фиксированной области С, легко доказать, что IAX В| находится во взаимно однозначном соответствии с теоретико-множественным произведением |А| и |В|. В самом деле, для всех элементов хе |А| И, у е | В | можно показать, что
(х,у)Н(^,Ав)|£е^}и{(АА,^
fst(x,y) = x,
snd (%,у) = у
и что для всех 2 е | А X В |
2 = (fst 2,snd 2).
Используя обозначения из предложения 6.2, можно также показать, что
(f,g)M(0,g(0)
для всех t е С.
Можно также сделать несколько замечаний о поточечной природе частичного порядка на |АХ В|, но мы не будем их здесь формулировать. Отметим однако, что существует тривиальное произведение пустого множества систем 1, называемое единичным типом или единичной областью. Оно с точностью до изоморфизма определяется уравнением S)i = {Ai}. Область 1 имеет лишь один элемент, а именно ±ь Заметим также, что все аппроксимируемые отображения f : 1-> А— константы. Это показывает, что определение 5.1 является обобщением определения 3.1. Заметим, наконец, что существует лишь одно аппроксимируемое отображение f : 1 -> А, а именно f = 0 = const(j_i).
Перейдем теперь к определению и свойствам суммы областей.
Определение 6.3. Пусть А и В — две информационные системы. Назовем прямой суммой А + В этих систем систему, удовлетворяющую следующим условиям (где А—некоторый объект, нс принадлежащий ни Фх, ни Ф^\
W+b = {(X, А) |Х е ФД U {(А,У) | Y ^ Фв} U {(А, А)};
(и) Аа+в = (А,Д);
и г Сопд+в тогда и только тогда, когда или 1ft и е СопА и rhtw=0, или 1ft м=0 и rhtw^ConB;
(iv') и Н а+в (X', А) тогда и только тогда, когда и ^ 0 и Ift U |— а Х^
(iv") и На+в (А,У') тогда и только тогда, когда rhtw V= 0 и rht и Нв ^;
(iv"') всегда ^На+в(А,А).
В (iii) и — любое конечное подмножество ^А+в; в (iv') — (iv/z/) и г Сопа+в и
Ift^ = {Xe^A|(X,A)e^},rhtu = {ye^B|(A,y)^i/}.
Идея этого определения суммы очень похожа на идею определения произведения, за исключением того, что (1) по причинам, которые станут ясны в ходе рассмотрения примеров, наименее информативный элемент не является общим для обоих частей (т. е. объекты данных (Да,А),(А,Дв) и (А,А) не эквивалентны в этой системе), и (2) непротиворечивость и следование
определяются не с помощью конъюнкции, а с помощью дизъюнкции. Отличия от определения 6.1 приводят к такой системе А + В, элементы которой делятся на две непересекающиеся копии А и В (плюс дополнительный элемент ±А+В). Эти замечания можно уточнить следующим образом..
Предложение 6.4. Если А и В — информационные системы^ то А + В — также является информационной системой. Имеются такие аппроксимируемые отображения
ini: А->А + В и inr-:B-->A + B,что для любых аппроксимируемых отображенийf:A->C и g.B^C
существует одно и только одно аппроксимируемое отображение [f, g] : А + В С, для которого
[f,g]oinl = f, [f,g]oinr = g U [f, gb(±A+B)= ±с.
Доказательство. Доказательство того, что 6.3 определяет систему, удовлетворяющую основным аксиомам из определения 2.1, предоставляется читателю. Далее, используя обозначения из определения 6.1, переопределим 1ft и rht как операции на непротиворечивых множествах meCoo.ub следующим образом, получая при этом аппроксимируемые отображения:
yinlw тогда и только тогда, когда {(X, А) । Х^и} Ьа+вЩ
w inr и тогда и только тогда, когда {(А,У)|Уе^} На+вЩ
u\j,gAs тогда и только тогда, когда или Нс 5, или 1ft и =Н 0 и 1ft и f s, или rht м И 0 и rht и g s.
Поскольку сумма А + В определена таким образом, что непротиворечивость и следование работают на двух частях множества объектов данных так же, как на множествах А и В соответственно, легко убедиться, что условия (1) — (3) определяют аппроксимируемые отображения с нужными свойствами.
Единственность отображения [f, g] вытекает из того, что элементы А + В, за исключением дна области, являются элементами областей значений ini и inr. Поскольку функция [f, g] отображает дно одной области в дно другой области, она однозначно определяется своим поведением на двух слагаемых суммы. Последние равенства теоремы означают, что эта функция действительно полностью определена на таких элементах. □
Можно также показать, что предложения 6.2 и 6.4 характеризуют области АХ В и А + В с точностью до изоморфизма.
Кроме того, они доказывают существование дополнительных отображений, необходимых для доказательства того, что произведение и сумма являются функторами категории областей. Используя эти результаты, можно также показать, что область
BOOL = 14-1
имеет два таких элемента true и false, что любое заданное на BOOL отображение однозначно определяется своим действием на true, false и ±Bool, причем его значение на первых двух элементах может быть произвольным.
ПРОСТРАНСТВО ФУНКЦИЙ КАК ОБЛАСТЬ
Функции, или отображения между областями, играют важную роль в нашей теории, поскольку с их помощью можно наиболее просто преобразовывать данные и устанавливать связи между структурами, в которые входят элементы, определяемые объектами данных. Существует много различных функций, причем с большими группами функций можно выполнять одни и те же операции. Например, если область-источник и область-цель подобраны правильно, то к любой паре функций можно применить очень важную операцию — композицию. Если бы мы могли объединять функции в области, то такая операция, как композиция, могла бы оказаться отображением в теории. Так и происходит в действительности: определенная соответствующим образом композиция оказывается аппроксимируемым отображением от двух аргументов. Разумеется, для каждой пары, включающей область-источник и область-цель, имеется своя операция композиции.
Для того чтобы сделать аппроксимируемые отображения элементами некоторой области, нужно сначала понять, какими будут соответствующие объекты данных. В § 5 уже есть намек на это. Для определения аппроксимируемого отображения f: А->В нужно указать, какие пары ^и, и), в которых ueCoha и и е Сояв, находятся в отношении и f v. Одна такая пара дает некоторое (конечное) количество информации о возможной содержащей ее функции. Аппроксимируемое отображение полностью определяется такими парами. Следовательно, располагая соответствующими понятиями непротиворечивости и следования для этих пар, можно построить область, элементами которой будут функции. Дадим сначала формальное определение, а затем поясним, как оно действует.
Определение 7.1. Пусть А и В — две информационные системы. Пространством функций А-^В называется система, обладающая следующими свойствами:
^)А->в = {(^,^) 1^ ^ СопА; уеСопв);
АА->в = (0,0);
для всех п и всех w = {(^о>уо)>^п-л^п-х^
weCohob тогда и только тогда, когда из того, что I ^ {0, . .., п —- 1} и U ^ui |Z'^ /} г СопА, следует, что U ^1 ее /} е= Сопв
и
w На->в (^\^/) тогда и только тогда, когда
U ^1 I и' Н А ^J Нв у'
для всех и' е Сопа и cf г Сопв.
Выбор объектов данных в (i) мы уже объясняли. Далее, очевидно, что наименее информативная пара выбрана правильно. Напомним, что объект данных (и, v) означает, что если подать на вход информацию и, то на выходе будет получена по крайней мере информация и. Очевидно, что один такой объект данных непротиворечив (он дает функцию-константу, не так ли?), однако множество, состоящее из нескольких таких пар, может оказаться противоречивым. Отсюда вытекает необходимость условия (iii). Неформально его можно интерпретировать следующим образом. Выберем такой набор I индексов элементов, составляющих w, что множество всех ui, i е /, непротиворечиво. Поскольку имеется в виду, что все пары из w должны нести корректную информацию об одной и той же функции, входная информация, состоящая из всех щ, является допустимой. Тогда эта функция должна на выходе давать по крайней мере все цг, I е /, так как для нее должны выполняться все пары из w. Следовательно, множество U {^ф’^ О должно быть непротиворечивым как выход, полученный для одной аппроксимируемой функции на непротиворечивом входе. (Мы обосновываем необходимость (iii); слово «непротиворечивость» должно означать, что все объекты данных из этого множества истинны по крайней мере на одной функции.)
Наконец, мы должны показать, что (iv) правильно определяет понятие следования для таких объектов данных. В этом можно убедиться, заметив, что для фиксированного непротиворечивого w множество пар (г/, о^, удовлетворяющих правой части (iv), определяет аппроксимируемую функцию. Чтобы проверить это, заметим, что для любого и' е Сопа множество U {уИ
и У-ки^ непротиворечиво, т. е. такое определение имеет смысл. Свойства транзитивности, необходимые для доказательства того, что мы получили аппроксимируемое отображение, устанавливаются легко. Это, в частности, показывает, что w истинно по крайней мере на одной аппроксимируемой функции, поскольку каждая отдельно взятая пара (щ', и') удовлетворяет определению. Однако нетрудно убедиться, что для любой аппроксимируемой функции, на которой истинно w, истинна также любая пара (г/, и'), удовлетворяющая определению из (iv). Следовательно, в (iv) фактически содержится определение наименьшей аппроксимируемой функции, порожденной w. Таким образом, это рассуждение показывает, что отношение w Н->в (и\ v') означает в точности то, что если w истинно на некоторой аппроксимируемой функции, то на ней истинно и ^и', и'). Отсюда также вытекает, что На->в представляет собой отношение следования и что элементы из А-^В— аппроксимируемые отображения, как утверждается в следующей теореме.
Теорема 7.2. Если А, В и С — информационные системы, то А-^В также является информационной системой, причем аппроксимируемые отображения f : А-^ В — это в точности элементы f^ | А —В |. Существует такое аппроксимируемое отображение apply : (В -> С) X В -> С, что если g е В-^С и у ^ е | В |, то
арр1у(£,Л = £(У)-
Для всех аппроксимируемых отображений h : А X В -^ С существует единственное такое аппроксимируемое отображение curry h : А (В -> С), что
h = apply о ((curry й) о fst, snd).
Доказательство. Выше мы уже прокомментировали основные моменты доказательства. Определение 7.1 было подобрано таким образом, чтобы в Сопд->в вошли в точности конечные подмножества аппроксимируемых функций, которые как бинарные отношения представлены множествами упорядоченных пар. Если f:A-^B и w ^ f, то, используя свойства аппроксимируемых функций, можно проверить, что w удовлетворяет правой части 7.1 (iii). Если же w е СопА^в, то, как мы уже говорили, отношение, определенное в 7.1 (iv), которое можно обозначить через
W = ^UZ ^'^W На^в <Uf ^Х)^,
представляет собой аппроксимируемое отображение. Это можно Доказать, используя правую часть 7.1 (iv) и обычные свойства отношений На и Н- Поскольку w ^ w, то w I—a->b^z тогда и только тогда, когда для всех аппроксимируемых f:A-^B из
w ^ f следует wf ^ Д (Это, очевидно, то же самое, что wf ^ w.^ Отсюда вытекает не только то, что А-э-В — информационная система, но и что все аппроксимируемые отображения являются элементами. Наконец, если fe | А —В |, то отображение Д рассматриваемое как бинарное отношение, должно быть аппроксимируемым отображением, так как свойства из определения 5.1 включены в определение 7.1.
При построении специального отображения apply как аппроксимируемого отображения также используется идея 7.1 (iv). Непротиворечивые множества составного пространства (В~>
С) X В — это, в сущности, пары непротиворечивых множеств, скажем, w е СопВ->с и и' ^ Сопв. Отношение, которое мы хотим получить между такими парами и у'е Сопс, это не что иное, как w Нв->с(м',у')-Рассуждения из § 6 показывают, что вычисление apply (g, у) фактически представляет собой применение функции к аргументу.
В определении curry h используется тот же самый прием: бинарному отношению, в котором один из аргументов является парой, ставится в соответствие другое бинарное отношение, в котором одна из координат пары перенесена в другую часть отношения. В частности, мы можем представлять себе аппроксимируемое отображение h : А X В-^С как отношение между парами ^и, у) непротиворечивых множеств из А и В соответственно и непротиворечивым множеством w из С. Мы хотим, чтобы curry h сопоставляло и пару (u, wY Разумеется, (и, w)—это лишь один объект данных для В -^ С, однако для определения curry h как аппроксимируемого отображения достаточно пока* зать, как переходить от непротиворечивых множеств из А на входе к таким объектам на выходе. Точная связь между этими двумя отображениями выражается через значения функций следующим образом:
А (х, у) = (curry /г) (х) (у)
для всех х е |А| и уЕ |В|. Отсюда следует, что curry h определено однозначно. Но из того, что мы знаем о функции apply, следует, что это уравнение равносильно последнему уравнению из формулировки теоремы. О
Аппроксимации функций. Почему мы назвали аппроксимируемые функции именно так? Вообще говоря, элементы области являются пределами своих конечных аппроксимаций. Мы уже объяснили, почему аппроксимируемые отображения из одной области в другую сами представляют собой элементы некоторой области, и явно показали, как строить конечные аппроксимируемые отображения w. При более подробном изучении определений выявляется в высшей степени конструктивный характер
этого исследования. Действительно, аппроксимируемые отображения можно, таким образом, аппроксимировать простыми функциями. Отсюда не следует, что все аппроксимируемые отображения являются простыми или конструктивными, поскольку предельный переход может оказаться очень сложным. Однако этот результат позволяет применить более дифференцированный подход — после того, как раскрыт точный смысл понятия аппроксимации.
Функции высших порядков и комбинаторы. Мы уже комбинировали конструкцию пространства функций с другими областями с помощью произведений. Однако ничто не мешает нам комбинировать конструктор областей («стрелку») с самим собой сколько потребуется. Таким образом строятся так называемые высшие типы. В некоторых категориях, таких, как категория множеств, это неконструктивный путь, приводящий к высшим кардинальным числам. Однако в категории областей этот конструктор действительно является конструктивным, поскольку мы показали, как определить все составляющие системы А-^В через конечные объекты данных (при этом необходимо добавить, что А и В должны быть заданы конструктивно).
Теперь, когда мы построили высшие типы как пространства, возникает вопрос, что с ними делать. Ответ заключается в том, что существует много отображений между пространствами, которые можно определить с помощью тех простых понятий, с которыми мы работаем. Эти отображения очень полезны последующей причине: высшие типы предоставляют широкие возможности моделирования понятий (например, в денотационной семантике), однако различные аспекты моделей нужно соотносить между собой, и здесь вступают в игру такие отображения. В последней теореме нам уже встретился один такой пример, который можно интерпретировать как изоморфность двух областей:
АХВ->С^ А>(В>С)
Нам не хватит ни времени, ни места, чтобы изложить здесь всю теорию операторов высших типов, поэтому ограничимся несколькими примерами. Во-первых, мы уже рассматривали постоянные отображения. Поскольку все они строятся одинаково, должен существовать соответствующий оператор. Фактически, в обозначениях мы уже его использовали. Имеется аппроксимируемое отображение const: В(А-> В), отображающее любой элемент В в соответствующую постоянную функцию. (Необходимо проверить, что это отображение аппроксимируемо-) Заметим, что для каждой пары областей А и В получается свое отображение, так как типы этих констант различны.
В качестве второго примера рассмотрим функцию спаривания из предложения 6.2. В этом случае можно рассмотреть оператор
pair ; (С - А) X (С В) - (С - (А X В)).
Для функций соответствующих типов
pair(f,g) = (f,g).
Аналогичный оператор использовался в предложении 6.4.
Основной оператор композиции функций, разумеется, тоже является аппроксимируемым оператором определенного типа. Его можно записать в виде
comp : (В-^С)Х(А-^В)-^(А->С).
Для функций соответствующих типов
comp(f,g) = gof.
Конечно, аппроксимируемость этого оператора тоже надо проверить. Однако после установления аппроксимируемости некоторого числа более простых операторов аппроксимируемость остальных можно доказывать, представляя их в виде комбинаций уже известных операторов.
Снова категории. Все, что мы говорили об операторах, тесно связано с теорией категорий (как давно известно специалистам по этой теории). Фактически, мы рассматривали декартово замкнутые категории (это свойство категории областей). Не вдаваясь в детали, скажем, что такие категории по существу описываются предложением 6.2 и теоремой 7.2. Однако области, кроме декартовой замкнутости, имеют много других свойств. Например, дополнительным преимуществом является возможность образования сумм. Обсуждение декартово замкнутых категорий, а также ссылки на соответствующую литературу можно найти в статье [23].
Несмотря на свою абстрактность, категорный подход удобен при изучении свойств общего характера. Он также может подсказать некоторые концепции на основе опыта работы с другими категориями. Например, следующая теорема вводит одно особенно важное понятие, которое допускает операторное представление и открывает дальнейшие возможности использования категорий.
Теорема 7.3. Пусть А — информационная система. Тогда существует единственный такой оператор fix (оператор неподвижной точки), что
fix : (А—> А)-> А
и для всех аппроксимируемых отображений f : А —>- А выполняются условия
t (fix (Л) — fix (f);
для всех x e | A | из f^^x следует, что fix(f)^x.
Более того, для этого оператора условие (ii) переходит в равенство.
Доказательство. Этот результат — в особенности то, что приведенные условия определяют единственный оператор, — хорошо известен. Единственным вопросом является существование этого оператора. Включение из (ii) наводит на мысль, что fix (f) — наименьшее решение f(x) ^ х. Пусть х— любой такой элемент. Тогда если и <^ х и выполняется ufv, то v ^ х. Теперь, поскольку всегда 0 ^ х, для построения наименьшего х можно начать с 0 и последовательно применять к нему отображение /.
Конкретнее, определим fix(f) как объединение всех ^Сопд, для которых существует такая последовательность и^, . .., W^ СоПа, ЧТО
^0=0;
Uifui + X для всех z < л;
и„ = и.
Поскольку f — аппроксимируемое отображение, очевидно, что fix f замкнуто относительно следования. Для доказательства непротиворечивости предположим, что и и с' принадлежат множествам, входящим в объединение. Требуется показать, что множество v U и' непротиворечиво и также входит в объединение. Рассмотрим две последовательности и0, ..., ип е СопА и и^, . . . ..., и^^ СоПд,которые позволили включить и и и' в объединение. Без потери общности можно предположить, что они имеют одну и ту же длину, так как в противном случае можно добавить нужное число 0 в начало более короткой последовательности, не нарушив условий (I) — (3). Теперь индукция по I показывает, что последовательность объединений и U и' удовлетворяет условиям (1) — (3) для у U у7.
Однако почему отображение fix является аппроксимируемым? Это можно доказать, заменив в (2) f на w и воспользовавшись условием существования последовательности, удовлетворяющей (I) — (3), в качестве определения отношения между множествами w е Сопа->а и множествами с е СопА. Нетрудно показать, что это аппроксимируемое отображение в смысле нашего определения. Очевидно, что это отношение определяет fix как оператор.□
Приведенный результат доказывает не только то, что любое аппроксимируемое отображение вида f:A-^A имеет наименьшую неподвижную точку, но и то, что оператор сопоставления отображению наименьшей неподвижной точки сам является аппроксимируемым оператором. В нашей формулировке существенно используется частичное упорядочение на областях, однако Гордон Плоткин заметил, что этот оператор можно полностью охарактеризовать уравнениями (см. [17]). В то же время Арбиб и Мейнис обнаружили, что данная категорная формулировка применима к большому числу различных категорий (см. [2]).
Предложение 7.4. Оператор наименьшей неподвижной точки однозначно определяется следующими тремя условиями*.
fixA ; (А—> А)—> А для всех систем А;
fixA (f) = f (fixA (f)) для всех f;X^X;
й (fixA (f)) = fixB (^), где f : A-> A,g : В -> В, h : A->B, hof = go h и й(±а) = ±в-
Замечание о пространстве строгих отображений. В этом предложении и во многих других местах нам случалось использовать отображения, переводящие дно одной области в дно другой. Такие отображения называют строгими, так как они строго относятся к пустым входам. Мы будем использовать для строгих аппроксимируемых отображений f (т. е. таких, что f (±а) = ±в) обозначение-
f: A->SB.
Совокупность всех областей и строгих аппроксимируемых отображений сама по себе образует интересную категорию, но ее лучше всего использовать вместе с полной категорией всех аппроксимируемых отображений.
Набор всех строгих отображений также образует область. Это можно заметить, обратившись снова к определению 7.1 (iii) и добавив к нему дополнительное условие, которое делает нестрогие отображения противоречивыми. Точнее, к правой части 7.1 (iii) нужно добавить условие, означающее, что если 0 HaU U Vh | i е /}, то 0 Н в U {^/1 i ^ /}• С помощью тех же рассуждений, что и раньше, можно доказать, что таким образом получается система, соответствующая области строгих отображений: Обозначим е,е через (A->SB).
Существует также полезный оператор
strict: (А -> B)->(A->SB),
такой, что для f : А-^ В
и strict (f) v тогда и только тогда, когда или 0Vt^bu,
ИЛИ 0 |-/-А и и ufa
для всех и г Сопа и уеСопв. Этот оператор переводит любое аппроксимируемое отображение в наибольшее содержащееся в нем строгое отображение.
Поскольку любое строгое отображение является аппроксимируемым, существует очевидным образом определяемый оператор, действующий наоборот. Эта пара операторов показывает, что А-^sB как область является ретрактом области А-^В. Имеется интересная теория отношений такого типа между областями, но мы не будем здесь ее рассматривать.
В качестве небольшого приложения строгих отображений заметим, что следующие две области изоморфны:
АХ A^(BOOL>SA).
Соответствующее отображение из левой части в правую носит название условного оператора cond, и для любых элементов х, у е | А| и / е | BOOL|
Г х, если t = true, cond (%, у) (0 = ), г 1
(у, если t = false.
. НЕКОТОРЫЕ УРАВНЕНИЯ НАД ОБЛАСТЯМИ
Теперь, когда мы описали несколько конструкций областей, заключительной темой этой статьи будет обсуждение итерирования этих конструкций для получения рекурсивных, а не прямых определений областей. Эти рекурсивно определенные системы часто называют рефлексивными, поскольку такие области обычно содержат собственные копии в качестве части своей структуры. Лучше всего такие вложения в себя описываются так называемыми уравнениями над областями, которые фактически являются изоморфизмами, ставящими в соответствие области комбинацию областей — как правило, содержащую эту главную область в качестве компонента. Это, конечно, упрощенное описание, поскольку рекурсивные уравнения над областями могут быть столь же сложными, как рекурсивные уравнения для функций. Мы не будем подробно рассматривать теорию уравнений над областями, а лишь приведем несколько примеров, чтобы показать, как наш новый подход позволяет сделать конструкции более наглядными.
Область деревьев, или S-выражений. Все очень любят этот пример. Он действительно хорош, но не нужно думать, что им
исчерпывается вся теория уравнений над областями. Даже если обобщить тип уравнений, включив все итерации конструкций -|- и X, все равно мощность метода не будет раскрыта полностью. Мы постараемся показать это на дальнейших примерах.
Пусть задана область (информационная система) А. Мы хотим сконструировать область Т деревьев, построенных из элементов А в качестве атомов. Для простоты мы рассмотрим непомеченные бинарные деревья, однако было бы легко включить в рассмотрение и более сложные деревья. Мы хотим «решить» следующее уравнение над областями:
Т^ А + (Т XT).
Если такая область существует, то элементами Т (с точностью до изоморфизма) должны быть или дно, или элементы заданной области А, или пары элементов самой области Т. Других элементов в Т быть не должно.
Для доказательства существования такой области нужно только узнать, какую информацию требуется дать о ее предполагаемых элементах. Возможно, ответ на этот вопрос заставит нас возвращаться назад, однако этот процесс не должен быть бесконечным — по крайней мере для конечных элементов. Как мы увидим, бесконечные элементы Т могут содержать собственные копии, однако для полного построения области достаточно уметь строить некоторым упорядоченным образом конечные элементы из объектов данных. К счастью, условия замкнутости для объектов данных, обеспечивающие выполнение приведенного выше уравнения, строятся легко.
Прежде всего для образования суммы нужны копии всех объектов данных из А. Для этого лучше всего взять объект А, не принадлежащий 2)А, и положить
АТ = (А,А).
Это даст нам один элемент S)T, который должен содержаться там в любом случае. Копией Х^Ф\ будет (X, А). Другие элементы 3)т имеют вид (A, ^), где U дает информацию о элементах Т другого вида. Дело в том, что Т должно быть суммой, и для того, чтобы добиться этого, мы воспользуемся схемой определения 6.3.
Теперь нужно подумать, какого вида информацию должно включать U. Поскольку в итоге мы хотим получить произведение, вернемся к определению 6.1 и предположим, что S)T Уже определено. Из 6.1 (i) следует, что в S>t нужно добавить новое множество объектов данных. Единственное, о чем при этом нужно позаботиться, — это чтобы объекты данных копировались вб
всю сумму. Учитывая это, получаем следующее множество предложений, индуктивно определяющее Фт*.
Ау €= 3^т\
если Х^Ф\, то (1,А)е^т;
если У,геД, то (А, (У,Ат))е^т и (А,(Ат,2))еД.
Разумеется, говоря об индуктивном определении, мы имеем в виду, что S)T — наименьший класс, удовлетворяющий условиям (1) — (3). С помощью стандартных рассуждений можно показать, что S)T удовлетворяет следующему теоретико-множественному уравнению:
®т = {Ат} U {(Z, А) | X е Ж} U {(А, (У, Ат)) | У е 2)т} U
и {(Д,(ДТ,2)) 1^ ^т}.
При некоторых достаточно слабых предположениях об упорядоченных парах из теории множеств 2)т будет единственным решением этого уравнения.
Однако определение объектов данных — это еще не все: одни и те же объекты данных могут входить в совершенно разные информационные системы. Объекты данных — это всего лишь «знаки», которые приобретают «смысл»,' только когда определены Сопт и Нт. Рассмотрим сначала вопрос о непротиворечивости. Мы уже владеем этим понятием в применении к системам суммы и произведения, так что для определения Сопт достаточно скомбинировать части предыдущих определений. Можно определить Сопт двумя способами; возможно, наилучшим будет индуктивный способ:
0 е= Сопт;
если и г Сопт, то zzUATeConT;
если w е Сопд, то {(У, А) |Х е w} е Сопт;
если и,иеСопт, то {(А,(У,АТ))У ew}U
U{(A,(AT,Z))|2ey}eConT.
Условия (4) — (7) подчеркивают индуктивный характер Сопт (еще раз отметим, что нужно брать наименьшее из таких множеств). Из определения также видно, что каждое непротиворечивое множество Т — за исключением содержащего лишь Ат — фактически является или копией непротиворечивого множества из А, или копией непротиворечивого множества из Т X Т. Таким образом, для Сопт, как и для S)T, можно задать теоретико-мно- жественнос уравнение.
Остается определить отношение следования для Т. Вот индуктивные предложения, которым мы просто обязаны следовать, решая уравнение над областями:
всегда и Нт Ат;
если uY-tY, то ^U{At}HtZ;
если wbA^ то {(X, А) |Х е ^} Нт (1^, А);
если ^НтХ и уеСоп.т, то
{(А, (К, Ат)) | Г е гг} U {(А, (Ат, Z)) | Z е
если у НтХ и иеСопт, то
{А, (У, Ат)) 1У е и} U {(А, (Ат, Z))Z е у} Н т (А, (Ат, X)).
Индуктивные определения влекут за собой индуктивные доказательства. Мы должны убедиться, что для непротиворечивости и следования на Т выполняются аксиомы из определения 2.1. Все шаги этой проверки являются чисто механическими. (Можно упростить доказательство, заметив, что случаи (4) — (7) и (8) — (12) не пересекаются, если не считать тривиального пересечения между (8) и (9). Обычно мы рассматриваем эти случаи, когда задаемся вопросом о природе объекта в правой части доказываемого отношения следования.)
После того как установлено, что Т — информационная система, справедливость уравнения над областями для Т можно проверить, построив его правую часть и заметив, что Т совпадает с системой А + (TXT). Это объясняется тем, что мы тщательно подобрали обозначения, согласованные с определениями сумм и произведений. (В общем случае при решении уравнений над областями может еще потребоваться некоторое преобразование, меняющее форму представления объектов данных.)
Отметим, что можно формально уточнить, в каком смысле Т является наименьшим решением данного уравнения над областями. (Это инициальная алгебра в соответствующей категории алгебр и их гомоморфизмов.) Очевидно, что область Т в каком- то смысле минимальна, поскольку мы включали в нее только то, что необходимо по условию задачи, и ничего больше.
Очевидно также, что это уравнение над областями имеет много решений. Неконструктивный путь получения неминимального решения состоит в интерпретации всего процесса построения Т в некоторой нестандартной модели теории множеств. Хотя при определении S)T все выглядит так, будто мы работаем с конечными объектами, но то, что мы делали, можно абстрагировать и проделать в некотором необычном универсуме. В результате получится система «конечных» объектов данных, обладаю-
щая всеми необходимыми формальными свойствами, однако содержащая нечто, не входящее в стандартную минимальную систему. Затем мы возьмем понятия непротиворечивости и следования, которые также существуют в этом необычном универсуме, и ограничим их на множества объектов данных, конечных в стандартном смысле. Из формальных свойств конструкции вытекает, что полученные в результате понятия удовлетворяют аксиомам информационной системы и что уравнение над областями выполняется, — но в системе окажется много различных элементов помимо тех, что- первоначально входили в Т. Кстати, чтобы эта конструкция заработала, система А должна быть абсолютной в модели: если она конечна (скажем, А = BOOL), то никаких проблем не возникнет. (Можно также предложить конструктивные методы введения «нестандартных» объектов данных.)
Наконец, нужно объяснить, почему мы назвали Т областью S-выражений. Ответ становится очевидным, если структурировать Т как алгебру. Во-первых, существует аппроксимируемое отображение
atom : А-> Т,
которое отображает А в Т, делая элементы А атомами Т. Существует булевозначный предикат на Т, который проверяет, является ли элемент атомом.
isatom : Т ->BOOL.
Наконец, поскольку TXT представляет собой часть Т, можно переопределить функции над парами таким образом, что
pair:TXT->T; fst:T->T; snd:T->T.
В Лиспе эти хорошо известные функции называются cons, саг и cdr. Таким образом Т становится алгеброй, элементы которой (выражения) строятся из атомов путем последовательного применения функции спаривания.
Но чем наша система отличается от обычных S-выражений? Ответ состоит в том, что добавление частичных выражений (содержащих ±т) и пополнение области пределами приводит к появлению бесконечных выражений. Например, если аг |Т|, то можно найти решение уравнения наименьшей неподвижной точки
х = pair (atom (а), %), являющееся бесконечным списком с элементами а. Это лишь °Дин пример. Аналогичные возможности обсуждались в таком 1 ^личестве статей, что их невозможно здесь перечислить.
Обычно отмечают, что S-выражения можно рассматривать как деревья разбора, дающие грамматическую форму выражения. Мы же добавили к идее дерева возможность получения бесконечных деревьев и возможность рассматривать все эти деревья как элементы некоторой области.
Область в лямбда-исчислении. Основным источником по этой теме стала теперь книга Барендрегта [3]. Подробное обсуждение современного состояния дел и многочисленные ссылки на модели лямбда-исчисления можно найти в работах [12] и [13]. Мы хотим лишь показать, как наш метод построения области путем решения уравнения над областями можно использовать для нового представления областей. При этом мы добавим к более ранним идеям (которые всегда опирались на анализ конечных элементов модели) общий взгляд на информационные системы. В частности, модели, полученные таким образом, не являются решетками,— поэтому возникает потребность в Con. Я надеюсь, что наше описание прояснит связь «чистых» моделей лямбда-исчисления с областями другой структуры, например с областями из денотационной семантики.
Мы хотим решить уравнение над областями
D А + (D > D)
Будем действовать так же, как и для Т, за исключением того, что теперь в область нужно включить объекты данных, соответствующие функциональному пространству. Вот требуемая конструкция (где элемент А не принадлежит 2)^ и AD = (A,A)):
Ad е= ®d\
если X^SDk, то ^Х,^^®^
если (ы,у)еСопо, то (A,(u,y))e2)D;
0 ее ConD;
если и г ConD, то и U {AD} е ConD;
если w е Con а, то {(ЛГ, А) |Х е w^ е ConD;
{(А,(цо^о)), •(АЛ^-нУд-!))} ^ConD при условии, что
и{, Ui е ConD для всех i < п и что если I ^ {0, . . ., п — 1} и U ^i |Ze /} е ConD, то U ^i Ii^/} е ConD.
Отличие этой конструкции от определения Т заключается в том, что S)D и ConD взаимно рекурсивны, так как объекты данных в свою очередь строятся из непротиворечивых множеств. Эта схема основана на комбинации конструкций суммы и пространства функций, однако взаимная рекурсия приводит к возникновению* «обратной связи».
Для завершения определения нужно дать индуктивное определение следования:
всегда и Но Ао;
если u\-DY, то uU{Ad}HdT;
если w^W, то {(X, А) | X ge -j^ Hd(1^,A);
{(А,(ы3,у0)),(А,(«„_,,y^))} Но (А,(и',у')), если
U {yz- |и' hn^} Hd ^z и множество в левой части отношения принадлежит ConD.
Очевидно, что определения были бы намного короче, если бы у нас имелась область, в которой все множества непротиворечивы. Однако по ряду причин имеет смысл провести концепцию непротиворечивости через все определения. То, что D — информационная система и что она удовлетворяет указанному уравнению над областями, проверяется механически. Мы не будем подробно описывать, как данная конструкция позволяет получить модель лямбда-исчисления.
Очевидно, что эти определения конструктивны и что при соответствующей гёделевой нумерации объектов данных предикаты непротиворечивости и следования рекурсивно перечислимы. Однако мы строим эти предикаты с помощью рекурсии, восходящей от менее сложных объектов данных к более сложным. Следовательно, предикаты должны быть рекурсивными, поскольку последовательность шагов, относящая к предикату объекты данных какого-либо фиксированного размера, имеет ограниченную длину. Это замечание оказывается полезным при обсуждении вычислимости операторов, определенных на этих областях,— еще одна тема, который мы здесь не касаемся.
Универсальная область. В качестве последнего примера рекурсивного построения областей рассмотрим конструкцию «универсальной» области U (мы скоро поясним это название). По- видимому, для определения U удобнее всего сначала определить область V с элементом-верхом, а затем удалить верх.
Рекурсия для V удивительно проста. Мы начнем с двух разных объектов данных А и V, которые дают информацию о дне и верхе V соответственно. Таким образом, Av = A по определению. Предположим, что эти два объекта являются атомарными в том смысле, что они не равны никакой упорядоченной паре объектов. Следующие два предложения определяют S\<
А,уеД;
если X,Y^®V, то (^,A)e^)v и (А,У)е0у.
Таким образом, мы начинаем с двух объектов и выполняем замыкание относительно двух копий всех объектов. (Необходи- м'ость такого структурирования вызвана наличием произведения.)
Все подмножества 2>v непротиворечивы, поэтому остается только определить отношение следования для этой области:
всегда и Ну А;
(4)uHvV, если илиили {^ | (X, А) ^ u} Н у V и
{У|(А,У)е^НУУ;
uV-v(X\^ если или V или (^ | (X, А) е ц} Н VX';
и \-у(А,У/) если или V^u, или {У | (А,У) е и} |— у Y\
То, что V — информационная система, доказывается так же, как и раньше. Заметим, что по этому определению следования объекты данных А, (А, А), ((А, А), А) и т. д. эквивалентны, однако нет отличных от V объектов, эквивалентных V. Область V удовлетворяет следующему уравнению над областями:
VX V.
Но это уравнение имеет бесконечное число решений, поэтому то, что V ему удовлетворяет, говорит нам очень немногое. Поскольку из V следует все что угодно, его можно рассматривать как мошенника, которого следует изгнать из приличного общества. Он дает информацию лишь о верхе V, который совершенно бесполезен. Мы избавимся от него, объявив его противоречивым. То, что остается, и будет областью U. Формально
®U = SV-^;
Au = Av;
Сопи = (^ ^ Dy | и конечно и uhvV};
и\-у}¥ тогда и только тогда, когда геСоп^УеД; и и |— у У.
Определения этого типа можно использовать во всех тех случаях, когда в информационной системе есть объект-мошенник, из которого следует все что угодно. Всегда существует система, получаемая из данной системы удалением всех объектов, из которых следует все что угодно. В самом деле, мы всегда могли бы включить такой объект в любую область и изменить опреде^ ление таким образом, чтобы элементами были дедуктивно замкнутые множества объектов данных, в которые не входит объект- мошенник. Мы не делаем этого по той причине, что лишние элементы порождают множество исключений в конструкциях типа
произведения, когда возникает соблазн включить их в различные комбинации.
Однако на этот раз мы позволяем V входить в различные комбинации — и это один из секретов нашей конструкции. Но в результате оказывается не очень просто установить, какому уравнению над областями удовлетворяет U, поскольку оно включает неизвестный функтор. Таким образом, понять природу этой области непосредственно через такие уравнения нельзя. Тем не менее можно объяснить, как она работает, рассмотрев шаги ее построения.
Представим себе полное (бесконечное) бинарное дерево. Объекты данных из U дают информацию о возможных путях в этом дереве. Будем считать, что дерево растет вниз из корня, расположенного вверху. Объект А не дает никакой информации, т. е. никакие пути не исключаются. (Если бы мы включили объект V, то он давал бы информацию, что все пути исключаются.) Объект данных ^Х, А) говорит о пути, который-неограничен или в правой половине дерева, или в левой, и если мы начнем с узла, расположенного прямо под корнем, то пути, которые исключаются из этого поддерева, в точности совпадают с путями, которые исключаются в соответствии с X. Это имеет смысл, поскольку поддеревья бинарного дерева выглядят точно так же, как само это дерево, и поэтому информацию можно релятивизо- вать или передать в другие позиции. Для объекта (А, У) правое и левое поддеревья меняются ролями. Мы могли бы ввести объекты данных вида (X, У), дающих информацию одновременно о двух половинках дерева, но эту роль выполняет непротиворечивое множество {(X, А), (А, У)}. Вообще, при «чтении» информационных объектов непротиворечивые множества можно понимать как конъюнкции, а запятую в упорядоченной паре — как дизъюнкцию.
Теперь мы видим, что один объект данных (если он содержит V) просматривает дерево вдоль одного пути на некоторую конечную глубину, а затем исключает остальную часть дерева под этим узлом. Непротиворечивое множество объектов данных оставляет по крайней мере одну «дыру», поэтому по крайней мере один путь не исключается. Максимальные непротиворечивые множества информационных объектов — это те множества, которые дают информацию ровно об одном бесконечном пути в бинарном дереве. Частичные элементы, однако, труднее интерпретировать геометрически. При сборе информации в непротиворечивое множество пустоты могут быть оставлены по всему дереву. Таким образом, частичный объект носит недетерминированный характер, поскольку описываемый путь может проходить через любую из пустот. (Кстати, все это можно объяснить
топологически. Тотальные элементы U образуют хорошо известное топологическое пространство, так называемое канторово пространство, а частично упорядоченные множества элементов U изоморфны решетке открытых множеств в этом пространстве,— с той разницей, что само пространство нужно исключить из этой решетки.)
Все это очень хорошо, однако мы вправе спросить, чем замечательна данная область и почему она называется универсальной? Мы не можем привести здесь доказательство, но ответ будет следующим. Используя стандартные сведения о счетных булевых алгебрах, можно доказать, что любая «счетно базируемая» область является подобластью U. В частности, если А— информационная система и S)A счетно, то существует пара аппроксимируемых отображений
а : А -> U и b : U -> А, для которых
Ь о а = 1а и а о Ь 1ц.
Это делает А ретрактом U специального вида. Такие отображения а и b далеко не единственны, однако существует по крайней мере один способ инъективного вложения элементов А в элементы U.
Свойство универсальности U находит широкое применение. Например, поскольку система (U-^U) имеет (по построению!) счетное число объектов данных, она является ретрактом U. Зафиксировав одну такую пару отображений, можно сделать U моделью лямбда-исчисления. Я не знаю, приводят ли разные пары к разным моделям. Однако суть в том, что области могут содержать свои собственные пространства функций по самым разным и интересным причинам.
Область областей. Не будем вдаваться в детали, но отметим, что даже области можно объединить в некоторую область. Для того чтобы понять, каким образом это можно сделать, заметим, что, поскольку подобласти U соответствуют функциям некоторого типа на U и поскольку пространство функций на U также является подобластью U, можно ожидать, что подобласти U образуют подобласть U.
Однако это довольно сложный путь, который требует проработки множества деталей. Проще поставить вопрос, что значит дать конечную информацию об области. Для единообразия предположим, что объекты данных возможной области построены из неотрицательных целых чисел и что вместо А используется 0. Тогда для того, чтобы дагь конечную информацию об области, нужно, грубо говоря, специфицировать конечную часть
Con и конечную часть Н. Для упрощения формулировки зарезервируем за 1 ту роль, которую раньше играл элемент V. Спецификация будет выдавать пары (щ у) конечных множеств целых чисел, рассматриваемых как объекты данных, несущих информацию об отношении следования.
Но ведь отношения следования тесно связаны с аппроксимируемыми отображениями! В самом деле, мы уже отмечали, что тождественная функция как аппроксимируемое отображение на области в точности представляется отношением следования на области. Предположим, что нашей областью является область всех множеств целых чисел. Обозначим это множество-степень через Р. При этом все целые числа оказываются объектами данных, все конечные множества непротиворечивы, а отношение следования является минимальным из всех возможных. (Что касается элементов, произвольное множество целых чисел равно объединению всех своих конечных подмножеств, и это означает, что элементы области находятся во взаимно однозначном соответствии с произвольными множествами целых чисел.) Вопрос в том, какие аппроксимируемые отображения Р в себя соответствуют отношению следования на целых числах как объектах данных.
Ответ принимает наиболее сжатую форму в наших стандартных обозначениях. Если рассматривать г:Р-^Р как обычное отношение между конечными множествами, то рефлексивность г означает, что
Ip^r;
транзитивность г означает, что
г о г = г;
то, что в г объект 0 играет роль А, означает, что
0^г(1),
где п— сокращение для {/г} в области Р. То, что 1 играет роль объекта-мошенника, означает, что
Т=г(Т).
Наконец, то, что I следует исключить как противоречивый объект, означает, что
Т$г(0).
Вот и все. Набор аппроксимируемых отображений, удовлетворяющих условиям (I) — (5), дает нужное отношение следования. Условие (5) —это условие непротиворечивости; конечными
непротиворечивыми подмножествами являются такие и, что 1 $ г (й). Совокупность г, удовлетворяющих (1) — (5), образует элементы области, построенной из (Р->Р) аналогично тому, как мы раньше строили U из V.
Теперь, когда мы образовали область из областей, следующим шагом будет построение аппроксимируемого отображения из конструкций над областями (т. е. функторов). Однако мы отложим это до следующей публикации. Я лишь надеюсь, что после данной работы теория областей покажется проще и естественней.
9. ДВЕ ОБЛАСТИ-СТЕПЕНИ1)
Все виды конструкций, которые мы обсуждали до сих пор, носят логический характер: произведения областей нужны для теории кортежей и для изучения функций нескольких переменных; суммы областей нужны для того, чтобы делать копии областей и соединять вместе существенно различные области; пространства функций, рассматриваемые как области, требуются для того, чтобы иметь возможность работать с операторами высших типов, аргументами и значениями которых являются операторы. Эти конструкции действительно предоставляют нам очень богатый выбор типов, особенно когда они входят в рекурсивные определения типов, использующие уравнения над областями, как показано в § 8. Однако это лишь несколько возможностей, а обо всех возможностях мы пока даже не имеем представления. Уже само понятие области-степени указывает путь к новому множеству конструкций, но, по-видимому, многое еще предстоит открыть.
В основе конструкции области-степени лежат неупорядоченные кортежи элементов, в то время как произведения областей имеют дело с упорядоченными кортежами. Располагая областью А, мы хотим, чтобы область-степени S^A содержала по крайней мере все (конечные) неупорядоченные кортежи элементов А и операции для их образования. Мы увидим, что существует несколько способов определения такой области, обусловленных тем, какие именно свойства неупорядоченных кортежей нам нужно получить.
Обобщение категории множеств до категории областей затруднено тем, что обычное понятие множества-степени играет несколько ролей. В теории множеств (во всяком случае, в нашей обычной классической логике) все множества рассматри-
’) Этот параграф прислан автором специально для русского издания,— Прим. ред.
ваются как дискретные*, это означает, что у каждого множества есть определенная мощность, и при этом различные размеры множеств можно выделить и расставить по местам с помощью более или менее произвольных функций. В теории областей дело обстоит не так просто, потому что элементы, которые мы пытаемся собрать вместе, — это только частичные элементы, и нужно принимать в расчет их взаимосвязи. Мы должны также принимать решения относительно того, что предположительно изображает кортеж, так как взаимосвязи между термами, составляющими кортеж, могут по-разному проявляться при исследовании отношений между самими кортежами. Для иллюстрации приведем два примера.
Область-степень мультизначений. В этом простейшем примере области-степени элементы называются мультизначениями, поскольку считается, что кортеж представляет собой совокупность значений из данной области, каждое из которых вносит что-нибудь позитивное в окончательный результат; таким образом, чем больше значений входит в совокупность, тем лучше. Представим себе, например, покупку яблок: чем больше яблок, тем удачнее покупка. Формальное определение оказывается очень простым, поэтому давайте рассмотрим его, а затем вернемся к обсуждению его смысла. (Эту конструкцию называют также областью-степенью Хоара, или, как исторически сложилось, перевернутой областью-степенью Смита.)
Определение 9.1. Пусть А — информационная система. Областью-степенью мультизначений называется система Р = ^мА, для которой
Фр = Сопд;
Ар = 0; <
(Hi) СопР = все конечные подмножества Фр*,
и для всех р ^ Сопр и всех и е ФР
(iv) p\-pu тогда и только тогда, когда либо I—дУ, либо ц|—ду для некоторого и^р.
В 9.1 (iv) мы используем отношение ц|—ду в смысле определения 2.2. Опираясь на свойства Ь-д, нетрудно показать, что отношение I— Р обладает всеми свойствами, нужными для того, чтобы Р было информационной системой, и мы даже не будем формулировать этот результат в виде теоремы. Для того чтобы понять связь между этими двумя областями, удобнее всего считать, что множество и е Сопд соответствует конъюнкции всех объектов данных, или высказываний X ^ и, которые оно содер-
жит. Причина подобной интерпретации заключается в том, что для любого элемента х е | А| отношение и ^ х означает, что все высказывания из и одновременно истинны на х. Теперь, предположив, что мы имеем интуитивное представление об области А, попробуем понять, что же представляет собой система ^мА.
Основной вопрос заключается в том, какую информацию об элементе области-степени дает множество
Р = {^0, . . ., ип_^ GE Сопр.
Для множества
w=GY0, . . Xm_x\ ее СопА,
связанного с исходной областью А, информационное содержание и можно прочесть так: «Все высказывания X, истинны на одном и том же возможном элементе из А». Но для области-степени, которую мы строим, множество р должно иметь следующий смысл: «Каждое ut истинно на некотором члене возможной группы (или сумки) элементов, которые мы собираем вместе для получения элементов из ^глА». По мере того как мы добавляем информацию в множество р, группа, которую оно порождает, становится все больше и все более полно определенной. По крайней мере, таково специальное понятие группы для данной конкретной конструкции над областями. Это можно назвать поступательной (или прогрессивной) интерпретацией группы, поскольку чем больше мы помещаем в нее элементов, тем лучше. Группы, таким образом, выступают как «мультизначения в том смысле, что все значения присутствуют и каждое вкладывает что-то в аддитивном смысле. Однако, как мы покажем, отдельные добавки никак не комбинируются.
Некоторые новые обозначения, возможно, позволят прояснить природу области ^мА. Во-первых, существует аппроксимируемое отображение
singM: А^^МА,
которое вкладывает данную область в область-степень. Для хе |А| мы будем использовать более наглядное обозначение
• {х} • =singM(x),
полагая по определению
• {х} • = {^ е Сопа I и ^ х}.
Ясно, что • {х} • — это элемент области-степени, поскольку все его члены дают информацию об одном и том же элементе области А; таким образом, он замкнут относительно следования, которое мы определили для ^мА. Все, что мы до сих пор де-
лали, должно было показать, что отдельные элементы (из А) действительно представляются мультизначениями. Нужно проверить, чго отображение singM действительно аппроксимируемо*.
Для того чтобы сделать второй шаг к пониманию природы S^mA, укажем, что существует аппроксимируемое отображение
union : ^МА X ^мА-^^мА,
которое определяется как
union (s,/) = s U /, s^el^A].
На самом деле теоретико-множественное объединение любого количества элементов из ^мА также является элементом й^мА. Именно так мы вводим множественность в только что построенную область: просто соединяя несколько элементов вместе. В случае простой множественности, обусловленной заданными элементами А, мы можем определить
• {х0, . .. = . {х} • и и • К-Л • ,
где все х, являются элементами А.
Третий шаг осмысления заключается в том, чтобы точно выяснить, когда выполняется отношение
■ Uo, • ■ - , хп_^ • Е ■ {г/о, . . .,.
Поскольку мультизначение слева оказывается просто объединением, этот вопрос сводится к более простому: когда выполняется отношение
■ {х} •* ^0> • • •> ^//72 — 1} * •
Теперь • {х} • состоит из всех конечных подмножеств х. Если бы х не содержалось как подмножество ни в одном yi, то для каждого j <т выполнялось бы и, х в том случае, если Uj е у$ не выполняется. Однако объединение всех и, — это конечное подмножество х, и поэтому оно должно входить в некоторое подмножество у^ так как отношение (2) выполняется на ^мА. Но это невозможно, и полученное противоречие доказывает, что х должно входить в некоторое у;. Итак, (I) означает, что каждое Xi входит в некоторое у,; другими словами, первое мультизначение можно «улучшить» до второго путем улучшения каждого из его отдельных значений и, возможно, добавления новых значений.
Кстати, для того чтобы сказать, что элемент хе |А| является членом группы (сумки) se |^мА|, достаточно сказать, что • {х} -е s, однако это утверждение будет не слишком информативным, если х — очень частичный элемент. Все сказанное хорошо соответствует простейшей идее мультизначений (т. е.
сумок) с добавлением частичных элементов, которые можно постепенно улучшать. Например, непротиворечивое множество {«Uo} из ^мА сильнее, чем множество {w, у}, поскольку в первом из них мы не можем разделить и и и, а во втором мы можем усиливать эти части по отдельности, превращая их в противоречивые объекты данных из ^мА. Если некоторая порция информации, порождающая элемент области, допускает больше расширений, чем другая, то первый элемент более частичный. В нашем примере два конечных элемента {w U ^} и {ц, ц} не могут, вообще говоря, быть эквивалентными.
Заключительный шаг осмысления й^мА заключается в том, чтобы понять, что остальные элементы множества-степени являются пределами специальных элементов вида • {х0, • • • , x^-i} •, которые мы только что рассмотрели. Предельный переход порождает «большие сумки» с бесконечно большим числом элементов, но этот вид бесконечности значительно более ограничен, чем тот, который мы используем в классической теории множеств. Способ осуществления предельного перехода похож на способ вычисления функций.
Вспомним, что в категории областей всякая функция
h : ^м А —> В
аппроксимируема (непрерывна). Это означает, что ее значение в предельной точке s области-степени определяется значениями h на конечных мультизначениях, содержащихся в s. Если при выявлении различий полагаться на функции, то этих различий окажется гораздо меньше, чем можно обнаружить в обычной теории множеств. Данное обстоятельство не всегда является помехой; наоборот, вычисление значений путем конечных аппроксимаций широко используется в теории прямых вычислений. Мы хотим одновременно располагать бесконечными элементами для концептуальных целей и иметь возможность выполнять с ними вычисления. Конструкция области-степени дает широкий простор для экспериментов с подобными вычислениями.
Особенно важное свойство области-степени связано с тем, как она, ведет себя при отображениях. Из-за недостатка места мы не сможем изложить эту теорию полностью, но основное определение сформулировать легко. Пусть f:A->B — любое заданное аппроксимируемое отображение из одной заданной области в другую. Тогда можно однозначно определить отображение
Д : ^мА-^^мВ,
называемое отображением прямого образа между этими двумя областями-степенями. Для любого элемента s из ^мА положим
по определению
f*(s) = {^ ^ Сопв| у ^ f (z2) для некоторого и г s^.
Несложно убедиться, что отображение f* полностью определено и аппроксимируемо.
Отметим, что переход от отображения f между двумя данными областями к отображению /* переводит тождественные отображения в тождественные. Более того, при этом переходе сохраняется композиция, т. е. если /:А-^В и g : В ->■ С, то
(g ° П. = (у.) ° (f.)-
На языке теории категорий можно сказать, что мы получили функтор, — в том смысле, что переход от области А к области .З^мА соответствует переходу на отображениях, сохраняющему тождественное отображение и композицию. (У функтора должны быть определены обе компоненты, включающие как области, так и отображения.) В приведенном примере области-степени мультизначений отображения из А в В преобразуются в отображения прямого образа без изменения направления; таким образом, это ковариантный функтор. Отметим также, что из свойств функторов сразу вытекает, что изоморфизм между областями переходит в изоморфизм между областями-степенями. Для того чтобы конструкция имела существенное структурное значение, она обязательно должна удовлетворять этому условию.
Кстати, для того чтобы получить любое число «бесконечных» элементов области-степени ^мА, часто бывает достаточно зафиксировать в области-степени один элемент а и затем выбрать некоторое аппроксимируемое отображение
Это позволяет определить элемент области-степени, удовлетворяющий уравнению неподвижной точки:
х = union каЛ* (х)).
Если f осуществляет перестановку, то у нас получится бесконечное объединение (но допускающее конечные аппроксимации).
Область-степень неопределенности. Рассмотрим теперь область-степень Смита, или, как я предпочитаю ее называть, область-степень неопределенности. В данном случае группы элементов должны читаться не поступательно (прогрессивно), а регрессивно*, грубо говоря, это означает, что из сумки такого вида можно надеяться достать один элемент, но не все. Чем больше вы кладете в сумку, тем более непредсказуемым становится то, что вы оттуда вытащите; итак, на этот раз «больше» значит «хуже».
Для того чтобы описать эту конструкцию как можно проще, предположим, что данная область А обладает следующим свойством замкнутости для объектов данных.
Определение 9.2. Информационная система А называется замкнутой относительно конъюнкции, если для любого и е Сопд существует такой объект данных U гФк, что^ На U и {(/} Нам.
Объект данных U в этом определении представляет собой просто конъюнкцию объектов данных из и. В данной системе их может быть много, но все они эквивалентны относительно Н (эту эквивалентность несложно определить формально). Всякая информационная система изоморфна некоторой системе, замкнутой относительно конъюнкции. Самое простое доказательство этого утверждения сводится к тому, чтобы просто сделать непротиворечивые множества из Сопд объектами данных новой информационной системы, считая их своими собственными конъюнкциями. (Это указание позволяет понять, что такое непротиворечивое множество непротиворечивых множеств и когда из одного такого множества следует другое.) Итак, без потери общности можно считать, что А удовлетворяет приведенному условию.
Перед тем как определить новую область-степень, нужно чуть-чуть пополнить терминологию. Если S — множество множеств, то множеством выбора для S называется множество с, имеющее непустое пересечение с каждым множеством из S.
Определение 9.3. Пусть А—информационная система, замкнутая относительно конъюнкции. Областью-степенью неопределенности называется такая система Q = ^]A, что
S)Q — множество всех конечных непустых подмножеств s из д',
00 Aq = {Aa};
(Hi) ConQ — множество всех таких конечных подмножеств q из S)Q, у которых имеется хотя бы одно множество выбора и е Сопд;
для всех q е ConQ и s е S)q
(iv) ^HqS тогда и только тогда, когда для каждого множества выбора меСогц для q существует объект данных Kes, для которого и\-xY.
Идея этого определения состоит в том, что если Q действительно является информационной системой, то она оказывается
также замкнутой относительно конъюнкции. В самом деле, если q— непротиворечивое множество из Q, то для каждого непротиворечивого множества выбора и для q можно выбрать соответствующую конъюнкцию и^Ф\. Поместим все эти U в множество t, которое, согласно определению, есть объект данных из Q. Используя 9.3 (iv) можно показать, что q Hq/ и {7} HqU для всех и ^ q. Это доказывает, что в Q объект данных t является конъюнкцией для q.
Для того чтобы объяснить это определение, лучше всего, по- видимому, сравнить его с приведенным выше определением области-степени мультизначений. Предположив, что область А замкнута относительно конъюнкции, можно свести объекты данных из Р=^МА к отдельным объектам данных (множествам, состоящим из отдельных объектов) из А. Это возможно потому, что в Р каждое множество {ц} е СопР эквивалентно {{(/}}, где U — конъюнкция и из А, т. е. — непротиворечивое множество ^еСопр эквивалентно множеству вида {{^о}, ..., {Xn-J}. И поскольку мы всегда можем добавить А, можно считать, что это множество непусто и что п > 0. Зададимся теперь вопросом, что означает отношение
(ГО, П„_,}}НР{{Г0},
Ответом на этот вопрос будет следующее несложное отношение:
V/ < mBi < n.{Xt} V-xYj.
Таким образом, становится ясно, почему для этой области-степени «больше» значит «лучше»: потому, что если множество в левой части отношения I— Р заменяется большим множеством, то отношение остается справедливым. Большее множество в данном случае содержит больше информации.
Вернемся теперь к Q=^iA и заметим, что, поскольку Q замкнуто • относительно конъюнкции, каждое множество q е ConQ эквивалентно множеству вида {№, ..., Хп_х^, где снова п > 0. Теперь зададимся вопросом, что означает отношение
(№,^„-i}} На{Го. 1VJ,
где m > 0 в силу 9.3 (i). Ответом б^дет другое несложное отношение, несколько отличающееся от предыдущего:
MKn3i<m. №}НаГ/.
Таким образом, мы видим, почему на этот раз «больше» значит «хуже»: поставьте слева множество побольше, и отношение может перестать выполняться, в то время как при увеличении множества справа истинность отношения сохраняется.
Можно объяснить разницу между двумя нашими областями- степенями и другим способом: сказать, что в ^мА комбинация {{Хо}, . . , PG-J} может рассматриваться как свободная конъюнкция объектов данных из А. Слово «свободная» означает, что непротиворечивость в А не принимается в расчет и «внешняя> конъюнкция в ^МА не комбинируется с конъюнкцией в системе А (которую мы считаем замкнутой относительно конъюнкции). С другой стороны, в ^iA комбинация {{Хо}, . . . , {X^-J} может рассматриваться как свободная дизъюнкция объектов данных из А. При этом допустима любая непустая дизъюнкция и дизъюнкции замкнуты относительно конъюнкции в силу дистрибутивности и замкнутости А. (В простейшем исчислении высказываний любую конъюнкцию дизъюнкций можно представить в виде дизъюнкции конъюнкций; в нашем случае непротиворечивость должна быть определена таким образом, чтобы хотя бы одна из получающихся конъюнкций существовала в А. Все противоречивые конъюнкции устраняются.)
Как и прежде, основной вопрос заключается в том, какую информацию об элементе новой области-степени дает множество
<? = {№„ . ^_J}eConQ.
Ответ теперь будет таким: множество q дает информацию о том, что для каждого Члена возможной группы (или кортежа) элементов, комбинация которых дает элемент из ^хХ, некоторое высказывание Х{ истинно. По мере добавления множеств в множество q оно становится менее определенным, поскольку появляется более широкий и менее детерминированный выбор. Я называю такое прочтение группы регрессивным, или обратным, поскольку чем больше элементов мы включаем в группу, тем хуже она становится. Это станет яснее, если рассмотреть единичные кортежи.
Аппроксимируемое отображение
singi A->^iA,которое отображает данную область в новую область-степень икоторое для хе |А| можно записать в более наглядной форме
: {х}: = singi (х), определяется так:
:{x}: = {se^)Q|snx^ 0}.
Нужно проверить, что :{х}: является элементом области-степени ^VX и что q^ :{х}: читается именно так, как было указано в предыдущем абзаце. Отметим также, что теперь для того, чтобы сказать, что хе |А| является элементом группы /е |^iA|, нужно сказать, что t :{х}:.
Данной области-степени соответствует следующее определение кортежа:
: {х0, ..х„_,}: = : {х0}: П- ■ -П : {^-1}:,
где все Xi — элементы А. Вследствие двойственности с другой рассмотренной здесь областью-степенью отношение
• {-^0» • • • , Xn_t} • — • {^/о» • • • , ^/т —1} •
выполняется в ^iA тогда и только тогда, когда для любого / С m существует такое число I << п, что Xi ^ ур Кортеж :{х0, • • • , Хп-у}: обладает качествами своих компонент, но не содержит (с точки зрения информации) ни одной из них — это некий синтез. Заметим в связи с этим, что : {х0 А • • • A *n-i}:, вообще говоря, является намного более частичным, чем :{х0, ... .. ., Хп-1):. Отметим также, что
: {1а, х0,-.х„_!}: = 1Q
независимо от добавленных элементов.
На новой области-степени удобно задавать отображения. Пусть дано произвольное аппроксимируемое отображение f: : А-^В между двумя заданными областями. Тогда однозначно определяется отображение между соответствующими областями-степенями
fj^iA-^B,
которое также называется отображением прямого образа. Вновь используя типичные редукционные формы непротиворечивых множеств, определим f* как аппроксимируемое отображение, сказав, что отношение
№о,Yn^}}
эквивалентно следующему условию: для всякого I < п существует такой номер / < т, что Xi f Yi. Легко показать, что мы действительно определили аппроксимируемое отображение и что переход от f к f* является функтором в нашей' категории.
Конечно, теория множеств-степеней неопределенности здесь лишь намечена, но, надеюсь, мне по крайней мере удалось показать, что это достаточно простая конструкция, имеющая очевидный логический смысл. Надеюсь, я убедил читателя в том, что это только одна из многих возможных конструкций и что надо исследовать и другие конструкции.
Краткий экскурс в историю. Первые упоминания областей- степеней встречаются в [16] и [26], однако многие читатели нашли эти статьи слишком сложными. Подробное и доступное изложение с историческими комментариями и пояснениями можно
найти в [5]. Но, по-моему, ни в одной из этих статей не уделяется должного внимания конечным элементам. Поэтому я постарался дать как можно более конкретное описание конструкций двух так называемых «слабых» областей-степеней. Это алгебры (конечных) множеств и я надеюсь, что мне удалось прояснить вопрос о том, как сопоставляются множества при использовании отношения аппроксимации.
Заключительные замечания. Объекты данных для двух рассмотренных здесь конструкций областей-степеней определяются явно и четко. Таким образом, ясно, что эти конструкции можно комбинировать с другими для того, чтобы решать уравнения над областями, подобные приведенным в § 8 для Т и D. Конечно, неплохо иметь общие теоремы о том, когда уравнения над областями имеют решения, однако полезно также уметь анализировать структуру решения, чтобы точно знать, как оно строится. В этой статье мы рассмотрели ряд таких конструкций, но у нас не было ни времени, ни места, чтобы глубоко исследовать их свойства или чтобы рассуждать о более общих теоремах, которые удобнее всего формулировать на языке теории категорий. (См. по этому поводу работы [I] и [28], а также указанную там литературу.)
Существуют два основных вопроса, которые требуют исследования. Первый вопрос касается отношения одной области к другим областям. Например, можно сказать, что наши определения задают «наименьшее», или «начальное», решение соответствующих уравнений над областями. Решения могут быть также «окончательными» или «терминальными», — однако объяснение этих терминов потребовало бы значительно более глубокого изучения теории категорий. Второй вопрос связан с внутренними свойствами самих областей. Например, все наши примеры сильно структурированы в том смысле, что на построенных областях естественным образом задается много операций. Мы привели целый ряд примеров таких операций. Нужно точно установить свойства этих операций. Каким уравнениям они удовлетворяют? И как мы узнаем, что это все уравнения? Нужно еще многое сделать, чтобы во всем этом разобраться, и уже существует обширная литература по «алгебраической спецификации» типов данных.
Только что высказанные соображения приводят еще к одному вопросу, который также требует дальнейшего изучения. Если найдены уравнения, обеспечивающие некоторый полезный набор свойств, всегда встает вопрос о том, какие еще структуры удовлетворяют .этим уравнениям. Можно ли с помощью той или иной конструкции получить «свободную» область, удовлетво-
ряющую данным уравнениям? Области-степени дают пример «алгебр», порожденных заданной областью (единичных кортежей) с помощью некоторой операции абстрактного объединения. Плоткин потряс нас тем, что для самых очевидных свойств объединения в рассмотренной здесь категории областей не существует свободной области-степени. Существует, однако, решение в более широкой категории (так называемые SFP-объекты). Смит обнаружил , что при добавлении некоторых дополнительных свойств появляются решения в более узкой категории. Этот феномен требует дальнейшего изучения. Содержит ли категория Плоткина все, что нужно, или есть еще более широкие категории? При каких условиях существуют решения в нашей категории областей? Эти вопросы сформулированы не очень строго, но они могут дать пищу для размышлений.
ЛИТЕРАТУРА
Adamek J, Koubek V. Least fixed point of a functor. Journal of Computer and System Sciences, 19, 1979, p. 1G3—178
Arbib M A, Manes E. G. The pattern-of-calls expansion is the canonical fixpoint for recursive definitions Journal of the Association for Computing Machinery, 29, 1982, p. 577—602.
Barendregt II. P. The Lambda Calculus* Its Syntax And Semantics Studies in Logic, 103, North-Holland, New York, 1981. [Имеется перевод: Барендрегт X. Ламбда-исчисление* его синтаксис и семантика —М.* Мир, 1985]
Berry G., Curien Р L. Sequential algorithms on concrete data structures. Report of Ecole Nationale Superience des Mines de Paris. Centre de Mathematiques Appliquees, Sophia Antipolis, 1981
Clinger W D Foundations of Actor Semantics Ph D Thesis, MIT, May, 1981. Artificial Intelligence Laboratory Report AI-TR-633, 1981.
Engeler E. Algebras and combinators. Berichte des Instituts fiir Infor- matik, Nr. 32, ETH Ziirich, 1979
Gierz G., Hofmann К N., Keimel К, Lawson J. D., Mislove M., Scott D. S A compendium of Continuous Lattices. Springer-Verlag, 1980.
Gordon M. The Denotational Description of Programming Languages, An Introduction Springer-Verlag, 1979.
Gordon M. J., Milner A J. R., Wadsworth С. P. Edinburgh ICE. Springer-Verlag Lecture Notes in Computer Science, 78, 1979
Greibach S A. Formal languages: origins and directions. Annals of the History of Computing, 3, 1981, p. 14—41
Kahn G, Plotkin G. Domaines Concretes. Rapport IRIA-LABORIA, No 336, 1978.
Longo G. Set-theoretical models of lambda-calculus: theories, expansions, isomorphisms. Preprint, Pisa, 1982.
Meyer A. R. What is a model of the lambda calculus? Expanded version. Preprint, MIT, 1981.
Nielsen M, Plotkin G, Winskel G. Petri nets, event structures and domains. Theoretical Computer Science, 13, 1981, p 85—108
Plotkin G D. A set-theoretical definition of application. Memorandum MIP-R-95, School of Artificial Intelligence, University of Edinburgh, 1972.
Plotkin G. D. A powerdomain construction SIAM Journal on Computing 5, 1976, p. 452—487.
Plotkin G. D. The category of complete partial orders: a tool for making meanings. In: Proc. Summer School on Foundations of Artificial Intelligence and Computer Science. Instituto di Scienze dell’Informazione, Uni- versita de Pisa, June 1978.
Rabin M. O., Scott D. S. Finite automata and their decision problems. IBM Journal Research and Development, 3, 1959, p. 114—125.
Reynolds J. C. On the interpretation of Scott’s domains. Symposia Ma- thematica, 15, 1975, p. 123—135.
Scott D. S. Continuous lattices. Springer Lecture Notes in Mathematics, 274, 1972, p. 97—136.
Scott D. S. Data types as lattices. SIAM Journal on Computing, 5, 1976, p. 522—587.
Scott D. S. Lambda calculus: some models, some philosophy. The Kleene Symposium. Barwise J. et al. (eds.), Studies in Logic 101, North Holland, 1980, p. 381—421.
Scott D. S. Relating theories of the X-calculus. To H. B. Curry: Essays on ' Combinatory Logic, Lambda Calculus and Formalism. Seldin J. P. and Hindley J. R. (eds.), Academic Press, 1980, p. 403—450.
Scott D. S Lectures on a mathematical theory of computations. Oxford University Computing Laboratory Technical Monograph PRG-19, 1981.
Scott D. S. Some ordered sets in computer science. In: Ordered sets. I. Rival (ed), D. Reidel Publishing Company, 1982, p. 677—718.
Smyth M. Effectively given domains. Theoretical Computer Science, 5, 1977, p. 257—274.
Smyth M. Power domains. Journal of Computer and System Science, 5, 1978, p. 257—274.
Smyth M, Plotkin G. D. The category-theoretic solution of recursive domain equations. SIAM Journal on Computing, 1982, to appear. (An extended abstract is in: IEEE 18th Annual Symposium on Foundations of Computer Science, 1977, p. 13—17.)
Stoy J. E. Denotational semantics: The Scott—Strachey Approach to Programming Language Theory. M. I. T. Press, Cambridge, Mass., 1977.
Tennent R. D. Principles of Programming Languages. Prentice-Hall, 1981.
Wadsworth C The relation between computational and denotational properties for Scott’s Doo-models of the lambda-calculus. SIAM Journal of Computing, 5, 1977, p. 488—521.
Winskel G. Events in Computation. Ph. D. thesis, University of Edinburgh, 1980.
Работы, вышедшие на русском языке
Ершов Ю. Л. Вычислимые функционалы конечных типов. Алгебра и логика, 1972, т. 1L с. 367—437.
Ершов Ю. Л. Теория A-пространств. Алгебра и логика, 1973, т. 12, с. 369—416.
КОМБИНАТОРЫ И ЛЯМБДА-ИСЧИСЛЕНИЕ. КРАТКИЙ ОБЗОР1)
ДЖ. р. ХИНДЛИ
Резюме. В статье кратко изложены основные понятия комбинаторной логики и лямбда-исчисления. Рассматриваются как типовые, так и бестипо- вые системы.
0. ВВЕДЕНИЕ
Комбинаторную логику и лямбда-исчисление можно рассматривать как языки программирования, хотя они были созданы в 20-х годах нашего века в период философских исследований в области оснований математики.
Их главная особенность заключается в том, что они являются языками высших порядков, т. с. в них имеются средства описания операторов, входные и выходные значения которых также могут быть операторами. Кроме того, они основаны не на концепции множества, как многие другие математические языки, а на понятии функции или оператора.
Лямбда-исчисление (или, точнее, лямбда-исчисления, поскольку их много) было изобретено А. Чёрчем; исторический обзор можно найти во введении к книге [2].
Комбинаторная логика была изобретена М. Шёнфинкелем (см. [9]), а затем повторно изобретена и развита X. Карри. Краткий исторический обзор приводится в [4], § 5S1.
Может показаться удивительным, что эти языки, созданные 60 лет назад, используются в современной теории программирования, но для этого есть веские основания. Современные компьютеры представляют собой настолько мощные инструменты, что идея автоматизации значительной части математического и логического интеллекта перестала быть просто мечтой и имеет уже некоторые шансы быть реализованной, по крайней мере частично. Однако, работая в этом направлении, программисты- теоретики сталкиваются с теми же вопросами, над которыми логики (особенно принадлежащие к различным школам конструктивной математики) ломают голову уже около 80 лет. Например: что такое математическое мышление и как его формализовать? Поэтому, — если, конечно, логики не совсем сбились
Hindley J R. Combinators and X-calculus, a short outline —Leet. Notes in Comp. Sci., 1986, v. 242, p. 104—122
© by Springer-Verlag, 1986
© перевод на русский язык, Д. Э. Найдич, 1991
Автор любезно прислал изменения и уточнения своей статьи, которые мы учли при подготовке русского перевода. — Прим. ред.
с пути, — их исследования могут служить по крайней мере полезным источником идей.
Эта статья представляет собой очень краткий обзор основных идей, изложенных в самой простой форме. Все несущественные детали и варианты опущены.
Более полную информацию можно найти во вводном курсе [7], и в дальнейшем ссылки вида ([7] 6.34) будут относиться к параграфам этой книги. Еще более подробная информация содержится в [1], а ранние исследования отражены в [4, 5] *).
БЕСТИПОВОЕ ЛЯМБДА-ИСЧИСЛЕНИЕ
Предварительные замечания. Мы будем рассматривать здесь лишь функции одного аргумента. В любом языке со средствами описания функций высших порядков оператор h с двумя аргументами всегда может быть представлен одноаргументным оператором h*, определяемым следующим образом. Для каждого входного значения х определим оператор hx так, что
hx-(Y) = h(x,y).
Затем определим h*, положив
h*(x) = hx.
Тогда для всех х и у
(h* (х)) (у) = hx (у)
= h (х, у).
Замену h на h* теперь часто называют заменой Карри (Currying). Но в действительности Карри ссылается при этом на Шён- финкеля [9]. Я полагаю также, что подобная замена встречалась в ряде публикаций XIX века.
Лямбда-обозначения. Арифметическое выражение вида «х2 + 3» определяет некоторую функцию, зависящую от х; Чёрч ввел для этой функции обозначение
Лх.х2 + 3.
Этой записи соответствует правило: для всех чисел а
(Лх. х2 + 3) (а) = а2 + 3.
Обозначения Чёрча оказываются полезными в том случае, когда мы имеем дело с выражениями, содержащими несколько
9 Читателю, впервые сталкивающемуся с лямбда-исчислением и комбинаторной логикой, можно порекомендовать также заключительную главу из книги [Энгелер Э. Метаматематика элементарной математики. — М.: Мир, 1987] —Прим ред
переменных: например, выражение вида «х + 2у» можно рассматривать как определение либо функции от х при постоянном у, либо функции от у при постоянном х. В лямбда-обозначениях эти две функции легко различимы: они имеют вид Хх.х + 2у и Ху.х + 2у соответственно. Мы имеем
(Хх. х + 2у) (а) = а + 2у,
(Ху. х + 2у) (а) = х + 2а.
Кроме того, если h(x, у) = х + 2у, то определенный выше оператор h* принимает вид
h* = Хх.(Ху. х + 2у).
Для всех чисел а и b имеем
h* (а) (Ь) = (Хх.(Ху.х + 2у)) (а) (Ь)
= (Ху. а + 2у) (b)
= а + 2Ь.
Лямбда-обозначения позволяют отчетливо различать оператор h* и его «зеркальный образ», которые записываются как
(Хх. (Ху. х + 2у)), (Ху. (Хх. х + 2у)).
Формально лямбда-обозначения определяются ниже. Для простоты изложения я не буду рассматривать дополнительные константы, такие, как «+» и «2», хотя используемые на практике Х-системы всегда их содержат. Однако, несмотря на это упрощение, мы увидим, что «чистые» системы без констант никоим образом не являются тривиальными.
Определение ([7] 1.1): Х-термы. Пусть имеется бесконечная последовательность переменных х, у, z, xi, уь zi, х2, уг, z2,.. . (предназначенных для обозначения произвольных операторов). Определим Х-термы следующим образом:
каждая переменная есть Х-терм;
по любым Х-термам М и N можно построить новый Х-терм (MN) (обозначающий применение, или аппликацию, оператора М к аргументу N);
по любой переменной х и любому Х-терму М можно построить новый Х-терм (Хх.М) (обозначающий функцию от х, определяемую Х-термом М).
Обозначения. Мы будем называть (MN) аппликацией, а (Хх.М) —абстракцией. (В математике аппликацию М к N обычно обозначают через M(N); то, что в Х-исчислении принято обозначение (MN),— просто историческая случайность.)
Для обозначения произвольных Х-термов мы будем использовать буквы L, М, N, Р, Q, R, S, Т.
Синтаксическое тождество. Следуя Карри, мы будем употреблять запись
M^N
для обозначения того, что термы М и N совпадают.
Скобки и повторяющиеся символы X часто будут опускаться, например:
MNPQ = (((MN) Р) Q),Xxyz. М = (Хх. (Ху. (Xz. М))).
Определение ([7] 1.10): свободные и связанные переменные. Любое вхождение переменной х в терм Хх. М называется связанным посредством Хх. Всякое вхождение переменной в терм, не являющееся связанным, называется свободным. Множество всех переменных, имеющих свободные вхождения в терм Р, обозначается через FV(P). Терм без свободных вхождений переменных называется замкнутым термом или комбинатором.
Предупреждение. Говоря о свободных и связанных переменных, мы на самом деле имеем в виду вхождения переменных. Переменная может иметь как свободные, так и связанные вхождения в один и тот же терм.
Пример. Рассмотрим терм
Р = (Xv. х) (Ху. ух (Хх. yvx)).
В этом терме левое вхождение v является связанным, а правое — свободным; два самых левых вхождения х свободные, а два других — связанные; все три вхождения у связанные. Кроме того, FV(P) = {v, х}.
Определение ([7] 1.11): подстановка. Для любых М, N и х через [N/x]M обозначается результат подстановки N вместо каждого свободного вхождения х в М и замены всех Ху в М таким образом, чтобы свободные переменные из N не стали связанными в [N/x] М. Более формально:
[N/x]x = N;
[N/x] у = у, если у ^ х;
[N/x] (PQ) = ([N/x] Р [N/x] Q);
[N/x] (Хх.Р) = Хх.Р;
[N/x] (Ху. Р) = Ху. [N/x] Р, если у ^ FV (N) или х ^ FV (Р);
[N/x] (Ху. Р) = Xz. [N/x] [z/y] Р, если у е FV(N) и х е FV (Р) (здесь z — первая переменная, не содержащаяся в FV(N)).
Примеры. Пусть М = Ху.ух.
Если N^vx, то [(vx)/x](Xy.yx) = Xy.[(vx)/x](yx) согласно (е)
— Xy.y(vx) согласно (а).
Если N = yx, то [(ух)/х] (Ху .ух) = Xz.[(yx)/x] (zx) согласно (f)
= Xz.z(yx) согласно (а).
Замечание. Если бы пункт (f) в определении 1.7 был опущен, то мы столкнулись бы со следующим нежелательным явлением. Хотя Xv.x и Ху.х обозначают один и тот же оператор (константу, чье значение всегда есть х), после подстановки v вместо х они стали бы обозначать различные операторы:
[v/x] (Ху. х) = Ху. v,[v/x] (Xv. х) = Xv. v.
Замечание: замена связанных переменных. На содержательном уровне термы, различающиеся лишь именами связанных переменных, имеют одинаковое значение. Например, термы Хх.х и Ху.у обозначают тождественный оператор. Процедура замены связанных переменных формально определяется следующим образом.
Определение ([7] 1.16): «-конверсия. Если y^FV(M), то
(а) А, (х) .М =а А,у. [у/х] М.
Если Р сводится к Q посредством конечной (быть может, пустой) последовательности преобразований вида (а), то мы говорим, что Q получается из Р заменой связанных переменных (или Р конгруэнтен Q, или Р ^-конвертируется к Q), и пишем
P^aQ.
Можно доказать, что отношение = а симметрично, т. е. если Р=д то Q=aP [7] (1.17 (с)).
Определение ([7] 1.22): 0-свертывание, 0-редукция. Тер.м вида (Xx.M)N называется ^-редексом. (Он обозначает применение оператора к входному значению.) Если 0-редекс содержится в терме Р и одно из его вхождений заменяется термом [N/x] М, то мы будем говорить, что происходит свертывание этого вхождения. Конечная (возможно, пустая) или бесконечная последовательность свертываний и замен связанных переменных называется ^-редукцией. Если такая последовательность конечна и переводит Р в Q, то мы говорим, что Р ^-редуцирует- ся к Q, и пишем Р >pQ.
Примеры. Вот несколько примеров редукций. Редекс, сворачиваемый на каждом шаге, подчеркнут. В примере (с)
редукция бесконечна, хотя редуцируемый терм при этом не изменяется.
(Хх. ((Ху. ху) u)) (Xv. v) Ор (Ху. (Xv. v) у) и
Op(Xv.v) и
(Хх.((Ху.ху) и)) (Xv. v) Ор (Хх.хи) (Xv. v)
>p(Xv.v)u
Op и.
(Xx. xx) (Xx. xx) Op (Xx. xx) (Xx. xx)
Op • • •
Определение ([7] 1.24): p-нормальная форма. Терм N, не содержащий Р-редексов, называется ^-нормальной формой или р-н. ф. Если при этом М OpN, то N называется ^-нормальной формой терма М.
Замечание. Не каждый терм имеет P-нормальную форму. Так, терм (Хх.хх) (Хх.хх) из примера (с) не имеет р-нормальной формы. Примеры (а) и (Ъ) поднимают вопрос об однозначной определенности p-нормальной формы. Следующая теорема показывает, что p-нормальная форма единственна.
Теорема Чёрча — Россера для р-редукции ([7] 1.29), Если Р ОрМ и Р OpN (см. рис. 1), то существует такой терм Т, что
МОрТ, NOpT.
' W\.
\/
\/
\/
эт
Рис. 2.
Доказательство. См. [7], приложение 1.□
Следствие ([7] 1.29.1). Если терм имеет p-к. ф., то эта н. ф. единственна по модулю =а.
Определение ([7] 1.32): p-равенство, или р-конверсия. Если Р сводится к Q конечной последовательностью р-редукций и обратных p-редукций (называемых ^-расширениями), то мы будем говорить, что Р p-конвертируется к Q, или Р p-равен Q, и писать
P=pQ.
Теорема Чёрча — Россера для р-равенства ([7] 1.35). Если Р =pQ, то существует такой терм Т, что Р >рТ и Q >рТ.
Доказательство. Утверждение выполняется по теореме Чёрча — Россера для редукции, см. рис. 2.
Следствие ([7] 1.35.3). Если Р и Q — ^-нормальные формы и Р ^ aQ, то Р не является ^-равным Q.
Следствие. Теория предиката =р непротиворечива в том смысле, что нельзя доказать равенство всех термов.
Доказательство. Термы Хх.х и Хху.ух представляют собой различные p-нормальные формы, не являющиеся а-конвертируе- мыми.□
Несколько полезных комбинаторов. Ниже приводятся некоторые наиболее часто используемые комбинаторы, их названия и редукционные свойства. (Здесь X, Y, F, G обозначают произвольные Х-термы.)
I ^Хх.х (тождественный комбинатор) : IX >р X; BsZxyz.x(yz) (композиция):BFGX >pF(GX);
С = Лху2. xzy(коммутатор):CFXY O^FYX;
К = Лху.х(образование константы): KXY >р X;
S ^Zxyz.xy(yz) (подстановка и композиция) : SFGX >pFX(GX);
W^Xxy.xyy (дублирование):WFX >pFXX.
Нумерация Чёрча. Целое число п ^ 0 часто представляется термом n-кратной композиции, который обозначается через Zn или п (обозначение хпу служит сокращением для х ( х (...(ху)...))):
п
2о=О = Лху.у:OXY >pY;
Zn^n^Zxy.xny :nXY >pXnY.
Комбинатор прибавления единицы;
о = Лиху. х (иху):on >р n + 1.
Комбинатор упорядоченной пары, или проверка на нуль ([7] 4.7):_■
D = Zxyz. z (Ку) х :DXYO >р X,
DXY (гГ+Т) >pY.
(Терм DXYZ можно ийтерпретировать как «если Z = О, то X, иначе Y».)
Комбинатор неподвижной точки ([7] 3.4):
Y - Лх. ((Лу. х (уу)) (Лу. х (уу))) : YF =р F (YF).
Если обозначить YF через X, то FX=pX, т. е. X есть неподвижная точка F.
Комбинатор примитивной рекурсии ([7] 4.10):
R = Xxyu.u(Qy)(D0X)l, где Q = Zyv.D(o(vO))(y(v0)(vl)):
RGX0=pX,
RGX (Л+Т) =p Gn(RGXn).
(Заметим, что вопреки распространенной легенде комбинатор неподвижной точки не является необходимым для определения R, хотя при желании им можно воспользоваться, см. [7] 4.11.)
Следующая теорема утверждает, что в некотором важном смысле отношения =р и >р не являются тривиальными.
Определение ([7] 4.4). Говорят, что частичная числовая функция f с к аргументами Л-определима термом М, когда
Mri]...nk >рf(nb . ..,пк), если значение f(nh ..., пк) определено, и МП]...пк не имеет р-н. ф., если f(nh . . ., пк) не определено.
Теорема ([7] 4.18). Частичная числовая функция является ^-определимой тогда и только тогда, когда она частично рекурсивна.
Следствие ([7] 5.6.3). Отношения =р и >р не являются рекурсивно разрешимыми.
БЕСТИПОВАЯ КОМБИНАТОРНАЯ ЛОГИКА
Комбинаторная логика позволяет избежать использования связанных переменных, усложняющих лямбда-исчисление. В этом параграфе лямбда-абстракции не считаются примитивными, а определяются через другие примитивы: так называемые базисные комбинаторы. Эти примитивы порождают систему, интуитивно менее понятную, чем лямбда-исчисление, однако (как мы увидим в дальнейшем) гораздо более простую в техническом отношении.
Определение (ср. [7] 2.1): CL-термы. Начнем с бесконечного списка переменных, такого же, как в лямбда-исчислении, и двух дополнительных символов К и S, называемых базисными комбинаторами. CL-термы определяются таким образом:
переменные и базисные комбинаторы суть CL-термы;
если X и Y — CL-термы, то (XY) — также CL-терм.
Обозначения. Обозначения в этом параграфе совпадают с обозначениями для лямбда-исчисления, за исключением следующих упрощений:
прописные латинские буквы (кроме К и S) обозначают произвольные CL-термы;
FV(X) обозначает теперь множество всех переменных, входящих в X, поскольку переменные не могут быть связанными;
подстановка [N/x]M означает теперь просто замену каждого х из М на N;
комбинаторы, или замкнутые термы, — это термы, не содержащие переменных;
атомами являются переменные или базисные комбинаторы.
Примеры стандартных CL-термов.
I = SKK(сокращенное обозначение для ((SK)K)),
B = S(KS)K (Т. е. ((S(KS))K)),
C^S(BBS)(KK) (Т. е. ((S((BB)S))(KK))),
W^SS(KI) (т. е. ((SS)(KI))),
0 = KI,
as SB,
п = о(аЦ^)...)).
n
Определение (ср. [7] 2.7): слабое свертывание, слабая редукция. Слабым редексом в терме U является любое вхождение терма вида KXY или вида SXYZ. Слабое свертывание — это действие, состоящее в замене слабого редекса на X и XZ(YZ) соответственно. Последовательность слабых свертываний называется слабой редукцией. Если эта последовательность конечна и переводит терм U в терм V, то говорят, что U слабо редуцируется к V, и пишут U >wV.
Пример. Для* всех термов X имеем IX >wX, поскольку IX = SKKX
>WKX(KX) (сворачиваем SKKX)
>wX (сворачиваем КХ(КХ)).
Пример. Для всех термов F, G, X hmccmBEGZ >WF(GX),
поскольку
(сворачиваем S(KS)KF) (сворачиваем KSF) (сворачиваем S(KF)GX) (сворачиваем KFX).(сворачиваем S(KS)KF) (сворачиваем KSF) (сворачиваем S(KF)GX) (сворачиваем KFX).BFGX = S(KS)KFGX >wKSF(KF)GX >wS(KF)GX >wKFX(GX) >wF(GX)
(сворачиваем S(KS)KF) (сворачиваем KSF) (сворачиваем S(KF)GX) (сворачиваем KFX).
(сворачиваем S(KS)KF) (сворачиваем KSF) (сворачиваем S(KF)GX) (сворачиваем KFX).
Упражнения. Докажите, что для всех термов F, G, X и Y (i) CFXY >wFYX, (ii) WFX >WFXX, (iii) nFX >wF<n)X.
Определение (ср. [7] 2.14): абстракция. Для каждого х и каждого терма Y построим из базисных комбинаторов и частей Y новый терм, обозначаемый через Vx.Y (в более ранних работах его также обозначали через [x].Y). Он определяется индукцией по числу символов в Y следующим образом:
V/.U =KU,если х не входит в U,
Гх.х =1,
Vx.Ux^U,если х не входит в U,
Гх.ПУ^8(Гх.и)(Гх.и), если х входит в UV и
(с) неприменимо.
Замечание. В комбинаторной логике нет связанных переменных и х вообще не входит в терм Vx.Y.
Пример.
Х*х. x(yxz) = S(Vx. х) (Л*х. yxz) по (f)
= SI(S(Vx.yx)(Vx.z)) по (b) и (f)
= SI(Sy)(Kz)по (с) и (а).
Лемма о полноте. Определение абстракции задает терм Vx.Y для всех х и всех CL-термов Y.
Доказательство. Достаточно проверить все случаи в определении.
Определение ([7] 2.17): множественная абстракция. Для всех п положим*
Гх,... хп. Y = ГХ1. (Гх2. (.. .(Гхп. Y)...)).
Пример.
Л*ух. х (yxz) = Х*у. (Vx. х (yxz))
= V^.SI(Sy) (Kz)см. предыдущий при
мер
= S(Vy.SI(Sy))(Vy. Kz) по (f) из определения X*
^8(8(Гу.81)(Гу.8у))(К№)) по (f) и (а)
= S(S(K(SI))S)(K(Kz))по (а) и (с).
0-Теорема ([7] 2.15). Комбинаторная абстракция ведет себя подобно Хх в лямбда-исчислении, т. е.
(Vx.Y)Z >w[Z/x]Y.
Доказательство проводится индукцией по числу символов в Y. Отметим роль, которую играет свертывание для S, К, I в следующих случаях.
(а) если х не входит в Y:
(Г
x.Y)Z
= (KY)Z t>w Y
= [Z/x]Y
по (а) из определения X*
т. к. х не входит в Y;
(Ь)
(V
если х. x)Z
Y = x:
IZ
по (Ь) из определения X*
(е)
если
[>w Z
= [Z/x]x;
Y = Ux и x не
входит в U:
(Cx.Ux)Z^UZ
= [Z/x](Ux)
(f) если Y = UV и предыдущие случаи неприменимы: (Cx.UV)Z = 8(Гх.и)(Гх.У)г
>w(C'x. U)Z)((Vx.V) Z) сворачиваем S
Ow([Z/x]U) ([Z/x]V) по индукционной гипотезе [Z/x](UV).
Определение ([7] 2.8). Слабой нормальной формой, или w-н. ф., называется любой CL-терм, не содержащий слабых редексов. Слабой нормальной формой терма X является любая такая w-н. ф. Y, что X >wY.
Замечание. Не каждый CL-терм имеет w-н. ф. Например, у SII(SII) се нет. Однако, как показывает следующая теорема, терм не может иметь более одной w-н. ф.
Теорема Чёрча — Россера для слабой редукции ([7]
. Если U OwX и U >wY, то существует такой терм Z, что
X >wZ, Y>wZ.
Доказательство. См. [5], § 11В, теоремы 2—3.□
Следствие ([7] 2.13.1). Если CL-терм имеет слабую нормальную форму, то она единственна.
Определение ([7] 2.22): слабое равенство. Если X переводится в Y конечной последовательностью слабых свертываний и обратных свертываний (расширений), толоворят, что X слабо равен Y, и пишут X = WY.
Теорема Чёрча — Россера для слабого равенства ([7]
. Если X = WY, то существует такой терм Z, что X >wZ и Y >wZ.
Следствие ([7] 2.24.3). Если X и Y — различные w-h. ф., то X=# WY. Следовательно, теория предиката =w непротиворечива в том смысле, что не все термы являются слабо равными.
Замечание, (а) Все Х-термы из списка полезных комбинаторов (см. конец § 1) также могут быть определены в комбинаторной логике с использованием X* вместо X.
Все числовые частично рекурсивные функции комбинаторно определимы, т. е. могут быть определены с помощью некоторого CL-терма X по аналогии с Х-определимостью (см. конец § 1).
Как следствие (Ь), можно показать, что отношения >w и =w рекурсивно неразрешимы.
Предупреждение. Все приведенные выше результаты показывают, что комбинаторная логика CL во многом аналогична лямбда-исчислению. Однако эта аналогия вовсе не является полной. Существует одно важное свойство, которым обладает X, но не обладает CL, а именно свойство, обозначенное Карри через (£):
(УX = Y=>Zx.X = Zx.Y.
Для ХР-равенства (£), очевидно, истинно, поскольку любые свертывания или расширения, которые можно выполнить в терме X, можно выполнить также и в Хх.Х. Но для CL-термов и слабого равенства аналогом (£) является утверждение
(g)CLX =w Y => Гх. X =w Гх. Y,
которое в общем случае ложно. В качестве упражнения покажите, что оно будет ложным, когда
Х = Кхх, Y = x.
ТИПОВОЕ ЛЯМБДА-ИСЧИСЛЕНИЕ
Типовое лямбда-исчисление необходимо потому, что (i) функция не является полностью определенной, пока не указаны ее область определения (множество всех допустимых входных данных) и область значений (множество всех возможных выходов), а также потому, что (ii) структура терма М, представляющего функцию, должна нести информацию о се области определения и области значений.
Для того чтобы реализовать это на практике, начнем с определения некоторых выражений, которые называются типами и предназначены для обозначения множеств.
Определение ([7] 13.1): типы. Выберем некоторые символы и назовем их элементарными типами. Например, пусть О или N обозначает множество всех натуральных чисел, а 1 обозначает множество истинностных значений {истина, ложь}. Из любых двух типов аир можно построить новый тип
(а -> р), обозначающий множество функций, которые определены на а и принимают значения из р.
Пример. Если 0 и 1—элементарные типы, то
((0-^.0)-*((1 ^0)-^ 1))
также будет типом.
Обозначения. Греческими буквами мы будем обозначать произвольные типы. Скобки будем опускать таким образом, что, например,
(Это соглашение противоположно тому, которое принято для записи термов! Для типов опущенные скобки при восстановлении ассоциируются вправо, тогда как для термов они ассоциируются влево.)
Определение ([7] 13.3): типовые Х-термы. Для каждого типа а рассмотрим бесконечное множество типовых переменных ха, уа, ... . При этом
каждая типовая переменная есть типовый терм;
если Ма^р и Na — типовые термы, то (Mfa^P)Na)p— также типовый терм;
если ха — типовая переменная, а М$— типовый терм, то (кха • М9)1"-*^ — также типовый терм. Верхний индекс справа от терма называется типом терма.
Примеры. Для любых типов а, р, у следующие выражения являются типовыми Х-термами (в записи которых опущены некоторые внутренние индексы типа). Вслед за каждым термом в виде дерева показана его конструкция.
Ia^Uxa.xa)(a^a);
(Zxa.xT^a)’
Ka,g = (^x .у1 .X ) р ; ха
Sa, Р> Y(Лх“^Vya^Pza . xz(yz))(^^V)-»(«^PHa^ у
xa^P->vz« ya^Pza
((xz)(yz))v*
(Zz. xz(yz))a^v(^yz.xz(yz))(a^₽)^v
^XVZ.X7(y7))(a^YW(a^,->U^
Упражнения. Изобразите в виде деревьев конструкции следующих типовых Х-термов:
Ва у,Y (Zxa^₽yY^V.хЫ)^^^Y^₽;
Ca>p,Y = (Axa^vy^a.xzy)(a^Y,^a^v;
Wa, p - Цх“^₽у“. хуу)<™^°^
Замечание. Подстановка [N/x]M определяется для типовых термов точно так же, как и для бестиповых, за исключением того, что N и х должны теперь иметь один и тот же тип; в том случае, если N и х имеют разные типы, подстановка [N/x]M не определена.
Замечание. Определения ^-редукции и ^-равенства также аналогичны соответствующим понятиям для бестиповых термов (см. [7] 13.9—10).
Теоремы Чёрча — Россера и другие основные свойства редукции бестиповых термов остаются справедливыми и для типовых термов (ср. [7] 13.11). Кроме того, справедлива следующая важная теорема.
Теорема о сильной нормализации ([7] 13.12, [7] приложение 2). В системе типовых Х-термов все ^-редукции конечны.
Следствие (теорема о нормализации). Каждый типо- вый Х-терм имеет ^-нормальную форму.
Следствие. В системе типовых Х-термов отношения =р и >р рекурсивно разрешимы.
ТИПОВАЯ КОМБИНАТОРНАЯ ЛОГИКА
Типы и обозначения типов остаются такими же, как для типового лямбда-исчисления. Термы и другие понятия определяются следующим образом.
Определение ([7]> 13.16): типовые CL-термы. Для каждого типа а рассмотрим бесконечную последовательность типовых переменных ха, уа, .. . . Для любых а, р и у рассмотрим два различных типовых базисных комбинатора j^a-*?-»^ При этом
типовые переменные или базисные комбинаторы являются типовыми термами;,
если Х(а->Р) и Уа — типовые термы, то (Х^^У0)^ — типа- вый терм.
Верхний индекс, расположенный справа от терма, называется типом терма.
Определение ([7] 13.18): слабая типовая редукция. Это понятие определяется точно так же, как и в § 2, однако с использованием свертываний вида
(К“->^ахау^а >w х»,
y«^z«)y >w
((х
Замечание. Типы базисных комбинаторов выбраны так, чтобы обе части этих свертываний имели один и тот же тип.
Определение: абстракция. Для каждой переменной ха и каждого типового CL-терма Yp мы определяем терм Vxa.¥& точно так же, как в определении Vx.Y из § 2.
Лемма, (а) Терм Vxa.Y определен для всех х\ Yp;
Vxa.Yp имеет тип a > Р;
(Гха.¥р)2а >w[z7xa]Yp.
Замечание. Теоремы Чёрча — Россера и другие основные результаты остаются справедливыми и для типовой редукции (ср. [7] 2.7—2.24). Справедливы также следующие утверждения.
Теорема о сильной нормализации ([7] 13.22, [7] приложение 2). Для типовых CL-термов каждая слабая редукция является конечной.
Следствие (теорема о нормализации). Каждый типовой CL-терм имеет слабую нормальную форму.
Следствие. Для типовых CL-термов отношения слабой редукции и слабого равенства рекурсивно разрешимы.
Система присваивания типов — это множество правил присваивания бестиповым термам, но при этом присваиваются не типы, которые однозначно задавали бы область определения и область значений, а типовые схемы, т. е. подобные типам выражения, содержащие параметры и показывающие, как область значений соотносится с областью определения.
Определение ([7] 14.1): типовые схемы. Рассмотрим бесконечное множество типовых переменных а, Ь, с, . . . , предназначенных для обозначения произвольных множеств. Назовем элементарные типы из определения 3.1 типовыми константами. Тогда
каждая типовая переменная или типовая константа есть типовая схема;
если аир — типовые схемы, то и а р — типовая схема.
Примеры; (0 а) 0, а b а.
Обозначения. Для обозначения типовых схем приняты те же соглашения, что и для типов. (Каждый тип также является и типовой схемой.)
Предупреждение. Греческие буквы а и р не являются типовыми переменными, а выражение (а~>Р) не является схемой типа. Это просто выражение метаязыка, которое обозначает некоторую типовую схему, если греческие буквы интерпретируются как некоторые конкретные схемы типов.
Определение. CL-те^жы определяются точно так же, как в § 2. (Типов они не имеют.) Переменные из этого определения мы будем теперь называть переменными-термами, чтобы отличать их от типовых переменных. Комбинатором будем называть любой терм, не содержащий переменных-термов.
Определение ([7] 14.4). Формулой присваивания типа называется любое выражение вида X : а, где X — терм (называемый субъектом формулы), а а — типовая схема (называемая предикатом).
Интерпретация. Если аир обозначают множества, то формула Х:(а-^р) означает, что X представляет собой оператор, который сопоставляет каждому элементу Y из а не более одного элемента XY из р. Заметим, что значение XY может быть не определено для некоторых Y из а и определено для некоторых Y, не принадлежащих а.
Обозначение. В [7] вместо X : а использовалось обозначение «Хеа».
Определение ([7] 14.5). Система присваивания типов ТАС— это формальная система со следующими схемами аксиом и правилом вывода:
схемы аксиом*. К:а—>р—>а,
S : (а —> р —> у) —> (а —> р) —> а —> у;
правило (-^е), или правило удаления стрелки:
Х:а->Р ¥:а
XY : р '
Обозначения. Асиомой является любой частный случай схемы аксиом, например
К0->(1 —>а)—>0.
Правило (->■ е) означает, что из X :а^р и Y:a можно вывести XY : р. Запись
X : а
означает, что формулу X : а можно вывести из аксиом при помощи правила вывода. Запись вида
X] • б], . . ., xn . dpi । X . (х
означает, что X : а можно вывести при помощи правила вывода из аксиом и дополнительных гипотез xi : бь . . ., хп : 6П, где X], . .., Хп — различные переменные, входящие в X.
Базисом переменных-субъектов называется любое множество формул вида Xi : di, . . ., хп : 6П, где все хь . . ., хп — различные переменные.
Пример. Исходя из данных схем аксиом для К и S, для любого а получаем
Н SKK I а—>а.
Вот вывод этой формулы (здесь р = а-^а):
S : (а > Р > а) > (а > Р) а > а К-« >P>cz
SK : (а > Р) а > а К • а а —> а
8КК:а->а *
Замечание. Форма этого вывода обусловлена структурой терма SKK. Если а не содержит типовых переменных, то вывод в целом в точности соответствует типовому терму
((д(а->р->а)->(а->р)->а->а|^а->р->а)а
(Если а содержит переменные, то соответствующего типового терма не существует, поскольку типовые схемы, содержащие переменные, не являются типами.)
Определение ([7] 14.28). Комбинатор X называется стратифицированным, если существует такая типовая схема а, что НX : а. Терм X, содержащий переменные хь ... , хп (и не содержащий других переменных), называется стратифицированным, если существуют такие а и 6ь .. ., dn, что
Xi : бь ..., xn : бп h- X : а.
Упражнения. Пусть даны К и S, а также их схемы аксиом. Покажите, что если в = S(KS)K и С = S(BBS) (КК), то
Н В : (а->Р)>(у->а)->у>Р;
Н С : (а-> р-> у)-^Р^а-> у;
II, КК, SS — стратифицированные комбинаторы;
терм Vx. хх не является стратифицированным.
Теорема о типах и абстракции ([7] 14.19). Пусть хь ... ..., Хп, х — переменные из X. Если
X!: бь ..., хп : бп, х : б н У : р, то
Xj : б15 ..., хп : бп Н (Гх.У): а->р.
Теорема редукции субъекта ([7] 14.24). Если В—базис переменных-субъектов, то
В I— Xia, X £>w X => В |— X' I а.
Теорема о сильной нормализации ([7]. 14.42). Если терм X является стратифицированным, то все слабые редукции, начинающиеся с X, конечны.
Следствие. Каждый стратифицированный терм имеет слабую нормальную форму.
Определение ([7] 14.31). Главной типовой схемой (г. т. с.) стратифицированного комбинатора X называется такая типовая схема а, что
НХ:а;
если Н X i Р, то р является подстановочным примером а.
Пример. Главной типовой схемой комбинатора SKK является схема а-^а. (Другая г. т. с. — b-^b.)
Первая теорема о главной типовой схеме. Существует алгоритм, который для каждого комбинатора X определяет, является ли X стратифицированным, и, если это действительно так, выдает его г. т. с.
Доказательство. См. [6], теорема 1, или [3], теорема 1. □ 5.14.1. Следствие ([7] 14.40, 14.41).
Каждый стратифицированный комбинатор имеет г. т. с.
Множество всех стратифицированных термов рекурсивно разрешимо.
Замечание ([7] 14.46). Если взять вывод в системе ТАС1 например вывод для SKK из 5.5, и удалить из него все типовые схемы, мы получим дерево
S КSK кSKK ’которое является деревом построения SKK. Напротив, если уда-лить из вывода все термы, мы получим дерево типовых схем(а ^Р ^а) >(а >Р) >а >а а^Р>а (р = а-^а)(а>р)>а>аа^а^а
а> а
Это дерево является выводом в интуиционистской импликатив- ной логике. Типовые схемы стратифицированных комбинаторов в точности соответствуют доказуемым формулам интуиционистской импликативной логики.
6. ПРИСВАИВАНИЕ ТИПОВ В ЛЯМБДА-ИСЧИСЛЕНИИ
Определение ([7] 15.1 —15.6). Система.присваивания типов ТАХ подобна генценовской системе натурального вывода в логике (см. [8]). В ней нет аксиом, а есть три следующих правила:
На): М : р M=aN
N : Р;’
(-^е), правило удаления стрелки: М *. a^p Nia (MN): Р ’ (->/), правило введения стрелки:
[х : а]
М : р
(Лх.М):(а^р)
Пояснение. Правило (-Н) означает, что если мы уже построили вывод формулы М : р из х : а и, возможно, множества В других гипотез, не включающих переменную х, то мы можем вывести только из В формулу (Хх.М) : (а-^р). (Использование правила (-^i) не допускается, если В содержит х.)
Кроме того, после применения правила (-^i) гипотеза х : а заключается в скобки, где бы она ни находилась в дереве вывода выше формулы М : р. Это делается для того, чтобы показать, что она больше не считается гипотезой. В этом случае говорят, что гипотеза отменяется, или устраняется (ср. [7] 15.1).
Таким образом, дерево вывода растет в двух направлениях: путем добавления новых заключений снизу и путем добавления скобок к гипотезам.
Вывод, в котором устранены все гипотезы, называется доказательством.
Определение: выводимость. Если существует вывод формулы х : а, в котором устранены все гипотезы, то мы пишем
I— X : а.
Если хь ... , Хп — различные переменные и существует вывод формулы х : а, не содержащий неустраненных гипотез, за исключением тех, которые входят в множество {xi : Sb .. ., xn : 6n}, то мы пишем
Xi : бь ..., хп : бп н х : а.
Пример. Пусть Sx = Xxyz.xz (yz) и а, р, у — произвольные типовые схемы. Приведем доказательство формулы
Sx: (a->P->v)->(«-*P)-*a-> Y-
Заметим, что в начале вывода все гипотезы являются неустра- ненными; их устранение происходит позднее (ср. связывание переменных посредством л; фактически этот вывод совпадает с деревом построения Sa, p,Y из § 3):
[х:«->р>у] [z : a][y:a_>p] [z: a]
-(-> e) -(-^ e) xz. p-> уyz : p
(e)
xz (yz): у
(—* 0 (устраняются обе гипотезы z : a) Xz. xz (yz): a—» у
""Z7(“* О(устраняется у : a > P)
Xyz. xz(yz): (a ^ p) > a > у (~*0 (устраняется Xxyz.xz(yz): (a-> p-> у) > (a-> P) ^ a-> у x:a->p^y)-
Пример. Пусть Кх = ^ху.х. Приведем доказательство формулы
Кх • « -> Р -> а,
в котором гипотеза у : р устраняется, хотя она фактически не использовалась (это действие разрешено и называется фиктивным устранением гипотезы):
[х : а]
(—> i)(фиктивно устраняется у : р)
(Лу.х): р^а
(^ 0 (устраняется х : а)
(Лху.х): а->р^а.
Пример. Следующее дерево не является выводом, поскольку при применении правила (-^i), устраняющего гипотезу х : а, среди неустраненных гипотез имеется формула, содержащая х:
х : а-т>Р [х : а]
-(-^ е)
хх: р
(_> i) (устраняется х : а).
(Лх.хх) :р
Замечание. Теоремы о системе ТАс, сформулированные в конце предыдущего параграфа, справедливы и для ТАХ. Более полную информацию о системе ТАХ можно найти в [7], гл. 15.
ЛИТЕРАТУРА
Barendregt Н Р. The Lambda Calculus, 2nd edition. North-Holland Co., 1984 [Имеется перевод: Барендрегт X. Ламбда-исчисление. — М.: Мир, 1985.]
Church A. The calculi of lambda-conversion. Princeton University Press, 1941; reprinted 1963 by University Microfilms Inc., Ann Arbor, Michigan, U.S.A.
Curry H. B. Modified basic functionality in combinatory logic. Dialectica, 23, 1969, p. 83—92
Curry H. B, Feys R. Combinatory Logic, vol. I. North-Holland Co., 1958.
Curry H. B., Hindley J. R., Seldin J. P. Combinatory logic, vol. II. North- Holland Co., 1972..
Hindley J. R. The principal type-scheme of an object in combinatory logic. Trans. American Math. Soc., 146, 1969, p. 29—60.
Hindley J. R., Seldin J. P. Introduction to combinators and %-calculus. Cambridge University Press, 1986.
Prawitz D. Natural deduction. Almqvist and Wiksell, Stockholm, 1965.
Schonfinkel M. Ober die Bausteine der mathematischen Logik. Math. Anna- len, 92, 1924, s. 305—316. English transl. in From Frege to Godel, ed. by J. van Heijenoort, publ. Harvard Univ. Press, 1967, p. 355—366.
ВВЕДЕНИЕ В СУПЕРКОМБИНАТОРЫ
ДЛЯ ВПОЛНЕ ЗАДЕРЖАННЫХ ВЫЧИСЛЕНИЙ 9
С. Л. ПЕЙТОН ДЖОУНЗ
Резюме. Редукция графов возникла как мощная модель реализации «ленивых» функциональных языков, особенно на параллельных компьютерах Суперкомбинаторы и вполне задержанные вычисления являются двумя из важнейших методов, пригодных для эффективной реализации редукции графов, и цель этой статьи заключается в том, чтобы предложить доступное введение в эти методы.
ВВЕДЕНИЕ
Мы покажем, как преобразовать функциональную программу (заданную в виде лямбда-выражения) в некоторую форму, которая гораздо лучше подходит для эффективного исполнения как на последовательных, так и на параллельных компьютерах. Это преобразование проводится в два этапа. Во-первых, мы введем суперкомбинаторы и покажем, как их можно получать и вычислять. Во-вторых, мы опишем оптимизационное преобразование для комбинаторов, называемое полной задержкой (full laziness). Обе эти идеи принадлежат Хьюджу [8], а полное исследование можно найти в [16].
Сделаем два принципиальных предположения:
Программа написана на расширенном языке лямбда-исчисления. Этот язык описан в 1.1.
Программа будет выполняться с помощью редукции графов, краткое описание которой приводится в 1.2.
После этих предварительных сведений в § 2 говорится о необходимости 'суперкомбинаторов, в § 3 показывается, как их можно получать, а в § 4 обсуждается их реализация для исполнения на ЭВМ. Затем в § 5 вводится понятие полной задержки, а в § 6 показывается, почему оптимизацию посредством полной задержки нельзя применять неограниченно.
!) Peyton Jones S. L. An introduction to fully-lazy supercombinators.— Leet Notes in Comp. Sei., 1986, v. 242, p. 176—208.
© by Shpringer-Verlag, 1986
© перевод на русский язык, В. М. Антимиров, 1991
Исходный язык
Вместо того чтобы описывать непосредственную реализацию функционального языка высокого уровня, мы будем использовать промежуточный язык — лямбда-нотацию, дополненную возможностью явного описания взаимной рекурсии (мы предполагаем знакомство читателя с лямбда-исчислением: вводный материал можно найти в [17] или в [16]). На рис. 1 показан абстрактный синтаксис этого языка.
выражение: := (константа)
Константы
(идентификатор)
Идентификато
(выражение) (выражение)
ры Апплика
ции
Х(идентификатор). (выражение)
Х-аб-
letrec (идентификатор) = (выражение)
стракции Взаимно рекурсивные определения
(идентификатор) = (выражение) in выражение
Рис. 1. Синтаксис лямбда-выражения (в БНФ *))
Все функции представлены в форме Карри), поэтому можно считать, что все функции имеют единственный аргумент. Рекурсия представляется явно, с помощью конструкции letrec, а не Y-комбинатора. Это позволяет алгоритму компиляции обрабатывать рекурсию более прямым способом. Мы также предполагаем наличие встроенных констант (или дельта-правил), представляющих арифметические и логические значения и операции.
нормальная форма Бэкуса. —X D -> D представляется лямб- , хп))...), имеющим тип D-*нормальная форма Бэкуса. —X D -> D представляется лямб- , хп))...), имеющим тип D-**) БНФ—это форма Бэкуса — Наура, или Прим. ред.
нормальная форма Бэкуса. —
X D -> D представляется лямб- , хп))...), имеющим тип D-*
нормальная форма Бэкуса. —
X D -> D представляется лямб- , хп))...), имеющим тип D-*
Редукция графов
Дадим краткое описание редукции графов. Рассмотрим функциональную программу
(Xx.AND х x)(NOT TRUE).
Представим эту программу деревом ее грамматического разбора
0 х
AND X
где знак @ стоит на месте функциональной аппликации. Отметим, что приведение к форме Карри отражено в поддереве для (AND х х).
Это дерево содержит два так называемых редуцируемых выражения (или редекса), которые состоят из применения (аппликации) функции к своему аргументу (аргументам): применение NOT к TRUE и применение Хх-абстракции к (NOT TRUE). Чтобы применить Хх-абстракцию к ее аргументу (NOT TRUE), мы заменяем верхний узел @ некоторой конкретизацией тела ix-абстракции, в которой вместо каждого вхождения х подставляется указатель на аргумент:
/ \
AND @
/\
NOT TRUE
Заметим, что дерево превратилось в граф. Теперь мы можем применить NOT к его аргументу TRUE, получив
Наконец, выполнив операцию AND, получим
FALSE.
Каждый из выполненных шагов вычисления называется редукцией. Этот простой пример показывает, что
Исполнение функциональной программы заключается в вычислении некоторого выражения.
(н) Функциональная программа допускает естественное представление в виде дерева (или, в более общем случае, графа).
Вычисление сводится к последовательности простых шагов, называемых редукциями, которые заключаются в применении функции к некоторым аргументам (отсюда термин редук» ция графов). Каждая редукция является локальным преобразованием графа, которое заменяет редекс результатом применения функции к своему аргументу (аргументам). При этом корень редекса заменяется результатом.
Лямбда-абстракция применяется к своему аргументу путем создания нового наполнения (конкретизации) своего тела, в котором вместо каждого свободного вхождения формального параметра подставляется указатель на этот аргумент.
Вычисление завершается тогда, когда больше нет редуцируемых выражений. При этом говорят, что выражение имеет нормальную форму.
Порядок редуцирования редексов не влияет на ответ. Оказывается, что порядок редукций может влиять на остано- вочность процесса, однако некоторый конкретный порядок, называемый нормальным, гарантирует приведение к нормальной форме, если эту форму можно получить при каком-либо порядке редукций.
Редукции можно без опасений применять одновременно, так как они не мешают друг другу. Например, первые две редукции в приведенном примере можно выполнить одновременно.
2. РЕАЛИЗАЦИЯ ЛЯМБДА-ИСЧИСЛЕНИЯ
С ПОМОЩЬЮ РЕДУКЦИИ ГРАФОВ
Применение лямбда-абстракций к своим аргументам (т. е. |3-редукция) играет главную роль в вычислительных затратах при исполнении функциональных программ, и наша цель состоит в том, чтобы показать, как сделать это достаточно эффективно.
Вот наша отправная точка:
для применения лямбда-абстракции к некоторому аргументу строится новая конкретизация тела этой абстракции: вместо каждого свободного вхождения формального параметра подставляется указатель на этот аргумент; затем результирующий граф (его корень) замещает исходный узел аппликации.
Простейший способ реализации этого правила заключается в том, чтобы выполнить обход тела лямбда-абстракции и построить его новую копию, подставляя указатель на аргумент вместо каждого свободного вхождения формального параметра. Тело абстракции рассматривается как «шаблон» и не изменяется в результате этой операции, которая называется наполнением. Однако выполнение 0-редукции таким способом довольно неэффективно по следующим причинам:
в каждом узле шаблона алгоритм обхода должен выполнить разбор случаев по типам этого узла;
в каждом узле, являющемся переменной, алгоритм обхода должен проверить, является ли этот узел формальным параметром; аналогичную проверку приходится выполнять в лямбда-узле;
будут строиться новые конкретизации выражений, не содержащих свободных вхождений формальных параметров, в то время как они благополучно могли бы быть разделенными (см. § 5).
Более эффективным способом является компиляция, сопоставляющая каждому лямбда-телу фиксированную последовательность команд, при выполнении которой строится конкретизация этого лямбда-тела. В этом случае операция наполнения лямбда-тела сводится к выполнению ассоциированной с ним последовательности команд.
Такую последовательность команд компилятор может построить заранее; она неявно содержит знания о форме лямбда- тела и о местах вхождения формальных параметров. Следовательно, можно ожидать, что скомпилированный код будет выполняться гораздо быстрее, чем алгоритм обхода дерева (по тем же причинам, по которым скомпилированный код выполняется быстрее интерпретированного кода в обычных языках). Все проверки, которые производит алгоритм обхода дерева, заранее выполняются компилятором. Более того, оказывается, что компиляция создает много новых возможностей оптимизации, что позволяет существенно повысить эффективность.
К сожалению, не все лямбда-абстракции поддаются такой компиляции. Рассмотрим, например, лямбда-абстракцию
Хх.(Ху. —у х).
Когда мы применяем Хх-абстракцию к некоторому аргументу, например 3, мы наполняем ее тело, создавая тем самым новую лямбда-абстракцию (Ху.—уЗ). К тому же каждое применение Хх-абстракции к различным аргументам создает новые и различные Ху-абстракции, тем самым лишая нас надежды
скомпилировать единственный фиксированный код для каждой лямбда-абстракции.
Проблема заключается в том, что х свободно входит в тело Ху-абстракции, и поэтому мы вынуждены строить новое наполнение Ху-абстракции каждый раз, когда применение Хх-абстрак- ции связывает х с новым значением. В случае лямбда-абстракций, не содержащих свободных переменных, трудностей не возникает, поэтому для них можно компилировать код описанным выше способом.
Один из путей решения указанной проблемы — обеспечить последовательности команд доступ к значениям свободных переменных, параметризуя тем самым эту последовательность команд значениями свободных переменных. Этот подход приводит нас к машине SECD (см. [4], [14]), в которой код лямбда-абстракции имеет доступ к среде, содержащей значения всех свободных переменных, что позволяет получить единственную последовательность команд для каждой лямбда-абстракции. По этому пути следуют также все языки с блочной структурой, в которых значения свободных переменных находятся посредством доступа к соответствующей области активации стека.
В этой статье, однако, мы рассмотрим совершенно другой метод, который называется суперкомбинаторной редукцией графов и не требует добавления среды к модели редукции графов. Идея состоит в трансформации программы в эквивалентную ей программу, в которой каждая лямбда-абстракция поддается компиляции. Мы подробно опишем эту трансформацию, но недостаток места не позволит нам обсудить последующий процесс компиляции (см., однако, 4.1).
Решение проблемы свободных переменных
Здесь мы наметим метод решения проблемы свободных переменных. Воспользуемся модифицированной формой р-редук- ции, в рамках которой можно эффективно выполнять несколько p-редукций одновременно.
Рассмотрим наш текущий пример
Хх.Ху. —у х.
Предположим, что мы применяем это выражение к двум аргументам:
(Хх.Ху. —у х)3 4.
Лямбда-редукция выполнялась так:
(Хх.Ху. —у х) 3 4
(Ху.-у 3)4
->—4 3.
Однако ничто не мешает нам выполнить Хх-редукцию и Ху-редукцию одновременно:
(Хх.Ху. —у х) 3 4
—4 3.
Эта «многоаргументная» редукция строит наполнение тела (—у х), подставляя 3 вместо свободных вхождений х и 4 вместо свободных вхождений у. Сделаем два принципиальных замечания:
) За счет одновременного выполнения редукции мы многого добиваемся. Во-первых, при этом строится меньше промежуточных структур, так как не строится промежуточный результат Хх-редукции. Во-вторых (и это самое важное), не возникает трудностей, связанных со свободным вхождением в Ху-абстракцию.
) При одновременном выполнении редукций мы ничего не теряем. Результатом выполнения одной только Хх-редукции является Ху-абстракция, и с этой Ху-абстракцией ничего нельзя сделать до тех пор, пока ей не будет задан другой аргумент (предполагается, что мы выполняем редукции в нормальном порядке).
Следовательно, можно подождать появления обоих аргументов, а затем выполнить обе редукции одновременно. Это допустимо даже в том случае, если применение Хх-абстракции к одному аргументу используется-в нескольких местах.
1.1. Суперкомбинаторы
Какие лямбда-абстракции соответствуют такой многоаргументной редукции? Это лямбда-абстракции вида (ХхьХх2 ... ... Ххп.Е). Дадим следующее определение.
Определение. Суперкомбинатором $5 арности п называется лямбда-выражение вида
Хх^Ххз.-.Ххп.Е ,
где Е не является лямбда-абстракцией (это гарантирует, что Xi ... хп соответствуют всем «ведущим лямбдам» и
) $S не содержит свободных переменных;
) все лямбда-абстракции внутри Е являются суперкомбинаторами;
) п ^ 0 (т. е. может не быть ни одной лямбды).
Суперкомбинаторный редекс строится как аппликация суперкомбинатора к п аргументам, где п— его арность. Суперкомбинаторная редукция заменяет суперкомбинаторный редекс на наполнение тела суперкомбинатора этими аргументами, подставленными вместо свободных вхождений соответствующих формальных параметров.
Например, выражения
3
(+2 5)
Хх.х
Хх.+х 1
Хх. +х х
Хх.Ху. -^-у х
МЛ(Л,х.+х х)
являются суперкомбинаторами, а следующие выражения — нет:
Хх.у(у входит свободно)
Ху.—у х(х входит свободно)
Xf.f(Xx.f х 2) (внутренняя Х-абстракция не является суперкомбинатором, так как f входит в нее свободно)
1.1. Суперкомбинаторы ненулевой арности
Суперкомбинаторы ненулевой арности (т. е. имеющие впереди по крайней мере одну лямбду) важны потому, что они будут нашими единицами компиляции. Поскольку они не имеют свободных переменных (условие (i)), для них можно скомпилировать фиксированную последовательность команд. Кроме того, условие (ii) гарантирует, что ни одна лямбда-абстракция в теле суперкомбинатора не содержит свободных переменных и, следовательно, не требует копирования при наполнении тела суперкомбинатора.
Суперкомбинатор ненулевой арности в какой-то степени аналогичен функциям языка Паскаль, которые принимают несколько параметров (значений), не ссылаются на глобальные переменные и не имеют побочных эффектов.
1.2. Супёркомбинаторы нулевой арности и КАФы
Суперкомбинатор нулевой арности (то есть не имеющий впереди ни одной.лямбды) является просто константным выражением (вспомним, что он не содержит свободных переменных). Такие суперкомбинаторы часто называют константными аппли- кативными формами, или КАФами. Например, выражения
34-4 54-3
являются КАФами. Последний пример показывает, что КАФы могут быть и функциями.
Поскольку КАФ не имеет впереди лямбды, она никогда не наполняется. Следовательно, для нее не нужно компилировать код, так как единственное наполнение ее графа допускает совместное использование.
1.3. Комбинаторы
Термин «суперкомбинатор» выглядит как «комбинатор специального вида», и это действительно так.
Определение. Комбинатором называется лямбда-выражение, не содержащее свободных вхождений переменных.
Комбинатор является «чистой» функцией в том смысле, что результат применения комбинатора к аргументам зависит только от значений этих аргументов, а не от значения какой-либо свободной переменной. Термин «комбинатор» имеет длинную историю (см. [1]).
Метод компиляции на основе суперкомбинаторов
Если бы все лямбда-абстракции в нашей программе были суперкомбинаторами! Тогда, как мы уже видели, их было бы легко скомпилировать. Реальные программы, конечно, содержат лямбда-абстракции, не являющиеся суперкомбинаторами, но оказывается, что программу достаточно легко трансформировать таким образом, чтобы она содержала только суперкомбинаторы. В этом и заключается наш метод. Мы .займемся такой трансформацией в следующем параграфе.
Для наглядности мы часто будем давать суперкомбинаторам имена. Поскольку лямбда-абстракции анонимны, эти имена произвольны, и для того, чтобы выделить их, мы обычно будем начинать их символом «$». Так, мы могли бы написать
$S = Хх.Ху— у х , но чтобы подчеркнуть их особый статус, запишем определение следующим образом:
$S X у = —у X .
Итак, наш метод заключается в преобразовании лямбда-выражения, которое мы хотим Скомпилировать, в
набор определений суперкомбинаторов плюс
выражение, которое нужно вычислить.
Для того чтобы подчеркнуть неразделимость этих двух компонент, используем рамку:
Определения суперкомбинаторов
Вычисляемое выражение
Например, выражение
(Zx.Zy. —у х) 3 4 можно представить в виде
$XY х у = —у х
$XY 3 4
Ключевым моментом в определении суперкомбинатора является то, что суперкомбинаторная редукция осуществляется только при наличии всех аргументов. Например,
$XY 3
не является редексом суперкомбинатора и не будет редуцировано. Поэтому определения суперкомбинаторов можно рассматривать как набор правил замещения. Редукция заключается в замещении выражения, которое соответствует левой части некоторого правила, наполнением правой части этого правила. Такие системы правил называются системами переписывания термов и исследуются в [5, 13, 15].
3. ПРЕОБРАЗОВАНИЕ ЛЯМБДА-АБСТРАКЦИЙ
В СУПЕРКОМБИНАТОРЫ
Итак, мы выяснили, что лямбда-абстракции определенного вида — суперкомбинаторы — особенно легко компилировать. Теперь сосредоточим усилия на решении двух задач:
построение алгоритма трансляции, который преобразует все лямбда-абстракции нашей программы в суперкомбинаторы;
(н) реализации редукции суперкомбинаторов (которую мы обсудим в следующем параграфе).
Прежде всего обсудим, как преобразовать произвольную лямбда-абстракцию в суперкомбинатор.
Основной алгоритм
Вот пример программы, в которой ни одна лямбда-абстракция не является суперкомбинатором:
(Хх.(Ху. +у х)х)4
Рассмотрим сначала самую внутреннюю лямбда-абстракцию (Ху. + у х). Она содержит свободную переменную х и поэтому не является суперкомбинатором. Однако следующее простое преобразование превратит ее в суперкомбинатор:
сделаем каждую свободную переменную дополнительным параметром (эту операцию иногда называют абстрагированием свободных переменных).
Таким образом, выражение
(Лу. +у х)
преобразуется в выражение
(Хх.Ху. +у х) х
(эта операция является просто 0-абстракцией). Чтобы убедиться, что эти два выражения эквивалентны, применим 0-редукцию ко второму из них и получим первое. Теперь лямбда-абстракция (Хх. Ху. + У х) является суперкомбинатором! В результате применения этого преобразования к исходной программе получаем
(Хх. (Хх.Ху. +у х)х х)4
Теперь дадим супер комбинатору имя $¥:
$¥ х у — +у х
(Хх.$¥ х х)4
Мы видим, что Хх-абстракция также удовлетворяет требованиям, предъявляемым к суперкомбинатору. Дадим этому суперкомбинатору имя $Х:
$¥ х у = +у х
$Х х = $¥ х х
$Х 4
Теперь мы можем исполнить нашу программу, выполняя редук- ции суперкомбинаторов:
$Х 4
->$Y 4 4
->+4 4
Резюмируем описанный алгоритм:
ПОКА остаются лямбда-абстракции
выбираем любую лямбда-абстракцию, не содержащую в своем теле внутренних лямбда-абстракций;
делаем все ее свободные переменные дополнительными параметрами;
даем этой лямбда-абстракции произвольное имя;
заменяем вхождение этой лямбда-абстракции на ее имя» примененное к свободным переменным;
компилируем лямбда-абстракцию и ассоциируем ее имя с откомпилированным кодом.
КОНЕЦ
Легко заметить, что в результате этого преобразования возможно увеличение размера программы, но мы согласны заплатить эту цену за более легкие правила редукции.
Сделаем одно заключительное замечание. Когда алгоритм заканчивает работу, мы получаем программу в такой форме:
Но что представляет собой выражение Е? .Оно не должно содержать свободных переменных, так как это выражение верхнего уровня, которое подлежит вычислению, поэтому мы превращаем его в суперкомбинатор нулевой арности (КАФ) следующим образом:
завершая тем самым преобразование программы в суперкомбинаторы. Следуя работе [11], мы называем преобразование лямбда-выражений в суперкомбинаторы лямбда-лифтингом (lambdalifting), поскольку при этом все лямбда-абстракции поднимаются на верхний уровень.
Устранение избыточных параметров
Опишем два простых способа оптимизации алгоритма лямбда-лифтинга. Вновь рассмотрим пример
кхА^. —у х .
Это выражение уже само по себе является суперкомбинатором, но предположим, что мы тем нс менее применяем алгоритм трансляции. Сначала мы берем Ху-абстракцию, замечаем, что переменная х свободна, и выполняем преобразование
$Y х у = — х у
Xx.$Y х
Затем, обрабатывая Хх-абстракцию, получаем
$Y х у = —у х $Х x = $Y х
$Х
Очевидно, определение $Х можно упростить:
$Х = $Y.
Этот процесс устранения избыточных параметров из обеих частей определения представляет собой просто т\-редукцию. Выполнив ее, мы видим, что суперкомбинатор $Х избыточен и все его вхождения можно заменить на $Y:
$Y х у = — у х
$Y
Итак, можно выделить два способа оптимизации:
устранение из определений избыточных параметров с помощью трредукции;
(и) удаление избыточных определений, которые могут при этом появиться.
Эти способы оптимизации используют суперкомбинаторы, которые естественно возникают в исходной программе, а иногда включают и другие трредукции.
Упорядочение параметров
Когда мы извлекаем несколько свободных переменных из лямбда-абстракции в качестве дополнительных параметров, порядок, в котором мы их размещаем, кажется довольно произвольным. Например, рассмотрим программу
(
(^x.Zz. +у ( * х z))
где многоточие обозначает некоторое выражение, охватывающее Xz-абстракцию. Эту программу можно представить в виде
$S х у z = +у ( * х z)
(
(Ax.$S х у))
или в виде
$S у X Z= + y (*х z)
(
(Ax.$S у х)
Обе переменные хну свободны, и на первый взгляд не имеет значения, в каком порядке мы их берем. Продолжим, однако, второй вариант преобразования на один шаг и выполним лифтинг Хх-абстракции:
$S у х z = + y ( *х z)$Т у x = $S у х
(
(ST у)
Теперь можно убрать избыточные параметры из определения комбинатора $Т и удалить само это определение (поскольку $Т совпадает с $S). Это было бы невозможно, поставь мы дополнительные параметры х и у комбинатора $S в другом порядке. Следовательно, мы должны упорядочивать свободные переменные таким образом, чтобы переменные, связанные на внутренних уровнях, оказывались последними в списке параметров супер комбинатора.
Таким образом, мы могли бы ассоциировать с каждой лямбда-абстракцией некоторый числовой лексический уровень, который полностью определялся бы количеством охватывающих лямбда-абстракций (опытный читатель узнает в этих числовых уровнях числа де Брюйена, см. [2]). Например, рассмотрим выражение
(Лх.Ху. + х ( * у у)) .
В нем Хх-абстракция находится на уровне 1, а Ху-абстракция — на уровне 2 (так как ее охватывает Хх-абстракция).
Лексический уровень переменной теперь можно определить как лексический уровень связывающей ее лямбда-абстракции. Если уровень переменной х меньше, чем уровень переменной у, то будем говорить, что х свободнее, чем у, так как она связана меньше.
Константы (включая встроенные константы, такие, как «+») не являются связанными или могут считаться связанными на самом верхнем уровне, то есть должны иметь лексический уровень 0. (Очевидно, константы не требуется абстрагировать как дополнительные параметры.)
Лексические уровни всех переменных легко можно определить за один обход дерева выражения. На пути вниз по дереву Номера уровней лямбда-абстракций записываются в некоторую
среду, а на пути вверх с помощью этой среды вычисляется уровень каждой переменной.
Теперь для того, чтобы максимально повысить шансы применения трредукции, достаточно располагать дополнительные параметры в порядке возрастания лексических уровней.
Лямбда-лифтинг при наличии локальных определений
До сих пор мы не говорили о том, как обрабатывать локальные определения (letrec) при лямбда-лифтинге. Что касается основного алгоритма, то он не требует никакой специальной обработки letrec: с локальными определениями обращаются точно так же, как с любыми другими выражениями. Например, программа
(Av.(letrec vs = CONS v vs in vs)) 4
возвращает бесконечный список четверок. В результате лямбда- лифтинга Av-абстракции получаем
$Inf n = letrec vs = CONS v vs in vs $Prog = $Inf 4
$Prog
Суперкомбинатор $Inf содержит в своем теле вложенный letrec. Позже мы обсудим реализацию таких суперкомбинаторов.
Для того чтобы оптимальным образом упорядочить параметры, нужно ответить на вопрос о том, какой лексический уровень присваивать переменным, связанным в letrec.
Переменные, связанные в letrec, конкретизируются при применении непосредственно охватывающей лямбда-абстракции к некоторому аргументу, то есть тогда, когда мы строим наполнение локального определения, осуществляя подстановку на место всех свободных переменных. Следовательно, связанным в локальном определении переменным нужно присвоить лексический уровень непосредственно охватывающей лямбда-абстракции.
А что если охватывающей лямбда-абстракции нет? Таким переменным естественно присвоить уровень 0. Но здесь содержится подсказка, так как нулевой уровень чы присваиваем константам и суперкомбинаторам. Если охватывающей лямбда-абстрак-
ции нет, то тела локальных определений не могут содержать свободных переменных (кроме переменных, определенных в самом локальном определении), другими словами, это — комбинаторы. Для того чтобы превратить их в суперкомбинаторы, достаточно применить к ним лямбда-лифтинг для устранения всех внутренних лямбда-абстракций. Заметим, что переменные, связанные такими локальными определениями на нулевом уровне, не будут извлекаться как свободные переменные, потому что константы (уровень 0) не извлекаются.
Рассмотрим, например, функцию факториала:
letrec fac = Zn.IF (=n 0) 1 ( * n (fac (— n 1))) in fac 4
Здесь letrec находится на уровне 0 и нет внутренних лямбда-абстракций, поэтому fac уже является сулеркомбинатором, и мы получаем
$fac n = IF (= n 0) 1 ( * n (fac (—n 1)))
$Prog = fac 4
$Prog
Пример
Теперь мы проработаем один пример, чтобы показать алгоритм лямбда-лифтинга в действии. Это программа на языке Miranda, предназначенная для суммирования первых 100 натуральных чисел. Она написана в несколько странном стиле, для того чтобы продемонстрировать различные аспекты алгоритма:
Sumlnts 100 where
Sumlnts m
= Sum (Count 1) where
Count n = [ ], n > m
= n : Count (n+ 1)
Sum [ ]= 0
Sum [n : ns] = n + Sum ns
В языке Miranda пустой список обозначается через [ ], а конструктор списков обозначается инфиксом «:»
В нашем расширенном лямбда-исчислении эта программа принимает вид
letrec
Sumlnts
= Am. letrec
Count = Am. IF (> n m)
NIL
(CONS n (Count (+n 1))) in
Sum (Count 1)
Sum = Ans. IF (= ns NIL) 0 (+ (HEAD ns) (Sum (TAIL ns))) in
Sumlnts 100
Sumlnts и Sum находятся на уровне 0, но Sumlnts содержит внутреннюю лямбда-абстракцию. Эта Xn-абстракция имеет свободные переменные m и Count. Мы осуществляем их лифтинг и получаем суперкомбинатор, который (произвольно) именуем $Count:
$Count Count m n = IF (> n m) NIL (CONS n (Count (+ n 1)))
letrec
Sumlnts
= Zm. letrec
Count = $Count Count m
in
Sum (Count 1)
Sum = Xns. IF (= ns NIL) 0 (+ (HEAD ns) (Sum (TAIL ns))) in
Sumlnts 100
Теперь Sumlnts и Sum не содержат внутренних лямбда-абстракций, и оба находятся на верхнем уровне, т. е. представляют собой суперкомбинаторы. В результате их непосредствен-
ного лифтинга и добавления заключительного суперкомбинатора получаем
$Count Count m n = IF (> n m) NIL (CONS n (Count (+ n 1))) $Sum ns = IF (=ns NIL) 0 (+(HEAD ns)($Sum (TAIL ns))) $SumInts m = letrec Count = $Count Count m
in $Sum (Count 1)
$Prog = $SumInts 100
S'Prog
Задача выполнена.
Альтернативный подход
Описанный метод не является единственным способом выполнения лямбда-лифтинга рекурсивных функций. Например, Джонсон в [11] предлагает алгоритм, который строит суперкомбинаторы, содержащие в своем теле локальные определения, для структур данных, но не для функций.
Вкратце, его метод работает так. Предположим, что имеется программа с рекурсивной функцией I, содержащей свободную переменную v:
letrec f = Хх.(.. Л.. .v...) in (... Л....)
Мы строим по f рекурсивный суперкомбинатор $f, абстрагируя свободные переменные (в данном случае только v), но не саму функцию f. Вместо этого все вхождения f (в том числе в теле ($0 заменяются на ($f v):
$f V Х = . . .($f v). . .V. . .
(....($f V)....)
Для иллюстрации этого метода скомпилируем заново приведенный ранее пример Sumlnts. Напомним, что мы начинаем с программы
letrec
Sumlnts
= Am. letrec
Count = An. IF (> n m)
NIL
(CONS n (Count (+n 1))) in
Sum (Count 1)
Sum = Ans. IF (= ns NIL) 0 (+ (HEAD ns) (Sum (TAIL ns))) in
Sumlnts 100
Сначала мы выполняем лямбда-лифтинг An-абстракции, абстрагируя свободную переменную т, но не Count. Вместо этого мы заменяем все вызовы Count — один в теле An-абстракции и один в определении Sumlnts — на ($Count m):
$Count m n = IF (> n
m) NIL (CONS n ($Count m (+ n
1)))
letrec
Sumlnts
= Am. Sum ($Count
Sum = Ans. IF (= ns in
Sumlnts 100
m 1)
NIL) 0 (+ (HEAD ns) (Sum (TAIL
ns)))
Теперь Sumlnts и Sum являются суперкомбинаторами, поэтому мы выполняем лифтинг и получаем
$Count m n = IF (> n m) NIL (CONS n ($Count m (+ n 1))) $Sum ns = IF (= ns NIL) 0 (+ (HEAD ns)($Sum (TAIL ns))) $SumInts m = $Sum ($Count m 1)
$Prog = $SumInts 100
$Prog
Заметим, что (в отличие от предыдущего метода) ни один суперкомбинатор не содержит в своем теле letrec; вся рекурсия осуществляется как непосредственная рекурсия суперкомбинаторов. Оказывается, однако, что с циклическими структурами данных приходится обращаться по-другому, и для них действительно требуются суперкомбинаторы с телами в виде графа.
У этого метода есть одно важное преимущество. Предыдущий подход предусматривал рекурсивный вызов Count в суперкомбинаторе $Count через функцию, переданную как параметр (названный Count). В противоположность этому новый метод осуществляет рекурсивное обращение непосредственно к суперкомбинатору $Count. Это значит, что компилятор может узнать, какая функция вызывается, и эта информация может сделать скомпилированный код значительно более эффективным.
С другой стороны, суперкомбинатор $Count, полученный новым методом, имеет больший размер, чем суперкомбинатор, полученный предыдущим методом. Он содержит дополнительный узел с аппликацией ($Count m), и новое наполнение этого узла нужно строить при каждом применении $Count, что требует большего объема памяти.
В случае взаимно рекурсивных функций оказывается, что каждой функции требуется передать как ее собственные свободные переменные, так и свободные переменные всех остальных функций этого взаимно рекурсивного набора. Для этого нужно выполнить анализ зависимостей, который мы опишем в § 5, посвященном полной задержке. Кроме того, как мы уже говорили, новый метод по-разному обрабатывает структуры данных и функции, что усложняет компилятор. Преимущества и недостатки этих двух методов до конца еще не ясны.
РЕАЛИЗАЦИЯ РЕДУКЦИИ СУПЕРКОМБИНАТОРОВ
Мы показали, как преобразовать программу в набор определений суперкомбинаторов. Выполнение такой преобразованной программы сводится к многократному выделению редекбов и их редуцированию, и сейчас мы опишем, как редуцировать суперкомбинаторный редекс.
Применение суперкомбинатора к своим аргументам
Мы говорили, что суперкомбинаторы некоторым образом компилируются, но в действительности существует целый спектр возможных реализаций суперкомбинаторов:
— Можно хранить тело суперкомбинатора в виде дерева и использовать для его наполнения процедуру, аналогичную
описанному выше алгоритму обхода дерева. Это суперкомбинаторный эквивалент алгоритма редуцирования графа лямбда- выражения, единственное изменение касается реализации обхода дерева. Он упрощается, поскольку все лямбда-абстракции являются суперкомбинаторами (которые не содержат свободных переменных и поэтому не нуждаются в копировании), но в то же время усложняется, потому что приходится выполнять одновременную подстановку вместо нескольких переменных.
Мы называем эту реализацию наполнением образца (template-instantiation implementation).
— Можно хранить тело суперкомбинатора в виде дерева, расположенного в непрерывном блоке памяти. При этом для наполнения можно воспользоваться пересылкой блока с модификацией, которая реализуется более эффективно, чем наполнение путем обхода дерева. Эту идею использовал Келлер [12]. Она осуществима, потому что суперкомбинаторы строятся раз и навсегда во время компиляции, а не порождаются динамически во время выполнения программы.
— Можно скомпилировать тело суперкомбинатора в линей- нук> последовательность инструкций, при исполнении которых будет создаваться наполнение. Именно эта идея положена в основу G-машины. Она также открывает новые возможности оптимизации (см. [9], [16]).
Самое важное здесь то, что все, что мы можем делать с суперкомбинаторами,— это применять их к аргументам, и, следовательно, мы свободны в выборе такого представления суперкомбинаторов, которое сделает эту операцию эффективной.
Локальные определения в теле суперкомбинаторов
Алгоритм лямбда-лифтинга вырабатывает суперкомбинаторы, содержащие в своем теле локальные определения. Теперь мы обсудим, как наполнять тела таких суперкомбинаторов.
Предположим, мы хотим дать текстуальное описание графа
@3
/\
С помощью таких выражений, как (f(g, a)b), можно описывать деревья, но нельзя описывать разделение и циклы, входящие и этот граф. Одно из возможных решений заключается в том, чтобы дать узлам имена (скажем, а, b и с сверху вниз) и описать
этот граф так:
а = с b
Ь = с 3 с = f b
Мы также хотели бы идентифицировать узел а как корень графа. Но мы как раз заново открыли понятие локального определения (letrec)! Наш граф можно описать с помощью letrec-выражения
letrec а = с b
Ь = с 3 с = f b in а
Это наводит на мысль, что \^\х ^-выражения можно рассматривать как текстуальные описания графов с циклами. Следовательно, локальное определение в теле суперкомбинатора можно рассматривать как описание графовой части тела этого суперкомбинатора.
До сих пор мы рассматривали тела суперкомбинаторов как деревья и применение суперкомбинатора включало построение нового наполнения дерева. Теперь мы видим, что, разрешая локальные определения в теле суперкомбинатора, мы допускаем, что тело может становиться графом. Применение такого суперкомбинатора включает построение нового наполнения этого графа.
Например, рассмотрим следующее суперкомбинаторное определение:
$Y f = letrec yf = f yfin yf
Это — определение циклической версии известного комбинатора Y, тело которого является графом. При применении $Y мы строим наполнение этого графа, подставляя аргумент вместо вхождений формального параметра f. В процессе наполнения нужно быть осторожным, чтобы сохранить циклы исходного графа. В результате компиляции мы должны получить код, который при исполнении строил бы граф с осуществлением соответствующих подстановок.
Резюмируя, можно сказать, что для наполнения локального определения в теле суперкомбинатора мы просто строим граф, заданный этим локальным определением.
ПОЛНАЯ ЗАДЕРЖКА
Есть одно глобальное направление усовершенствования алгоритма лямбда-лифтинга. Здесь мы опишем эту возможность и связанные с ней модификации.
Полная задержка
Пользуясь описанной нами процедурой наполнения образца, мы рискуем получить несколько вхождений одного и того же выражения вместо разделения одной его копии. На это зря тратится память, поскольку каждое вхождение хранится отдельно, и зря расходуется время, поскольку вхождения редуцируются раздельно. Эти затраты могут оказаться сколь угодно большими: например, каждое из дублирующихся вхождений может независимо порождать большой объем вычислений.
Отсутствие разделения можно лучше понять на конкретном примере. Рассмотрим программу
letrec g = Zx.Zy-|-y (sqrt х)f = g 4
in + (f l)(f 2)
В результате лямбда-лифтинга этой программы получаем
$g х у = + у (sqrt х)
^ = $g 4
$Prog = + ($f l)($f 2)
$Prog
Редукция происходит следующим образом:
$Prog
- + (.!)(.2)
'>($g 4)
-> + (.l)(.+2(sqrt 4))
Мы видим, что, несмотря на разделение выражения ($g 4), выражение (sqrt 4) было построено и вычислено дважды.
Чтобы избежать таких затрат, хотелось бы разделять динамически создаваемые выражения. Более конкретно, хотелось бы достигнуть такого эффекта, чтобы каждое выражение после связывания его переменных вычислялось не более одного раза. Этот принцип называется полной задержкой и в точности соответствует оптимизации циклов, выполняемой иногда обычными компиляторами, при которой выражения, не использующие переменную цикла (т. е. свободные), выносятся из цикла и не вычисляются повторно.
Максимальные свободные выражения
Обнаруженная нами проблема заключается в том, что можно потерять «ленивость» вычислений, если слишком многое конкретизировать в теле лямбда-абстракции.
Какие же части не следует наполнять? Части тела лямбда- абстракции, не подлежащие наполнению, — это те подвыражения, которые не содержат свободных вхождений формальных параметров. Если в некоторое подвыражение не входят формальные параметры, значение этого подвыражения будет одним и тем же при всех конкретизациях и, следовательно, может разделяться. Для того чтобы формализовать это, дадим следующее определение.
Определение. Подвыражение Е лямбда-абстракции L называется свободным в L, если все переменные, входящие в Е, свободны в L. Максимальным свободным выражением (МСВ) в L называется свободное выражение, которое не является собственным подвыражением другого свободного в L выражения. (Е является собственным подвыражением F, если Е является подвыражением F и E^F.) ,
Примеры. В следующих лямбда-абстракциях подчеркнуты максимальные свободные выражения Хх-абстракции:
(Zx.sqrt х)
(Лх.х (sqrt 4))
(Ay. А,х. + х ( * у у))
(АуАх. + (*уу) х)
(Хх.(А,х.х) х) (Здесь (Лх.х) свободно, несмотря на конфликт имен.)
Лямбда-лифтинг, использующий максимальные свободные выражения
Для реализации полной задержки при лямбда-редукции графов нам потребуется динамически выделять максимальные свободные выражения. Делать это эффективно весьма трудно.
К счастью, алгоритм лямбда-лифтинга можно модифицировать таким образом, что непосредственная реализация результирующей суперкомбинаторной программы автоматически окажется вполне задержанной (fully-lazy). Эта модификация заключается в том, что при выполнении лямбда-лифтинга некоторой лямбда-абстракции абстрагируются не свободные переменные, а максимальные свободные выражения.
В рассматриваемом нами примере функция g содержит лямбда-абстракцию
Хх.Ху.+ у (sqrt х).
При выполнении лямбда-лифтинга для Ху-абстракции мы абстрагировали переменную х как дополнительный параметр, поскольку она является свободной. Вместо этого нужно абстрагировать все свободное подвыражение (sqrt х) как дополнительный параметр. В результате мы получим суперкомбинатор
$gl sqrt х у = + у sqrt х.
Здесь sqrt х является произвольно выбранным именем дополнительного параметра. Заменим Ху-абстракцию суперкомбинатором $g 1, примененным к подвыражению
Xx.$gl (sqrt х).
Завершив компиляцию обычным способом, получим
$gl sqrt х у=+у sqrt х $g X = $gl (sqrt x)
# = $g 4
$Prog = + (№ W 2)
$Prog
Мы получили лишний суперкомбинатор, потому что потеряли возможность трредукции, выбрав в качестве дополнительного па»
раметра (sqrt х), а не х. Но зато вычисления будут вполне задержанными, потому что (sqrtx) будет разделяться. Проследим еще раз последовательность редукций:
$Prog
+ (.!)(.2)
(fc 4)
4$gl (sqrt 4))
>($gl (sqrt 4))
+ ($gl 2)
^gl 2)
-> + (+1.) 4-> + (+1.) 4I
-> + (+1.) 4
-> + (+1.) 4
2
Выражение (sqrt 4) разделяется и, следовательно, вычисляется только один раз.
Итак, для достижения полной задержки нужно в процессе лямбда-лифтинга абстрагировать максимальные свободные выражения (а не просто свободные переменные} лямбда-абстракции как дополнительные параметры.
Эта модификация обеспечивает полную задержку. Назовем полученный алгоритм лямбда-лифтингом с полной задержкой.
Можно внести еще одно небольшое усовершенствование: если максимальное свободное выражение вообще не имеет свободных переменных (т. е. это КАФ), то вместо абстрагирования его как дополнительного параметра можно просто дать ему имя, превратив его в суперкомбинатор, и использовать это имя вместо самого выражения. Продемонстрируем этот прием.
Лямбда-лифтинг с полной задержкой при наличии локальных определений
Здесь, как и в 3.4, следует учесть наличие локальных определений. Рассмотрим программу
let
f = Ax.letrec fac = Xn.()in + х (fac 1000)
in
+ (f 3) (f 4)
Описанный нами алгоритм скомпилирует ее так:
$fac fac n = ()
$f x = letrec fac = $fac fac in + x (fac 1000)
+ (Sf 3) (# 4)
Функция fac определена локально в теле f, поэтому (fac 1000) невозможно извлечь из тела f как свободное выражение. Это, к сожалению, означает, что (fac 1000) будет вычисляться заново при каждом применении $f, т. е. принцип полной задержки будет нарушен.
Однако выход можно найти, если заметить, что определение fac не зависит от х. Это позволяет нам вынести локальное определение fac наружу и получить программу
letrec fac = Xn.()
in let
f = Xx.+ x (fac 1000)
in
+ (f 3)(f 4)
Теперь в результате применения лямбда-лифтинга с полной задержкой мы получим вполне задержанную программу
$fac п =
$fac lOOO = $fac 1000 $f х = + х $fac 100 $Prog= + ($f 3)(gf 4)
$Prog
Этот пример также иллюстрирует преимущества превращения максимального константного выражения в суперкомбинатор (в данном случае $fac) перед абстрагированием его как параметра.
Теперь наша стратегия разбивается на два этапа:
вынесение локальных определений letrec и (let) наружу (насколько это возможно);
(И) выполнение лямбда-лифтинга с полной задержкой.
Насколько далеко можно вынести локальные определения? Значение переменной, связанной в letrec, в общем случае зависит от значений некоторых свободных переменных. Будем называть множество свободных переменных, от которых зависит х, множеством свободных переменных переменной х. Зная множество свободных переменных переменной х, можно выносить определение х наружу до тех пор, пока какая-либо переменная из множества ее свободных переменных не окажется связанной. Дальше выносить определение х нельзя, так как при этом оно вышло бы из области действия этой свободной переменной.
Мы будем называть этот этап исследования программы анализом зависимостей, так как на нем выявляется множество свободных переменных, от которых зависит локальное определение. Анализ зависимостей аналогичен потоковому анализу, и наиболее сложные компиляторы все равно вынуждены выполнять его для решения других задач (например, для осуществления контроля типов или анализа строгости), поэтому он не окажется большим дополнительным бременем.
Еще одно преимущество анализа зависимостей состоит в том, что определения, вообще не содержащие свободных переменных, выносятся на самый верхний уровень, где они превращаются непосредственно в суперкомбинаторы.
Более сложный пример
Рассмотрим теперь более сложный пример, чтобы продемонстрировать работу алгоритма лямбда-лифтинга с модификациями, обеспечивающими полную задержку.
Возьмем хорошо известную процедуру Reduce сложения чисел от 1 до 100:
letrec
Sumlnts = Лп. Reduce + 0 (Count 1 n)
Count = An.Am. IF (> n m) NIL (CONS n (Count (+ n 1) m)) Reduce
= Zop.Zbase.Zxs. IF (=xs NIL) base
(Reduce op (op base (HEAD xs))-(TAIL xs)) in
Sumlnts ' 100
Применяя наш алгоритм к Reduce, мы выбираем самую внутреннюю лямбда-абстракцию (Zxs ...) и находим максимальные свободные выражения: (Reduce op), (op base), base. Абстрагируя их как дополнительные параметры р, q и base соответственно, получаем
$R1 р q base xs=IF (= xs NIL) base (p (q (HEAD xs)) (TAIL (xs))
letrec
Sumlnts = Zn. Reduce + 0 (Count 1 n)
Count = Am. An. IF (> n m) NIL (CONS n (Count (+ n 1) m))
Reduce = Лор.Zbase.$Rl (Reduce op) (op base) base in
Sumlnts 100
Теперь самой внутренней лямбда-абстракцией является
Xbase, а ее максимальными свободными выражениями — ($R1
(Reduce op)) и op. Абстрагируем их как г и ор соответственно:
$R1 р q base xs = IF (=xs NIL) base (p (q (HEAD xs)) (TAIL xs)) $R2 r op base = r (op base) base
letrec
Sumlnts = An. Reduce + 0 (Count 1 n)
Count = Zn.Zm. IF (> n m) NIL (CONS n (Count (+ n 1) m))
Reduce = Zop.$R2 ($R1 (Reduce op)) op in
Sumlnts 100
Теперь все определения на верхнем уровне являются суперкомбинаторами, потому что мы извлекли все внутренние лямбды. Поэтому после выполнения лифтинга всех константных выражений мы можем поднять их непосредственно. В результате получим
$SumInts n = $ReducePlusO ($Countl n)
$ReducePlusO = $Reduce + 0
$Countl = $Count 1
$Count n m — IF (> n m) NIL (CONS n ($Count (+n 1) m))
$Reduce op = $R2 ($R1 ($ Reduce op)) op
$Prog = $SumInts 100
$R1 p q base xs = IF (= xs NIL) base (p (q (HEAD xs)) (TAIL xs))
$R2 r op base = r (op base) base
$Prog
Заметим, что мы не можем устранить параметр ор в $Redu- се, так как он дважды использован в правой части.
УСТРАНЕНИЕ ИЗБЫТОЧНОЙ ПОЛНОЙ ЗАДЕРЖКИ
За достижение полной задержки приходится платить. Вот чем мы платим:
Порождаются суперкомбинаторы с большим числом аргументов (для всех максимальных свободных выражений). Это увеличивает размер редекса и замедляет редукцию.
Еще хуже то, что из-за потери возможности ^-оптимизации может появиться избыточное количество суперкомбинаторов. Вспомним пример из 5.5, где мы получили три суперкомбинатора, тогда как для реализации без полной задержки хватило бы одного. Больше суперкомбинаторов — больше редукций.
Хуже всего то, что программа разбивается на маленькие фрагменты — фрагменты тел функций, которые передавались наружу по частям. В случае простой реализации путем наполнения образца это не создает проблем, но если тела суперкомбинаторов компилируются, то можно потерять много возможностей оптимизации. Рассмотрим, например, лямбда-абстракцию
Xv.Xx.IF(=v 0)(+х 1)(+х 2)
Процедура лямбда-лифтинга без полной задержки построит по ней единственный суперкомбинатор
$R v x = IF (=v 0)(+х 1)(+х 2) Оптимизирующий компилятор построил бы по $R код, который сначала проверяет значение v, а затем вычисляет либо (+х 1), либо (+х2), получая численное значение. При этом не потребовалась бы куча. А в результате лямбда-лифтинга с полной задержкой мы получим два комбинатора:
$'S1 if-v-zero х = if-v-zero (+х 1) (+х 2)
$S v= SSI (IF (= v 0))
и Xv-абстракция будет заменена на $S. Теперь компилятор должен сгенерировать по $S1 код для построения (+х!) и (4-х 2) в куче, прежде чем раскроется сущность функции if-v- zero, о которой он в данном случае не имеет информации.
Эти потери весьма существенны, но, с другой стороны, полная задержка в некоторых случаях может сэкономить очень много времени и памяти. Однако дальнейшие исследования показывают, что лямбда-лифтинг с полной задержкой часто абстрагирует выражение и в том случае, когда это ничего не дает. Следовательно, мы могли бы усовершенствовать алгоритм, выполняя в таких случаях обычный (без полной задержки) лямбда-лифтинг. Этот параграф посвящен выявлению ситуаций, в которых лямбда-лифтинг с полной задержкой бесполезен, и основывается на работах [3, 6, 7].
Функции с малым числом аргументов
В последнем примере процедура лямбда-лифтинга абстрагировала выражение (IF(=vO)) как дополнительный параметр. Однако для редукции IF требуются 3 аргумента, поэтому разде-
ление этого выражения не приносит экономии вычислений. Точнее говоря, мы сэкономили бы ровно столько же, если бы абстрагировали (=v0) как дополнительный параметр, получив
$Т1 v = zero х = IF v = zero (+ х 1) (+ х 2)
ST v=ST1 (=v 0) ,
и заменили Xv-абстракцию на $Т. В случае простой реализации путем наполнения образца некоторая экономия памяти была бы достигнута за счет абстрагирования выражения большего размера (так как применение IF к (=v0) строилось бы сразу), однако для реализации посредством компиляции даже это не всегда верно.
Вывод заключается в том, что абстрагирование выражений, состоящих из встроенной операции или суперкомбинатора, которые применяются к малому количеству аргументов, не приносит экономии вычислений (хотя при этом можно сэкономить немного памяти). Это в равной степени справедливо и для константных выражений, которые в противном случае могли бы оказаться подходящими кандидатами для новых определений суперкомбинаторов (см. конец 5.3). Однако наш пример показывает, что можно абстрагировать аргументы операции.
Неразделенные лямбда-абстракции
Продолжая рассматривать тот же пример, предположим, что лямбда-абстракция появилась в таком контексте:
let
f = Xv.Xx.IF (=v 0) (+х 1) +(х 2) in
(f 4 5)...
и предположим, что (f 4 5) является единственным вхождением f. В этом случае частичная аппликация (f 4) не может быть разделена, так как она используется немедленно. С использованием комбинатора $8 для f редукция выражения (f 4 5) происходила бы так:
f 4 5 = $S 4 5
-*$S1 (=4 0) 5
—>IF (=4 0) (+5 1) (+5 2)
-> + 5 2
->7
Поскольку частичная аппликация не может разделяться, то и старательно абстрагированное выражение (=4 0) тоже не может разделяться. При использовании исходного суперкомбинатора $R никакой потери разделения не произошло бы. Отсюда можно сделать общий вывод:
если лямбда-абстракция Хх. Е задана в контексте, в котором она не может разделяться, то не следует абстрагировать свободные выражения из Е, потому что они тоже не будут разделяться. Вместо этого следует абстрагировать только свободные переменные.
Этот вывод подтверждается тем, что свободные выражения, абстрагированные из Е, не могут разделяться по следующим причинам:
Они не разделяются внутри Е, поскольку абстрагированы из единственного места в Е.
Они не разделяются вне Е, поскольку вся лямбда-абстракция Хх. Е не разделяется.
Разделение частичной аппликации функции иллюстрирует это общее правило. Заметим, что впервые наш метод лямбда- лифтинга становится контекстно-зависимым. Хитрость в том, чтобы определить, когда лямбда-абстракция может разделяться. Это совсем не очевидно. Начнем с того, что она может передаваться другой функции как аргумент и при этом для полноты анализа требуется просмотр тела этой функции. В качестве более тонкого случая рассмотрим расширение нашего примера:
let
f = Xv.Xx.IF (= v 0) (+х 1) (+х 2)
g = Xx.Ху. + 1 (f х у) in
...выражение, не использующее f...
Не похоже, чтобы частичная аппликация f здесь могла разделяться. Но если частичная аппликация g разделяется, мы абстрагируем (f х) из Ху-абстракции в g как максимальное свободное выражение, и тогда частичная аппликация f будет разделяться.
Извлечение информации о разделяемости является потенциально весьма трудной задачей (это, по-видимому, еще одно применение абстрактной интерпретации); но спасает дело то, что мы в любой момент можем отказаться от этого и считать, что частичные аппликации функций могут разделяться. Эти детали выходят за рамки настоящей статьи, но в [3] и [7] описаны соответствующие алгоритмы.
ЛИТЕРАТУРА
Curry Н. В., Feys R. Combinatory logic, vol. II, North-Holland, 1969.
De Bruijn N. G. Lambda-calculus notation with nameless dummies. Indag Math. 34, 1972, p. 381—392.
Fairbairn J. Removing redundant laziness from supercombinators. Proc. Aspenas Workshop on Implementation of Functional Languages, Chalmers Institute, Goteborg, Jan 1985.
Henderson P. Functional programming. Prentice-Hall, 1980. [Имеется перевод. Хендерсон П. Функциональное программирование —М.: Мир, 1983.]
Hoffman С. М, O’Donnell М. J. Programming with equations. ACM TOP- LAS 4 (1), Jan 1982, p. 83—112.
Hudak P., Goldberg B. Serial combinators. Proc. IFIP Conference on Functional Programming and Computer Architecture, Nancy, Sept 1985.
Hudak P., Goldberg B. Serial combinators. Functional Programming and Computer Architecture, ed. Jouannaud, LNCS 201, Springer-Verlag, Sept 1985.
Hughes R. J. M. The design and implementation of programming languages. PhD thesis, Programming Research Group, Oxford, Sept 1984.
Johnsson T. Efficient compilation of lazy evaluation. ACM Symposium on Compiler Construction, Montreal, June 1984, p. 58—69.
Johnsson T. Lambda lifting. Proc. Aspenas Workshop on Implementation of Functional Languages, Sweden, Feb 1985.
Johnsson T. Lambda lifting. Functional Programming and Computer Architecture, ed Jouannaud, LNCS 201, Springer-Verlag, 1985, p. 190—203.
Keller R. M. Distributed graph reduction from first principles. Proc. Aspenas Workshop on Implementation of Functional Languages, Sweden, Feb 1985.
Klop J. W. Combinatory reduction systems. PhD thesis, Mathematish Centrum, Amsterdam, 1980
Landin P. J. The mechanical evaluation of expressions. Computer Journal, Jan 1964.
O’Donnel M. J. Computing in systems described by equations. LNCS 58, Springer-Verlag, 1977.
Peyton Jones S. L. The implementation of functional languages. PrenticeHall, 1986.
Stoy J. E. Denotational semantics. A4IT Press, 1981.
РАВЕНСТВА И ПРАВИЛА ПЕРЕПИСЫВАНИЯ1) ОБЗОР
Ж. ЮЭ, Д. ОППЕН
ВВЕДЕНИЕ
Равенства, т. е. формулы вида М = N, часто встречаются в математике, логике и программировании. В этом обзоре мы в рамках единого подхода рассматриваем основные результаты, относящиеся к равенствам, а также методы, предназначенные для проведения рассуждений о равенствах и вычислений с использованием равенств.
Рассуждения о равенствах могут включать решение вопроса о том, является ли некоторое равенство следствием заданного множества равенств (аксиом), или о том, истинно ли равенство в смысле данной теории, т. е. о выводимости или истинности соответственно.
Рассмотрим следующее множество аксиом теории групп:
х + 0 = х;
х Нх = 0;
(х + у) + 2 = X + (у + z).
Мы могли бы поставить вопрос, следует ли равенство 0 + % = = х из этих аксиом, т. е. является ли оно истинным во всех группах. Как известно, то, что это равенство есть логическое следствие аксиом, можно показать чисто эквациональным способом: с помощью подстановки произвольных термов вместо переменных и замены «равных равными». Это пример рассуждений о равенствах.
Когда равенства используются таким образом, они устанавливают отношения между объектами.
Равенства можно использовать и в качестве определений. Так, множество равенств может определять некоторую группу (тогда мы говорим о группе, представленной равенствами). Равенства в качестве определений широко применяются в про
*) Huet G., Oppen D. Equations and rewrite rules. A survey. Formal languages: perspectives and open problems. — New’ York, Pergamon Press, 1980, p. 349—405.
© by Academic Press, 1980
© перевод на русский язык, А. И. Дегтярёв, 1991
граммировании: программы, написанные на аппликативных языках, абстрактные определения интерпретаторов и алгебраические определения типов данных, очевидно, имеют именно эту природу. Если рассматривать равенства как ориентированные правила переписывания, их можно использовать для вычислений. Например, следующие равенства задают функцию Append:
Append {Null, х) = х;
Append {{Cons {x,y),z) = Cons {x, Append {y,2)).
С помощью этого определения можно вычислить, скажем, Append (Cons{A,Cons {В, Null)),Cons {С,Null)), и получить Cons {A, Cons {В, Cons {С, Null))).
Вычисления с использованием равенств и рассуждения о равенствах тесно связаны друг с другом. Например, один из методов рассуждений о равенствах состоит в компиляции их в правила переписывания с последующим применением этих правил для приведения выражений к каноническому виду. Позже мы покажем, как этот метод применяется к сформулированным выше аксиомам группы и как равенство 0 + ^ = ^ доказывается путем редукции обеих сторон к канонической форме х.
Однако для рассуждений о равенствах, рассматриваемых как определения, эквациональных заключений уже недостаточно. Например, известно, что Append—ассоциативная функция, но для доказательства этой теоремы потребуется индукция.
Вначале полезно прийти к ясному пониманию различных семантик, которые можно сопоставить равенствам и правилам переписывания. Поэтому мы начнем с введения различных семантических определений, а затем рассмотрим связанные с ними теории доказательств (если таковые имеются). Эти понятия мы будем развивать в рамках традиционной абстрактной алгебры.
Мы попытаемся дать достаточно полный обзор, однако за недостатком места ограничимся равенствами в языке первого порядка. Мы не будем также рассматривать равенства, определяющие бесконечные вычисления: для них нужна более сложная теория моделей (непрерывные области или алгебры). Не рассматриваются также новые работы о применении правил переписывания к классам эквациональных конгруэнций (в § 14 коротко говорится об этих исследованиях).
Л МНОГОСОРТНЫЕ АЛГЕБРЫ1)
Предположим, что задано множество сортов У, элементы которого являются именами различных областей. Мы будем Ч В оригинале sorted algebras. — Прим, перев.
рассматривать только простые многосортные теории, в которых эти области не пересекаются.
Пример: ^° = {integer, boolean}.
Определим язык 0 типов, получаемых композицией сортов. Мы ограничимся теориями первого порядка и назовем типом конечную последовательность сортов: 0 = ^К При этом будем писать t = SvX S2X • • • X sn*^ s вместо t = <5i, 52, .sn, s)w Этот тип характеризует операторы (отображения) с п аргументами сортов Si, s2, . . ., 5„ соответственно и значениями сорта 5. Когда п = 0, мы пишем t = s; в этом случае t означает константу сорта 5.
Сигнатура над ^ состоит из множества 2 операторов и функции типизации т: 20. Для простоты будем обозначать
сигнатуру через 2, предполагая, что одновременно задается и т.
Пусть 2 — сигнатура над ^. Будем говорить, что сорт s ^ S является строгим в 2, если в 2 существует такой оператор F, ЧТО t(F) = 5 ИЛИ Т^) = 51 X S2 X . . . X Sn ^ 5, ГДе сорт Si является строгим в 2 для каждого L Будем называть сигнатуру 2 разумной (sensible), если для любого F ^ 2 типа %(F) = = Si X • • • X sn^ s из строгости сорта s следует строгость всех сортов Si. Далее мы будем считать все сигнатуры разумными; это чисто техническое ограничение будет обосновано позже (отметим лишь, что любую сигнатуру можно расширить до разумной путем добавления константных символов).
Пример. Рассмотрим для множества сортов S^° из предыдущего примера сигнатуру 2° ={0, S, TRUE, FALSE, ^}, где
т (0) = integer,
т (S) = integer —> integer,
т (+) = integer X integer —> integer,
т (TRUE) = т (FALSE) = boolean,
т (*) = integer X integer -> boolean.
Любой сорт из 990 является строгим в 2°.
Назовем ^-алгеброй, или просто алгеброй, пару <si, 9~у, где — ^-индексированное семейство множеств, а ^ — 2-индек- сированное семейство функций (главных операций алгебры), причем
S' F е sis, если т (F) = s, и
^F e.^S| X • • • X ^„ -> ^s, если т YF'Y — s, X • ■ • Xs„ > s.
При этом ^s называется носителем или универсумом сорта 5 в данной алгебре. Обычно, если не возникает двусмысленности, для обозначения алгебры указывается лишь семейство ее носителей (первый элемент пары). Так, мы говорим об алгебре ^, определенной выше, и используем F, чтобы обозначить соответствующий оператор 2Г г. Заметим, что s^s =# 0 для любого строгого сорта s.
Пример. 2°-аЛГебра <я£°, ДЛЯ которой ^integer = N, ^boolean = = {true, false}, 0 — целое 0, S— функция следования, TRUE = = true, FALSE = false,
Г true, если m ^ n,
( false в противном случае.
Определим особые разновидности алгебр, в которых носители состоят из конечных упорядоченных деревьев, помеченных операторами из 2. Эти ^свободные) 2-алгебры потребуются нам для определения термов.
Сопоставим каждому оператору F е 2 дерево, состоящее из вершины, помеченной буквой F. Теперь рекурсивно определим семейство множеств деревьев ^(2)s, s ^ 9. Если r(C) = s, то дерево, состоящее из единственного узла (без наследников), помеченного буквой С, является элементом £T(2)S. Если т(Е) = = 51 X $2 X • • • X sn s и М£ е FT (2)s для всех 1 ^ I ^ п, то i
дерево с вершиной, помеченной буквой F, и п наследниками А1Ь ..., Мп является элементом ^(2)s. Будем обозначать эти термы обычным образом — строками, например, через С или F(Mb ..., Мп).
Соответствующая алгебра FT(2) называется инициальной алгеброй. Будем называть ^(2)s множеством основных (ground) термов сорта s. Например, 0 + s(0) — основной терм сорта integer над сигнатурой 2°, определенной выше. В алгебре основные термы называются словами, а в программировании — абстрактными синтаксическими деревьями. Логики используют их неявно, работая с конкретным синтаксисом (со строками), определенным грамматикой без двусмысленностей.
Отметим, что ^(2)5^0 тогда и только тогда, когда 5 — строгий сорт.
Рассмотрим теперь произвольное ^-индексированное семейство множеств Т. Элементы Ts назовем переменными сорта $. Будем считать, что переменные различных сортов различны и что ни одна переменная не входит в 2. Обозначим через 2U^ сигнатуру, получаемую из 2 добавлением всех множеств Ts, элементы которых рассматриваются как константы сорта s.
Соответствующая 2-алгебра ST (2 U У) называется свободной И-алгеброй, порожденной У, а ее носитель £Г(2 U У)5— множеством термов сорта s. Эта терминология согласуется с терминологией, принятой в книгах по общей алгебре, таких, как монография Кона [27], где в односортном случае множество ^(2 U У) обозначалось бы через IF2(^) (ср. также с ^v(Z) у Гогена [52] иЛ4(2, У) у Нива [123]).
Для того чтобы строго ввести термальные структуры, потребовалось бы аккуратно определить области над деревьями и представить термы как отображения из этих областей в сигнатуру 2Uf в соответствии с их типами. Мы не станем это делать, а будем неформально пользоваться понятием позиции (occurrence)— последовательности натуральных чисел, обозначающей путь доступа в терме (по аналогии с десятичной нотацией Девея). Для М ^ ST(2 U У) обозначим через О(М) множество всех таких позиций в терме М, а для и е О(М) обозначим через М/и подтерм терма М, находящийся в позиции и. Например, для M = 0 + s(0) имеем О(М)={Л, 1, 2, 2.1} и MJ2 = s(0). Обозначим через У (М) множество всех переменных, встречающихся в М. Таким образом, х^У(М) тогда и только тогда, когда х ^ У и существует такая позиция и^ О(М), что М)и = х. Наконец, определим терм M\u^N^, полученный из терма М заменой подтерма в позиции и термом N. (Позиции были введены Горном в [55] и впоследствии использовались Брайнердом в [14], Розеном в [141] и Юэ в [72].)
В дальнейшем будем предполагать, что отображения из 2-алгебр в 2-алгебры сохраняют сорта, и будем использовать обозначение h\ st-+$ для ^-индексированного семейства отображений hs: sts-^^s.
Наконец, если st и ^ — две алгебры, будем говорить, что А: st-^Ж является ^-морфизмом (или просто морфизмом), если ДЛЯ любого F ^ 2, ДЛЯ которого т(Г) = S1 X 52 X • • • X 5П~> ->s, справедливо кДРл<ах, ..., ап)) = F^ (hSx (aj, . .., Н8Дап)у
Теорема (универсальное свойство свободных 2-алгебр). Пусть st— произвольная lL-алгебра. Тогда любая st-интерпретация ^\У -^ st допускает единственное продолжение до %-мор- физма из ^(2 U^) в st.
Будем обозначать через v как саму интерпретацию, так и ее продолжение.
Примеры.
Тривиальной алгеброй является алгебра Sort, Sorts = {s} и F^Sy, ..., s„) = sf если t(F) = si X s2 X • • • X Sn~+s. Интер-
претация v, заданная условием v(x) = s при х е Ts, единственным образом продолжается до 2-морфизма из РГ (2 U Т) в Sort. Например, для определенной выше сигнатуры Рипе ^integer получаем v (s (0) -ф- n) = integer
2-эндоморфизмы алгебры термов £Г(2 U Т) в себя называются подстановками. Обычно нас будет интересовать действие подстановки о на некотором конечном множестве термов, поэтому можно считать, что о(х)=х везде, кроме конечного множества переменных 3)(о), которое мы будем довольно произвольно называть областью определения подстановки о. При этом подстановку можно описать конечным множеством пар термов {<х, o^x^V^S^V Будем называть подстановку а основной (ground), если Т(о(х))= 0 для любого х^3)(а).
В следующем параграфе нам понадобится ещё одно определение.
Пусть ^ — некоторая алгебра, а ~ — отношение эквивалентности в ^!), сохраняющее сорта. Отношение ~ называется отношением конгруэнтности в (или ^-конгруэнцией), если для VF е 2, Vai, 6Ь ..., am bn^ ^
av~bv&...&an~bll^F(ab . а^ ~ F (bv, .bn\
РАВЕНСТВА И МНОГООБРАЗИЯ
Назовем 2-равенством, или просто равенством, пару М = N, где М и N являются термами из Т (2 U^)s, т. с. образованы из переменных, принимающих значения из множества элементов универсума, и из символов, обозначающих главные операции алгебры. В равенствах переменные неявно связаны кванторами общности.1
Пусть j^ — некоторая алгебра, a M = N — некоторое равенство. Будем говорить, что равенство М = N истинно в или что ^ является моделью равенства М = N, и записывать это в виде «s^V^ М = N, если для любой ^-интерпретации v:^°(Al)U UT\N)-^^ справедливо v(Лl)=v(^), т. е. М и N обозначают один и тот же элемент носителя ^s вне зависимости от того, как переменные М и N интерпретируются элементами ^. Алгебра j^ является моделью множества равенств, если при любой ^-интерпретации значения левой и правой частей каждого равенства совпадают.
*) В оригинале не требуется, чтобы отношение ~ было отношением эквивалентности, т. е. фактически определяется стабильное отношение, или пред- конгруэниия. — Прим, персе.
Примеры:
^° Н х 4- у =-- у 4- х\
^°^£ 0 = s (х);
Sort |= М = N, если М и IV имеют одинаковый сорт.
Ясно, что отношение =^ на ^(2U^)> определяемое таким образом, чтоМ=лП тогда и только тогда, когда з£У= М = N, является S-конгруэнцией при условии, что 2 — разумная сигнатура (или если любой носитель этой алгебры непуст).
Теперь множество 2-равенств ^ можно рассматривать как определение некоторого семейства алгебр или единственной (с точностью до изоморфизма) алгебры. Многообразием, или эква- циональным классом, Л^, $) (или просто Л^)) называется класс всех моделей $х). Таким образом, з^ г Л^$) тогда и только тогда, когда ^ |= Е для любого Е из ^.
Заметим, что многообразие^^) всегда непусто, так как содержит алгебру Sort.
Пример. Пусть ^° = ^х + 0 = х, х + S(y) = S(x 4- у)У Определим 2°-алгебру ^ следующим образом: «^integer = ^синий U и ^красный, ^boolean = {true, false}, 0 = 0синий, 4- = ф, где псинийф ® ^синий ^синий ® ^красный (^ Н" ^)синий> ^красный ® ^синий ==:
^красный ® ^красный (^ ® ^)красный> TRUE ttUC, FALSE = = false, S = Sz/ССсиний U *^^ССкрасный>
#(т, п) =#(т, п) =false, если тип имеют одинаковые значения (без учета окраски),
#(т, п) =
#(т, п) =
true в противном случае.
Обе алгебры ^° и зР являются, моделями ^°, однако они не изоморфны, и равенство х 4- у = у + х не является истинным в
Проблема тождества) в классе алгебр ^ ставится так: для заданного равенства Е над ЗГ^УТ^ выяснить, верно ли, что tp/ |= Е для всех алгебр зФ е ^6. Если ответ положителен, будем
*) Вместо термина «многообразие» иногда употребляют термин «примитивный класс» (А. Г. Курош), а также «эквационально определимый класс».— Прим, перев.
писать ^^Е. Когда ^ = {^}, а Е— основное равенство (ground), проблему тождества называют проблемой слов1).
Например, рассмотрим проблему тождества в многообразии, определенном множеством равенств S \ Л t^V^ Е. Существует очевидная связь между этим понятием и традиционным понятием истинности в эквациональной логике первого порядка. Единственное отличие заключается в том, что «Ж^^ может содержать модели, отличные от обычных моделей ^ первого порядка, так как мы не требуем, чтобы носители алгебры были непустыми2). Множество термов £T(2)S, если оно непусто, совпадает с эрбрановским универсумом над 2 сорта 5.
Как и для логики первого порядка, где семантические понятия получают эквивалентную синтаксическую характеристику через теорему о полноте, в нашем случае также имеется теория доказательств, соответствующая истинности в многообразии.
В дальнейшем мы будем использовать обозначение Т вместо Т (2 U Т^ и 9 вместо ^Г (2) везде, где не возникает двусмысленностей. *
ТЕОРИЯ ДОКАЗАТЕЛЬСТВ
Отношением равенства =^, порожденным множеством равенств 8, называется наименьшая 2-конгруэнция над ST, содержащая все пары <о(М), a(^)>, где М = N принадлежит ^, а о — произвольная подстановка. В эквациональной логике =g называется эквациональной теорией, а ^ — базой или множеством аксиом этой теории.
Сформулируем известную теорему Биркгофа о полноте ([8]).
Теорема. Л (^) |= М = N тогда и только тогда, когда М =g N.
Эта теорема означает, что равенство М = N истинно в многообразии, определенном S, тогда и только тогда, когда это равенство можно получить из аксиом Ж с помощью подстановок и замен равных равными (т. е. два терма эквивалентны тогда и только тогда, когда это можно доказать за конечное число шагов). Если 8— рекурсивное множество аксиом, мы получаем
*) Таким образом, проблема тождества совпадает с проблемой слов в свободной алгебре класса ^ с бесконечным множеством образующих Т. — Прим перев
Вместо этого требования авторами принято синтаксическое ограничение: допустимыми считаются лишь так называемые разумные сигнатуры; при этом в многосортной теории можно использовать обычное эквациональное исчисление одиосортной логики (см [Goguen J., Meseguer J Completeness of many-sorted equational logic. Houston J of Mathematics, 1985, v. 11 (3), p. 307—334]). — Прим перев.
отсюда полуразрешающую процедуру для проблемы тождества в многообразии Ж^8у (В теореме предполагается, что У5 является счетным множеством для любого сорта 5 из ^. Однако для некоторых многообразий можно ограничиться конечными множествами переменных).)
Введем теперь понятия выполнимости и непротиворечивости (или совместности).
Равенство M=N называется выполнимым в алгебре ^, если существует такая ^-интерпретация v :У(М) U Т(М)->- ^, что v(Al) = v(A). Равенство М = N называется выполнимым (в многообразии Ж^8\у если существует такая алгебра ^ е е v<(^), что М = N выполнимо в
В такой форме проблема выполнимости тривиальна: в алгебре Sort выполняется любое равенство. Однако мы можем поставить вопрос иначе: существуют ли нетривиальные алгебры, в которых истинны некоторые равенства? Для того чтобы перейти к такой постановке, предположим, что у нас имеются выделенный сорт boolean и выделенные константы TRUE и FALSE сорта boolean. Будем называть такие сигнатуры сигнатурами с булевым сортом. Например, 2°— сигнатура с булевым сортом.
Пусть 2 — сигнатура с булевым сортом. Множество равенств 8 называется непротиворечивым (совместным), если TRUE=^ ^^FALSE,t- е. если 8 допускает по крайней мере одну модель, для которой носитель сорта boolean есть подлинное множество истинностных значений {true, false}.
Это условие является модификацией соответствующего понятия в эквациональной логике без сортов; там множество равенств 8 считается противоречивым (несовместным), если х=^у (напомним, что все переменные предполагаются связанными кванторами всеобщности). Как и выше, противоречивость рекурсивно перечислима, если множество 8 рекурсивно).
Примеры. Множество 8° непротиворечиво, так как равенство TRUE = FALSE не является истинным б ^° (так же, как и в L).
Равенство х + S (S (#)) = S^х + {у + S(0))) истинно в Ж^8^\ Его истинность доказывается так: х + S(S (уУ =^х + S (S (у + + 0)) =^ S (х + (у + S (0))). Аналогично Ж (^ ^ 0 + S (0) = S (0) и, шире, ж\8^ |= 0 + М = М для любого терма М вида S (S (...S (0)...)). Но Ж (8°) ^ 0 + х = х, так как это равенство
не будет истинным в ^х. По этой же причине коммутативность операции + не будет истинна в Л (^°), несмотря на то что любой основной пример (ground instance) коммутативности является истинным. Хотелось бы как-то ограничить понятие истинности рамками «стандартной модели» ^°. Этому будет посвящен следующий параграф.
ИНИЦИАЛЬНЫЕ АЛГЕБРЫ
И ПРОБЛЕМА СЛОВ
Инициальная алгебра Т^, ^), или просто ^(^), задаваемая множеством равенств 8, определяется как фактор-алгебра алгебры 9 основных термов по конгруэнции =g, ограниченной на основные термы. Читатель может самостоятельно убедиться, что это действительно S-алгебра. (Она является инициальным объектом той категории, объектами которой выступают 2-модели множества 8, а морфизмами — 2-морфизмы, т. е. существует единственный 2-морфизм из 9"(^) в произвольную алгебру Л^8У Подробности см. в работе Гогена, Тэтчера, Вагнера [52].)
Теорема. Т (^) |= М = И тогда и только тогда, когда для любой основной подстановки (ground substitution) о справедливо or(Af) =^g^NY
Другими словами, проблема тождества в ТV§^ —это то же самое, что проблема тождества в ^-многообразии для всех основных примеров этой проблемы. Таким образом обосновывается интуитивное понятие стандартной модели, которое упоминалось выше. Однако, к сожалению, для этого семантического понятия нет простой теории доказательства}) в отличие от понятия истинности в Л^8у Здесь дело обстоит так же, как с арифметикой Пеано первого порядка, с одной стороны, и стандартной моделью Л9 — с другой.
Отметим, что если М и N — основные термы, то эквацио- нальные рассуждения образуют полную систему для решения проблемы слов в инициальной алгебре. В других случаях проблему 9" (8) |= М = И можно решить с использованием той или иной схемы индукции, например по структуре S’, но ни одна схема индукции не позволяет решить проблему тождества для инициальной алгебры в полном объеме. В § 6 мы сформулируем достаточные условия, при которых эта проблема сводится к проблеме противоречивости.
Замечание. В работе Бёрстолла и Гогена [21] множество равенств, истинных в .^(^), обозначается Induce{Th{^)). Алгебра § есть 5Г(0), а ЕГ есть ST (S U Т, 0), рассматриваемые как S-алгебры.
Пример. Алгебра ^(^°) integer совпадает с Л9. Однако алгебра .^(^°) не совпадает с ^°, так как ее булев носитель является более сложным, например 0 # 0 ф^ Е ALSE. Истинность ^ (g’°) [= О + х = х можно доказать с помощью индукции по структуре Steger, которая в данном случае соответствует обычной индукции по целым числам. Аналогично истинность 5" (^о) ^x-V-y = y + x можно доказать с помощью двукратной индукции.
Установим связь между нашими определениями и проблемой слов в конечно представимых алгебрах.
Предположим, что заданы сигнатура S и многообразие, определенное множеством равенств ^. Представление (presentation) над этим многообразием состоит из множества С констант, которые называются порождающими (или образующими) символами (generators), и множества 91 основных равенств, которые называются определяющими соотношениями (defining relations) над Т(2 U С).
Говорят, что пара <С, представляет алгебру ^ (S U С, ^А9?), которая является (S U С)-алгеброй и, следовательно, S-алгеброй. Проблема слов для этого представления, как и выше, заключается в том, чтобы для заданного основного равенства Е над ^(S|JC) выяснить, справедливо ли ^ (5 U С, <^U U 9^) |== Е. Представление называется конечным^, если С и 91 конечны, и рекурсивным, если С и 91 рекурсивно перечислимы.
Равномерная проблема слов (uniform word problem) для многообразия состоит в том, чтобы для заданного конечного представления <С, 9^> и равенства Е над ^“(S U С) выяснить, справедливо ли ^(SUC, (S’U^)H^-
УНИФИКАЦИЯ
Эквивалентные системы, о которых идет речь в этом обзоре, действуют в термальной структуре ^(SU^) или, шире, в структуре ^(SU^, ^), определяемой как S-алгебра ЗГ^ U Г, sy
Проблема унификации ставится как проблема выполнимости в этой алгебре. Точнее, пусть М и N— два терма b^(S U7). Будем говорить, что они 8-унифицируемы, если существует такая подстановка o:F^^(2|J^), что о(М) =gо^N\ Обозна-
чим множество таких подстановок через ^-^(М, N) и назовем его множеством ^-унификаторов 9.
Например, если $ состоит из аксиом Пеано, проблема унификации в точности совпадает с десятой проблемой Гильберта и, таким образом, является неразрешимой (см. [107]). Но если сохранить только сложение, то проблема унификации над целыми числами без умножения будет разрешимой, так как ее можно будет выразить формулой арифметики Пресбургера, а эта теория является разрешимой (см. [134]). В работе Сабо [153] анонсирована неразрешимость проблемы унификации для следующего множества аксиом:
х X кУ + 2) = х X У + х X 2;
кх + у} X 2 = х X 2 + у X 2;
X + ку + 2) = кх + у) + 2.
Как правило, нужно.не только узнать, унифицируемы ли два терма, но и найти множество всех их унификаторов. Конечно, нас не интересуют те унификаторы, которые можно получить из других в результате композиции: на самом деле нужно найти базисное множество, которое порождает все решения проблемы унификации. Наилучшим образом это можко выразить введением упорядочения на множестве подстановок, которое представляет собой распространение упорядочения по насыщению (instantiation ordering), определенного на термах. Для этого дадим следующие определения.
Предупорядочение по насыщению или поглощению (subsumption) ^g определяется над ^(S U^) правилом
Л4<^<^Эсг: Т k^T^N =^о k^Y
Теперь распространим отношение ^§ на подстановки. Сначала напомним, что 2) (о) = {х ^ Т\о(х) 2= х}. Через 2" kG^ будем обозначать U х е s (Оу^ kG kx)Y т. е. множество переменных, вводимых о. Пусть V — произвольное конечное подмножество множества V. Определим предупорядочение ^ (V) на подстановках правилом
a <g o' (V) ^ (Эр) (Vx ^ V) 2 кх} =^ Р (ст (х)).
Пусть М и N— два терма одного сорта и V = Tk^ UTkNY Пусть W — любое конечное множество переменных, содержащее
*) Достаточно полная сводка результатов по проблеме (^-унификации для различных множеств аксиом ^ содержится в работе [Зикманн Й., Сабо Р Универсальная унификация и классификация эквациональных теорий - Кибернетический сборник (новая серия), 21, с. 213—234] —Прим персе
V, т. е. I/^lFcz^. Множество подстановок 5 называется полным множеством $-унификаторов термов М и N вне W, если
<4o^SW^^V и ^(о)ПГ=0;
8^0Ш N\
(Va^^(M, A))(3p^S) p<ga(E).
Первое условие является чисто техническим, второе связано с корректностью, а третье — с полнотой. Легко показать, что полные множества унификаторов всегда существуют (достаточно взять все (^-унификаторы термов М и N и проверить выполнение условия 1).
Полное множество унификаторов S называется минимальным, если оно удовлетворяет дополнительному условию
(Vo, о' ^ S) о =# o' zd o' ^g (o/) (F).
Минимальные полные множества унификаторов существуют не всегда). Если такое множество существует, то оно единственно с точностью до эквивалентности, индуцированной пред- упорядочением ^g.
Наши определения согласуются с определениями Юэ (см. [71]). Определение полного множества унификаторов по Плоткину ([132]) соответствует нашему определению минимального полного множества унификаторов с точностью до незначительных технических деталей. Необходимость введения множества IF связана с тем, что термы М и N можно выбирать из более широкого контекста, содержащего переменные, не входящие в множество V, и мы не хотим смешивать «внешние» переменные с «новыми» переменными, вводимыми унификатором.
Примеры.
Если S = 0, то, как известно, существует наиболее общий (т. е. минимальный) унификатор. Алгоритмы вычисления этого унификатора предложены в диссертации Эрбрана 1930 г. и в работах Робинсона [1*39], Бакстера [5], Мартелли и Монтанари [106]. Все эти алгоритмы не являются линейными; линейный алгоритм предложен Патерсоном и Вегманом в [127] )«
Современное состояние работ по поиску и реализации эффективных алгоритмов освещается в статье [106]. Отношение эквивалентности = , индуцированное отношением ^0, равнозначно переименованию переменных, и соответствующее упорядочение па ^(2U^)/_, дополненное максимальным элементом, образует полную решетку. Унификация соответствует вычислению точной верхней грани на этой решетке. Эти вопросы обсуждаются в работах Плоткина [131], Рейнольдса [137] и Юэ [71]. Унификация — это один из фундаментальных алгоритмов вычислительной логики. Она играет главную роль в таких правилах вывода, как резолюция (Робинсон, [139]) и парамодуляция (Робинсон и Воз, [138]). В § 7 мы воспользуемся унификацией в алгоритме суперпозиции.
Пусть ^ состоит из одной аксиомы ассоциативности для некоторого функционального символа X, т. е. S = {(*Х//) X X 2 = х X (у X 2)}. В этом случае всегда существует минимальное полное множество унификаторов, хотя это множество может быть бесконечным. Например, если М = х X А и N = = А X х, где А — некоторая константа, то S = {{х-<- А X (А X X (• ..ХИХ^) ...))}} U {{х^-А}} является минимальным полным множеством унификаторов термов М и N вне любого множества W. Алгоритм порождения таких полных множеств унификаторов приводится в работе Плоткина [132]. Проблема унификации сводится к проблеме уравнений в словах, алгоритмическая разрешимость которой была недавно установлена Маканиным в [164].
Если $ состоит из аксиом коммутативности и ассоциативности для некоторого функционального символа X» т. е. 8 = ={(%Х У^)Х^ = хХкуХр, хХу = уХ х) и S= {X}, ТО проблема унификации соответствует решению уравнений в свободных абелевых полугруппах. В этом случае всегда существует конечное минимальное полное множество унификаторов. В работе Стиккела [151] описан алгоритм построения этого множества. Алгоритм остается корректным и для более общей задачи: множество ^ может состоять из коммутативных и ассоциативных законов для нескольких функциональных символов, а сигнатура 2 может содержать и другие (свободные) функциональные символы. Но пока не доказана остановочность алгоритма Стиккела в том случае, когда арность некоторых свободных символов больше нуля !).
Исследовались также другие теории: коммутативности ([146]), идемпотентности ([136]); коммутативности, ассоциативности и/или идемпотентности с нейтральным элементом или без него ([152], [164]). В § 12 мы опишем общий метод построения полного множества унификаторов для широкого класса теорий, включающего теорию групп. Алгоритм унификации для теории абелевых групп приводится в работе* Ланкфорда [92]. Однако его алгоритм не всегда останавливается, если допускаются «внешние» функциональные символы (Стиккел, частное сообщение)).
Односторонняя унификация (one-way unification), при которой подстановка применяется лишь к одному из термов, называется выравниванием (matching). Подстановка о называется ^-идентификатором (^-match) термов М и N, если а (Л4) =g (/V). Полное множество $-идентификаторов термов М и N вне W определяется так же, как для унификации, с единственным отличием: условие 3)(о) ^ V в 1) заменяется на S)(o) ^Z(M) \ \ Г (А). Такое множество всегда существует, когда Т(М) П ПГ (А) =0.
Унификация изучалась и для языков высших порядков). Алгоритм унификации для языков порядка со предложен в работах Юэ [70], [71], а для языка третьего порядка доказана неразрешимость задачи унификации (Юэ, [69]). Монадическая) унификация для языка второго порядка является разрешимой* так как она эквивалентна ассоциативной унификации, но задача полиадической унификации для языка второго порядка неразрешима, как показано в работе Голдфарба [53].
СИСТЕМЫ ПЕРЕПИСЫВАНИЯ ТЕРМОВ
Теперь мы готовы приступить к описанию одной из главных парадигм вычислений с равенствами — использования их как правил переписывания термов. Эта парадигма лежит в основе разрешающих процедур, использующих канонические формы, а
также построения абстрактных интерпретаторов ориентированных равенств, рассматриваемых как язык программирования.
Системой переписывания термов !) (term rewriting system) (над 2) называется такое множество ориентированных равенств 91 = {Xf-^pjz г /}, что для любого ориентированного равенства из J? справедливо Т(р) Со
отношением редукции ->д^ соответствующим ^?, называется наименьшее бинарное отношение над 2Г, содержащее 91 и замкнутое относительно подстановки и замены. Таким образом,
М^^^оСМ)^^^),(1)
М->^Ы^Р\и<-М\->Р\и^- -ЛД(2)
Это равносильно тому, что - >j? — наименьшее отношение, содержащее все такие пары <а(%), а(р)>, что Х^р^9?, и замкнутое относительно замены (2).
Пример. Если 9?={А-^В, F(B, x)^G(x, .г)}, то
Далее вместо ->^ мы будем использовать обозначение Транзитивное замыкание отношения ^- будем обозначать через ->■+, транзитивное и рефлексивное замыкание — через -^*, а симметричное замыкание — через -<->. Отметим, что отношение совпадает с ^-равенством =^э если рассматривать 91 как множество равенств. Наоборот, любое множество равенств 8 можно преобразовать в систему переписывания термов .% над расширенной сигнатурой 2Z таким образом, чтобы отношение ■<->* было консервативным расширением равенства =^. (Тогда для любых термов М и N из ^(2U^) утверждения М—^ N и равносильны.) Это преобразование заключается в следующем: для каждого равенства М = N из $ недетерминированным образом выбирается одна из следующих инструкций:
если Т (7И) е Т (W), включить NМ в ^;
если Т (N) е V кМ\ включить M->N в 91;
для {хь . .., х^ = Т (Л1) П Т (N) ввести в 2' новый оператор Н соответствующего типа и включить в 91 правила М-^Р и N->P, где Р = Н(хг, . xnY
(Отметим, что выполнение этой инструкции может привести к тому, что некоторые сорта, которые не были строгими в 2, станут строгими в 2Z. При этом в сигнатуру 2Z, возможно, придется добавить новые константные символы, чтобы она стала
^ Или системой подстановок термов (СПТ).— Прим перев.
разумной. Кроме того, не все S-алгебры, которые были моделями ^, можно будет дополнить до S'-алгебр, так как соответствующие носители могут оказаться пустыми.)
Основное отличие систем переписывания термов от равенств заключается в том, что равенства выражают отношение равенства (являющееся симметричным), а в системах переписывания термов равенства рассматриваются как несимметричные правила замещения, выполняемые в одну сторону. Кроме того, в системе переписывания термов используются только такие подстановки, которые находятся путем сопоставления с образцом (pattern matching). Эквациональная полнота дедуктивной системы правил переписывания описывается свойством Чёрча — Россера:
Система Ж называется системой Чёрча — Россера, если для любых термов М и N утверждение M=^N равносильно существованию такого терма Р, что М *Р и N *Р.
Эквивалентным свойством является конфлюентность:
Система 5? называется конфлюентной, если для любых термов М, N и Р, таких, что Р-^*М и P-^*N, существует такой терм Q, что М -►• *Q и N-^*Q.
Будем говорить, что терм М нередуцируем, или находится в нормальной форме (по отношению к системе ^?), если не существует такого терма N, что M-^N; другими словами, ни один из подтермов терма М не является примером левой части ни для одного из правил системы ^. Утверждение «N является нормальной формой М» означает, что M-PN и N находится в нормальной форме относительно ^.
Если ^ — система Чёрча — Россера, то нормальная форма терма единственна (если она существует). Достаточным условием существования такой канонической формы является завершение всех переписываний.
Система ^? называется нётеровой или конечно остановочной (finitely terminating), если ни для какого терма М не существует бесконечной цепочки редукций, начинающейся в М : М =
Пусть М| — нормальная форма, полученная из М в результате произвольной последовательности редукций.
Если J?—конфлюентное и нётерово конечное множество правил, то эквациональная теория =^ является разрешимой, так как в этом случае М =&N тогда и только тогда, когда Л1ф = = ^|. Конфлюентные и нётеровы правила переписывания предоставляют достаточно общий метод решения проблемы тождества для разрешимых многообразий.
Свойство конфлюентности не является разрешимым для произвольных термальных систем переписывания. Если бы это было не так, проверкой на конфлюентность можно было бы воспользоваться, например, для решения вопроса об эквивалентности рекурсивных схем программ. Разрешимость конфлюентности для основных термальных систем переписывания остается открытой проблемой1). Сейчас мы покажем, что конфлюентность разрешима для нётеровых систем.
Первый шаг в этом направлении заключается в том, что для нётеровых систем показывается .эквивалентность свойств конфлюентности и локальной конфлюентности. Система ^? называется локально конфлюентной, если для любых термов М, N и Р из того, что Р—^ М и P-^-N, вытекает, что существует такой терм Q, что М *Q и N *Q.
Теорема Ньюмена. Пусть 91 — нётерова система переписывания термов. Система 91 конфлюентна тогда и только тогда, когда она локально конфлюентна.
Эта теорема впервые была доказана Ньюменом в [121]; простое доказательство получено в работе Юэ [72]. Различные эквивалентные этой теореме или родственные ей «леммы о ромбе» приводятся, например, в работах Хиндли [66], Кнута и Бендикса [84], Нива (122], Ахо, Сети и Ульмана [2], Ланкфорда [89].
Второй шаг заключается в доказательстве разрешимости локальной конфлюентности (конечной) термальной системы переписывания. Проведем это доказательство.
Алгоритм суперпозиции.
Пусть Х-э-р и Х'-^р/— два правила из 91. Предположим, что переменные переименованы таким образом, чтобы у X и X' не было общих переменных. Пусть и — такая позиция в X, что Х/и— не переменная, и термы Х/и и Xz унифицируемы с наиболее общим унификатором о (конечно, мы предполагаем, что Х/и и Xz имеют одинаковый сорт). Тогда будем говорить, что пара термов <o(X[z/^-pz]), о(р)> является критической в 91.
Пример. Рассмотрим правила F(x, G^x, Н(//)))-> К(х, у) и О (Л, z)-^* L^z). Можно выполнить суперпозицию первого правила во второй позиции со вторым правилом с наиболее общим унификатором {г->*//(</), х^Ау При этом мы получим критическую пару
^(АЛ^НШ-КИ.у^.
9 Положительное решение этой проблемы получено в работе [Oyamaguchi М. The Church — RoSser property for ground term rewriting systems is decidable — Theoret. Comp. Sci, 1987, v. 49, p. 43—79]. — Прим, nepee.
Если система ^? конечна, то существует лишь конечное число таких критических пар. Они эффективно вычисляются с помощью стандартного алгоритма унификации.
Теорема Кнута—Бендикса. Система 91 локально конфлюен- тна тогда и только тогда, когда Р| = Q| для любой критической пары <Р, Q> в 91.
Первоначальная идея этой теоремы принадлежит Кнуту и Бендиксу (см. [86]), объединившим ее с теоремой Ньюмена (см. также [91]). Данная формулировка, не использующая нё- теровость, приводится в работе Юэ [70].
Теоремы Кнута — Бендикса и Ньюмена позволяют получить разрешающую процедуру установления конфлюентности нётеро- вой системы переписывания термов с конечным числом правил. Если система 91 удовлетворяет условию теоремы Кнута — Бендикса, то 91 определяет каноническую форму соответствующей эквациональной теории =^. В этом случае будем называть 91 полной или канонической системой переписывания термов.
Существуют и другие достаточные условия конфлюентности систем переписывания термов, не требующие, чтобы любая последовательность редукций была конечной. Большинство этих условий опираются на более сильное свойство строгой конфлюентности, являющееся достаточным для конфлюентности. Система 91 называется строго конфлюентной, если для любых термов М, N и Р из того, что P^N и Р-^-М, следует существование терма Q, для которого M^eQ и N^eQ, где обозначает рефлексивное замыкание отношения -^.
Терм М называется линейным, если каждая переменная встречается в М не более одного раза. Пусть для любого правила Х^р из 91 его части X и р линейны. Тогда система 91 является строго конфлюентной в том случае, если для любой критической пары <Р, Q> в 91 существует такой терм R, что Р *^ -^eR и Q^eR (см. [73]). Однако линейность р — это не очень естественное условие. В следующей, более полезной теореме требуется только линейность левых частей правил из Й. Обозначим через -Н--> параллельную редукцию по правилам из 91 в не- пересекающихся позициях.
Теорема (Юэ [69]). Если для любого правила Х-^р терм X является линейным и для любой критической пары <Р, Q> справедливо P-^^Q, то отношение -Н-^ строго конфлюентно и, следовательно, 91 — конфлюентная система.
Эта теорема обобщает главную теорему из работы Розена [141], охватывающую только основные системы. Она показы-
вает, в частности, что леволинейная (left-linear) термальная система переписывания, не имеющая критических пар, является конфлюентной. Такие рекурсивные определения будут, следовательно, детерминированными (однозначными, или функциональными.— Перее.). Они обобщают как обычные рекурсивные схемы, так и определения, подобные примитивно рекурсивным.
ОСТАНОВОЧНОСТЬ
Для того чтобы упростить обсуждение и обозначения, будем в дальнейшем считать, что у нас есть только один сорт, что сигнатура 2 конечна и 9 ^ 0. Главная проблема, связанная с тестом Кнута — Бендикса на конфлюентность, заключается в доказательстве остановочности (termination). Напомним, что система 91 называется нётеровой, если не существует терма М; с которого начинается бесконечная цепочка редукций М = Мх->- ->-М2-^... . Установление нётеровости системы 9 является ключевой проблемой, так как без этого локальная конфлюентность ни о чем не говорит. Например, система 91= ^А^ В, А-^С, В^А, В-^ D) является локально конфлюентной, но тем не менее терм А имеет две разные нормальные формы С и D. В работе Юэ и Ланкфорда [75] показано, что задача распознавания нётеровости произвольной системы переписывания термов является неразрешимой. Однако там же доказано, что задача распознавания нётеровости разрешима для основных систем.
Сначала заметим, что система 91 является нётеровой тогда и только тогда, когда не существует основного терма М, с которого начинается бесконечная последовательность редукций (напомним, что, согласно нашему предположению, множество 9 непусто). Таким образом, система 91 является нётеровой тогда и только тогда, когда отношение —^ определяет на S частичное упорядочение с условием обрыва убывающих цепей (well-founded partial ordering). На этом основан следующий общий метод доказательства нётеровости.
Пусть )> — произвольное частичное упорядочение (т. е. транзитивное и иррефлективное) на S, такое, что
х* удовлетворяет условию обрыва убывающих цепей, т. е. не существует бесконечной последовательности основных термов вида Мх >> М2 >- ...;
M->N^M>N.
Тогда очевидно, что 91— нётерова система. Обратно, если система 91 нётерова, то отношение ~^+ удовлетворяет условиям (1) И (.2).
Предлагались различные уточнения этой схемы. Остановимся на некоторых из них.
А. Метод отображения в упорядоченное множество с условием обрыва убывающих цепей )
Пусть S) — произвольное множество, на котором определено частичное упорядочение ^з, удовлетворяющее условию обрыва убывающих цепей. Метод заключается в том, что подбирается подходящее отображение ср :S-^S), с помощью которого определяется искомое упорядочение ^> на 3*.
M>N^^^ >2>^М\
Условие (1), очёвидно, выполняется. Остается доказать выполнение условия (2). Наоборот, если ^?—нётерова система, возьмем в качестве 2 множество 3, в качестве >^ — отношение -^+, а в качестве ф— тождественное отображение. Если же отношение ->- является конечно ветвящимся (например, когда система ^ конечна), то нётеровость можно доказывать описанным выше методом, где 2—множество натуральных чисел N с обычным упорядочением >, а ф(Л1)—длина наибольшей (по числу элементов) последовательности редукций, начинающейся с М (ф(М) всюду определено по лемме Кёнига).
Однако суть дела заключается в доказательстве выполнения условия (2), и это не очень приятно, так как оно универсально квантифицировано по всем возможным редукциям M^N. Полезно заметить, что (2) вытекает из следующих условий (3) и
....
М> N => F (Р ,M,Q)> F (Р ,N ,Q)для любого оператора
F из 2 и любых последовательностей основных термов Р и Q;
а(А))хг(р) для любой основной подстановки о и правила Х-^р из Я.
Условие (3) означает, что отношение )> совместимо со структурой 2-алгебры. Это подсказывает следующую модификацию рассматриваемого метода.
Метод возрастающей интерпретации )
Выберем в качестве 2 2-алгебру, а в качестве ф— единственный 2-гомоморфизм из 3 в 2. Тогда (3) следует из соответствующего свойства алгебры 2*. каждый оператор из 2 интерпретируется в 2 отображением, строго возрастающим по каждому аргументу:
(Vx, у е 2^ ^и, v е 2} х ^>3 у^Рки,х^>>зРки,у^.
Если задана такая возрастающая интерпретация сигнатуры 3, то остается только доказать выполнение условия (4) или его более строгого аналога в 3)\
(УЛ->р^5?) 3) р.
В действительности (4) и (6) предполагают разные методы доказательства: (4) предполагает использование структурной индукции в S, а для доказательства более сильного условия (6) нужно воспользоваться нётеровой индукцией в 2).
Метод возрастающей интерпретации был предложен Манной и Нессом в [105], а также Ланкфордом в [89] для специального случая полиномиальной интерпретации над целыми числами.
Пример. Для десяти редукционных правил теории групп, которые приводятся в приложении, остановочность можно доказать с помощью следующей возрастающей интерпретации над множеством целых чисел, больших единицы:
х + </ = хХ(1 +2Х yY
I (х) = х2;
0 = 2.
Однако доказательство условия (6) в этом случае не столь очевидно, так как должно включить, например, обоснование того, что для Ух, у е N из х > 1, у > 1 следует х2(1 + ^уУ >. >У2(1 + 2х2). На самом деле задача установления истинности утверждений вида (6) для интерпретаций полиномами над целыми числами алгоритмически неразрешима. Это препятствует практическому использованию указанного метода даже в том случае, если пользователю удастся подобрать правильную интерпретацию. ,
Конечно, полиномиальных интерпретаций в общем случае недостаточно, так как они дают полиномиальную верхнюю оценку сложности вычислений, проводимых с помощью системы ^?, которая интерпретируется как программа над целыми числами, в то время как системы переписывания термов могут задавать произвольные рекурсивные функции. Этот аргумент распространяется и на примитивно рекурсивные меры сложности, как заметил М. Стиккел.
Однако в полном объеме метод возрастающих интерпретаций является общим методом, поскольку, если система 5? нётерова, то само множество S как 5-алгебра определяет возрастающую интерпретацию, если в качестве ^^ взять отношение —>+ Вместе с тем нельзя ограничиться полными упорядочениями; напри-
мер, А и В должны быть несравнимыми в любой возрастающей интерпретации, которая показывает остановочность ^? = = {^(Д)^(В), G (В) G (Д)}. Поэтому даже порядковых чисел здесь в общем случае недостаточно !).
Покажем, как можно модифицировать условие (1). Определим на множестве $ отношение гомеоморфного вложения ^1 с помощью индукции: -
F(M[, .. ., Мп) ^1 N тогда и только тогда, когда существуют такой подтерм F{Ni, ... , Nn) терма N и такая перестановка л последовательности (1, 2, ... , /г), что Mt ^1 Nn^ для любого t, 1 /г.
Теорема Крускала. Для любой бесконечной последовательности Мь М2, ... основных термов из S существуют такие I и jf I < /, что Mi ^ | Mj.
В работах [87] и [117] доказаны более общие теоремы (в которых не требуется, чтобы сигнатура 5 была конечной). Теорема Крускала подсказывает замену условия (1) более сильным условием
M<LV=>1(M>7V).
Наконец, Дершовиц в [33], [34] показывает, что (7) следует из (3) и условия
F^P,M,Q)>M.
Эти рассуждения обосновывают следующий метод.
Метод упрощающего упорядочения )
Пусть ^> — произвольное частичное упорядочение на 3, удовлетворяющее условиям (3) и (8). (Будем называть его упрощающим упорядочением.) Тогда система 91 является нётеровой, если выполняется условие (4).
Этот метод впервые был предложен в работах Дершовица [33], [34]. Опишем его важное приложение.
Сначала напомним, что частичное упорядочение ^> на множестве qp можно обобщить до частичного упорядочения Э> на множестве мультимножеств над qp (т. е. на множестве отображений qp->7V) следующим образом: S )> S' тогда и только тогда, когда S=#S' & (Vx е ф) [S' (х) > S(х) =>-(Зу > х) S(z/) > S'(у)1-
Частичное упорядочение ^ множества конечных мультимножеств над qp удовлетворяет условию обрыва убывающих цепей
*) Поскольку всякое множество порядковых чисел вполне упорядочено. —* Прим, перев.
тогда и только тогда, когда этому условию удовлетворяет упорядочение )> множества qp (см. [35]). Упорядочение мультимножеств представляет собой обобщение лексикографического упорядочения, которое получается в том случае, если )> — линейный порядок.
Теперь определим на S перестановочную эквивалентность ~ следующим образом: М ~ N тогда и только тогда, когда для некоторого F из 2 справедливо M = F^MX, ..., МД, N = = F(N[t ... , N Д и существует такая перестановка л последовательности 1, 2, . .. , п, что Mi ~ NK для всех 1 ^ I ^ п.
Для М = F(Mb ..., МД обозначим перестановочный класс М через ^{AIi, ..., МД. Пусть >>2 — произвольное частичное упорядочение на множестве операторов 2. Зададим на 5/~ упорядочение рекурсивного пути (recursive path ordering) с помощью следующего рекурсивного определения:
М = F {Мн .. ., МД > N = G {Nx, . . ., *Np^ если выполняется одно из следующих условий:
F = G и Ш, ..., MJ»{^, МД;
F>^G и (^i^p)M>Npt
иначе (3/ ^ п) М, ^ jv, где М^М означает, что М^М или М = N.‘
Упорядочение рекурсивного пути обобщает упорядочения, введенные в работах [130], [79], [35]. Определив теперь М )> )> N как М^М, получим следующую теорему.
Теорема. Отношение )> представляет собой упрощающее упорядочение.
В работе [34] приводится доказательство несколько более общего утверждения, допускающего бесконечные сигнатуры, которые, в свою очередь, могут содержать операции с плавающей арностью (varyadic operations).
Только что сформулированная теорема позволяет предложить весьма общий метод доказательства нётеровости системы ,^.
Метод упорядочения рекурсивного пути !)
Нужно угадать подходящее упорядочение )>$ и доказать (4), используя соответствующее упрощающее упорядочение.
Конечно, Этот метод еще не дает полностью автоматического способа проверки условия (4), так как оно универсально кван-
9 В оригинале recursive path ordering method. — Прим, перев.
тифицировцно по всем основным подстановкам. Что нам здесь необходимо, так это возможность рекурсивного определения такого упорядочения )> на основных термах, которое допускает расширение до упорядочения )> на термах общего вида, — в том смысле, что из N вытекает о (М) )> о (Л1) для любой основной подстановки о.
Мы в состоянии сделать это в ограниченном объеме. Во-первых, условие (с) в приведенном выше определении не зависит от термов Мк, k^j, поэтому эти позиции можно занимать неосновными термами. Во-вторых, условия (3) и (8), которые выполняются в силу последней теоремы, универсально квантифицированы по Р и Q, поэтому в них также допустимы неосновные термы. Таким образом, упорядочение рекурсивного пути распространяется на термы общего вида. Условие (3) получается непосредственно с помощью этого метода, а условие (8) можно получить следующим образом. По возможности зададим упорядочение рекурсивного пути > на неосновных термах, т. е. на 9~/~. (Мы расширяем отношение ~, включая х ~ х для любой переменной х.^ Добавим к введенным выше условиям (а), (Ь), (с) еще одно условие:
(d) М^ х тогда и только тогда, когда М ^ Т и х ^VVMY Читателю должно быть очевидно, что если М )> N в смысле нового определения, то о(Л1) )> о(Л1) для любой основной подстановки о в смысле старого определения (в (d) нужно воспользоваться индукцией по М и условием (8)). Будем называть новое упорядочение обобщенным упорядочением рекурсивного пути (generalized recursive path ordering). Проведенные рассуждения обосновывают следующий метод.
Метод обобщенного упорядочения рекурсивного пути ])
Пусть >-2 — некоторое частичное упорядочение на 2, а )> — обобщенное упорядочение рекурсивного пути, определенное выше. Если для всех правил р из 5? имеет место X )> р, то 91— нётерова система.
Пример (дизъюнктивная нормальная форма). Пусть
ПП (х)) ->х;
КхУуЫМЛКу);
l(xA!/HnWVKj);
х Л (У V г) -> (х л у) V (х Л z);
(у V г) Д х-> (у Д х) V (г Л х\
*) В оригинале generalized recursive path ordering method.—Прим, перед.
Выберем 1>sA>sV Предлагаем читателю самостоятельно доказать, что для любого правила %->р из 91 справедливо Х)>р, и тем самым установить нётеровость системы 91. Отмстим, что эти рассуждения позволяют полностью автоматизировать (в рамках алгоритма обобщенного рекурсивного пути) доказательство, приведенное в [34].
Другие рекурсивные упорядочения на термах общего вида, расширяющие упрощающие упорядочения (например, поверхностное упорядочение), определяются в работе Плсйстсда [129].
В заключение обсуждения упрощающих упорядочений заметим, что у этого класса есть семантический аналог, модифицирующий метод возрастающей интерпретации.
Метод гомеоморфной интерпретации 9
Этот метод заключается в выборе S-алгебры Ф с заданным на ней частичным упорядочением )>£> и проверке условия возрастания (5) и нового условия
(Vx ^ S>) (Vw,u ^ Ф)Р (u,x,v) ^sx для любого оператора F в S. Если при этом выполняется условие (6), тогда система 91 нётсрова. Обоснование данного метода достаточно прозрачно: пусть ф — единственный S-гомоморфизм из ^ в 2), и пусть упорядочение )>на® определено как Л4 > Af <=> ф (Л4) ^^ )>^ф(Лг). Условие (2) следует из (5) и (6). При этом (1) является просто следствием (7), которое, в свою очередь, вытекает из (6) и (9). Таким образом, здесь нс нужно требовать, чтобы упорядочение ^^ удовлетворяло условию обрыва убывающих цепей.
Этот метод открывает новые практические возможности доказательства остановочности систем переписывания термов, если выбирать такие алгебры, для которых условие (6) разрешимо. Например, Дершовиц в [33] предлагает использовать этот метод, выбирая в качестве Ф действительные числа с полиномиальными операторами. Он показывает, что условия (5), (9) и (6) разрешимы в этой системе, пользуясь методом Тарского (см. [154]). Более того, проблема существования полиномов ограниченной степени, разрешающих нётеровость 91, сама является разрешимой. Практическая ценность этого метода зависит, конечно, от того, насколько доступны соответствующие разрешающие процедуры (см. работы Коэна [26] и Коллинза [28]). Использование интерпретаций над действительными числами было впервые предложено Ланкфордом в [89].
9 В оригинале homeomorphic interpretation method. — Прим, псрев.
В заключение этого параграфа рассмотрим обобщение упрощающих упорядочений до предупорядочений, т. е. транзитивных и рефлексивных отношений. Пусть > — предупорядочение на ^, удовлетворяющее условиям упрощения:
(3Z) M>N ^F<P,M^><Kn,QY
(8Z) F(P,M,Q)>M.
Будем называть ^ упрощающим предупорядочением (simplification pre-ordering). Положив M^N, если M ^ N и неверно, что N^M, получим следующий метод.
Метод упрощающего предупорядочения J)
Пусть ^ — упрощающее предупорядочение. Если выполняется (4), то 5?—нётерова система. Корректность этого метода доказывается в [34], где также сообщается, что метод можно использовать для доказательства корректности рекурсивного упорядочения, описанного в работе [84].
9. КОМПИЛЯЦИЯ КАНОНИЧЕСКИХ ФОРМ
Теорема Кнута — Бендикса из § 7 даст условия, при которых эквациональная теория принимает каноническую форму следующего вида.
Пусть ^ — конечное множество равенств, представляющее собой базис (аксиомы) теории. Если существует такая каноническая система переписывания Ft, что
(VM = ^ ^^)^(M) = FZ(N),
(V^ >pe^?)X=^p
(где St(M) означает единственную нормальную форму М, получаемую в результате применения к М произвольной последовательности редукций из ^?), то Ft(M)—каноническая форма М в теории =$ в том смысле, что
Отмстим, что в этом случае мы получаем разрешающую процедуру для проблемы тождества в ^(^) и, как следствие, разрешающую процедуру для проблемы слов в FT (^).
В § 7 было показано, как проверять локальную конфлюент- ность с помощью критических пар, а в § 8— как проверять нё-
*) В оригинале simplification pre-ordering method. — Прим, иерее.
теровость ^?. Сейчас мы опишем алгоритм, который пытается построить систему 9^ удовлетворяющую для заданного множества равенств $ условиям (1) и (2).
Алгоритм пополнения
Пусть $t — множество равенств, 9h— система переписывания термов, i е N. Пусть в начальный момент ^0 = 9li = 0 и / = 0.
L Если ^ = 0, то остановиться с ответом ^? = ^. Иначе выбрать М = N из St и взять в качестве Л4| и Л/| нормальные формы М и N соответственно относительно текущей системы 9^. Если 7И| = 1Ц, положить Sw = ^i\ {Л4 = Л^}, 91цл = 911, увеличить i на единицу и перейти к 1; иначе перейти к 2.
Выбрать недетерминированным образом одну из следующих инструкций:
если T^M\^^TVNW то положить X = N\, р = М|;
если T\N^^T^M>,y то положить Х = Л4ф, р = А|.
Если ни (а), ни (Ь) неприменимы, то остановиться по неудаче.
В противном случае положить SV = {V = pz | V -> р^ 91. и V или pz содержат в качестве подтерма некоторый пример X}. Затем положить^ = (9£. \ <^^) U {А -> р} и перейти к 3.
Если система 9LV не нётерова, остановиться по неудаче. Иначе положить ^.+1 = 9lrp Sw = (^. \ {М = N^ U ^ U {Р = = Q|(P,Q)— критическая пара для 9?i+i}. Увеличить-/ на единицу и перейти к 1.
Алгоритм пополнения предложен в работе Кнута и Бендикса [84]. Его корректность обосновывается следующим образом1): (i) для любой итерации / отношение =^zug. совпадает с =^; (ii) каждая система 9U является нётеровой, и каждое правило Х-^р из 9li таково, что р — нормальная форма относительной, а X—нормальная форма относительно ^?f\{A,-^p}; (iii) если алгоритм успешно завершает работу, то результирующая система 91 является локально конфлюентной, поэтому для нее выполняются сформулированные выше условия (1) и (2).
’) Строгое исследование корректности алгоритма Кнута — Бендикса проведено в работе [Huet G. A complete proof of correctness of the Knuth and Bendix completion algorithm. J. of Comput. and Syst sci., 1981, v. 23, p. 11—22]. Более общая техника, позволяющая обосновывать различные уточнения и модификации алгоритма Кнута — Бендикса, предложена в работе [Bachmair L, Dershowitz N., Hsiang J. Ordering for equational proofs. — Proc. 1986 Symp. on Logic in Comp. Sci., p. 346—З^]. — Прим, перев.
Отметим, что это недетерминированный алгоритм, так как он включает возможность выбора. Он может успешно завершить работу, остановиться по неудаче или вовсе никогда нс остановиться. Однако мы предусмотрительно оставили ему единственную возможность нс завершить работу — из-за бесконечного продолжения внешней итерации, а этого можно избежать, установив верхнюю границу для I.
Этот алгоритм допускает различные усовершенствования. Например, достаточно вычислять только те критические пары системы 5?н-ь которые не были, получены в качестве критических пар SU. Оставляем эти детали читателю.
Существуют различные варианты неудачи. Если на шаге 2 неприменимы ни (а), ни (Ь), можно начать процесс заново, пополнив сигнатуру 2 и множество равенств ^ до 2' и 8Г соответственно следующим образом. Пусть {хь ..., Xn\=T^M^V\ П^(Л^). Добавим к 5 оператор Н типа t(xi), ..., т(хд)->- ->т(х), а к ^ — равенство H(xi, ..., xrt) = ;M|. Как мы уже говорили, при таком расширении сигнатуры в многосортном случае могут понадобиться новые константные символы, чтобы полученная сигнатура оказалась разумной. Но в любом случае новая эквациональная теория будет консервативным расширением старой теории, т. с. для любых термов Р и Q над 2 отношение p=^,Q справедливо тогда и только тогда, когда P=tQ Интуитивно ясно, что новые равенства — это просто определения новых символов. Эти определения корректны, поскольку из ТИф = =zN | следует, что в любой 2-модели 8 значение /Иф зависит только от интерпретации переменных хь Теперь, когда алгоритм пополнения работает с 8Г, ситуация меняется, поскольку новое равенство позволяет образовать новую редукцию М^ -*- Н (х\, ... ... , х^ и если выбрано равенство М = N, применима инструкция (а). Новая система может и в самом деле сходиться, как показывают некоторые примеры в [82]. Эту модификацию можно реализовать, заменив остановку по неудаче на шаге 2 следующей инструкцией:
положить 8i+i = (8i\ {М = N}) U ({ЛЦ = Н(хь ..., хл), //^ = H(xit .. ., Хи)}, ^+! = Ж, увеличить на единицу и перейти к 1.
Неудача возможна также на шаге 3, если мы устанавливаем, что система ^ нс является нётеровой. Это может произойти по трем причинам.
Мы неправильно выбрали ориентацию некоторого правила на шаге 2; другой выбор может привести к успешному окончанию вычислений.
Метод установления нётсровости, используемый на шаге 3, является гедостаточно общим, т. с. система 91*г на самом деле
является нётеровой, но наш метод этого не показывает. Для успешного пополнения может быть необходим более мощный метод.
Любой выбор на шаге 2 приводит к системе 91ь которая не является нётеровой. Такая «непоправимая» неудача происходит, например, когда алгоритм сталкивается с симметричной аксиомой типа аксиомы коммутативности. Эго, очевидно, главный камень преткно-вения данного метода: он неприменим к теориям с такими перестановочными аксиомами (см., впрочем, § 14).
В приложении приводится реализация Ж-М. Юлло алгоритма пополнения для аксиом теории групп. Для проверки нётеровости используется упорядочение Кнута — Бендикса.
РАЗРЕШИМОСТЬ И СЛОЖНОСТЬ
ПРОБЛЕМЫ СЛОВ
Проблемы слов широко изучались в логике; результаты по разрешимости можно найти в работах Тарского [154], МакНалти [НО] и Эванса [44].
Например, когда S — стандартное множество аксиом теории групп Group = (х + 0 = х, х + (—х) = 0, Vх + У) + 2 = х + + (// + ^)}, некоторые проблемы слов (а значит, и равномерная проблема слов) являются неразрешимыми. В свободной группе с со образующими, т. е. в Т(2 U Т, Group), проблема слов разрешима. Алгоритм Дэна (см. [32], [57]) позволяет решать проблемы слов в семействе представлений групп.
Изучалась также вычислительная сложность некоторых разрешимых проблем слов. Для абелевых полугрупп равномерная проблема слов является разрешимой (см. работы Мальцева [165] и Емеличева [163]); Кардоза, Липтон и Мейер в [23] доказали, что эта проблема полна в классе с экспоненциальной памятью относительно сводимости с логарифмической памятью. Еще ряд результатов можно найти в статьях [103], [111].
Подробно изучена равномерная проблема слов для = 0, т. е. в многообразии всех 2-алгебр. Эта проблема состоит в том, чтобы выяснить, вытекает ли некоторое основное равенство из заданного множества основных равенств вследствие подстано- вочности отношения равенства, и, таким образом, является также проблемой разрешимости для бескванторной теории равенства с неинтерпретированными функциональными символами. (Например, нужно определить, следует ли ^а) = а из {f(f(f(^))) = я, f(f(f(f(f(a))))) = я}.) Аккерман доказал в [1], что эта проблема разрешима, но не предложил практического алгоритма.
Проблема сводится к задаче построения «конгруэнтного замыкания» некоторого отношения на графе. Пусть G = (V, £) — ориентированный граф с отмеченными вершинами, возможно с кратными ребрами. Обозначим через Z(d) отметку вершины и, а через д(у) ее степень исхода (outdegree), т. е. число ребер, выходящих из у. Ребра, выходящие из вершины, упорядочиваются. Пусть ^[z], l^z^d(y), обозначает z-ro наследника щ т. е, вершину, в которую направлено z-e ребро. Вершина и называется предшественником щ если и = и\1\ для некоторого I. Так как допускаются кратные ребра, возможно, что и [z] = и [/] для i^j. Пусть п— число вершин графа G, a m — число ребер. Предположим, что п = О(т).
Пусть ~ — некоторое отношение на V. Две вершины, и и и, назовем конгруэнтными относительно ~, если К (и) = Му)> 6 (и) =д(у) и и ViA ~ ^[z] для любого z, 1 ^ z ^ Ь(и). Будем говорить, что отношение ~ замкнуто относительно конгруэнций, если для любых вершин и и v, конгруэнтных относительно ~, справедливо и ~ о. Конгруэнтным замыканием отношения ~ называется наименьшее отношение эквивалентности, замкнутое относительно конгруэнций и содержащее ~.
Связь между равномерной проблемой слов и конгруэнтным замыканием описывается следующей теоремой (см. [145], [Н8]).
Теорема. Пусть 8 — множество определяющих равенств алгебры. Предположим, что мы хотим выяснить, следует ли равенство М = N из <d. Пусть G — ориентированный граф, соответствующий множеству термов, которые встречаются е § и равенстве M = N, и пусть 0(Р)—вершина графа G, соответствующая, терму Р. Пусть ~ — конгруэнтное замыкание отношения {<0(<7), 0(К)>} по всем равенствам U = V, встречающимся в 8. Тогда М = N следует из ^ в том и только в том случае, если 0(Л4) - ®<NY
Козен в [85] показал, что проблема слов принадлежит классу Р (т. е. решается за полиномиальное время). Нелсон и Оппен в [118] доказали, что эта задача решается за время О^п2^ а Дауни, Сети и Тарьян в [38] показали, что ее можно решить за время O(/rlog2M). (Их алгоритмы используют линейную память, а полученные оценки времени справедливы независимо от того, получают ли алгоритмы входные данные по одному биту (в режиме online) или сразу (offline)). Однако все еще остается открытым вопрос, решается ли проблема слов за линейное время.
Канонические системы переписывания термов можно использовать для решения проблемы слов в алгебрах, если алгоритм
пополнения из § 7 успешно завершает работу с начальным множеством равенств, составленным из аксиом многообразия и представления алгебры.
Кроме того, алгоритм пополнения можно использовать для решения равномерной проблемы слов, если он успешно завершает работу для всех представлений, входящих в проблему. Это имеет место,, например, в том случае, когда многообразие состоит из всех S-алгебр, а для доказательства нётеровости используется простое лексикографическое упорядочение (Ланкфорд, частное сообщение). Здесь задачи суперпозиций левых частей равенств и редукции термов сводятся к поиску общих подвыражений в множестве равенств. Последняя задача фактически является задачей конгруэнтного замыкания, и, значит, ее решение гарантированно достигается за время О (п log2 п) над памятью О (я).
Бюккен в [17] доказал, что алгоритм пополнения в применении к аксиомам теории групп и такому представлению группы, к которому применим алгоритм Дэна, завершает работу. Таким образом, алгоритм Дэна (см. [32], [57]) «охватывается» алгоритмом пополнения, а ту часть его обоснования, которая связана с теорией групп, можно представить как доказательство остановочности алгоритма пополнения.
СЕПАРАБЕЛЬНЫЕ ЭКВАЦИОНАЛЬНЫЕ ТЕОРИИ
В этом параграфе мы предполагаем, что S — сигнатура с булевым сортом, содержащая оператор # типа т (#) = sX -^boolean. Будем говорить, что теория S является s-сепарабельной, если
хфх = FALSE е ^ для всех х е Ts\
Для любых М, N из ^s
М ^N^N*M=&TRUE.
Для любых основных термов М и N сорта s из этих условий вытекает, что если М =% N, то М # N =& FALSE, а в противном случае M4L-N=^TRUE; следовательно, проблема слов для сорта s является разрешимой. Для непротиворечивых s-сепарабельных теорий проблема тождества для термов сорта s в инициальной алгебре равносильна проблеме непротиворечивости, как показывает следующая теорема.
Теорема. Пусть S — непротиворечивое s-сепарабельное множество равенств, а М и 7V — два терма сорта s. Тогда РГ (&)^= М = N тогда и только тогда, когда теория К U {М = = N^ непротиворечива.
Доказательство.
Необходимость очевидна, так как, если теория ^ непротиворечива, тоTRUE = FALSE.
Докажем достаточность. Предположим, что теория Sf = = ^U {М = 7V} непротиворечива, и пусть о — произвольная основная подстановка. Тогда в силу условия 1) s-сепарабельности о (М) # о (N) =^ FALSE. Далее, если а(Л1)7^ о(?/), то о'(М)# # g (N)=£ TRUE в силу условия 2) и, следовательно, о(М)^ * о^)=^ TRUE. Но это противоречит предположению о непротиворечивости Sf. Поэтому o(Al)=g o(7V) и, таким образом, О^ Н М = N.□
Рассмотрим более общий случай, когда ^'— произвольное множество равенств (Mi = Ni-| I е 7}, а теория ^ непротиворечива и т(Л1/)-сепарабельна для любого I. Тогда 9" \g^ (= М( = Ni для любого i из / в том и только в том случае, если теория ^ U ^7 непротиворечива.
Эта теорема основана на работах Гуттага [62] и Массера [114], [115] и обобщает результаты, полученные в статье Гогена [48] 1 (где спецификация типов данных представляет собой теорию, s-сепарабельную для каждого сорта s). Таким образом, мы получаем полуразрешающую процедуру установления истинности утверждений вида 3x(M^vV) в ^~(^). Это неудивительно, поскольку, например, в арифметике данная задача соответствует распознаванию конечно опровержимых утверждений. В результате появляется возможность раз и навсегда ограничить применение индукции только доказательством s-сепарабельности (которое проводится лишь один раз) и доказывать тождества с помощью чисто эквациональных рассуждений, которые обычно не используют индукцию !). Однако практическая ценность полученного результата оказывается весьма ограниченной, так как непротиворечивость даже не является рекурсивно перечислимой. Наиболее полезен этот результат для разрешимых теорий, для которых непротиворечивость также разрешима. Покажем, как им можно воспользоваться в сочетании с алгоритмом Кнута — Бендикса.
Пример. Пусть 8х = ^° U {х # х = FALSE, S(x) #S(y) = = X у, 0# S(x) = TRUE, S(x) #0 = TRUEy Нетрудно убедиться с помощью индукции по FT (2°), что теория Sx является integer-сепарабельной и непротиворечивой. В действительности,
of (Д') = ^. Позже мы увидим, как с помощью приведенной теоремы доказывать ассоциативность и коммутативность оператора + в ЕГ^Еу
Обсуждаемая теорема вызывает ассоциации с известным явлением в логике первого порядка: полная теория является максимально непротиворечивой. Однако s-сепарабельность не влечет за собой полноты в традиционном смысле. Например, заметим, что 5Г к§х^ ^= 0 + х = х. В то же время Ж(^х} ^ 0 + х = х, в частности, Ж1 е ^s0^1).
Когда алгоритм пополнения завершает работу, решается вопрос о непротиворечивости теории, поэтому алгоритм пополнения можно использовать для решения проблемы тождества в инициальных алгебрах, определенных сепарабельными эквацио- нальными теориями. Тем не менее следует подчеркнуть, что такое применение алгоритма пополнения по своему характеру отличается от его использования для получения канонического представления эквациональной теории. Построение канонической системы переписывания термов похоже на компиляцию: вы применяете алгоритм к нужной теории лишь один раз, даже если это дорого стоит. Последующие доказательства сводятся к редукциям к нормальным формам и поэтому должны быть весьма эффективными (так по крайней мерс подсказывает интуиция). С другой стороны, каждое доказательство тождества в ^(^J потребует применения алгоритма пополнения и всех связанных с ним затрат (таких, как доказательство остановочно- сти), даже если сама теория ^ уже пополнена. Однако отрицательное решение можно получить даже в том случае, если алгоритм пополнения не завершит работу: как только в качестве критической пары получено равенство TRUE = FALSE, мы делаем вывод, что теория противоречива.
Примеры таких доказательств приводятся в приложении. Для простой теории списочных структур доказывается ассоциативность рекурсивно определенной функции Append. Затем рекурсивно определяется функция Reverse и показывается, что она удовлетворяет соотношению Reverse (Reverse(v) )= х. Наконец, задается итеративная версия функции Reverse, названная Reviter, и доказывается эквивалентность этих двух программ. Отметим, что ни одно из доказательств не использует аксиом неравенства, поскольку с ними невозможна ни одна суперпозиция.
АЛГОРИТМ МЕТАУНИФИКАЦИИ
В этом параграфе мы покажем, как можно выполнять унификацию в теориях, допускающих канонические системы
переписывания термов. Пусть 91—(конечная) каноническая система переписывания термов, полученная в результате применения алгоритма пополнения к множеству равенств S. Опишем метаунификационный алгоритм, который получает на вход такую систему 5? и конечное множество переменных IF, а в процессе работы строит полное множество ^-унификаторов вне IF, Этот алгоритм предложен в работе Фея [47] и усовершенствован Ланкфордом. Он элегантно объединяет обычную унификацию и сужение (narrowing)—способ применения к терму в нормальной форме минимальной подстановки, в результате которой получается насыщенный терм, не имеющий нормальной формы (см. [148]).
Уточним сказанное. Пусть терм М находится в ^-нормальной форме, и пусть V — конечное множество переменных, содержащих Т^Му Пусть и — некоторая позиция «не переменной» в М (non-variable occurence), такая, что подтерм М/и можно унифицировать с левой частью некоторого правила из 5? с помощью обычной унификации. В символьном виде М/и ^ Т и ^0 (М/и ,Х) Ф 0, Х->- р е 91. Предположим, что правило Х-^-р переименовано вне У, т. е. У(Х)ПУ:=0- Пусть о — наиболее общий унификатор М/и и X, ограниченный на ^(Л4). Это значит, что а—минимальная подстановка, для которой о(М/и) является примером X. Будем говорить, что о — сужающая под* становка (narrowing substitution) терма М вне У, и обозначать через NS^M, У) (конечное) множество таких подстановок.
Теперь мы можем описать (недетерминированный) алгоритм ^-унификации. Пусть 91—каноническая система переписывания термов для ^, а через 9?(М) обозначается ^-нормальная форма терма М.
Алгоритм ^-унификации
На вход алгоритма поступают два терма, М и W, одного сорта и конечное множество переменных IF, удовлетворяющее условию T(M)U^(N) ^ IF. На каждом шаге Ni и Mi — термы того же сорта, IF/—множество переменных, 0/— подстановка. Через о и S обозначаются подстановка и конечное множество подстановок соответственно.
В начальный момент М0 = 9ЦМу N0 = 9l(Ny IFo = W, 0О = 0, i = 0.
Если Mi = Ni, то остановиться с ответом 0/. В противном случае положить S = NS(Mi, IF/) U NS (Ni, Wt) и добавить к этому множеству наиболее общий унификатор термов Mi и Ыь если он существует. Выбрать из 5 подстановку о и вычислить
0z+1=a-0z. Если для некоторого х из W терм 0ж(.к) не находится в нормальной форме, то остановиться по неудаче. В противном случае положить Mw = ЭЦо^М^), Nm = ^^(Ni)), U^z-n = Wi 11^(0), увеличить I на единицу и перейти к 2.
Этот алгоритм можно рассматривать как недетерминированный или, что эквивалентно, как алгоритм перечисления конечно ветвящегося дерева. Дерево может быть бесконечным, но если термы М и N ^-унифицируемы, то обязательно существует некоторая успешно завершающаяся последовательность шагов алгоритма, т. е. на конечном уровне дерева существует вершина, соответствующая успеху. На самом деле справедливо более сильное утверждение. Пусть V = T^M^ U УЦ^У и пусть ^(М, N ,W)— множество (возможно, бесконечное) всех -ответов 0Z, ограниченных на V, т. е. Ql^ (М, N, W) = {{(x,0z W/1х ^ И I алгоритм останавливается с результатом 0/}.
Теорема. ^^(М,N, W") — полное множество ^-унификаторов термов М U N вне W.
Доказательство приводится в работе Юлло [78] и является обобщением доказательства из статьи Фея [47].
Алгоритм допускает различные усовершенствования, однако в общем случае он не перечисляет минимальное множество унификаторов, даже если такое множество существует. Так получается, например, для ассоциативности, для которой следует предпочесть алгоритм Плоткина (см. [132]). Интересная открытая проб шма заключается в том, чтобы усовершенствовать приведенный алгоритм таким образом, чтобы он действительно строил минимальное множество унификаторов всегда, когда это возможно. («Очевидное» решение, состоящее в отбрасывании подстановок, которые поглощаются другими ответами, неудовлетворительно, так как для теорий, не обладающих минимальными полными множествами унификаторов, результат может оказаться неполным.)
Описанный алгоритм представляет собой первое известное решение задачи унификации в теории групп, использующее в качестве системы ® каноническое множество правил, приведенное в приложении !).
*) По-видимому, имеется в виду полуразрешающая процедура. Разрешимость проблемы существования решений (унифицируемости) для уравнений в свободной группе установлена Г. С. Маканиным, см. [Маканин Г С Уравнения в свободной группе —Известия АН СССР, Математика, 19^2, т. 16, № 6, с. 1199—1273]. — Прим, персе.
РАСШИРЕНИЯ И ОБЪЕДИНЕНИЯ ЭКВАЦИОНАЛЬНЫХ ТЕОРИЙ
В предыдущих параграфах мы рассмотрели формализмы для описания эквациональных систем и оперирования с ними над различными типами объектов, в частности обсудили подход к проблеме разрешимости в рамках отдельных эквациональных теорий. Однако на практике часто возникает желание «объединить» различные эквациональные теории, и в этом параграфе мы обсудим новые исследования в области сочетания теорий (см. также [21]).
Ясно, что на самом деле нам хотелось бы рассуждать не только о равенствах, но и о формулах. Поэтому мы хотим расширить язык эквационального исчисления, в частности включить в него булевы связки и условные выражения вида if ... then ... else.
Рассмотрим следующую аксиоматизацию теории массивов;
select (store (tz, Z, ^),/) = if i — j then e else select (a J);
store (a, i, select (tz, Z)) = a;
store(store(zz,Z,e),/,f) = ifi = / then
store (a,i,f) else store (store(a, j,f),Z,^).
(Символ равенства в литерале i = j является равенством в теории индексов массива.) Очевидно, что эта аксиоматизация позволяет доказывать такие формулы, как Z ^ / ^ select (store (a, Z, е), /) = select («, /).
Рассмотрим теперь (слабую) аксиоматизацию 5? для действительных чисел со сложением («слабую», поскольку эти аксиомы имеют и другие модели, например алгебру целых чисел со сложением):
х + 0 = х;
х + (— х) = 0;
(я + у) + г = X + <у 4; z);
х + У = У + х;
х-<х;
X <уУ у < X V х = у;
х <у^~\(у <х)-,
х <У Ку <z-=> х < z;
. х < у xd х ~V г < у-\-z\
0< 1.
С помощью этих двух теорий можно попытаться доказать теорему select (store (а, О, е), 1) = select(а, 1); это пример теоремы в «объединении» двух эквациональных теорий.
В ряде работ получены результаты по разрешимости и сложности для таких объединений теорий (см., например, [118], [119], [125], [126]). Как мы увидим, решающую роль здесь играют равенства между переменными.
Предположим, что у нас есть бескванторная теория, формализованная в классической логике первого порядка с равенством, к которой добавлен условный оператор от трех аргументов if ... then ... else. Символы =, Д, V» Я, =), V, 3 и if ... then ... else являются общими для всех теорий; будем называть их логическими символами. Каждая теория обычным образом характеризуется множеством своих нелогических символов и нелогических аксиом.
Приведем несколько примеров. Определим бескванторную теорию массивов ^ как теорию, имеющую нелогические символы store и select и сформулированные выше аксиомы. Бескванторная теория 5? действительных чисел со сложением задается нелогическими символами 0, 1, +, С и своими аксиомами. Теория $ списочных структур имеет нелогические символы car, cdr, cons, atom и следующие аксиомы:
car (cons (х, //)) = х;
cdr (cons (х, z/)) = z/;
И atom (х) zd cons (car (x), cdr (x)) = x;
П atom (cons (x, y)).
Наконец, определим теорию ^, множество нелогических символов которой состоит из всех неинтерпретированных функциональных символов. Теория ^ не имеет аксиом, так что это просто бескванторная теория равенства.
Теория называется стабильно бесконечной, если для любой бескванторной формулы F выполняется ^следующее условие: если формула F имеет модель в этой теории, то она имеет бесконечную модель. Заметим, что любая теория, не имеющая конечных моделей, является стабильно бесконечной. Поэтому теория 31 стабильно бесконечна. Нетрудно доказать, что теории 8, $ и ^ также стабильно бесконечны.
Пусть теории 5ГХ, Т^ .... 2Г к не имеют общих логических символов. Их объединением Uz(^) будет теория, множество нелогических символов которой представляет собой объединение множеств нелогических символов теорий STi, а множество аксиом — объединение множеств аксиом теорий Т i. Мы не будем
рассматривать объединение теории, использующих одинаковые логические символы. В работе Нелсона и Оппена [119] доказана следующая теорема.
Теорема. Пусть Я"ь Я"2, . . ., Я"к — разрешимые стабильно бесконечные бескванторные теории, не имеющие общих логических символов. Тогда их объединение Щ^ГО разрешимо.
Теорема доказывается конструктивно; описывается разрешающая процедура определения выполнимости конъюнкций литералов. Эта разрешающая процедура «комбинирует» разрешающие процедуры для отдельных теорий следующим образом.
Предположим, что у нас есть только две теории ^ и Я" и мы хотим узнать, выполнима ли некоторая бескванторная конъюнкция литералов F в объединенном языке этих теорий. Предположим, что F ^FQy Л F^^ где F^ — конъюнкция литералов в языке теории ^ и Fу — конъюнкция литералов в языке теории Я". (Любую формулу можно привести к такому виду с помощью введения новых переменных; например, формула select (store (а, 0, еу 1) = select (а, 1) равносильна формуле
select (store (а,х,е),у) = select (а,у) Д х = О Д у = 1,
имеющей требуемый вид.) Опишем алгоритм распознавания выполнимости F. Этот алгоритм использует две переменные F^ и F^/, значениями которых являются конъюнкции литералов.
Процедура размножения равенств ])
[Проверка на невыполнимость.] Если хотя бы одна из конъюнкций F^ и F<z невыполнима, то конъюнкция также невыполнима.
[Размножение равенств.] Если из одной из конъюнкций, F^ или F</, следует равенство между переменными, которое не следует из другой конъюнкции, добавить это равенство как новый литерал к той конъюнкции, из которой оно не следует. Перейти к 1.
[Проверка на необходимость расщепления.] Если из одной из конъюнкций, F^ или следует дизъюнкция их = = у} V . . . V uk = vk, составленная из равенств между переменными, но ни одно из этих равенств, взятое отдельно, не вытекает из конъюнкции, то рекурсивно применить процедуру к к формулам F^ К Fa- Д и, = уь . . ., F К Fg- Д ик = vk. Если одна из этих формул выполнима, то конъюнкция F выполнима.
Если достигнут этот шаг, то конъюнкция F выполнима.
!) В оригинале Equality Propagation Procedure.— Прим, перев.
Следующая теорема о сложности объединения теорий доказана в работе Оппсна [126].
Теорема. Пусть теории ?Г\, 2Г^ ..., ?Гк удовлетворяют условиям предыдущей теоремы. Если проблема выполнимости для каждой из этих теорий принадлежит классу NP, то проблема выполнимости для Ui(^i) принадлежит NP и, следовательно, NP-полна. В противном случае сложность проблемы выполнимости для Uz(^) мажорируется максимумом сложностей проблем выполнимости для STi.
Следствие. Проблема выполнимости для .9? U $ U ^ U $. т. е. для бескванторной теории действительных чисел, списочной структуры, массивов и неинтерпретированных функциональных символов с операциями +, ^, store, select, cons, car и cdr, является NP-полной.
Однако при некоторых условиях можно получить результат с детерминированным временем. Назовем формулу невыпуклой, если из нее вытекает некоторая дизъюнкция равенств между,переменными, но не вытекает ни одно из равенств этой дизъюнкции в отдельности. Теорию будем называть выпуклой, если любая конъюнкция литералов в языке этой теории является выпуклой, и невыпуклой в противном случае.
Некоторые из рассмотренных теорий являются выпуклыми, другие — нет. Теория равенства с неинтерпретированными функциональными символами и теория списочных структур с операциями car, cdr и cons являются выпуклыми (см. [118]). Теория рациональных чисел с операциями 4 и ^ также выпукла. Действительно, множество решений конъюнкции линейных неравенств является выпуклым множеством, а множество решений дизъюнкции равенств представляет собой конечное объединение гиперплоскостей; но выпуклое множество не может принадлежать конечному объединению гиперплоскостей, если не принадлежит ни одной из них. Теории целых чисел со сложением и целых чисел с операцией следования являются невыпуклыми. Например, из формулы 1 ^ х ^ 2 Д у = 1 Д 2 = 2 следует дизъюню ция х = у V х = 2, но не следует ни один из ее литералов в отдельности. Теория массивов также является невыпуклой. Например, из формулы
х = select (store (a,i,e),j) ^ у = select (а,[)следует дизъюнкция i = j \/ х = у. Теория действительных чи-сел с умножением невыпукла: например, дизъюнкция x = zV
V У = ^ следует из ху = О Л 2 = 0. Теория множеств также невыпукла: достаточно рассмотреть {я, Ь, с} П {£, ^, с} ^ 0.
Определим проблему выполнимости ДНФ как проблему распознавания выполнимости бескванторной формулы, находящейся в дизъюнктивной нормальной форме.
Теорема. Пусть 9Гь 9Г ^ .... 9" к— разрешимые выпуклые бескванторные теории без общих логических символов, для которых проблемы выполнимости ДНФ решаются за детерминированное полиномиальное время. Тогда для теории Lb (УЛ) проблема выполнимости ДНФ также имеет детерминированное полиномиальное время решения.
Таким образом, в теории 5?U^, например, существует разрешающая процедура для формул в ДНФ с полиномиальным временем. Это следует из результатов, полученных в работах Хачияна [166] и Нелсона и Оппена [118].
Решающую роль в перечисленных результатах, касающихся объединения многосортных теорий, играет понятие равенства между переменными. В описанной выше разрешающей процедуре с разделением равенства единственной информацией, которая передается от одной из используемых разрешающих процедур к другой, является равенство между переменными или дизъюнкция равенств между переменными. И результаты, касающиеся сложности вычислений, показывают, что сложность для объединения теорий решающим образом связана с «выпуклостью» теорий — независимо от того, следует ли из конъюнкции литералов дизъюнкция равенств.
Поэтому приведенные здесь результаты можно рассматривать как результаты по сводимости проблемы разрешимости для неэквациональных теорий к более простым проблемам разрешимости для эквациональных теорий.
БОЛЕЕ ПОЗДНИЕ РЕЗУЛЬТАТЫ
Из-за недостатка места здесь нс представлен ряд последних результатов. Кратко остановимся на нескольких перспективных направлениях. Характеризация конфлюентности, полученная Кнутом и Бендиксом для нётеровых систем переписывания термов, допускает обобщение на классы конгруэнтности термов относительно некоторых условий. Это было сделано для коммутативности (Ланкфорд и Баллантайн, [96]), для коммутативно- ности и ассоциативности (Ланкфорд ц Баллантайн, [98], Петерсон и Стиккел, 1 [128]) и в общем случае для леволинейных систем переписывания термов с определенными свойствами (Юэ,
*)). Алгоритм пополнения можно обобщить на эти случаи таким образом, чтобы он строил канонические системы для абелевых групп, абелевых колец, дистрибутивных решеток. Дегано и Сирович в [31] использовали полное множество таких правил переписывания для доказательства разрешимости эквивалентности в новом классе примитивно рекурсивных функций. Баллантайн и Ланкфорд в [4] показали, что указанное расширение алгоритма пополнения решает равномерную проблему слов для конечно представимых коммутативных полугрупп (предполагается, что этот метод продолжается на абелевы группы и коль- ца)).
Если .система переписывания термов не является нётеровой, то возникает вопрос, как все-таки находить нормальные формы тех термов, для которых они существуют. Эта проблема определения порядка вычислений ) имеет хорошо известное решение для обычных рекурсивных определений (см. работы Вюйемена [157], Дауни и Сети [36], Берри и Леви [7]), но оказывается более трудной для переписывания термов в общем случае. Юэ и Леви в [76] вводят критерий строгой последовательности (strong sequentiality), допускающий эффективную реализацию корректных интерпретаторов для систем переписывания термов с линейными левыми частями, не имеющих критических пар. Связанные с этой проблемой результаты можно также найти в работе Хоффмана и О’Доннела [68].
БЛАГОДАРНОСТИ
Мы благодарны Рону Буку, Бобу Бойеру, Науму Дершовицу, Джо Гогену и Жан-Жаку Леви за многочисленные полезные замечания. Мы особенно признательны Далласу Ланкфорду за оживленную и полезную переписку.
ПРИЛОЖЕНИЕ
Это приложение отражает ход компьютерного эксперимента, проведенного в лаборатории искусственного интеллекта KL-10 Стэнфордского университета. Программа написана Ж-М. Юлло 1} Подход, обобщающий методы Петерсона — Стиккела и Юэ, разработан Жуано и Кирхнер, см. [Jouannaud J Р., Kirchner Н. Completion of a set of rules modulo a set of equations. SIAM J of Computing, 1986, v. 15, № 4]. — Прим, nepee.
на языке VLISP (разработанном в университете Венсена Патриком Грессе и Жеромом Шайу). Интервалы времени указаны для работы программы в режиме интерпретации.
Вначале приводится пример работы алгоритма пополнения Кнута — Бендикса, который строит каноническую систему переписывания термов из стандартного множества трех аксиом теории групп. Вход пользователя в систему предваряется знаком вопроса. Комментарии заключаются в квадратные скобки.
? (kbini)
MODE ? auto
LIST OF OPERATIONS ? (0+1)
WEIGHT OF 0 ? 1
WEIGHT OF + ? 0
WEIGHT OF I ? 0
MINIMUM WEIGHT OF A PURE WORD ? 1
LIST OF INFIX OPERATORS ? (+)
=READY
= ; time = 6 ms;
[Сейчас все веса назначены так, что остановочность (нётеро вость) будет доказываться автоматически с помощью исходного метода Кнута — Бендикса.]
? (kb group)
Rl: 0 + X >X
GIVEN
R2: I(X) + X->0
GIVEN
R3: (X + Y) + Z —> X + (Y + Z)
GIVEN
R4: I(X) + (X + Y)-^Y
FROM R3 AND R2
R5: I(0) + X->X
FROM R4 and Rl
R6: I(I(X)) + 0->X
FROM R4 AND R2
R7: 1(1(0))+ X-^X
FROM R5 AND R4
R8: 1(0)->0
FROM R7 AND R6
R5 DELETED
REWRITE RULES: R8 RI FOR LEFT PART
R7 DELETED
REWRITE RULES: R8 R8 RI FOR LEFT PART
r9: I(I(I(X))) + X —» О
FROM R6 AND R4
FROM R4 AND R4FROM R4 AND R4RIO: I(I(X)) + Y->X + YRIO: I(I(X)) + Y->X + Y
FROM R4 AND R4
FROM R4 AND R4
RIO: I(I(X)) + Y->X + Y
RIO: I(I(X)) + Y->X + Y
R6 REPLACED BY:.
x + o = x
REWRITE RULES: RIO FOR LEFT PART
R9 DELETED
REWRITE RULES: RIO R2 FOR LEFT PART
rUTX + 0 - > XFROM R6
R12 I(I(X))^XFROM Rll AND RIO
RIO DELETED
REWRITE RULES: R12 FOR LEFT RART
R13: X + I(X)->0FROMR12ANDR2
R14: X + (I(X) +Y)-^YFROMR12ANDR4
R15: X + (Y + I(X + Y)) >0FROMR13ANDR3
R16: X+ I(Y + X)->I(Y)FROMR15ANDR4
R15 DELETED
REWRITE RULES: R16 R13 FOR LEFT PART
R17: I(X +Y)^I(Y) + I(X)FROM R16 AND R4
R16 DELETED
REWRITE RULES: R17 R14 FOR LEFT PART
COMPLETE SET: CGROUP
RI: 0 + X ->X
R2: I(X) + X >0
R3: (X + Y) + Z X + (Y + Z)
R4: I(X) + (X + Y) -> Y
R8: 1(0)->0
Rll: X + O^X
R12: I(I(X))^X
R13: X + I(X) ^0
R14: X + (I(X) +Y)->Y
R17: I(X + Y)->I(Y) + I(X) 9-Dec-79 21 : 19 : 43 = END
= ; time = 4790 ms;
[Файл PROOFS содержит простую аксиоматизацию списочных структур, простые рекурсивные определения программ, оперирующих списками, и леммы, доказывающие их корректность. Теория LISP есть аксиоматизация списочных структур; отметим* что она list-сепарабельна (т. е. сепарабельна по сорту «список») .]
? (library proofs)
=PROOFS
= ; time = 41 ms;
? (kbini)
MODE ? free
LIST OF INFIX OPERATORS ? (#)
=READY
= ; time — 2 ms;
? (kb lisp)
X#X = FALSE COMMAND ? ¥ RI: X#X-> FALSE
GIVEN
CONS(X.Y) * NULL = TRUE
COMMAND ? Y
R2: CONS(X.Y)# NULL-> TRUE
GIVEN
NULL # CONS(X, Y) = TRUE COMMAND ? Y
R3: NULL #CONS(X,Y)-> TRUE
GIVEN
CONS(X,Y) # CONS(Z,U) = IF(X # Z,TRUE, Y # U) GIVEN COMMAND ? Y
R4: CONS(X, Y) * CONS(Z, U) IF(X * Z, TRUE, Y # U)
IF(TRUE,X,Y) = X
COMMAND ? Y
R5: IF(TRUE,X,Y)^X
GIVEN
IF(FALSE,X,Y) = Y
COMMAND ? Y
R6: IF(FALSE,X,Y)-> Y
given
APPEND(NULL,X) = X COMMAND ? Y
R7: APPEND(NULL,X)-*X
given
APPEND(CONS(X,Y),Z) = CONS(X,APPEND(Y,Z)) given COMMAND ? Y
R8: APPEND(CONS(X,Y),Z)^ CONS(X, APPEND (Y,Z))
COMPLETE SET: CLISP
Rl: X^X->FALSE
R2: CONS(X,Y)#NULL^TRUE
R3: NULL #CONS(X,Y)->TRUE
R4: CONS(X,Y)#CONS(Z,U)^IF(X#Z,TRUE,Y#U)
R5: IF(TRUE,X, Y)—> X
R6: IF(FALSE,X,Y)—>■ Y
R7: APPEND(NULL,X)->X
R8: APPEND(CONS(X,Y),Z)-*CONS(X,APPEND(Y,Z))
9-Dec-79 22:13 : 34
= END
= ; time = 905 ms;
[Докажем, что APPEND ассоциативная функция. PROOF1 содержит соответствующую лемму.]
? (provelemma proofl)
APPEND(APPEND(X, Y), Z) = APPEND(X, APPEND(Y, Z))
GIVEN
COMMAND ? Y
R9: APPEND(APPEND(X, Y), Z) -»APPEND(X, APPEND(Y, Z))
COMPLETE SET: CPROOF1'
Rl: X#X-> FALSE
R2: CONS(X.Y)# NULL-*TRUE
R3: NULL #CONS(X,Y)-> TRUE
R4: CONS(X,Y)#CONS(Z,U)->IF(X^Y,TRUE,Y#U)
R5: IF(TRUE,X,Y)-*X
R6: IF(FALSE,X,Y)^Y
R7: APPEND(NULL,X)->X
R8: APPEND(CONS(X,Y),Z) -> CONS(X,APPEND(Y,Z))
R9: APPEND(APPEND(X,Y),Z)->APPEND(X,APPEND(Y,Z))
9-Dec-79 22 : 16 : 09
= END
= ; time = 640 ms;
[Полученное множество непротиворечиво, и, таким образом, лемма доказана. Далее мы обогащаем теорию списков рекурсивным определением функции REV, которая обращает список. Докажем, что REV(REV(x)) = х для любого списка х.]
? (kb clisp proof2)
RI: X#X FALSE
R2: CONS(X,Y) # NULL-> TRUE
R3: NULL #CONS(X,Y) ->TRUE
R4: CONS(X, Y) * CONS(Z, U) -> IF(X # Z.TRUE, Y # U)
R5: IF(TRUE,X,Y) —> X
R6: IF(FALSE,X,Y)->Y
R7: APPEND(NULL, X)X
R8: APPEND(CONS(X,Y),Z) > CONS(X, APPEND(Y,Z))_ REV(NULL) = NULLGIVEN
COMMAND ? Y
R9: REV(NULL)-> NULL
REV(CONS(X,Y)) = APPEND(REV(Y),CONS(X,NULL)) GIVEN COMMAND ? Y
RIO: REV(CONS(X,Y))^APPEND(REV(Y),CONS(X,NULL))
REV(REV(X)) = XGIVEN
COMMAND ? Y
Rll: REV(REV(X)) >X
REV(APPEND(REV(X),CONS(Y,NULL))) = CONS(Y,X)
FROM Rll AND RIO
COMMAND ? Y
R12: REV(APPEND(REV(X),CONS(Y,NULL)))-»CONS(Y,X)
REV(APPEND(X, CONS(Y, NULL))) = CONS(Y, REV(X))'
FROM R12 AND Rll
COMMAND ? Y
RI3: REV(APPEND(X, CONS(Y, NULL))) — CONS(Y, RE V(X))
R12 DELETED
REWRITE RULES: R13 Rll FOR LEFT PART
COMPLETE SET: CPROOF2
RI: X#X-> FALSE
R2: CONS(X,Y)#NULL->TRUE
R3: NULL#CONS(X,Y) ^TRUE
R4: CONS(X, Y) # CONS(Z, U) -> IF(X # Z,TRUE, Y # U)
R5: IF(TRUE,X,Y)-^X
R6: IF(FALSE,X,Y)--> Y
R7: APPEND(NULL,X)-^X
R8: APPEND(CONS(X,Y),Z) ^CONS(X,APPEND(Y,Z))
R9: REV(NULL)^NULL
RIO: REV(CONS(X, Y)) -> APPEND(REV(Y), CONS X, NULL)) Rll: REV(REV(X)) >X
R13: REV(APPEND(X,CONS(Y,NULL)))-*CONS(Y,REV(X)) эЪес-79 22 : 21 ; 57
= END
= ; time = 2272 ms;
[Полнота и непротиворечивость! Таким образом, REV(REV (Х)) = Х принадлежит Е15П. Отметим, что проверка остано- вочности (нётеровости) была оставлена пользователю, так как упорядочение Кнута — Бендикса нельзя было использовать для правила 10. Ориентация каждого правила указывалась пользователем после запроса COMMAND? («Y» означает ориентацию слева направо). Рекурсивное определение REVERSE не очень эффективно. Поэтому мы задаем итеративную версию, называемую REVITER, и доказываем эквивалентность двух программ: REV(X) = REVITER (X, NULL). Нам необходимы ассоциативность APPEND и лемма REVITER (X, Y) = APPEND (REV(X), Y). Отметим, что эта принципиальная лемма не принимается без доказательства — она доказывается, как и сама теорема.]
? (kb cproofl proof3) RI: X#X-*FALSE
R2: CONS(X.Y)# NULL->TRUE
R3: NULL #CONS(X,Y)-^TRUE
R4: CONS(X,Y)#CONS(Z,U) ->IF(X# Y,TRUE,Y#U)
R5: IF(TRUE,X,Y) ^X
R6: IF(FALSE,X,Y)-^Y
R7: APPEND(NULL,X) ^X
R8: APPEND(CONS(X, Y), Z) -> CONS(X, APPEND(Y, X))
R9: APPEND(APPEND(X,Y),Z)^APPEND(X,APPEND(Y,Z))
REV(NULL)=NULLGIVEN
COMMAND ? Y
R10: REV(NULL)-^NULL
RE V(CONS(X, Y)) = APPEND(REV(Y), CONS(X, NULL)) GIVEN COMMAND ? Y
RI 1: REV(CONS(X,Y))APPEND(REV(Y),CONS(X,NULL))
REVITER(NULL,X) = X'GIVEN
COMMAND ? Y
R12: REVITER(NULL,X)-*X
REVITER(CONS(X, Y), Z) = REVITER(Y, CONS(X, Z))GIVEN
COMMAND ? Y
R13: REVITER(CONS(X, Y), Z) -► REVITER(Y, CONS(X,Z))
APPEND(REV(X),Y) = REVITER(X,Y)GIVEN
COMMAND ? Y
R14: APPEND(REV(X), Y) > REVITER(X, Y)
Rll REPLACED BY:
REV(CONS(X, Y)) = REVITER(Y, CONS(X, NULL))
REWRITE RULES: R14 FOR RIGHT PART
REV(CONS(X, Y)) = REVITER(Y,CONS(X,NULL)) FROM Rll COMMAND ? Y
R15: REV(CONS(X, Y)) -> REVITER(Y, CONS(X, NULL))
REV(X) = REVITER(X, NULL)GIVEN
COMMAND ? Y
R16: REV(X) —> REVITER(X, NULL)
RIO DELETED
REWRITE RULES: R16 R12 FOR LEFT RART
R14 REPLACED BY:
APPEND(REVITER(X, NULL), Y) = REVITER(X, Y)
REWRITE RULES: R16 FOR LEFT PART
R15 DELETED
REWRITE RULES: R16 R13 FOR LEFT PART
APPEND(REVITER(X, NULL),Y) = REVITER(X.Y) FROM R14 COMMAND ? Y
R17: APPEND(REVITER(X,NULL),Y)->REVITER(X,Y)
APPEND(REVITER(X, Y), Z) = REVITER(X, APPEND(Y, Z))
FROM R17 AND R9 COMMAND ? Y
R18: APPEND(REVITER(X,Y),Z)^REVITER(X,APPEND(Y,Z))
r17 DELETED
REWRITE RULES: R18 R7 FOR LEFT PART
Complete set: cproof3'
Rl: X#X-> FALSE
R2: CONS(X,Y)# NULL-> TRUE
R3: NULL #CONS(X,Y)->TRUE
R4: CONS(X,Y)#CONS(Z,U)->IF(X#Z,TRUE,Y#U)
r5: IF(TRUE,X,Y)^X
R6: IF(FALSE,X,Y)^Y
R7: APPEND(NULL.X)-*^
R8: APPEND(CONS(X,Y),Z)->CONS(X,APPEND(Y,Z))
R9: APPEND(APPEND(X,Y),Z)->APPEND(X,APPEND(Y,Z))
R12: REVITER(NULL ,X)-> X
R13: REVITER(CONS(X, Y), Z) -> REVITER(Y, CONS(X, Z))
R16: REV(X)->REVITER(X,NULL)
R18: APPEND(REVITER(X, Y), Z) -> REVITER(X, APPE ND(Y, Z))
9-Dec-79 22 ; 36 : 34
= END
— ; time = 3358 ms;
ЛИТЕРАТУРА
Ackermann W. Solvable Cases of the Decision Problem North-Holland, Amsterdam, 1954
Aho A., Sethi R, Ullman J. Code Optimization and Finite Church-Rosser Systems, in Proceedings of Courant Computer Science Symposium 5, Ed. Rustin R., Prentice-Hall, 1972.
Aubin R. Mechanizing Structural Induction. Ph. D. thesis, U. of Edinburg, Edinburg, 1976
Ballantyne A. M , Lankford D S New Decision Algorithms for Finitely Presented Commutative Semigroups. Report MTP-4, Department of Mathematics, Louisiana Tech U., May 1979
Baxter L. D. An Efficient Unification Algorithm Technical Report CS-73-23, Dept, of Applied Analysis and Computer Science, U. of Waterloo, 1973.
Bergman G. M The Diamond Lemma for Ring Theory. Advances in Math , 29, 1978, p. 178—218.
Berry G, Levy J J. Minimal and Optimal Computations of Recursive Programs. JACM 26,1, 1979.
Birkhoff G. On the Structure of Abstract Algebras. Proc. Cambridge Phil. Soc., 31, 1935, p. 433—454.
Birkhoff G., Lipson J. D. Heterogeneous Algebras. Journal of Combinatorial Theory, 8, 1970, p. 115—133.
Boone W. The Word Problem. Ann. of Math. 2,70, 1959, p. 207—265.
Boyer R, Moore J. Proving Theorems About LISP Functions. JACM 22, 1975, p 129—144.’
Boyer R, Moore J A Lemma Driven Automatic Theorem Prover for Recursive Function Theory. 5th International Joint Conference on Artificial Intelligence, 1977, p 511—519.
Boyer R, Moore J. A Computational Logic Academic Press, 1979.
Brainerd W S Tree Generating Regular Systems. Information and Control, 14, 1969, p. 217—231
Brand D., Darringer J , Joyner J. Completeness of Conditional Reductions Symposium on Automatic Deduction, 1979.
Brown T A Structured Design Method for Specialized Proof Procedures. Ph D. Thesis, California Inst of Tech, Pasadena, California, 1975.
Bucken Ы. Reduction Systems and Small Cancellation Theory. Proc. Fourth Workshop on Automated Deduction, 1979, p. 53—59.
Burstall R. M. Proving Properties of Programs by Structural Induction. Computer J, 12, 1969, p. 41—48.
Burstall R. M. Design Considerations for a Functional Programming Language Infotech State of the Art Conference, Copenhagen, 1977.
Burstall R. M, Darlington J. A Transformation System for Developing Recursive Programs JACM, 24, 1977, p. 44—67.
Burstall R. M, Goguen J A. Putting Theories Together to Make Specifications 5th International Joint Conference on Artificial Intelligence, 1977, p. 104 5 -1058
Cadiou J M. Recursive Definitions of Partial Functions and Their Computations PhD Thesis, Computer Science Department, Stanford U., 1972.
Cardoza F, Lipton R , Meyer A. Exponential Space Complete Problems for Petri Nets and Commutative Semigroups Proceedings of the Eighth ACM Symposium on Theory of Computing, May 1976, p. 50—54.
Church A. The Calculi of Lambda-Conversion. Princeton U. Press, Princeton N. J , 1941
Church A., Rosser J В Some Properties of Conversion. Transactions of AMS, 39, 1936, p 472—482
Cohen P. J. Decision Procedures for Real and p-adic Fields. Comm. Pure and Appl Math, 22, 1969, p 131 —151
Cohn P M Universal Algebra Harper and Row, New York, 1965
Collins G Quantifier Elimination for Real Closed Fields by Cylindrical Algebraic Decomposition Proc 2nd GI Conference on Automata and Formal Languages, Kaiserslauten, 1975. Lecture Notes in Computer Science, Springer-Verlag, to appear.
Colmcrauer A. Les grammaires de metamorphose. Rapport interne, U. de Marseille-Luminy, 1975.
Courcelle B. Infinite Trees in Normal Form and Recursive Equations Having a Unique Solution Rapport 7906, U. de Bordeaux 1, UER de Mathematiques et Informatique, Fevrier 1979. To appear Math. Systems Theory.,
Degano P, Sirovich F. On Solving the Equivalence Problem for a Subclass of Primitive Recursive Functions. Note Scientifiche S-79-18, Istituto di Scienze dellTnformazione, Pisa, Giugno, 1979.
Dehn M. Uber unendliche diskontinuierliche Gruppen. Math. Ann., 71, 1911, p. 116—144
Dershowitz N. A Note on Simplification Orderings. Information Processing Letters 9,5, 1979, 212—215
Dershowitz N.- Orderings for term-rewriting Systems. Proc. 20th Symposium on Foundations of Computer Science, 1979, p. 123—131. Theoretical Computer Science, 17, 1982, p. 279—301.
Dershowitz N., Manna Z. Proving Termination with Multiset Orderings. L CACM, 22, 1979, 465—476.
Downey P. J , Sethi R. Correct Computation Rules for Recursive Lan- 1 guages. SIAM J. on Computing 5,3, 1976, p. 378—401.
Downey P, Sethi R Assignment Commands with Array References. 1J ACM, 25, 1978, no. 4.
Downey P, Sethi R., Tarjan R. E. Variations on the Common Subexpression Problem. JACM, 27, 1980, no. 4, p. 758—771.
Ehrig EL, Rosen В. K. Commutativity of Independent Transformations on Computer Objects IBM Research report RC 6251, 1976.
Evans T. The Word Problem for Abstract Algebras. J. London Math. Soc., 26, 1951, p. 64—71.
Evans T. Embeddability and the Word Problem. J. London Math. Soc., 28, 1953, p. 76—80.
Evans T. On Multiplicative Systems Defined by Generators and Relations L, Normal Form Theorems, Proc. Cambridge Phil Soc., 47, 1951, p. 637—649.
Evans T. Some Solvable Word Problems. Proc. Conf on Decision Problems in Algebra, Oxford, 1976. To appear, North-Holland, Amsterdam.
Evans T. Word Problems. Bulletin of the AMS, 84,5, 1978, p. 789—802.
Evans T., Mandelberg K., Neff M. F Embedding Algebras with Solvable Word Problems in Simple Algebras Some Воопе-Higman Type Theorems. Proc. Logic Colloq, U of Bristol, 1973. North-Holland, Amsterdam, 1975, p. 259—277.
Fay M. First-order Unification in an Equational Theory. Master Thesis, U. of California at Santa Cruz Tech. Report 78-5-002, May 1978.
Fay M. First-order Unification in an Equational Theory. 4th Workshop on Automated Deduction, Austin, Texas, Feb 1979, p. 161 —167.
Goguen J. A. Proving Inductive Hypotheses Without Induction and Evaluating Expressions with Non-terminating Rules Unpublished manuscript, Oct. 1979.
Goguen J A., Tardo J. J. An introduction to OBJ, a Language for Writing and Testing Formal Algebraic Specifications. Specifications -of Reliable Software Conference, Boston. 1979.
Goguen J., Thatcher J., Wagner E., Wright J. Abstract Data Types as Initial Algebras and Correctness of Data Representations. Conference on Computer Graphics, Pattern Recognition and Data Structure, May 1975, p 89—93.
Goguen J. A., Thatcher J. W., Wagner E. G.. Wright J. B. Initial. Algebras Semantics and Continuous Algebras. JACM, 24, 1977, p. 68—95.
Goguen J. A., Thatcher J. W., Wagner E. G. An Initial Algebra Approach to the Specification, Correctness, and Implementation of Abstract Data Types. «Current Trends in Programming Methodology», vol. 4, Ed. Yeh R., Prentice-Hall, 1978, p. 80—149.
Goldfarb W. The Undecidability of the Second-order Unification Problem. Theor. Computer Sci., 13, 1981, p. 47—61.
Gorn S. Handling the Growth by. Definition of Mechanical Languages. Proc. Spring Joint Computer Conf., 1967, p. 213—224.
Gorn S. Explicit Definitions and Linguistic Dominoes. «Systems and Computer Science», Eds. Hart J. and Takasu S., U of Toronto Press, 1967, p. 77—115.
Gorn S. On the Conclusive Validation of Symbol Manipulation Processes (How Do You Know It has To Work?). J. of the Franklin Institute, 296,6, 1973, p. 499—518.
Greendlinger M. Dehn’s Algorithm for the Word Problem. Communications on Pure and Applied Mathematics, 13, 1960, p. 67—83.
Griesmer J. Н., Jenks R. D. SCRATCHPAD/1. An Interactive Facility for Symbolic Mathematics. Proceedings 2nd Symposium on Symbolic and Algebraic Manipulation, Ed. Petrick S., Los Angeles, March 1971.
Guard J. R , Oglesby F. 0 , Bennet J. H., Settle L. G. Semi-automated Mathematics. JACM, 16, 1969, p. 49—62.
Guttag J. The Specification and Application to Programming of Abstract Data Types. Ph. D thesis, U. of Toronto, 1975
Guttag J. V. Abstract Data Types and the Development of Data Structures. CACM, 20, 1977, p. 397—404.
Guttag J. V., Horning J. J. The Algebraic Specification of Abstract Data Types Acta Informatica, 10, 1978, p. 27—52.
Guttag J. V., Horowitz E., Musser D. The Design of Data Type Specifications. «Current Trends in Programming Methodology», Vol. 4, Data Structuring, Ed. Yeh R., Prentice-Hall, 1978.
Guttag J. V , Horowitz E., Musser D. R Abstract Data Types and Software Validation CACM, 21, 1978, p. 1048—1064.
Hall P. Some Word Problems. J London Math. Soc., 33, 1958, p. 482— 496.
Hindley R. An Abstract Form of the Church-Rosser Theorem I. J. of Symbolic Logic 34;4, 1969, p. 545—560.
Hindley R. An Abstract Form of the Church-Rosser Theorem II: Applications J of Symbolic Logic, 39,1, 1974, p. 1—21.
Hoffman M, O’Donnel M. Interpreter Generation Using Tree Pattern Matching. 6th ACM Conference on Principles of Programming Languages, 1979.
Huet G The Undecidability of Unification in Third Order Logic. Information and Control, 22, 1973, p. 257—267.
Huet G. Unification Algorithm for Typed Lambda Calculus. Theoretical Computer Science, 1,1, 1975, p. 27—57.
Huet G. Resolution d’equations dans des languages d’ordre 1, 2, ... 0). These d’Etat, Universite de Paris VII, 1976.
Huet G. Confluent Reductions: Abstract Properties and Applications to Term Rewriting Systems. 18th IEEE Symposium on Foundations of Computer Science, 1977, p. 30—45.
Huet G An Algorithm to Generate the Basis of Solutions to Homogenous Linear Diophantine Equations. Information Processing Letters, 7,3, 1978, p. 144—147.
Huet G, Lang B. Proving and Applying Program Transformations Expressed With 2nd Order Patterns. Acta Informatica, 11, 1978, p. 31 — 55
Huet G., Lankford D S. On the Uniform Halting Problem for Term Rewriting Systems. Rapport Laboria 283, IRIA, Mars 1978
Huet G., Levy J. J. Call by Need Computations in Non-Ambiguous Linear Term Rewriting Systems. Rapport Laboria 359, IRIA, Aout 1979.
Hullot J. M Associative-Commutative Pattern Matching. Fifth International Joint Conference on Artificial Intelligence, Tokyo, 1979, p. 406— 412.
Hullot J. M Canonical Forms and Unification. Leet. Notes in Comp. ScL, 87, 1980, p. 318—334.
Iturriaga R., Contributions to Mechanical Mathematics Ph. D. thesis, Carnegie-Mellon University, 1967.
Jeanrond H. J. A Unique Termination Theorem for a Theory with Generalised Commutative Axioms. Unpublished manuscript, July 1979.
Karnin S. Some Definitions for Algebraic Data Type Specifications. SIGPLAN Notices, vol. 14, No. 3, March 1979.
Kleene S. С. Introduction to Metamathematics. North-Holland, 1952.
L [Имеется перевод Клини С. К. Введение в метаматематику. — М.: ИЛ, 1957.].
Klop J. W. A Counter Example to the Church-Rosser Property for L Lambda-Calculus With Surjective Pairing. Preprint 102, Dept of Mathematics, U. of Utrecht, 1978.
Knuth D, Bendix P. Simple Word Problems in Universal Algebras.
'«Computational Problems in Abstract Algebra» Ed. Leech J., Pergamon
Press, 1970, p. 263—297.
Kozen D. Complexity of Finitely Presented Algebras. Ninth ACM Symposium on Theory of Computing, May 1977, p. 164—177.
Kozen D Finitely Presented Algebras and the Polynomial Time Hierarchy. Report 77—303, Dept, of Computer Science, Cornell U., March 1977.
Kruskal J. B. Well-quasi-ordering, the Tree Theorem and Vazsonyi’s Conjecture. Trans. Amer. Math. Soc., 95, 1960, 210—225.
Lankford D. S Canonical Algebraic Simplification. Report ATP-25, Departments of Mathematics and Computer Sciences, University of Texas of Austin, May 1975.
Lankford D. S. Canonical Inference. Report ATP-32, Departments of Mathematics and Computer Sciences, University of Texas at Austin, Dec. 1975.
Lankford D. S. A Finite Termination Algorithm. Internal memo, Southwestern U., Georgetown, Texas, March 1976.
Lankford D. S On Deciding Word Problems by Rewrite Rules Simplifiers. Unpublished manuscript, Sept. 77.
Lankford D. S. A Unification Algorithm for Abelian Group Theory. Report MTP-1, Math. Dept, Louisiana Tech. U., Jan. 1979.
Lankford D. S. Mechanical Theorem Proving in Field Theory. Report MTP-2, Math Dept, Louisiana Tech. U., Jan. 1979.
Lankford D. S On Proving Term Rewriting Systems are noetherian. Report MTP-3, Math. Dept., Louisiana Tech. U , May 1979.
Lankford D. S Some New Approaches to the Theory and Applications of Conditional Term Rewriting Systems. Report MTP-6, Math. Dept., Louisiana Tech. U , Aug 1979
Lankford D. S. and Ballantyne A M, Decision Procedures for Simple Equational Theories With Commutative Axioms: Complete Sets of Commutative Reductions. Report ATP-35, Departments of Mathematics and Computer Sciences, U. of Texas at Austin, March 1977.
Lankford D. S , Ballantyne A. M Decision Procedures for Simple Equational Theories With Permutative Axioms* Complete Sets of Permutative Reductions Report ATP-37, Department of Mathematics and Computer Sciences, U. of Texas at Austin, April 1977.
Lankford D S , Ballantyne A M. Decision Procedures for Simple Equational Theories With Commutative-Associative Axioms: Complete Sets of Commutative-Associative Reductions. Report ATP-39, Departments of Mathematics and Computer Sciences, U. of Texas at Austin, Aug. 1977.
Lankford D. S, Ballantyne A. M The Refutation Completeness of Blocked Permutative Narrowing and Resolution Fourth Conference on Automated Deduction, Austin, Feb 1979, p 53—59.
Lankford D. S., Musser D. On Semi-Deciding First Order Validity and Invalidity. Unpublished Manuscript, March 1978.
] Levy J. J. Reductions correctes et optimales dans le lambda-calcuk These d’Etat, U. de Paris VII, Jan. 1978.
Lipton R., Snyder L. On the Halting of Tree Replacement Systems.
Conference on Theoretical Computer Science, U. of Waterloo, Aug. 1977, p. 43—46.
Lipton R. J., Zalcstein Y. Word Problems Solvable in Logspace. Technical Report no 48, Department of Computer Science, SUNY at StonyBrook, 1975.
Livesey M., Siekmann J. Unification of Sets. Internal Report 3/76, In- stitut fur Informatik I, U. Karlsruhe, 1977.
Manna Z., Ness S. On the Termination of Markov Algorithms. Third Hawaii International Conference on Systems Sciences, Jan. 1970, p. 789—792.
Martelli A., Montanari U. An Efficient Unification Algorithm. ACM TOPLAS, 4,2, p. 258—282.e
Matiyasevich Y. Diophantine Representation of Recursively Enumerable Predicates. Proceedings of the Second Scandinavian Logic Symposium, North-Holland, 1970.
McCarthy J. Recursive Functions of Symbolic Expressions and Their Computations by Machine, Part I. CACM, 3,4 1960, p. 184—195.
McCarthy J. A Basis For a Mathematical Theory of Computation. Computer Programming and Formal Systems, Eds. Brafford F. and Hirsch- berg. North-Holland, 1963, p. 33—70.
McNulty G. The Decision Problem for Equational Bases of Algebra Annals of Mathematical Logic, 11, 1976, p. 193—259.
Meyer A. R., Stockmeyer L. Word Problems Requiring Exponential Time. Fifth ACM Symposium on Theory of Computing, April 1973, p. 1—9.
Moses J. Algebraic Simplification, a Guide For the Perplexed The Mac- syma Papers, 1970, p. 32—54.
Musser D L. A Data Type Verification System Based on Rewrite Rules. 6th Texas Conf, on Computing Systems, Austin, Nov. 1978.
Musser D L. Convergent Sets of Rewrite Rules for Abstract Data Types. Unpublished Manuscript, Information Sciences Institut, Jan. 1979.
Musser D. L On Proving Inductive Properties of Abstract Data Types. Seventh ACM Symposium on Principles of Programming Languages, Jan. 1980.
Musser D. L. Abstract Data Type Specification in the AFFIRN system. IEEE Transactions on Software Engineering, SE-6, 1, 1980, p. 24—32.
Nash-Williams C. St. J. A On Well-quasi-ordering Finite Tress. Proc. Cambridge Phil. Soc., 59, 1963, p. 833—835.
Nelson C. G., Oppen D. C Fast Decision Algorithms Based on Congruence Closure. Stanford CS Report No. STAN-CS-77-646, 1977. JACM, 27,2, 1980, p. 356—364.
Nelson C. G., Oppen D. C Simplification by Cooperating Decision Procedures. To appear CACM.
Nevins A. A Human Oriented Logic For Automatic Theorem Proving JACM, 21,4, 1974, p. 606—621.
Newman M. H. A. On Theories With a Combinatorial Definition of «Equivalence». Annals of Math., 43,2, 1942, p. 223—243.
Nivat M. Congruences parfaites et quasi-parfaites. Seminaire Dubreuil, 7, 1971 —1972. (Preliminary Version in Proc. Second Annual ACM Symposium on Theory of Computing, 1970, p. 221—225 )
Nivat M. On the Interpretation of Recursive Polyadic Program Schemes. Symposia Mathematica, vol. XV, Istituto Nazionale di Alta Matematica. Italy, 1975, p. 225—281.
O'Donnel M. Computing in Systems Described by Equations. Lecture Notes in Computer Science 58, Springer-Verlag, 1977.
Oppen D. С. Reasoning About Recursively Defined Data Structures. Fifth ACM Symposium on Principles of Programming Languages, January 1978. To appear in JACM
Oppen D. C. Convexity, Complexity, and Combinations of Theories. Fourth Symposium on Automated Deduction, Austin, 1979. To appear in Theoretical Computer Science.
Paterson M. S, Wegman M N Linear Unification. J of Computer and Systems Sciences, 16, 1978, p. 158—167.'
Peterson G. E, Stickel M E. Complete Sets of Reductions for Equa- tional Theories With Complete Unification Algorithms. Tech. Report, Dept, of Computer Science, U. of Arizona, Tucson, Sept 1977
Plaisted D. Well-Founded Orderings for Proving Termination of Systems of Rewrite Rules. Dept, of Computer Science Report, 78—932, U. of Illinois at Urbana-Champaign, July 1978.
Plaisted D. A Recursively Defined Ordering for Proving Termination of Term Rewriting Systems Dept of Computer Science Report 78-943, U. of Illinois at Urbana-Champaign, Sept. 1978
Plotkin G. Lattice-Theoretic Properties of Subsumption. Memo MIP-R-77, U. of Edinburgh, 1970
Plotkin G Building-in Equational Theories Machine Intelligence, 7, 1972, p. 73—90.
Post E. Recursive Unsolvabilitv of a Problem of Thue. J. Symbolic Logic, 12, 1947, p 1 — 11
Presburger M. Uber die Vollstandigkeit eines gewissen System der Arith- metik ganzer Zahlen, in welchem die Addition als anzige Operation her- vortritt. Comptes-Rendus du ler Congres des Mathematiciens des Pays Slaves, 1929.
Raoult J. C., Vuillemin J. Operational and Semantic Equivalence Between Recursive Programs. 10th ACM Symposium on Theory of Computing, San Diego, 1978.
Raulefs P., Siekmann J. Unification of Idempotent Function. Universitat Karlsruhe, Tech. Report, 1978. (См. также SIGPLAN Bull, 13, 1979.)
Reynolds J. Transformational Systems and the Algebraic Structure of Atomic Formulas. Machine Intelligence, 5, 1970, p. 135—145.
Robinson G. A., Wos L T. Paramodulation and Theorem Proving in First-order Theories with Equality. Atachine Intelligence, 4, American Elsevier, 1969, p. 135—150
Robinson J. A. A Machine-Oriented Logic Based on the Resolution Principle, JACM, 12, 1965, p. 32—41. [Имеется перевод. Робинсон Дж. Машинно-ориентированная логика, основанная на принципе резолюции. Кибернетический сборник (новая серия), 7. — М/ Мир, 1970, с. 194— 218]
Rosen В К. Subtree Replacement systems PhD Thesis, Harvard U., 1971.
Rosen В. K. Tree-Manipulation Systems and Church-Rosser Theorems. JACM, 20, 1973, p. 160—187
Scott D. Outline- of a Mathematical Theory of Computation Monograph PRG-2, Oxford U. Press, 1970
Seidenberg A. A New Decision Method For Elementary Algebra and Geometry. Ann- of Math., Ser 2,60, 1954, p. 365—374.
Sethi R. Testing for the Church-Rosser Property. JACM, 1974, p. 671—679. Erratum JACM, 22, 1975, 424.
Shostak R. An Algorithm for Reasoning about Equality. CACM, 583—• 585, July 1978.
Siekmann J. Unification of Commutative Terms. Unpublished manuscript, 1978.
Siekmann J. Unification and Matching Problems. Ph. D. the Memo CSM-4-78, University of Essex, 1978.
Slagle J. R Automated Theorem-Proving for Theories with Simplifiers, Commutativity and Associativity. JACM, 21, 1974, p. 622—642.
Staples J. Church-Rosser Theorems for Replacement Systems. Algebra and Logic, ed Crossley J, Lecture Notes in Math., Springer-Verlag. 1975, p. 291—307.
Staples J. A class of Replacement Systems with Simple Optimality Theory. To appear in Bull, of Australian Math. Soc.
Stickel M E. A Complete Unification Algorithm for Associative-Commutative Functions. 4th International Joint Conference on Artificial Intelligence, Tbilisi, 1975. [Имеется перевод- Стиккел M Полный алгоритм унификации для ассоциативно-коммутативных функций. — Труды 4-й Международной объединенной конференции по искусственному интеллекту, Тбилиси, сентябрь 1975. — М., 1975, т. 1, с. 177—189.]
Stickel М Е. Unification Algorithms for Artificial Intelligence Languages. Ph. D. thesis, Carnegie-Mellon University, 1976.
S^abo P. The Undecidability of the DA-Unification Problem. Proc. GWAI. 1979
Tarski A. A Decision Method for Elementary Algebra and Geometry. U. of California Press, Berkeley, 1951.
Tarski A Equational Logic. Contributions to Mathematical Logic, ed. Schutte et al., North-Holland, 1968.
Thatcher J., Wagner E., Wright J. Data Type Specifications: Parameterization and Power of Specification Techniques. Tenth ACM Symposium on Theory of Computing, May 1978.
Vuillemin J. Correct and Optimal Implementation of Recursion in a Simple Programming Language J of Computer and System Sciences 9,3 (19 74), p 332—354.
Wadsworth С. P. Semantics and Pragmatics of the Z-calculus. PhD Thesis, Oxford U., 1971.
Wand M. First Order Identities as a Defining Language Indiana U. Tech. Report 29, 1976.4
Wand M. Final Algebra Semantics and Data Type Extensions. JCSS, vol. 19, no. 1, Aug 1979.
Winker S. Dynamic Demodulation Internal memo, Dept, of Computer Science, Northern Illinois U, 1975.
Zilles S Data Algebra: A Specification Technique for Data Structures. Ph. D. thesis, MIT, 1978.
Работы, вышедшие на русском языке
Емеличев В. А. Коммутативные полугруппы с одним определяющим соотношением — Ученые записки Шуйского государственного педагогического института, 1958, т. 6, с. 227—242.
Маканин Г. С. Проблема разрешимости уравнений в свободной полугруппе.— Математический сборник, 1977, т. 103, вып. 2, с. 3—147.
Мальцев А И О гомоморфизмах конечных групп —Ученые записки Ивановского государственного педагогического института, 1958, т. 18, с. 49—60.
Хачиян Л. Г. Полиномиальный алгоритм в линейном программировании. — ДАН СССР, 1979, т. 244, 5, с. 1093—1096.
ЛОГИЧЕСКИЙ АНАЛИЗ МОДУЛЕЙ
В ЛОГИЧЕСКОМ ПРОГРАММИРОВАНИИ*)
Д. МИЛЛЕР
Резюме. Мы описываем логический язык, расширяющий синтаксис позитивных хорновых дизъюнктов за счет использования импликации в целях и посылках дизьюнктов. Операционное значение цели-импликации задается теоремой дедукции: цель D id G выводится из программы ^, если цель G выводится из большей программы ^U{^}- В статье изучается качественная природа такого расширения логического программирования. Например, если формула D является конъюнкцией предложений с кванторами всеобщности, то цель D zd G интерпретируется как требование загрузить код, содержащийся в D, прежде чем попытаться вывести G, а затем выгрузить этот код, когда вычисление G завершится успехом или неудачей. Такое расширенное использование импликации позволяет дать логическое объяснение параметрических модулей, некоторых способов использования предиката assert языка Пролог и некоторых аспектов абстрактных типов данных. Для этого логического языка строится теория моделей и теория доказательств. В частности, мы показываем, как построить модель Крипке для программы путем построения неподвижной точки, и доказываем, что операционное значение импликации корректно и полно для интуиционистской логики. Мы также изучаем легко реализуемое в этом языке слабое понятие отрицания и показываем, как с его помощью можно задавать ограничения в базах данных.
ИМПЛИКАЦИИ КАК ЦЕЛИ
Мы предполагаем, что наш логический язык — это язык первого порядка со счетным числом констант, переменных, функциональных символов и предикатов (от всевозможного числа аргументов). Следующие константы содержатся в языке в качестве примитивов: бинарные логические связки Д (конъюнкция), V (дизъюнкция) и zd (импликация), кванторы V (для всех) и 3 (существует) и 0-местная логическая константа ± (ложь). Используя отрицание ~В, мы подразумеваем, что оно определяется как В zd ±. Это соглашение будет объяснено в § 7, где впервые встретится отрицание. Отметим, что ± является атомарной формулой.
Пусть А — синтаксическая переменная, пробегающая атомарные формулы. Пусть G пробегает класс формул, которые мы
Miller D. A. A logical analysis of modules in logic programmnig. J. Logic Programming, 1989, p. 79—108.
© Elsevier Science Publishing Co., Inc., 1989
© перевод на русский язык, А. А. Воронков, 1991
назовем целевыми формулами или просто целями. Мы будем считать, что все атомарные формулы являются целевыми формулами. Определяющие предложения v), обозначаемые синтаксической переменной D, рекурсивно определяются следующим образом:
D=A\Gzd A iVxDIDi Д/)2.
Определяющие предложения, так же как и целевые формулы, могут содержать свободные переменные. Будем обозначать множества определяющих предложений буквой ^. Такие множества обычно будут называться программами. На протяжении всей статьи будем считать, что программа — это конечное множество определяющих предложений.
Пусть ^— некоторое множество определяющих предложений. Определим [^] как наименьшее множество формул, удовлетворяющее следующим рекурсивным условиям:
^ <= №
если D^D^e [^], то Dx^^ и D2 ^;
если VxD ^ [^], то [хД]Ое[^] для всех термов t.
Здесь через \хЩВ обозначен результат подстановки терма / вместо свободных вхождений переменной х в D.
Если G — целевая формула, а ^—множество определяющих предложений, будем использовать запись ^НOG для обозначения того, что G можно вывести из S9, или того, что G является выходом ^. Мы используем нижний индекс О, чтобы показать, что имеется в виду операционное определение выводимости, опирающееся на интуитивное понятие вычислений. Между Но и другими логическими понятиями выводимости или истинности не предполагается никакой априорной связи. Сформулируем шесть правил вывода для отношения Н 0. Первые два относятся к структуре определяющих предложений:
^V-qA, если Ле^;
^ Но Л, если существует формула (СзэА)е^] и ^ Н0G.
Эти два правила вывода служат базисом, необходимым для определения рекурсивных процедур. Предложение вида Vx(Gzd zd Л) (где Ух обозначает список переменных, связанных квантором всеобщности) рассматривается как спецификация того, ка-
В оригинале definite douses. В контексте логического программирования это название обычно переводится просто как «дизъюнкты» или даже «кло- зы», однако в данной статье используется их расширенное толкование как достаточно широкого класса предложений —Прим, перев.
ким образом процедура, имя которой является заголовком А, может недетерминированно вызвать другой код, т. е. формулу G.
Для завершения описания языка логического программирования нужно описать класс целевых формул и способ операционного вывода неатомарных целей из программы. Можно задать логику, эквивалентную позитивным хорновым предложениям t), определив целевые формулы как
G := Л| С} Д С2 ^ VC2|3xG
и добавив следующие правила вывода:
^1—oGiVG2, если ^VqGx или ^V-qG^
НоС! Д.С2, если ^V-qGx и ^V-qG^
^ НоЭхС, если существует такой терм /, что ^ Но1хД1 G.
В таком контексте логические связки Д и V служат спецификацией недетерминированных и- и или-ветвей в поиске доказательства. Квантор 3 специфицирует бесконечную недетерминированную шш-ветвь, в которой дизъюнкты параметризуются множеством термов.
Программа на этом языке логического программирования эквивалентна конъюнкции позитивных хорновых предложений. Например, определяющее предложение
VzVz/ \V3xRAx,y> КР(у,2^ V R(z,z) =>P(z,y)]
операционно эквивалентно определяющему предложению
VzVyVx[/?(x,y)AP(y,z)zDP(z,y)] Л VzVz/[P(z,z)iD P(z,z/)].
Поскольку для этой версии определяющих предложений существует указанная нормальная форма, в работах, касающихся теоретических аспектов позитивных хорновых предложений, синтаксис этой логики обычно не описывается в такой более общей постановке. В § 8 мы обобщим этот результат о нормальной форме на программы.
В дальнейшем, однако, мы будем предполагать, что целевые формулы имеют более сложный синтаксис:
G := А | Gx Л G^ | Gx V G^ 13xG | D zd G
и что имеется дополнительное правило вывода
^V-qDzdG, если Ш^ЬоС.
Классы целевых формул и определяющих предложений теперь определены совместной рекурсией.
]) То есть стандартным предложениям языка Пролог. — Прим. ред.
Сформулированные правила вывода — это те свойства, которыми должен обладать предикат доказуемости ho- Теперь мы формализуем значение Н-о, описав секвенциальную систему доказательств (см. [9] и [18]). Секвенция — это пара Г-^0, в которой и антецедент Г, и сукцедент 0 являются множествами формул, возможно, пустыми. При записи секвенций мы часто будем просто нумеровать элементы сукцедентов и антецедентов, опуская в записи множеств фигурные скобки. Мы также часто будем использовать запись Г, В или В, Г для Г U {£}•
Каждое из правил вывода (2) — (6) можно записать в виде фигуры заключения;
^->Gt
VG2;
^->GX ^->G2
MM 1
^->3xG ’
9>,D->G
^>DzdG‘
GtdA^Y^, i=L 2, a t — некоторый терм. В таких фи- заключения секвенция, расположенная над горизонтальной
(2)(3)(4)(5)(6)Здесь гурах(2)(3)(4)(5)(6)Здесь гурахчертой, называется верхней секвенцией, а секвенция, расположенная под этой чертой,— нижней секвенцией.
(2)
(3)
(4)
(5)
(6)
Здесь гурах
(2)
(3)
(4)
(5)
(6)
Здесь гурах
О-доказательство секвенции ^-^ G— это дерево, узлы которого помечены секвенциями таким образом, что (i) корень помечен секвенцией ^-^G, (ii) промежуточные узлы являются частными случаями перечисленных фигур заключения и (iii) листья помечены секвенциями, представляющими правило вывода (1), т. е. секвенциями вида ->- А, где А е [^]. Такие секвенции называются начальными.
Мы будем изображать доказательства как деревья, растущие вверх из корня. Высота доказательства — это длина самого длинного пути от корня к некоторому листу. Размер доказательства — это количество узлов в нем.
Фигуры заключения будут относиться только к синтаксическим объектам, используемым для построения доказательства, а правила вывода — к свойствам предиката выводимости Но.
Теперь формальное значение Но можно определить так: ^ Но Но О, если существует О-доказательство секвенции ^-^-G. При этом шесть сформулированных правил оказываются очевидными заключениями. В данной статье нас в основном будет интересовать операционная выводимость в ее недетерминированном смысле. Это означает, что нам безразлично, существует ли несколько таких О-доказательств, или что система доказательства теорем, основанная на принципе «сначала вглубь», никогда не найдет такого доказательства.
Пусть 9\ := {q(а),р(b) id г (6,а),ЧхЧу \г(х,у)№{у) ^ЧУ (х))]}.
Приведем О-доказательство цели Зх[р(х) ZDq(f(x))] из 9Рр.
^у,р<Ь>^р^<PXlpkby^r^b,a^^у,р<Ь>^р^<PXlpkby^r^b,a^^x.p^^q (а)^x.p^^q (а)^х.рЦ^гф.а) Kg^^.рЦ^д^_£v^\p^qO^\_^-^3x[p(x)iDp(f(x))]^х.рЦ^гф.а) Kg^^.рЦ^д^_£v^\p^qO^\_^-^3x[p(x)iDp(f(x))](4)(4)
^у,р<Ь>^р^
<PXlpkby^r^b,a^
^у,р<Ь>^р^
<PXlpkby^r^b,a^
^x.p^^q (а)
^x.p^^q (а)
^х.рЦ^гф.а) Kg^^.рЦ^д^
_£v^\p^qO^\_
^-^3x[p(x)iDp(f(x))]
^х.рЦ^гф.а) Kg^^.рЦ^д^
_£v^\p^qO^\_
^-^3x[p(x)iDp(f(x))]
(4)
(4)
Размер этого доказательства 7, а высота 6.
Хотя операционное понятие О-доказательств интуитивно ясно, естественно, возникает вопрос, является ли оно в том или ином смысле логическим. Рассмотрим следующий пример. Пусть ^2 := {р (а) Д р (6) zd q}. Существует ли О-доказательство секвенции 3x(p(x)iDp) из ^2? Рассмотрим следующее дерево секвенций:
^2,р(а)->р(а)^2,р(а)->р(&)^2,р(а)->р(а)^2,р(а)->р(&)^>2, р (а)-^р (а) Др (6)^2,р(а)-*р/А > р pz) id у^2 — Вх (р (х) id q)^>2, р (а)-^р (а) Др (6)^2,р(а)-*р/А > р pz) id у^2 — Вх (р (х) id q)(6)(6)(4)(4)(2)(2)(5)(5)
^2,р(а)->р(а)^2,р(а)->р(&)
^2,р(а)->р(а)^2,р(а)->р(&)
^>2, р (а)-^р (а) Др (6)
^2,р(а)-*р
/А > р pz) id у
^2 — Вх (р (х) id q)
^>2, р (а)-^р (а) Др (6)
^2,р(а)-*р
/А > р pz) id у
^2 — Вх (р (х) id q)
(6)
(6)
(4)
(4)
(2)
(2)
(5)
(5)
Это не доказательство, поскольку ^2, р(а) ~^р(Ь) не является начальной секвенцией. Независимо от того, какой терм используется для подстановки вместо переменной х в корневой секвенции, это дерево нельзя расширить до О-доказательства. Хотя отсутствие такого доказательства кажется вполне разумным, важно отметить, что формула
(р (а) Д р (6) id р) id Эх (р (х) id q)
классически доказуема. (Классическое доказательство этой формулы будет приведено в § 6.) Таким образом, классическая логика некорректна для нашей операционной семантики. В § 6 мы рассмотрим логический статус Но более подробно, а до тех пор нас будет интересовать только возможность интерпретации программ с помощью Н0.
В этой статье мы не будем обсуждать вопросы практической реализации определяющих предложений в языке типа Пролог, включающем такие механизмы, как возвраты, логические переменные и унификацию. Тем не менее отметим два отличия такой реализации от более традиционного интерпретатора Пролога. Во-первых, для спецификации программ требуется явно использовать кванторы. В Прологе кванторы в хорновых дизъюнктах опущены, так как подразумевается, что свободные переменные в них связаны квантором всеобщности. Также подразумевается, что свободные переменные в целях связаны квантором существования. Однако для определяющих предложений это неверно. Например, из двух целевых формул 3-t (Уур(х,y)^q) и V^x>iy р^х.у^тзц^ только вторую можно вывести из определяющего предложения р^а, с) Д p^b, с) zd q. Если же опустить кванторы, эти две цели станут неразличимыми.
Если унификация и логические переменные стандартным способом используются для задержки и определения подстановок, то второе отличие от традиционных Пролог-систем связано с тем, что как предложения в программе, так и цели могут содержать логические переменные. Рассмотрим, например, цель вида 3x(Z>(x) zdG(x)), т. е. импликацию, связанную квантором существования, в которой связанная квантором переменная может свободно входить в обе части этой импликации. Если заменить этот квантор логической (свободной) переменной, например X, то прежде, чем доказывать G(X), к предложениям исполняемой программы необходимо добавить код D^Xy Когда с помощью унификации получена подстановка для X, в соответствии с ней должны измениться как предложения программы, так и цели.
ЗАПОМИНАНИЕ ВЫПОЛНЕННЫХ ПОДЦЕЛЕЙ
Перед тем как исследовать возможность применения нашего расширенного понимания импликации для реализации модулей, покажем, как можно использовать импликацию для моделирования временного предиката assert с ограниченной областью действия. В качестве иллюстрации рассмотрим реализацию одного способа запоминания.
Заметим, что если Л— атомарная формула, то ^ Но Л Д G тогда и только тогда, когда ^ Но Л Д [Л zd G]. Доказательство этого утверждения в одну сторону очевидно. Доказательство в обратную сторону (несколько более сложное) приводится ниже. Ясно, что размер О-доказательства второй формулы иногда может быть значительно меньше, чем для первой формулы. При доказательстве второй формулы не нужно доказывать Л заново всякий раз, когда это требуется при доказательстве G.
Рассмотрим программу на Прологе, вычисляющую числа Фибоначчи (для записи примеров программ мы обычно будем использовать синтаксис из [20]
fib (0,0).
fib(lj).
fib (N,F):— Ml is N — 1, N2 is N — 2,fib (N1 ,F1), fib (N2,F2),F is Fl + F2.
В этом примере допускается использование начальных секвенций вида T->nis/ при условии, что п является значением арифметического выражения L Если обозначить через fn п-е число Фибоначчи, то размер единственно возможного О-доказа- тельства цели fib(n, /л) зависит от п экспоненциально.
Теперь рассмотрим программу, в которой для запоминания вычисленных ранее чисел Фибоначчи используются цели-импликации (здесь символ ^ обозначает импликацию, а символ :— обозначает обращение импликации):
fib (N ,М): — memo (0,0) => memo (0,1) =>fiba (N ,М ,2). fiba(N,M,I):-memo(N,M).
fiba (N ,M, I): — N1 is I — l,N2is I — 2,memo(Nl ,F1),
memo (N2,F2),F is Fl +F2,I1 is I + L memo(I,F)=>fiba(N,M,l).
Для этой программы существует ровно одно доказательство fib (л, /«), и оно линейно зависит от п.
Перейдем к формальному обоснованию этого метода запоминания.
Теорема 1. Если А—атомарная формула, то Г Н 0A\G тогда и только тогда, когда Г Но А Д [Л id С].
Доказательство. Необходимость очевидна. Докажем достаточность. Пусть Г I— о А Д [Л zd G]. Таким образом, ГН^Л и
0 См. также книгу [У. Клоксин, К. Меллиш. Программирование на языке Пролог. — М.: Мир, 1987]. — Прим. ред.
Г, ДНоб. Пусть Ту и Т2—О-доказательства секвенций Г->Д и Г, /1 G соответственно и нам нужно построить О-доказа- тельство секвенции Г->0. Если ЛеГ, то Г = ГиМ}НоО, то есть Т2— О-доказательство секвенции Г-^G. Предположим, что А ф Г. Построим новое дерево 73, удалив А из всех антецедентов секвенций из Т2. Это дерево может не быть доказательством Г-^G, поскольку в Т2 могли быть начальные секвенции вида Г7, А, которые теперь имеют вид Y'-^A и могут не быть начальными секвенциями. Так как Г г Г7, то, добавив определяющие предложения Г7— Г ко всем антецедентам секвенций в доказательстве Ту, мы получим доказательство Г'-^А. Таким образом, добавив сверху ко всем таким неначальным листьям Т3 соответствующим образом расширенные модификации Ту, мы получим О-доказательство Г-^G. Следовательно, Г|—оЛД
AG. □
После того как мы докажем равносильность Ро доказуемости в интуиционистской логике (см. § 6), эту теорему можно будет легко доказать с использованием интуиционистской эквивалентности Л Д О и A A (A zd G).
Множество формул, которые можно запоминать подобным образом, несколько шире, чем множество атомарных формул. Такие формулы могут иметь структуру определяющего предложения и целевой формулы. Пусть М — синтаксическая переменная, пробегающая множество формул вида
M:=A\Mzd А\Му Д М2.
Нетрудно доказать, что некоторая формула является одновременно определяющим предложением и целевой формулой тогда и только тогда, когда она принадлежит классу формул, удовлетворяющих этому рекурсивному определению. Заметим, что такими формулами являются, например, все пропозициональные позитивные хорновы дизъюнкты.
РЕАЛИЗАЦИЯ МОДУЛЕЙ
Посмотрим теперь, как можно с помощью целей-импликаций реализовать предикат consult языка Пролог. Пусть classify, scanner и misc— имена файлов, содержащих коды программ на Прологе. Если эти имена встречаются в формулах, будем считать, что они обозначают конъюнкцию связанных квантором всеобщности определяющих предложений, содержащихся в этих файлах. Рассмотрим цель
Но misc zd ((classify zd GJ A (scanner zd G2) Д G3).
Ее исполнение приведет к тому, что цели Gi, G2, G3 будут проверяться разными программами. В частности, будут проверяться цели
misc, classify Но G^
misc, scanner Но G2,
misc Ho Ga-
Следовательно, импликации-цели можно использовать для структурирования среды программы во время исполнения. Например, код, присутствующий в classify, при вычислении цели G2 фактически недоступен. Это весьма желательно, если файлы classify и scanner писали разные люди. Такой механизм гарантирует отсутствие конфликтов между предикатами в этих двух программах. Существующие реализации логических программ обычно требуют, чтобы весь код загружался в одну область до начала его использования. Такое отсутствие модульности, несомненно, является недостатком этих реализаций.
Проведенное обсуждение наводит на мысль, что можно разработать понятие модулей для логического программирования, целиком основанное на логическом смысле импликации. Для этого определим модули как именованные наборы предложений. Вот, например, модуль, содержащий некоторые программы обработки списков:
module lists.
append([ ],Х,Х).
append ([U | L], X, [U | М]):- append (L, X, M).
member (X,[X|L]).— 1.
member (X, [Y | L]):— member (X, L).
memb (X,[X | L]).
memb (X, [Y | L]): — memb (X, L).
В теории определяющих предложений, которая разрабатывается в этой статье, не рассматривается оператор отсечения !. Однако в примерах мы будем предполагать, что он играет ту же роль управления механизмом возвратов, что и в Прологе.
В соответствии с нашими определениями цель может иметь вид 3x[D(x)zd G(x)], где переменная х свободна в Щх) или в G(x) или в обеих этих формулах. Это, в частности, предполагает. что определяющие предложения, составляющие модуль, могут содержать свободные переменные. Рассмотрим параме-
трический модуль
module sort (Order).
bsort (L1 ,L2): —
append (Sorted,[Big, Small | Rest], LI).
Order (Small,Big),!,
append (Sorted,[Small, Big | Rest], BetterLl), bsort (BetterLl, L2).
bsort(Ll,Ll).
Этот пример, как и последующие, вообще говоря, выходит за рамки логики первого порядка, так как содержит переменную, ведущую себя как предикат. Иначе это можно реализовать с использованием таких внелогических трюков, как замена атома Order (Small, Big) на две цели G =..*[Order, Small, Big], call(G). Существует также более прямой и более логический способ: добавить в Пролог предикатные переменные, погружая его в логику высших порядков (см. [14, 15]). Для того чтобы придать смысл этому модулю, можно использовать любой из указанных подходов.
Рассмотрим использование модуля sort для сортировки списка [2, 1, 3] ho возрастанию. Так как в bsort присутствует предикат append, вместе с модулем sort необходимо использовать модуль lists. Соответствующая подстановка вместо х в следующей цели позволит получить искомый упорядоченный список:
Но lists Д sort (<) zd Зх bsort ([2,3,1 ], х).
К сожалению, для использования модуля sort нужно явно указать модуль lists, который необходим для успешного выполнения модуля sort. Хотелось бы, чтобы автор модуля мог импортировать те модули, которые необходимы в модуле sort. Для обеспечения механизма импортирования также можно использовать импликации. Например, модуль sort можно переписать следующим образом: module sort(Orde'r).
bsort (LI, L2): —
(lists =>
(append (Sorted,[Big, Small | Rest],LI),
Order (Small,Big),!,
append (Sorted,[Small, Big | Rest],Better LI), bsort (BetterLl,L2)
)).
bsort (LI, LI).
Теперь наш список можно упорядочить с помощью простой цели Но sort (<) zd Эх bsort ([2,3,1],%).
Когда делается попытка вызвать тело bsort в качестве цели, оно вызывается с посылкой lists. Заметим, что областью действия модуля lists в первом предложении bsort является все тело этого предложения. Очевидно, что эту область действия можно сузить до двух целей append. Это весьма желательно в связи с тем, что если использовать написанный выше код, то модуль lists будет импортироваться каждый раз при рекурсивном вызове bsort. Мы будем считать, что импортирование кода, который уже импортирован, не требует затрат. Это имеет смысл с точки зрения нашей теории, так как секвенцию Г, D D id G можно вывести из секвенции Г, D G.
Для удобства изложения последующих примеров дадим несколько определений. Пусть через ^(х) обозначено конечное множество определяющих предложений, все свободные переменные которых принадлежат списку х, а символы М, Mi, М2, М3— имена модулей. Каждый из этих символов, подобно функциональным и предикатным символам, имеет фиксированное число аргументов. Аргументы имени модуля используются для обозначения формальных параметров этого модуля. С нашей точки зрения, значение модуля, например М(х),— это некоторое множество определяющих предложений ^(х). Установим соответствие между именами модулей и этими определяющими предложениями с помощью следующих синтаксических спецификаций:
module Mi module М2(х) module М3 (у, 2) import М!,М2 (Н^)) ^i^2 (х)^3 (2)
Первый модуль не является параметрическим, так как предложения из ^! не содержат свободных переменных. Mi будет просто сокращением для конъюнкции предложений из ^ь Второй модуль является параметрическим, и предложения ^2 могут содержать свободные вхождения переменной х. Наконец, третий модуль является параметрическим и явно импортирует Мь а также некоторый частный случай М2. Новый синтаксис для импортируемых модулей — это всего лишь сокращенная запись некоторых вложенных импликаций. Если бы в модуле sort для определения bsort потребовалось несколько предложений, могло бы оказаться, что для каждого из них в качестве посылки потребовался бы модуль lists. Для того чтобы не записывать эту посылку в теле каждого предложения, мы и ввели синтаксис для
импортирования. Модуль М3 имеет следующий смысл: каждое предложение вида
V^ (G zd Л)
в ^3 заменяем предложением вида
V^((M,AM2(f(r/)) = G)^ Л),
то есть тела всех предложений из М3 релятивизуются импортируемыми модулями. Затем полученные предложения ставятся в соответствие модулю М3. Конечно, при этом необходимо избежать связывания переменных. Если у — элемент списка w, то перед построением нового предложения нужно переименовать связанные переменные.
Отметим два важных факта, вытекающих из такого построения модулей. Во-первых, это понятие модуля является побочным продуктом наших определяющих предложений. Оно не добавляется в качестве специальной синтаксической конструкции, которую должен был бы понимать интерпретатор О-доказа- тельств. Смысл и использование модулей можно свести к использованию вложенных импликаций. Разумеется, на практике это сведение не следует осуществлять таким прямым способом. Необходимо рассмотреть механизм совместного использования структур для модулей. Во-вторых, определенное ранее операционное поведение импликаций таково, что если один модуль импортируется в другой, то импортированный модуль будет использоваться только первым модулем. Для обеспечения такого локального использования не нужно добавлять никаких дополнительных охраняющих конструкций. Другими словами, если некоторый модуль непосредственно не импортирует данный модуль, то он не имеет доступа к коду этого модуля.
Для иллюстрации этого факта рассмотрим два модуля: Мь содержащий единственное определяющее предложение р, и М2, содержащий определяющее предложение a zd р. Очевидно, что не существует О-доказательства того, что М2 zd р, так как в М2 нельзя доказать q. Если бы модуль М2 импортировал Мь в М2 по-прежнему нельзя было бы доказать q. Таким образом, если М' — модуль, содержащий q id р и импортирующий Mi, то в М' не должно существовать О-доказательства р. Именно так и обстоит дело. Формула, представляющая М', — это ((р id g) zd р). Легко проверить, что цель ((р zd q) id р) id р не имеет О-доказательства. Таким образом, несмотря на то, что М' импортирует модуль, в котором утверждается, что р истинно, внутри этого модуля доказать р невозможно. Следовательно, модуль Mi используется внутри М^ локально. Следует отметить, что формула
((р zd q) zd р^ zd р носит название формулы Пирса и известна как классически истинная, но интуиционистски ложная формула. Ограниченный характер импликации в интуиционистской логике— это именно то ограничение, которое необходимо для обеспечения локального использования модулей при импортировании. В § 6 мы обсудим связь го с интуиционистской логикой более подробно.
В заключение приведем пример, показывающий, как с помощью импликации можно обеспечить блочно-структурированный подход к написанию кода. Следующее определяющее предложение описывает программу обращения списков:
rev(L,K)(all К revl ([ ],К,К),
all X all L all К (revl ([X | L] ,К, ACC) :- revl (L,К, [X I ACC]))) =^revl(L,K,[ ]).
Использованный здесь синтаксис выходит за рамки синтаксиса из [20], так как нам нужно использовать выражения с кванторами в теле определяющих предложений. Вместо этого мы используем выражение all X Р, соответствующее логическому выражению VxP. Код предиката revl доступен только во время вычисления предиката
МОДУЛИ КАК ИНТЕРФЕЙСЫ
Модули можно использовать также для явного экспорта программного кода в другие модули и сокрытия конкретной реализации. Например, пусть модуль Mi содержит предложения для двухместных предикатов р и s и для трехместного предиката г. Рассмотрим модуль
module М2.
import Mh
q (X ,Y)- р (X, Y).
t(X,Y):-r(f(Y),[ ],Х).
Пусть Мо—некоторый модуль, импортирующий М2. Модуль Мо будет иметь доступ к коду для предиката р, но только через имя q. Однако код для предиката s будет недоступен модулю, так как этот предикат не упоминается в М2. Аналогично предикат t Дает только часть кода для предиката г. Наличие такого связующего модуля по духу близко работе О’Кифа [17].
В этом примере для экспорта предиката р в Mi мы выбрали предикат q. Мы могли бы также экспортировать р просто как р. Например, пусть М3 совпадает с М2, за исключением того, что
определяющее предложение q (X, У): — р (X, У) заменено на р (X, У): — р(Х, У). Конечно, эти предложения представляют собой просто сокращения определяющих предложений УхУуЦМ^р (х, у)) zd q (х, #)) и VxVz/^Mi zd р^х, у^ zd р(х,у)). С абстрактной точки зрения эта замена не имеет значения, т. е.
{(ts): М, Нор(М)} = {</,s>: М2 НО7(М)} = {(Z,s): М3 V-oPlMY
Тем не менее доказательства секвенций М3 -^p^t, s) могут отличаться от доказательств секвенций №2-^р(Л s). Рассмотрим, например, следующее дерево секвенций:
VxVz/ ((Mi о р (х,у^=) р (х, у)), М, -> р (t,s) (о)
VxVy {(Мхо р(х,у))о р(х,у))p(/,s)
По.иск О-доказательства p^t, s) из М3 приводит к поиску доказательства рУ, s) из М3 и Mi. Поскольку М3 не приводит к расширению р, это с абстрактной точки зрения то же самое, что доказывать рЦ„ s) из Mi. Однако интерпретатор О-доказа- тельств может попасть в бесконечный цикл, снова и снова используя код М3 вместо кода Мь Один из способов решения этой проблемы — экспортировать р как q. Рассмотрим следующее дерево секвенций:
VxVz/ ((М, zd р (х, у)) zd q (х, у)), М, -> р (/,s) (6) V£^£((Ay=^*^^
Mx^y^NV => р(х«у» td q (х.yj) ^-'q (t,s)
В данном случае интерпретатор вынужден исследовать код в Mi.
Возвратимся к первому примеру этого параграфа: если предикат р был реализован в Mi и содержал обращения к предикату s, то будет доступен только предикат р, экспортируемый из М2 как q, но не s. Таким образом можно скрыть некоторые аспекты практической реализации программ. Эта особенность играет важную роль в использовании абстрактного типа данных.
Для большей наглядности рассмотрим реализацию бинарных деревьев, помеченных целыми числами таким образом, что числа, находящиеся в узлах, расположенных слева (справа) от данного узла, меньше (больше) числа из этого узла. Следующий модуль представляет собой одну из возможных реализа*
ций вставки и просмотра для таких деревьев:
module btree_internal.
import lists.
insert_btree (N,bt (N,T1 ,T2)).
insert_btree (N, bt (M, T, _)): —
N < M, insert_btree (N, T).
insert_btree (N, bt (M, _, T)):-
N > M,insert_btree (N,T).
traverse_btree (leaf,[ ]).
traverse_btree (bt (N, L, R), SortedList): — traverse_btree (L, Left), traverse_btree (R, Right), append (Left, [N | Right], SortedList).
Здесь выбрано следующее представление бинарных деревьев: терм bt(N, Tl, Т2) означает нетерминальный узел, помеченный числом N, с левым поддеревом Т1 и правым поддеревом Т2. Узлы, являющиеся листьями дерева, задаются константой leaf.
Такое представление, конечно, достаточно произвольно и не очень важно для остальной части программы, использующей этот модуль. Поэтому хотелось бы скрыть практическую реализацию таких бинарных деревьев. Это можно сделать с помощью следующего связующего модуля: module btree.
make_btree (TreeName, Goal) : —
btree (TreeName, T) =>Goal.
insert (TreeName, N) : —
btree_internal =>(btree (TreeName, T),insert_btree (N,T)). traverse (TreeName, L): —
btree_internal =>(btree (TreeName, T), traverse_btree(T, L)). build (TreeName,[ ]).
build (TreeName, [X | L]) : —
insert (treeName, X), build (TreeName, L).
Этот модуль связывает бинарные деревья с задаваемыми пользователем именами; такие связи накапливаются как «временные assert» с использованием атомарных фактов вида btree (TreeName, Tree). Модуль также определяет базисные процедуры (вставки и просмотры) над такими именованными деревьями. Для исполнения цели make_b.tree(TreeName, Goal) мы вызываем цель Goal в среде, в которой имя TreeName связано с
некоторым неспецифицированным бинарным деревом. Это дерево инициализируется как логическая переменная. Последовательные вызовы insert используются для добавления целых меток в дерево. Операция вставки таких меток не порождает новых копий бинарного дерева: при этом лишь специфицируются логические переменные внутри дерева. В каком-то смысле этот тип данных представляет собой монотонные бинарные деревья: такие деревья могут расти от листьев, но если узел помечается некоторым значением, в него уже нельзя внести изменения. При просмотре бинарного дерева все логические переменные в нем заменяются константой leaf и дальнейшие вставки в дерево становятся невозможными.
В следующем модуле описывается процедура сортировки, использующая тип данных btree:
module btree_sort.
import btree.
binsort (L, K): — make_ btree (sort, (build (sort, L), traverse(sort, K))).
Здесь sort — имя бинарного дерева, и весь доступ к дереву осуществляется через, это имя. Такой код не зависит от практической реализации бинарных деревьев. Например, если бы модуль btree-internal пытался сбалансировать деревья при некоторых вставках, смысл кода не изменился бы. Пользователь, импортирующий btree-sort, имеет доступ только к бинарному отношению binsort. Любой другой код недоступен.
Модуль btree не импортирует явно модуль btree-internal: он импортируется лишь локально в два из трех предложений. Если бы модуль btree-internal импортировался во все три предложения, то для цели Goal в make_btree(TreeName, Goal) оказалось бы доступным внутреннее представление деревьев. Это нарушило бы механизм сокрытия. Объявления об импортировании часто приводят к тому, что у импортируемых модулей оказывается слишком широкая область действия. Явное употребление импликации обеспечивает более избирательное действие.
Хотя такое построение типов данных на первый взгляд охватывает много стандартных программистских понятий из области абстрактных типов данных, оно не покрывает их полностью. Например, модули не обеспечивают совершенного механизма сокрытия. Всегда можно получить доступ к внутренней структуре объектов данных, пытаясь угадать их реализацию. Например, некоторый модуль может реализовать заново код в btree-internal, получая таким образом доступ к представлению бинарных деревьев. Аналогично, вызывая цель btree (Name, Tree) в нужном контексте, пользователь может получить доступ ко всем
хранящимся в памяти бинарным деревьям. Конечно, для этого пользователь должен знать, что они хранятся в памяти именно таким образом. По-видимому, для того, чтобы обеспечить большую степень безопасности для абстрактных типов данных, потребуется дальнейшее расширение или логики, или управляющих примитивов рассматриваемого языка программирования. В [15] мы описали расширение определяющих предложений, а именно добавление целей, связанных квантором всеобщности, которое можно использовать для сокрытия доступа к конструкторам термов в типах данных. Обсуждение этого механизма лежит за пределами нашей работы.
Код, содержащийся в двух различных модулях, может перекрываться, то есть они оба могут содержать определения общего предиката. Например, предположим, что два модуля, Mi и М2, содержат предложения, определяющие двухместный предикат р. Бывают случаи, когда необходимое значение р — это просто объединение предложений из Mi и М2. Так обстоит дело в том случае, если эти модули являются частью базы данных, состоящей из некоторых фактов, и мы хотим просто собрать все факты вместе. Это можно сделать с помощью следующего запроса:
H0M( Л М2=> ЗхЗур(х,у).
Другой способ объединения модулей заключается в том, чтобы рассматривать их как разные версии некоторой программы. В этом случае нам может понадобиться найти решение р, соответствующее версии, содержащейся в Mi, а затем — соответствующее версии, содержащейся в М2. Для этого можно построить модуль
module М3
q(X,Y):—М, =^p(X,Y).
q(X,Y):—M2=>p(X,Y),
а затем использовать запрос
H0M3ZD ЗхЗу q^x^yY
Когда некоторая программа находится в модуле, часто удобно рассматривать эту программу как полностью определенную внутри данного модуля. Это означает, что в любой среде модуль должен иметь одно и то же значение. Как показано в приведенном примере, вместе с заданным модулем можно использовать второй модуль таким образом, что предложения этих двух модулей объединяются. Такое добавление посторонных предложений может сильно изменить первоначальный смысл некоторых программ. Когда это нежелательно, можно добавить
управляющие примитивы, запрещающие расширение программ в модулях. Для этого можно явно использовать комбинацию !, fail в модуле интерфейса. Например, рассмотрим модуль module closedsort (Order).
import sort (Order).
binsort (LI,L2), :—bsort (LI ,L2); !,fail.
Этот небольшой модуль определяет версию пузырьковой сортировки, которую нельзя расширить посторонними предложениями: интерпретатор, осуществляющий поиск в глубину, никогда не получит к ним доступа.
Мы могли бы еще многое сказать о том, как можно использовать понятие модуля для структурирования программы и поиска, но сейчас мы перейдем к изучению некоторых формальных аспектов определяющих предложений и О-доказательств.
ТЕОРИЯ МОДЕЛЕЙ
В этом параграфе мы дадим альтернативное описание операционной выводимости. Для этого мы построим теоретико-множественную структуру, т. е. некоторую модель, такую, что ^V-qG тогда и только тогда, когда G выполняется в этой модели. Основная трудность построения такой модели состоит в том, что программа может расти в процессе исполнения. Это означает, что для проверки справедливости ^Н0G может оказаться необходимой проверка выполнения SPVo G\ где У—некоторое расширение ^. С точки зрения теории моделей это означает, что интерпретация ^ может зависеть от интерпретаций, связанных с большими программами. Поэтому мы применим подход к определению семантики, использующий возможные миры, или модели Крипке, т. е. попытаемся интерпретировать все программы одновременно с помощью одной большой интерпретации, аналогичной интерпретации Крипке. После этого можно будет индуктивно построить единую интерпретацию и рассматривать ее как интерпретацию всех программ. Эта интерпретация будет наименьшей неподвижной точкой некоторого оператора. Более подробно модели Крипке рассматриваются в [5] и [19].
Предположим, что выбрано фиксированное множество нело* гических констант, функциональных и предикатных символов. Обозначим через °LL множество всех замкнутых ]) термов (эр- брановский универсум), через 36—множество всех замкнутых атомарных формул (эрбрановский базис), а через Ж—множество всех программ. Назовем интерпретацией любую функцию
9 То есть не содержащих предметных переменных. — Прим. ред.
1 ЛГ -> powerset (5^), для которой Vwv ^2^^^^ w2 ^1 (^’1)^ ^/(^2)]- Таким образом, интерпретация — это просто отображение, сопоставляющее каждой программе множество «истинных» атомарных формул, которое является «монотонным» (т. е. при увеличении программы множество соответствующих ей истинных атомов не уменьшается).
Для интерпретаций /1 и /2 определим следующие отношения и операции:
Iv с^.^еГ [/J (w) £ /2 И],
(/1 и hHw) := Л М и Л>(^Х
(Л П I2)(w):= /1 (ш) п М®)-
Из того, что множество-степень 36 является полной решеткой, сразу следует, что множество всех интерпретаций также является полной решеткой относительно ^. В этой решетке U '— оператор объединения, а П — оператор пересечения. Наименьшая интерпретация /± задается условием /±(ш) = 0 для всех w е У.
Определим теперь понятие выполнимости I,w\\=G замкнутой целевой формулы G в интерпретации / на программе w;
/,w||=X тогда и только тогда, когда A^I^wY
/,^11=6?! V О2 тогда и только тогда, когда I,w\\=GY или I,w\\=G2. I,w\\~ G{ /\ G2 тогда и только тогда, когда I,w\\=Gx и Lw\V=G2. L w ||=3a:G тогда и только тогда, когда I,w ||= [хД] G для некоторого / е QZ.
I,w\\= D zd G тогда и только тогда, когда Lw U {^} 11= G.
Интрепретацию можно представить себе как большой набор моделей, индексированных программами. При этом I,w\\=G означает, что G истинно в модели, входящей в / и индексированной программой w. Истинность цели D о G в некоторой модели на программе w определяется инстинностью цели G на программе w U {£)}. Таким образом, моделируется увеличение программ.
Теперь мы хотим построить интерпретацию I, для которой ^ I— 0 G тогда и только тогда, когда /, ^||=0. Такая интерпретация получается в результате построения наименьшей неподвижной точки. Для этого определим функцию Г, отображающую интерпретации в интерпретации следующим образом:
Т (/) (w) = {Л | А е [оу] или существует такое замкнутое предложение 0юЛ^[ш], что /,&y||=G}.
Сформулируем две леммы об отношении ||=. Обе они доказываются индукцией по структуре целевых формул. Мы
докажем только вторую лемму: первая доказывается аналогично и более просто.
Лемма 2. Если 1Х^12 то для всех weT из того, что /ь w ||= 6, следует, что /2, ^ ||= G.
Лемма 3. Пусть Ix^ L^ U — ••• — некоторая последовательность интерпретаций. Тогда если G — цель,хю ^Ж и U/li Ц, оу||= ||= G, то существует такое ^ ^ 1, что lk w ||= G.
Доказательство. Проведем индукцию по структуре G. Если G — атомарная формула, то из и^ Ц ,w ||= G следует G^ ^ (иП=/0 (^)= U^! h (w\ Таким образом, существует такое 6^1, что G^UkwY Следовательно, lk,w\\=G. Теперь предположим, что для всех возрастающих последовательностей интерпретаций и всех w^lf лемма выполняется для любой целевой формулы, длина которой меньше некоторого фиксированного числа. Нужно рассмотреть следующие четыре случая.
Случай k G = GX f\G2. Поскольку U/ti Ц ,w ||= Gi Д G2, имеем Uzti Ц дм ||= Gx и иГ=1Л,^||=О2. По индукционному предположению существуют два таких положительных целых числа / и /, что Ii,w\\—Gx Ij,w\\—G2. Пусть к — максимальное из чисел 1Д. По лемме 2 имеем Iklw\\=Gx, Ik,w\[=G2 и, следовательно, 4,H=Gi Л 62-
Случай 2; G = GX\JG2. Поскольку U^=i I^w ||= Gx V G2, для некоторого /=1,2 имеем uT=\li,w\\=Gj. По индуктивному предположению существует такое положительное целое к, что Ik,w ||= Gj. Следовательно, Ife,w\\= GXV G2.
Случай 3: G = HxG\ Поскольку UT=i It ^w ||= 3xGf, для некоторого i^cU имеем Ufti h,w ||= [x//] G'. По индукционному предположению существует такое положительное целое к, что Ik,w ||= [х//] G'. Следовательно, Ikw\\=3xG'.
Случай 4\ G = D zd G'. Поскольку U^i It ,w ||= D zd G', имеем Ll^i IhW U {E)} ||= G'. По индукционному предположению существует такое целое положительное к, что Ik, w U {5} 11= G\ Следовательно, Ik,w ||= D id G'. □
Заметим, что /±,^||=Оне выполняется ни для каких ^ и G и что Г (/ L),^ ||= G тогда и только тогда, когда G — атомарная формула и G^ V^A- Теперь покажем, что Т является монотонной и непрерывной функцией на решетке интерпретаций.
Лемма 4. Функция Т является монотонной, т. е. из Л ЕЕ/2 следует, что Т (/J ^ Т Д^.
Доказательство. Предположим, что 1Х^1Ъ и пусть w ^Tf и А^ТДХ)^У Тогда или А е [^], и в этом случае Ле е Т(/2) (оу), или существует такое замкнутое предложение G id zd Л е [ку] , что Ix, w ||= G. По лемме 2 имеем /2, w ||= G, следовательно, А е Т(/2) VWV Из произвольности w и А заключаем, что ПЛ^ТД/з).□
Лемма 5. Функция Т является непрерывной, т. е. если /1 Е= £=/2 Е^/3 ЕЕ...— последовательность интерпретаций, то
иГ=17’(Л) = 7’(иГ=1Л).
Доказательство. Для доказательства этого равенства докажем включение в обе стороны.
Поскольку I3-^UT=\Ii для всех /^1, из леммы 4 следует Т (Д) ЧЕТ (и~ i Д). В силу произвольности / имеем UT=i Т Д^ ^
Пусть we Ж и ЛеГ(и”=1/<)(а>). Если Д е [ш], то Aeiai')(w') для любого /^1 и, очевидно, А г (UiZi Т (/,)) (ш). В противном случае существует такое замкнутое предложение G id А е [оу], что LJ^=i Ii,w ||= G. По лемме 3 существует такое й^1, что Ik, w||=G. Таким образом, А е Т ДД (w) ^(иГ-^^И. в силу произвольности w и А получаем
Эта лемма и ее доказательство остаются верными, даже если опустить требование конечности программ. Допущение о бесконечности программ не влияет на непрерывность Т.
По теореме Кнастера — Тарского (см. [1]) наименьшая неподвижная точка функции Т задается уравнением
Т°° (/i) = Т Да} U Г Д^ U Г3 Д J...
Теперь мы можем доказать следующую теорему.
Теорема 6. Если ^ — замкнутая программа и G — замкнутая целевая формула, то ^ Но G тогда и только тогда, когда Т°°Дд), ^ ||= G.
Доказательство. Сначала покажем, что из ^ Но G следует ^(/jl), ^||=G. Для этого докажем индукцией по 6, что для всех программ ^ и всех замкнутых целевых формул G если секвенция ^-^G имеет О-доказательство высоты к, то Т°°Д^Д ^ ||= G.
Базис индукции*, k = 1. В этом случае G — атомарная формула и Ge >]. Тогда С^ГДа.)^ ^Т^Д^^ и Т^ДаЗ, ^ h G.
Шаг индукции*, k > 1. Нам нужно рассмотреть те случаи, в которых последний шаг О-доказательства Г-> G является вариантом одной из фигур вывода (2) — (6). Рассмотрим лишь случаи, соответствующие фигурам вывода (2) и (6) (остальные три случая очевидны).
Предположим, что последней фигурой вывода была фигура (2). Тогда G — атомарная формула и существует такая формула G' id G е [д], что G' имеет О-доказательство высоты к—1. По индукционному предположению Т°° (/±), д ||= G'. По определению Т имеем О е 7(7°°(/±)) (5^) = 7°°(/±) (5^). Следовательно, Т°° (/±), ^ ||= G.
Предположим теперь, что последней фигурой вывода была фигура (6). Тогда G имеет вид D id G' и ^, D -> G' имеет О-доказательство высоты к—1. По индукционному предположению Гоо(/1),^и{О}||=С/. Следовательно, (Z±),^ ||= О =d Gz.
Докажем теперь обратное. Пусть ^ и G таковы, что ТкЦС^ ^||=О для некоторого ^^1. Предположим также, что к — наименьшее число, обладающее таким свойством. Если G содержит м 0 вхождений логических связок и кванторов, сопоставим паре S9, G меру — ординал со- (к— 1) + ^. Докажем индукцией по этой мере, что для всех программ ^ и всех замкнутых целевых формул G если мера пары ^, G есть а, то ^\—0 G.
Базис индукции*, мера ^, G равна 0(=(о-0 + 0)- Тогда G — атомарная формула и Т1 (Z±),^]|= G. Но в этом случае G^ е [^] и ^ Но G.
Шаг индукции*, мера ^, G равна io-a + р > 0. Этот случай распадается на два случая: когда указанный ординал является предельным и когда не является, т. е. когда р = 0 и когда Р >0.
Случай Р = 0. В этом случае а > 0 и G — атомарная формула. Следовательно, Ta^(Ii.C ^||=G и Ge r^’f/Jf,^). По определению Т либо G^ [g], откуда сразу следует ^H0G, либо существует такая замкнутая формула G'dGe [^], что Та (Z±), ^ ||= Gz. Во втором случае ординал со -(а—1) + pz, где pz— число логических связок в G', меньше, чем со а + р. По индукционному предположению существует О-доказательство ^V0G\ следовательно, по правилу (2) существует О-доказательство g^y-oG.
Случай р > 0. В этом случае формула G не является атомарной.-Поэтому эта часть доказательства разбивается на четыре случая, соответствующие разным связкам внешнего уровня формулы G. Доказательства для этих случаев очевидны, поэтому мы опускаем их.
Наконец, если 7°° (Z±),^ ||= G, то по лемме 3 существует такое k 1, что 7fe (Z±) ,^ |(= G. Следовательно, у пары £7, G есть
некоторая мера и, согласно проведенному индуктивному доказательству, ^ Но G-□
Аналогичная теорема для классической теории позитивных хорновых дизъюнктов приведена в [1]. Результат, полученный в этой статье для наименьшей неподвижной точки, можно рассматривать как частный случай теоремы 6.
ТЕОРИЯ ДОКАЗАТЕЛЬСТВ
В этом параграфе мы ставим вопрос о том, представляет ли наш язык новую логическую систему или является частным случаем некоторой известной логической системы.
Отметим, что обычно основной упор в теоретических обсуждениях логического программирования делается на другое. Как правило, исходят из некоторой специфической логики, а именно классической логики первого порядка, и затем исследуют возможности метатеории этой логики в применении к языкам программирования. Мы поступили наоборот: сначала рассмотрели один интересный и естественный язык программирования, а потом стали искать такую логику, метатеория которой описывает операционную семантику этого языка. Мы ищем такую логику не ради обоснования языка программирования: он уже обоснован вплоть до установления формальных свойств и реализации многих важных программистских концепций. Напротив, мы хотим выяснить, рассматривалась ли наша логика в существующей литературе.
Мы уже отмечали, что если в некоторой логике доказуемость описывается с помощью Но, то эта логика не может быть классической. Для того чтобы проиллюстрировать это еще раз, рассмотрим целевую формулу Gx У (D zd G2). В нашей операционной семантике эта цель интерпретируется как цель, которая выполняется, если выполняется Gi или при заданной программе D выполняется G2. Очевидно, что областью действия D является только G2. Однако классическая логика не допускает такой интерпретации этой цели. Например, в классической логике следующие эквивалентности являются тавтологиями:
Gi y(D^G2)^Gx У ~ОУС2
Dy Gi V G2
^(П^Ох)Уф^О2).
Классическая эквивалентность p^q и ~pyq противоречит нашему пониманию импликации как средства построения среды.
В,СЛ-^^ A-L В Д С,А^0В,СЛ-^^ A-L В Д С,А^0Г—>А,В V-RА,В VCГ-*0,В С,Г->АВ^С,Г->АС10ГДхД] Р -^0 -^-!V-LГ,УхВ->0Г,[х/у]В^0Г,ЗхР->0 d'Г—>А,В V-RА,В VCГ-*0,В С,Г->АВ^С,Г->АС10ГДхД] Р -^0 -^-!V-LГ,УхВ->0Г,[х/у]В^0Г,ЗхР->0 d'Г—>0,±Г—>0,±Г—>0,ВГ—>0,В±-R±-R
В,СЛ-^^ A-L В Д С,А^0
В,СЛ-^^ A-L В Д С,А^0
Г—>А,В V-R
А,В VC
Г-*0,В С,Г->А
В^С,Г->АС10
ГДхД] Р -^0 -^-!V-L
Г,УхВ->0
Г,[х/у]В^0
Г,ЗхР->0 d'
Г—>А,В V-R
А,В VC
Г-*0,В С,Г->А
В^С,Г->АС10
ГДхД] Р -^0 -^-!V-L
Г,УхВ->0
Г,[х/у]В^0
Г,ЗхР->0 d'
Г—>0,±
Г—>0,±
Г—>0,В
Г—>0,В
±-R
±-R
Мы покажем, как можно обосновать нашу интерпретацию логических связок в рамках двух более слабых логик: минимальной и интуиционистской.
Опишем теперь другое, отличное от введенного в § 1 множество фигур заключения для секвенций (эта система вывода заимствована из [18]):
Г—>А,В Г^А.С A-R
Г^А.ВДС
В,А->0 С,А-^0
■V-L
В\/СЛ-*6
Г^А.С V-R Г-^А,ВуС
В,Г—>0,С> -L =э -R
Г—>0,ВоС
Г->0,[х//]Р 3-R
Г^0,ЗхВ
Г -> 0, [x/z/] Р I2^l_v-R
Г-»0,УхВ
Как обычно, на фигуры 3-L и У-R накладывается следующее ограничение: переменная у не должна входить ни в одну из формул нижней секвенции.
Доказательством секвенции Г->-0 называется конечное дерево, построенное с использованием этих фигур заключения, листья которого помечены начальными секвенциями, т. е. такими секвенциями вида Г —>- 0, что пересечение Г П 0 содержит ± или некоторую атомарную формулу.
Секвенциальные системы такого типа обычно включают три структурные фигуры заключения, которые мы здесь не приводим. Две из этих фигур заключения — перестановка и сокращение — нам не нужны, так как у нас антецеденты и сукцеденты секвенций представляют собой множества, а не списки. Поэтому порядок и число вхождений формул в секвенции явно не указаны. Если антецедент имеет вид Г, В, то вполне возможно, что Be Г, т. е. формулы могут входить в антецеденты и сукце-
денты произвольное число раз. Третьей общепринятой структурной фигурой заключения является уточнение: к заданной секвенции можно добавить произвольное число формул в антецедент и сукцедент. Следующая лемма, которая легко доказывается по индукции, устанавливает некоторую форму утончения в антецеденте, которая нам позднее пригодится. Тем не,менее мы не вводим утончение как отдельную фигуру заключения.
Лемма 7. Пусть Е —доказательство секвенции Г->0, а Г'— некоторое множество формул. Пусть S + Г' — дерево секвенций, полученное добавлением Г' в антецеденты всех секвенций из Е. Тогда S + Г' является доказательством секвенции Г (J Гл-^
Определим три типа доказательств. Любое доказательство будем называть С-доказательством. Любое С-доказательство, во всех секвенциях которого сукцеденты являются одноэлементными множествами, назовем 1-доказательством. Далее, 1-доказательство, не содержащее вхождений фигуры вывода -L-R, будем называть М-доказательством. Секвенциальные доказательства в классической логике (С), интуиционистской логике (I) и минимальной логике (М) представляются С-доказатель- ствами, 1-доказательствами и М-доказательствами соответственно. Наконец, будем использовать запись Г Нс В, ГН/ В или Г Нм В, если у секвенции Г~>В существует С-доказательство, 1-доказательство или М-доказательство соответственно. Очевидно, что из Г Нм В следует Г Н/ В, откуда в свою очередь следует Г Нс В. Если множество Г пусто, будем опускать его в левой части записи этих трех отношений. Более подробное обсуждение интуиционистской и минимальной логик можно найти в [5, 9, 18, 21].
Приведем С-доказательство формулы из § 1:
р^.р^-^р^а) p(a),p(b)-+p(b)
д.^
р (а), ?(&)-»? (a) A P(b) p(a),p(b),q-^q 2D-L
рИАрМ^./Ф),/*^
p(a)Ap(b)zDq,p(a)^q>p(b)=)q p{a)Ap(b)=>q^p(ti)^q,p(b)=Dq
р (а) Д р (Ь) zd q -> Зх (р (х) о q)
Приведем также аналогичное С-доказательство формулы Пирса, упомянутой в конце § 3:
^р-р^д р-*р
^р=>д)=> р)-*р„
з-R
~> ((? =>?)=> р) => Р
Ни одна из этих формул не имеет 1-доказательства.
В классических доказательствах сукцедент может содержать более одной формулы, и при «обработке» любая из них может взаимодействовать с другими формулами сукцедента. Это становится особенно наглядным, если вернуться к целевой формуле GY\/ ^D G2) и рассмотреть следующее дерево секвенций:
D-^GX,G2
o-R
> Gj ,D zd 62
VR
->GX,GX V(O=dG9)
1 VR
->g,V(/)dG2)
Редукция корневой секвенции к D^GX, G^ не удовлетворяет требованию, чтобы областью действия D являлась цель G^. Допущение более чем одной формулы в правой части противоречит нашей интерпретации логических связок.
Теорема 8. Пусть ^ — множество определяющих предложений, a G — целевая формула. Если ^\—0G, то М В ,^ \-, В и ^V-CB.
Доказательство. Каждую из фигур заключения (2) — (6) можно получить в М\ фигура (2)—это комбинация V-L,A-L, zd-L и начальной секвенции; фигура (3) —это V‘R; фигура (4)—это Д-R; фигура (5)—это 3-R; фигура (6) — это zd-R. Начальная секвенция Но выводится с использованием V-L,A-L и начальной секвенции этой системы. Так как все эти фигуры заключения выводятся в самой слабой системе М, то они также выводятся в I и С.
Следующие две леммы тривиально доказываются индукцией по высоте доказательств.
Лемма 9. Пусть ^— множество определяющих предложений, а 0 — множество целевых формул. Тогда доказательства секвенции не содержат вхождений фигур заключения \J-L> 3-L и V-R,
Лемма 10. Пусть &— множество определяющих предложений. Тогда не существует 1-доказательств секвенции ±.
Из леммы 10 следует, что никакое 1-доказательство секвенции ^-^9 не может содержать примеров фигуры заключения _L-R. Следовательно, если ^—множество определяющих предложений, a G— целевая формула, то ^ НfG тогда и только тогда, когда Н м G.
Теперь мы хотим, показать, что если секвенция У^С интуиционистски доказуема, то она доказуема и операционно. Системы доказательства О и I имеют много общих правил, но у них есть два существенных различия. Во-первых, в О-доказательствах нет фигур заключения, соответствующих V-L и Д-L. Это различие компенсируется использованием [^] вместо ^ в правилах вывода (1) и (2). Во-вторых, что еще более важно, соответствие между фигурами заключения (2) и zd-L не является прямым. Если имеется секвенция G'td A, &-+G, то фигура (2) применима, только если G = A, в то время как для zd-L таких ограничений нет. Фактически zd-L порождает поддоказательство секвенции Л, ^-^G, которое не использует фигуру заключения (2). Эти различия приводят нас к следующим определениям и наблюдениям.
Каждый пример фигуры заключения zd-L находится в корне двух меньших доказательств. Назовем эти два доказательства правым поддоказательством и левым поддоказательством этого примера zd-L. Пример zd-L назовем\ простым, если его правое поддоказательство имеет высоту 1. В противном случае пример называется сложным. Доказательство, в котором все примеры zd-L просты, назовем простым доказательством. Именно простые примеры zd-L соответствуют использованию фигуры заключения (2). В лемме 12 мы покажем, что простые 1-доказательства предоставляют те же возможности, что и все 1-доказательства. Но для этого нам потребуется следующая лемма.
Лемма 11. Пусть Е—I-доказательство вида
^Zg' a.^^g zd-L, G'zdA^-^G
где Bi и E2— простые I-доказательства. Тогда существует простое 1-доказательство секвенции
G'zdA^->G.
Доказательство. Покажем, что сложные примеры zd-L можно перевести в простые, двигаясь назад по фигурам заключения
в В2. Для этого нужно показать, каким образом zd-L «коммутирует» со всеми фигурами вывода, которыми может заканчиваться В2. Формально доказательство проводится индукцией по высоте В2. Если высота равна 1, то данный пример zd-L уже является простым. Предположим, что высота В2 больше 1. Покажем, каким образом этот сложный пример коммутирует с последней фигурой вывода В2. Рассмотрим каждую из фигур вывода.
Случаи A R,zd-R,V"R и 3-R- Предположим, что фигурой вывода, расположенной в корне В?, является Д-R. Тогда В
имеет вид
A^->GX A^->G2
A^-^Gx Д G.
G' zd A^ —> Gx ^ G2
Рассмотрим следующее 1-доказательство:
Bls£Ejв^
^->0' A^->GX &-+G'A^->G2
-- ^-L ’- zd-L
G' о A^^GxGf ^A^->G2
Ц AR
G zd A^->Gx Л G2
Оба примера zd-L имеют простые правое и левое поддоказательства, причем их правые поддоказательства короче, чем В2. Для завершения доказательства достаточно воспользоваться предположением индукции для каждого из поддоказательств. Случаи, когда последней фигурой вывода является zd-R, VR или 3-R, рассматриваются аналогично.
Случаи V-L и Д-L. Предположим, что фигурой вывода, расположенной в корне В2, является V-L. В этом случае В имеет вид
AAx^D,^-^ G—— V-LA.MxD.^-^GAAx^D,^-^ G—— V-LA.MxD.^-^GЕ2
AAx^D,^-^ G
—— V-L
A.MxD.^-^G
AAx^D,^-^ G
—— V-L
A.MxD.^-^G
MxD^'-^G',,
зэ-L G' zd A^xD^' ->G
где ^ = У U{VxDy Рассмотрим следующее 1-доказательство:
. Sj+MD},B'+{vxr>}
[x/Z] D, MxD ^ -^GrA, [x/Z] D, M xD .^^G-
G' ZD A, MxD ~[xlt] D.^-^G
G'zd A^xD^'-^G
Этот пример zd-L имеет простые правое и левое поддоказательства, причем правое поддоказательство проще, чем В2. Для завершения доказательства достаточнохвоспользоваться предположением индукции для каждого из поддоказательств. Случай, когда последней фигурой вывода S2 является Д-L, рассматривается аналогично.
Случай zd-L. Рассмотрим, наконец, случай, когда последней фигурой вывода В2 является zd-L. При этом В имеет вид
G[ zd Ау^' G*G[ zd Ау^' G*A^'^GV A.A^^'^GA^'^GV A.A^^'^GA,Gvzd Ax^'^GA,Gvzd Ax^'^G
G[ zd Ау^' G*
G[ zd Ау^' G*
A^'^GV A.A^^'^G
A^'^GV A.A^^'^G
A,Gvzd Ax^'^G
A,Gvzd Ax^'^G
G'zd A,Gvzd Av,^'-^G
где ^ ={Gi zd Л1} U ^'. Поскольку верхний пример zd-L простой, секвенция A, Ах, G является начальной. Следовательно, либо G ^ ^', G = А, либо G = Ах. Если G ^ ^', то простым 1-доказательством секвенции
G'zdA,Gv zd Ах, ^ ->G
будет доказательство, состоящее из одного узла, помеченного этой секвенцией. Если G = A, то простым 1-доказательством этой секвенции будет
GxZdAx,^'--> GGxZdAx,^'--> GA,Gx zd Ax^'-yGA,Gx zd Ax^'-yG
GxZdAx,^'--> G
GxZdAx,^'--> G
A,Gx zd Ax^'-yG
A,Gx zd Ax^'-yG
G'zd A,GxZd A^'-^G
Наконец, если G = Av, рассмотрим следующее 1-доказательство:
BiE' + td^!}
zd-L A,G\zd A,^-^Gzd-L A,G\zd A,^-^GG"zd A,Gxzd AX,^^GXG"zd A,Gxzd AX,^^GXG'zd A,Gxzd Ax,^ -^GG'zd A,Gxzd Ax,^ -^Gzd-L.zd-L.Gx ZD Ax^'^G' A,G{ zd Av,^-> Gx
zd-L A,G\zd A,^-^G
zd-L A,G\zd A,^-^G
G"zd A,Gxzd AX,^^GX
G"zd A,Gxzd AX,^^GX
G'zd A,Gxzd Ax,^ -^G
G'zd A,Gxzd Ax,^ -^G
zd-L.
zd-L.
Здесь нижний пример zd-L простой, в то время как верхний — не обязательно простой. Но поскольку у верхнего примера правое поддоказательство короче, чем В2, для завершения доказательства достаточно воспользоваться предположением индук
ции.
Лемма 12. Пусть ^ — множество определяющих предложений, a G — целевая формула. Если существует 1-доказательство секвенции ^^G, то существует и простое 1-доказательство этой секвенции.
Доказательство. Лемма доказывается индукцией по числу сложных примеров o-L в I-доказательстве секвенции 9AQ. Если число таких примеров больше нуля, выберем из них тот, который имеет только простые левое и правое поддоказательства. Этот пример можно устранить, используя предыдущую лемму. В полученном 1-доказательстве будет на один сложный пример меньше. Таким способом можно устранить все сложные примеры. □
Теорема 13. Пусть 9—множество определяющих предложений, a G — целевая формула. Тогда 9 Ьо G равносильно 9\~mG и равносильно ^hG.
Доказательство. Нам осталось доказать только то, что из ^ Н1 G следует 9\—о G. Сначала докажем индукцией по высоте В, что если S— простое I-доказательство секвенции 9*'^ G и [^'l ^ [^], то существует О-доказательство секвенции ^->G. Будем считать, что никакие промежуточные секвенции в В не являются примерами начальных секвенций, так как если бы такая секвенция была, то доказательство можно было бы упростить, удалив расположенные над ней поддоказательства. Если высота В равна 1, т. е. это просто начальная секвенция, то G— атомарная формула и Ge [^1'. Следовательно, Ge [^] и ^-^G является начальной секвенцией для Но. Тогда искомое О-доказа- тельство состоит из одной этой секвенции.
Теперь предположим, что высота В больше 1. Пусть Si и, если необходимо, В2—1-доказательства, полученные после вычеркивания последней фигуры заключения Е. Рассмотрим следующие семь случаев в зависимости от фигуры заключения, которой оканчивается В.
Случаи V"R,A"R,3-R. Пусть последняя фигура заключения В — это Д-R. Тогда G имеет вид Gx Д G2, следовательно, В! — доказательство секвенции ^-^Gi, а В2 — доказательство секвенции ^ ->- G2. Пусть, в соответствии с предположением индукции, Тх и Т-2 — О-доказательства секвенций 9-^Gx и g>-^G2 соответственно. Искомое О-доказательство секвенции 9-^- Gi A G2 получается добавлением фигуры заключения (4) к деревьям Тх и Т2. Случаи V R и 3R рассматриваются аналогично. При этом вместо фигуры заключения (4) используются фигуры (3) и (5) соответственно.
Случай zd-R. Пусть последняя фигура заключения В — это o-R. Тогда G имеет, вид DzdGi, следовательно, Si—доказательство секвенции ^z, D-^GX. Пусть, в соответствии с предположением индукции, Т1 — О-доказательство секвенции 9, D-^Gx. Мы можем воспользоваться предположением индукции, так как из [д9'] ^ [^] следует [^ Щ е \9, D\. Искомое О-до-
казательство секвенции 9-^Dzz>Gy получается добавлением к Ту фигуры заключения (6).
Случаи V-L и Д-L. Пусть последняя фигура заключения В — это V-L. Тогда 9' = {VxD) U 9" для некоторого множества 9м, a Bi— доказательство секвенции 9", \x/t\D-^- ->- G для некоторого терма t. Применяя предположение индукции, сразу получаем искомое О-доказательство секвенции 9-^G. Мы можем воспользоваться предположением индукции, так как из [9^ ^[9] следует [9", [x/t]D]^[9]. Случай фигуры заключения Д-L рассматривается аналогично.
Случай zd-L. Пусть последняя фигура заключения В—это zd-L. Тогда 9' = {G zd Л} J 9м для некоторого 9м и доказательство В должно иметь вид
9"^GrA,9”-+G9"^GrA,9”-+GG' zd A.9" ->GG' zd A.9" ->Gzd-Lzd-L
9"^GrA,9”-+G
9"^GrA,9”-+G
G' zd A.9" ->G
G' zd A.9" ->G
zd-L
zd-L
Поскольку В простое, A, 9'-^ G должно быть начальной секвенцией. Из этого следует, что G = Л, так как в противном случае G е 9П и корневая секвенция В является начальной секвенцией, что противоречит нашим предположениям о В. Пусть в соответствии с предположением индукции Ту— О-доказательство секвенции 9-^ G'. Мы можем воспользоваться предположением индукции, так как из \9'\ [9] следует \9"\ [9}. Поскольку G'^A^9,1 имеем G' zd А е [^]. Искомое О-доказательство получается добавлением к Ту фигуры заключения (2).
Наконец, пусть 9\~iG. Тогда 9-^G имеет простое 1-доказательство. Согласно доказанному и вследствие [9] ^ р5] существует О-доказательство секвенции 9-^G и 9 Но G. □
В этом параграфе различия между доказательствами в минимальной логике и интуиционистской логике не были очевидны. Это объясняется тем, что целевые формулы и определяющие предложения не содержат вхождений отрицаний и ±. В § 7 мы введем в нашу логику отрицание и покажем, что этому отрицанию можно дать две естественные интерпретации: одна из них эквивалентна минимальной логике, другая — интуиционистской.
ОТРИЦАНИЕ В МИНИМАЛЬНОЙ ЛОГИКЕ
Разрешим теперь использовать логическую константу ± в целях и в определяющих предложениях, как если бы она была атомарной формулой. Более точно, в этом параграфе мы будем
считать, что определяющие предложения и целевые формулы задаются следующими рекурсивными определениями:
D: = 1 |Л|СюЛ|Сю 1 \4xD\Dx КОЪ
G: = 1 | A |Gi Д G2\GV V G2\HxG\DzdG.
Для формул вида В zd ± будем использовать сокращенную запись ~ В. Таким образом, отрицание целевой формулы является определяющим предложением, а отрицание определяющего предложения — целевой формулой. С операционной точки зрения будем рассматривать ± как атомарную формулу. В рамках такого простого, или «минимального», подхода к ± можно спокойно добавить следующие два правила вывода для случая, когда ± является целью:
^Но1, если 1 ее [^];
^ Но ±, если имеется формула (G zd _£) ^ [^] и ^ Но G.
К О-системе доказательства нужно добавить две фигуры заключения, соответствующие (7) и (8). Однако это расширение на самом деле расширением не является. При реализации правил (1)—(8) ± фактически будет трактоваться как нелогический предикатный символ, и при этом просто будет использовать правила (1) — (6).
Правило вывода (8) утверждает, что ± следует из З9, если существует формула G, для которой ~G^ [^] и G следует из ^. Поэтому будем говорить, что множество определяющих предложений противоречиво, если S9 Но JL, и непротиворечиво, если оно не является противоречивым.
Противоречивость множества определяющих предложений ^ не обязательно означает, что из ^ можно вывести все целевые формулы. Например, легко показать, что р \~р Но _L, в то время как pN^pVoq неверно. Следовательно, противоречия здесь «локальные». Как показывает следующая теорема, такая точка зрения на отрицание свойственна минимальной, а не интуиционистской логике.
Теорема 14. ^ Но G тогда и только тогда, когда У Нм G. Существуют цели, например р f\~piZ) у, которые можно доказать интуиционистски, но нельзя доказать в О-системе.
Доказательство. Пусть В —О-доказательство секвенции ^-^С. Пусть Н\ ^ и G' получены в результате замены всех вхождений 1 в S, ^ и С соответственно на некоторый О-мест- ный предикатный символ, например F, который не входит в В. Очевидно, что В—доказательство секвенции ^-^G7. По теореме 13 существует М-доказательство Т этой секвенции. Если
теперь мы заменим в Т все вхождения F на ±, получив таким образом Т', то Т' будет М-доказательством секвенции ^^G. Доказательство в другую сторону проводится аналогично. □
Не составляет труда так усилить О-систему доказательства, чтобы ± и отрицание оказались такими же, как и в интуиционистской логике. Достаточно добавить правило вывода, задающее фигуру заключения ±-R. Это правило утверждает, что если доказуемо ±, то доказуема любая целевая формула. Пусть (У— система доказательства, полученная в результате добавления к правилам вывода 0-системы следующего правила:
9^\-0'G, если ^Н0'±.
Нетрудно видеть, что р, ~р Vo,q. Справедлива следующая теорема.
Теорема 15. ^ Н0' G тогда и только тогда, когда S^ViG.
Доказательство. Леммы 11, 12 и теорема 13 допускают обобщение на случай I-доказательств, содержащих фигуру заключения ±-R. Обобщенные таким образом леммы и теорема доказывают данную теорему, поскольку правило вывода (9) в точности соответствует фигуре заключения 1-R в 1-доказательствах. □
По-видимому, выбор интерпретации ± и отрицания в значительной мере зависит от того, для чего конкретно используется язык. В тех случаях, когда важно знать, в какой момент программа становится противоречивой, пожалуй, следует предпочесть интерпретацию, соответствующую минимальной логике. В таких случаях представляется бессмысленным выводить целевые формулы из противоречивой программы: важнее разобраться с самим противоречием, чем пытаться выводить из него заключения. С другой стороны, если есть несколько процессов рассуждений, на протяжении которых делается по нескольку предположений, то интуиционистская интерпретация кажется более естественной. Это связано с тем, что во вложенных доказательствах для вывода заключений часто используются противоречия. Например, для целевой формулы
кСр q) => q) => (р => q)
существует 1-доказательство, но не существует М-доказатель- ства. Доказательство этой цели содержит поддоказательство, в котором есть противоречие. Это противоречие, однако, не отражается на среде, в которой первоначально поступил запрос.
До конца статьи мы будем предполагать, что используется интерпретация ±, соответствующая минимальной логике.
Один из способов моделирования отрицания в логическом программировании заключается в использовании металогического принципа «отрицание как неудача»1). Этот принцип состоит в том, что замкнутую атомарную формулу можно считать ложной, если для нее не имеется доказательства. Хотя принцип отрицания как неудачи гораздо сильнее, чем интерпретация отрицания в минимальной или интуиционистской логике, между ними можно установить некоторую связь. Если ^ непротиворечиво и ^ Но ~ Л, то Л не выводится из ^. Следовательно, в непротиворечивой программе из ^Но ~ А следует not А (отрицание как неудача). Это наводит на мысль о возможности замены некоторых форм отрицания как неудачи поиском доказательства отрицания. Но при этом отрицание как неудача не устраняется полностью, так как для установления непротиворечивости программы нужно установить отсутствие доказательства ±. Следующий пример демонстрирует эти два принципа отрицания.
Рассмотрим очень простую программу, описывающую базу данных. Фактами в этой базе данных являются простые замкнутые атомарные формулы. Определяющие предложения вида G zd ± задают ограничения. Рассмотрим, например, несколько предложений:
enrolled (jane, 102).
enrolled (bill, 100).
I enrolled (X, 101),enrolled (X, 102).
В этой крошечной базе данных содержится информация о том, что Джейн и Билл были внесены в список под номерами 100 и 102 соответственно. Предусмотрено также ограничение, что никто не может быть внесен в список одновременно под номерами 101 и 102. Теперь рассмотрим простую программу, работающую с базой данных:
db :— read (Command),do (Command),db.
do (enter (Fact)):— Fact =>db.
do (retract):— fail, do (commit) :—repeat, do (check(Query)): —
(Query, write(yes), nl,!;
Query => ± , write (no), nl,!;
write(zno,but it could be truez),nl) do(consis):—(not ± ,write (yes),!; write (no)),nl.
*) Название negation-by-failure переводят также как отрицание по неудаче и т. д. — Прим, перев.
Здесь с помощью db представлены повторяющиеся запросы к базе данных и программа изменения базы данных. Если дать db команду enter (Fact), это приведет к изменению текущей базы данных путем вызова db после того, как будет сделано предложение Fact. Можно отменить эти изменения с помощью команды retract. Эта команда просто приводит к неудаче. Все изменения, внесенные после последнего вызова команды commit, будут отменены. Команда commit всегда выполняется (при условии, что используется интерпретатор, ведущий поиск в глубину).
Наиболее интересна здесь команда check. Она имеет трехзначное поведение. Предположим, что база данных сначала непротиворечива. По команде check (Query) сначала происходит поиск доказательства Query, и если оно найдено, то печатается «yes». В противном случае ищется доказательство отрицания Query, то есть Query =^ ±. (Эта цель означает: «Если Query верно, получим ли мы противоречие?») Если доказательство найдено, то печатается «по». Если нельзя доказать ни Query, ни его отрицание, то база данных не содержит Query, хотя Query может быть фактом в некотором расширении этой базы данных. Если база данных противоречива, заключения, сделанные командой check, могут оказаться неверными. Для приведенной выше базы данных на три команды
check (enrolled (jane, 102)) check (enrolled (jane, 101)) check (enrolled (bill, 101))
будут получены ответы «yes», «по» и «по, but it could be true»1) соответственно.
Команда consis для проверки непротиворечивости базы данных использует правило отрицания как неудачи. Здесь использование not металогическое и выходит за рамки изложенной здесь теории.
Модель, описанная в § 5, достаточно богата, чтобы моделировать трехзначное поведение. Пусть ^—непротиворечивая программа, а А — замкнутая атомарная формула. Очевидно, что выполняется либо Д Г°° (/±) (^), либо А ф Т°° (/±) (^). Первый случай имеет место, когда check (Д) печатает «yes». Второй случай распадается на два варианта. Очевидно, что существует большая, чем S, программа, для которой истинно А (например, ^ U {Д}). В рамках нашей классификации миров на непротиворечивые и противоречивые можно рассмотреть следующие
возможности: либо расширения мира ^, содержащие А, непротиворечивы, либо это не так. Первый случай имеет место, когда check(Л) печатает «по», второй—когда check(Л) печатает «по, but it could be true».
УДАЛЕНИЕ ИЗ ПРОГРАММ ДИЗЪЮНКЦИЙ
В этом параграфе мы покажем, что дизъюнкции не являются необходимыми при написании программ. Это означает, что для любой программы существует другая (в общем случае гораздо большая), в которой доказуемы те же атомарные формулы и нет вхождений дизъюнкции. Это верно как для простых хорновых дизъюнктов, так и для определяющих предложений.
Определим с помощью совместной рекурсии две функции: dnf, отображающую целевые формулы во множества целевых формул, и dfnf, отображающую определяющие предложения во множества определяющих предложений. Через А ^ и V ^ будем обозначать конъюнкцию и дизъюнкцию формул из ^, взятых в некотором произвольном, но фиксированном порядке. Функции dnf и dfnf задают дизъюнктивную нормальную форму и дизъюнктивно-свободную нормальную форму соответственно и определяются следующим образом:
dnf (Л) = dfnf (Л) = {Л},
dnf (Gt V Go) = dnf (GJ U dnf (G2),
dnf (G, Д G2) = (Gz Д G'z | Gz e dnf (GJ, G" ее dnf (GJ},
dnf (3xG) = {3xGz | Gz ее dnf (G)},
dnf (D zd G) — {(Д dfnf (/))) zd Gz | Gz ее dnf (G)},
dfnf (G zd Л) = {Gz zd A | Gz ее dnf (G)},
dfnf (Dv Л Z)2) — dfnf (DJ U dfnf (Z)J, dfnf (^xD) = ^xDz | D' ее dfnf (/))}.
Пусть ^—множество определяющих предложений. Введем обозначение dfnf (^)= |J {dfnf (D) |Z) е ^}. Легко видеть, что в формулах из множеств dnf(G) и dfnf(G) нет вхождений дизъюнкций. Сформулируем лемму, доказательство которой очевидно и здесь опускается.
Лемма 16. Если ^ — некоторое множество определяющих предложений, то
Ле [^] тогда и только тогда, когда А е [dfnf (^) ];
G d Л е [^] тогда и только тогда, когда G'tdAe е dfnf (^) для всех G' е dnf (G);
Gz ^ dnf ([%//] G) тогда и только тогда, когда существует такая формула 3xG" ^ dnf (3xG), что G' = [x/t]G".
Сформулируем основной результат, касающийся dnf и dfnt
Теорема 17. Секвенция ^-^G имеет 0-доказательство тогда и только тогда, когда для некоторой формулы G' ^ dnf (О) существует 0-доказательство секвенции dfnf(^) ^Gz.
Доказательство. Пусть 3 — О-доказательство секвенции ^^G. Проведем доказательство индукцией по высоте В.
Случай 1*. В —начальная секвенция. В этом случае G — атомарная формула и G^[^]. По лемме 16 G^[dfnf(^)] и dfnf(G)->^ также является начальной секвенцией.
Случай 2: В оканчивается фигурой заключения (2). Тогда G — атомарная формула и существует такая формула G' zd G ^ [^], что секвенция ^^G1 имеет более короткое О-доказательство. По предположению индукции существует такая формула Gzz^dnf(Gz), что секвенция dfnf (^) ^ Czz имеет О-доказательство. По лемме 16 Gzz zd G ^ [dfnf(^)J, поэтому секвенция dfnf(^)^ G имеет О-доказательство.
Случай 3: В оканчивается фигурой заключения (3). Тогда G является дизъюнкцией Gi V Go и для i = 1 или i = 2 секвенция .^^Gi имеет более короткое О-доказательство. Следовательно, для некоторой формулы Gz ^ dnf (Gi) секвенция dfnf (^) G' имеет О-доказательство. Остается заметить, что Gz^dnf(G).
Случай 4*. В оканчивается фигурой заключения (4). Тогда G является конъюнкцией Gi Л G2 и для / =1 и 1 = 2 секвенция У-^Gi имеет более короткое О-доказательство. По индукционному предположению существуют такие формулы G\ е dnf (G}) и Gz^ dnf (G2), что секвенции dfnf (^)^GZ и dfnf(^)->G' имеют О-доказательства. Таким образом, существует О-доказательство секвенции dfnf (^) ^ Gz Л G2. Остается заметить, что G\ Д G'^dnf(G).
Случай 5: В оканчивается фигурой заключения (5). Тогда G—связанная квантором существования формула вида 3xG0 и для некоторого терма t секвенция [хД]С0 имеет более короткое О-доказательство. Следовательно, для некоторой формулы G' ^ dnf ([%//] Go) существует О-доказательство секвенции dfnf(^) G'. По лемме 16 формула Gz имеет вид \x/t\G", где ЭхС7' dnf (3xG0).
Случай 6: В оканчивается фигурой заключения (6). Тогда G является импликацией, например D id Go. Поскольку секвенция ^, D^G0 имеет более короткое О-доказательство, существует такая формула Gz^ dnf(G0), что секвенция dfnf(^, D) -> Q'
имеет О-доказательство. Так как dfnf (^, D)=dfnf (S9) U U dfnf (D), секвенция dfnf (S9), A dfnf (£)) -> G' также имеет О-доказательство. Применив к этому доказательству фигуру заключения (6), получим О-доказательство секвенции dfnf(^)-> -> [Adfnf (Z))] zd G'. Остается заметить, что [A dfnf (Z))] zd G' г dnf (G).
Доказательство в обратную сторону проводится аналогично, поэтому мы его опускаем.□
Простым следствием этой теоремы является то, что из программы ^ и dfnf(^) выводятся одни и те же атомарные формулы.
ДРУГИЕ РАБОТЫ НА ЭТУ ТЕМУ
Многие результаты этой работы впервые были изложены в [12]. В работах [13] и [15] содержатся очевидные расширения логики, описанной в этой работе. В частности, там вводится класс формул, названных наследственными харроповыми формулами, которые собственно содержат хорновы дизъюнкты и логику из этой работы. Наследственные харроповы формулы можно определить для логики как первого порядка, так и высших порядков.
Гэббей и Рейл в [7] описали логический язык, очень похожий на представленный здесь. Их мотивация при выборе логики в значительной степени основывалась на том, что этот язык охватывает большую часть своей собственной метатеории. Например, предикат demo из [2] можно закодировать непосредственно, используя импликацию. Это означает, что цель demo(D, G), которая должна выполняться, если цель G можно вывести из D, эквивалентна цели D zd G.
Уоррен в [22] исследовал более простую версию этой логики как основу «чистой» реализации программ, вносящих изменения в базу данных, таких, как программа из § 7. По существу он использует импликацию внутри целей, только если посылки этой импликации атомарные. Его записи «модального» оператора assume (X)@G в нашем языке приблизительно соответствует A zd G. Уоррен»тоже описывает семантику этого оператора с помощью семантики возможных миров.
Более сильный логический язык, включающий полное интуиционистское отрицание и цели, связанные квантором всеобщности, исследуется Маккарти в [11]. Маккарти использует эту логику как основу для представления знаний и программ, соответствующих рассуждениям на уровне здравого смысла. Он также описывает конструкцию наименьшей неподвижной точки и табличную процедуру доказательств для своей логики.
В ряде работ рассматривается организация модулей для языков логического программирования. Например, Боуэн и Уайнберг в [3] обобщают работу Боуэна и Ковальского [2] и приводят несколько интересных программ, использующих понятия, аналогичные модулю. Чомики и Минский в [4] показывают важность введения модульности в программы на Прологе и строят основанную на правилах систему контроля доступа для различных фрагментов кода. Однако ни в одной из этих работ не проводится логический анализ понятия модуля. Теоретические результаты этой статьи создают базис для такого анализа.
О’Киф в [17] предлагает формальный подход к построению модулей для Пролога. Многое из описанного в его статье охва- гывается теорией, развитой в этой работе (см., например, рассуждения из § 4). Найт Абдаллах в [16] предлагает логический подход к введению процедур, аналогичных модулям: он берет в качестве основы логического программирования фрагмент логики второго порядка и использует кванторы второго порядка как механизм абстракции для процедур (предикатов). Этот подход существенно отличается от описанного здесь и в другой нашей работе по логическому программированию высших порядков [14].
Гоген и Месегер в [10] вводят понятие модуля для многосортной теории хорновых дизъюнктов с равенством. В их работе модулям сопоставляются хорновы дизъюнкты и предлагается механизм импортирования модулей, называемый обогащением,. В основе этого понятия импортирования лежит идея накопления: если модуль Mi импортирует модуль М2, то дизъюнкты, сопоставленные М2, сопоставляются также Mi. Таким образом, модули импортируются не просто для внутреннего использования, а образуют иерархию, показывающую, какие модули являются частями других. В рамках этого подхода поиск дизъюнкта, заголовок которого соответствует заданной атомарной цели, требует поиска во всех модулях, доступных в этой иерархии из текущего модуля, вне зависимости от того, насколько удалены эти модули друг от друга. Если же используется более ограничительный подход, развитый в нашей работе, то достаточно просмотреть модули, которые импортируются явно. Такой поиск, конечно, может быть более ограниченным.
Некоторые исследователи изучали расширения позитивных хорновых теорий в рамках классической логики. Полученные в результате операционная и теоретико-модельная семантики существенно отличаются от рассматриваемых здесь. Например, в системе HORNLOG Галлиера и Раатца [8] в качестве программ допускаются хорновы предложения общего вида, то есть программы могут содержать любое число негативных предложе-
ний. Таким образом, описанные в § 7 ограничения в базах данных можно записывать просто как негативные хорновы предложения. Однако на запросы к такой системе в качестве ответов могут быть получены «дизъюнктивные» подстановки. Например, если системе HORNLOG послать запрос
~(Р (а) Л р (6)) => Зх ~ р (х),
то она успешно закончит вычисления и выдаст в качестве ответа дизъюнктивную подстановку, утверждающую, что х есть а или Ь. Соответствующий запрос в рассматриваемой здесь логике имеет вид
(р(«) Лр(»)=> ±)з(р(х)=) ±)
и является недоказуемым, так как в этом случае не существует простой подстановки-ответа. Фиттинг в [6] использует классическую логику для исследования расширения хорновых дизъюнктов, содержащего отрицания в телах предложений. В его теории моделей для интерпретации таких предложений используются частичные модели (также приписываемые Крипке). Однако оператор, который используется при построении частичных моделей как неподвижных точек, не является непрерывным. Ослабление классической логики до интуиционистской — это один из способов сохранения и простых подстановок в качестве ответов, и непрерывных операторов неподвижной точки в расширениях логики хорновых предложений.
БЛАГОДАРНОСТИ
Я благодарен Грегу Хэгеру, Торну Маккарти, Гопалану Нада- туру и Уэйну Снайдеру за ценные замечания по предыдущему варианту этой статьи. Джон Хэннан и рецензент сделали ряд полезных замечаний по данному варианту статьи.
ЛИТЕРАТУРА
Apt К. R, van Emden М. И Contributions to the Theory of Logic Programming, J. Assoc Comput. Mach., 29, 1982, p. 841—862.
Bowen K. A, Kowalski R. A.a Amalgamating language and metalanguage in logic programming, in- K' L Clark and S A. Tarnund (eds). Logic Programming, Academic Press, 1982, p. 153—172.
Bowen K. A, Weinberg T. A Meta-level Extension of Prolog, in: 1985 Symposium on Logic Programming, Boston, p 48—53
Chomicki J., Minsky N. EL Towards a programming environment for large Prolog programs, in: 1985 Symposium on Logic Programming, Boston, p. 230—241.
Fitting M. S. Intuitionistic Logic Model Theory and Forcing. North-Holland, 1969.
Fitting M. C. A Kripke—Kleene Semantics for Logic Programming.
[7][8][9][Ю][Н][12][13][14][15][16][17]1819202L[22][7][8][9][Ю][Н][12][13][14][15][16][17]1819202L[22]Gabbay D. М., Reyle U N-Prolog. An Extention of Prolog with Hypothetical Implications, I. J. Logic Programming, 1, 1984, p 319—355.
[7]
[8]
[9]
[Ю]
[Н]
[12]
[13]
[14]
[15]
[16]
[17]
18
19
20
2L
[22]
[7]
[8]
[9]
[Ю]
[Н]
[12]
[13]
[14]
[15]
[16]
[17]
18
19
20
2L
[22]
Gallier J. H, Raatz S HORNLOG: A Graph-Based Interpreter for General Horn Clauses. J. Logic Programming, 4, 1987, p 119—155 Gentzen G. Investigations into Logic Deductions, in M. E. Szabo fed), The Collected Papers of Gerhard Gentzen, North-Holland, Amsterdam, 1969, p. 68—131. [Имеется перевод Генцен Г. Исследование логических выводов. — В кн : Математическая теория логического вывода — М : Наука, 1967, с. 9—74 ]
Goguen J. A., Meseguer J. EQLOG: Equality, Types and Generic Modules for Logic Programming. J. Logic Programming, 1, 1984, p. 179—209.
McCarty L. T. Fixed Point Semantics* and Tableau Proof Procedures for a Clausal Intuitionistic Logic. Technical Report LRP-TR-18, Rutgers Univ., 1986.
Miller D. A Theory of Modules for Logic Programming, in* IEEE Symposium on Logic Programming, Salt Lake City, Sept. 1986, p. 106—115. Miller D. Hereditary Harrop Formula and Logic Programming, presented at VIII International Congress of Logic, Methodology and Philosophy of Science, Moscow, Aug. 1987.
Miller D , Nadathur G. Higher-Order Logic Programming, in: 1986 International Conference on Logic Programming, London, p. 4.48—462.
Miller D., Nadathur G , Sfcedrov A. Hereditary Harrop Formulas and Uniform Proof Systems, in: Second Annual Symposium of Logic in Computer Science, Cornell Univ., June 1987, p. 98—105.
Nait Abdallah M. A. Procedures in Horn-Clause Programming, in: 1986 International Conference on Logic Programming, Boston, p. 433—447. O’Keefe R. Towards an Algebra for Constructing Logic Programs, in: 1985 Symposium on Logic Programming, Boston, p. 152—160
Prawitz D. Natural Deduction. Almvist & Wiksell, Uppsala, 1965. Smorynski C. Applications of Kripke Models, in: [21], Chapter V. Sterling L, Shapiro E. The Art of Prolog. MIT Press, 1986.
Troelstra A. S. Metamathematical Investigations of Intuitionistic Arithrfle- tic and Analysis. Lecture Notes in Mathematics, 344, Springer, Berlin, 1973.
Warren D. S. Database Updates in Prolog, in: Proceedings of the International Conference on Fifth Generaton Computer Systems, 1984, p. 244—253.
МОДЕЛИ И РАВЕНСТВО
В ЛОГИЧЕСКОМ ПРОГРАММИРОВАНИИ!)
ДЖ. А. ГОГЕН, ж. МЕЗЕГЕР
Резюме. Мы показываем, что некоторые стандартные средства теории моделей обеспечивают лучшую семантическую основу логического программирования, чем традиционные синтаксические и операционные подходы. В частности, мы показываем, как инициальные модели позволяют описывать семантику функционального программирования, логического программирования и их комбинации, включая экзистенциальные запросы с логическими переменными (для функций и для отношений) при наличии произвольных абстрактных типов данных, определяемых пользователем, и включая всю мощь языков с ограничениями, имеющих любые встроенные (вычислимые) отношения и функции, в том числе неравенство (отрицание отношения равенства), а также обычные отношения порядка на традиционных встроенных типах, таких, как числа и строки. Эти результаты основаны на новой теореме о полноте для упорядоченно-сортной хорновой логики с равенством и на использовании стандартной интерпретации фиксированных сортов, функций и отношений. Наконец, мы даем определение логического программирования, использующее концепцию институции, и показываем, что таким образом закладывается общая основа для подобных обсуждений. Например, эта точка зрения подсказывает естественный способ объединения функционального про- грамммирования с логическим- нужно просто объединить их логики, получив тем самым хорнову логику с равенством.
1. ВВЕДЕНИЕ
В этой статье показывается, что логическое программирование может очень много выиграть от использования таких понятий теории моделей первого порядка, как
— упорядоченно-сортная логика и модели;
— инициальные модели;
— интерпретация определенных фиксированных сортов, функций и отношений в фиксированных моделях;
— настоящее семантическое равенство.
Эти инструменты (стандартные для теории абстрактных типов данных (см. [17], [22], [14])) составляют привлекательную альтернативу тем синтаксическим и операционным подходам, которые обычно применяются в логическом программировании.
*) Goguen J. A., Meseguer J. Models and equality for logical programming.— Leet. Notes in Comp. Sci., 1987, v. 250, p. 1—22.
© by Springer-Verlag, 1987
© перевод на русский язык, В. М. Антимиров, 1991
Они формируют новый мощный подход, в рамках которого можно использовать
абстрактные типы данных, определяемые пользователем; — встроенные типы данных;
комбинацию логического и функционального программирования;
программирование с ограничениями, позволяющее применять стандартные алгоритмы для стандартных задач, таких, как линейное программирование.
Кроме того, мы полагаем, что новая теория институций [10] может обеспечить концептуальное понимание и ясность, а также расширить сферу логического программирования таким образом, чтобы оно включало все логические системы, удовлетворяющие некоторым простым ограничениям.
Эта статья в каком-то смысле является попыткой развития идей нашей предыдущей статьи [И] о языке Eqlog: в ней дается более полное описание его математической семантики, проводится дальнейшая детализация, обсуждение и сравнение с существующими публикациями. Одна из причин, по которым работа [11] могла оказаться неясной для многих читателей, заключается в том, что в ней одновременно вводилось много новых идей. Здесь мы попытаемся выделить некоторые идеи, оставив в стороне прочие. Например, мы сознательно опускаем следующие элементы языка Eqlog: модули (как иерархические, так и родовые), теории и морфизмы (представления) и атрибуты операций (например, ассоциативность и коммутативность). Хотя эти элементы значительно увеличивают выразительную силу языка Eqlog, они отвлекали бы читателя от основных фундаментальных и семантических вопросов, которые мы хотим выделить. По тем же причинам в статье не развивается большинство вопросов, касающихся операционной семантики разнообразных обсуждаемых систем. Так, унификация, переписывание термов, сужение и резолюция лишь слегка затрагиваются. Эти вопросы обсуждаются несколько подробнее в [11], а впоследствии получат полное освещение в [23] и [26].
Упорядоченно-сортная логика ’)
Обычная односортная логика обладает тем сомнительным преимуществом, что все можно применять ко всему; например,
3 * фамилия (возраст (ложь)) < 2MeCT°~eHH* (температура (329))
В оригинале «order-sorted logic», т. е. многосортная логика с частичным порядком на сортах. — Прим. ред.
является правильно построенным выражением. Милая сердцу виртуозов Лиспа и Пролога односортная логика все же разрешает слишком многое. Беда в том, что обычная альтернатива — многосортная логика — слишком ограничительна, так как она не допускает перегрузки функциональных символов, таких, как -+-, для целых, рациональных и комплексных чисел. Кроме того, выражение вида
(—4/—2)!
в ней, строго говоря, не является грамматически правильным (в предположении, что факториал применяется только к натуральным числам). Здесь мы предлагаем упорядоченно-сортную логику с подсортами и перегрузкой операций, которая в сочетании с механизмом ретрактов (см. [14]) обеспечивает достаточную выразительность, в то же время не допуская полной бессмыслицы.
Хотя ограничение многосортной логикой до многосортной алгебры весьма успешно применялось в теории абстрактных типов данных, многосортная алгебра может на практике приводить к некоторым очень неуклюжим спецификациям, прежде всего из-за трудностей описания ошибочных выражений, таких, как деление на ноль в области рациональных чисел или взятие верхнего элемента пустого стека. Многосортная алгебра (MCA) фактически не дает удовлетворительного способа определения рациональных чисел или стеков. Однако упорядоченно-сортная алгебра преодолевает эти трудности за счет более богатой системы типов, предусматривающей подсорта, перегруженные операции и тотальные функции (которые иначе должны были бы быть частичными). Упорядоченно-сортная алгебра является основой языков OBJ [9] и Eqlog [11]. Наконец, упорядоченносортная алгебра решает проблему конструкторов-селекторов х), которая, грубо говоря, состоит в определении обратных к конструкторам операций, называемых селекторами; решение заключается в ограничении селекторов на наибольший подсорт, на котором они имеют смысл. Например, top и pop определены только для непустых стеков. В работе [15] показано, что упорядоченносортная алгебра решает эту проблему, в то время как многосортная алгебра не может ее решить.
Сущность упорядоченно-сортной логики заключается в том, что на сортах задается частичное упорядочение, определяющее
9 Эта проблема поставлена в [15]. Конструкторами алгебры называют такой минимальный набор операций (в том числе констант) из ее сигнатуры, который достаточен для представления любого элемента носителя этой алгебры в виде правильно построенного выражения без переменных (основного терма) — Прим.перев,
подсорта, которое семантически интерпретируется как теоретикомножественное включение носителей модели. Кроме того, предусматривается перегрузка операций, которая интерпретируется как ограничение функций на подсорта. К счастью, упорядоченно-сортная логика не намного сложнее многосортной и практически все результаты, полученные для многосортного случая, без особых сложностей обобщаются на упорядоченно-сортный случай. Всестороннее исследование упорядоченно-сортной алгебры можно найти в [14]. В данной статье границы логики расширяются таким образом, чтобы она допускала не только алгебры, но и модели произвольных сигнатур первого порядка с функциональными и предикатными символами, включая равенство. В рамках этой логики формулируются правила вывода для хорновых предложений, причем доказывается их полнота и ряд других основных результатов, непосредственно связанных с нашим теоретико-модельным описанием логического и функционального программирования, в том числе теорема об инициальных моделях и теорема Эрбрана.
Модели
Возможно, приверженность теоретиков логического программирования к синтаксическим методам и методам теории доказательств объясняется тем, что логическое программирование произошло от теории доказательств. Как бы то ни было, нам кажется, что более семантические и более абстрактные средства обеспечивают более широкий и мощный базис. В частности, мы чувствуем, что привычный эрбрановский универсум является слишком синтаксической и слишком ограничительной конструкцией, поскольку
он не предусматривает встроенных типов, таких, как числа и бесконечные деревья;
он не предусматривает абстрактных типов данных, определяемых пользователем;
он не обращается (непосредственно) к свойству независимости от представления термов и типов данных, встроенных или определяемых пользователем;
доказательства получаются более конкретными и вычислительными, чем это необходимо1).
Конечно, все эти дырки нетрудно «подлатать»: например, в [19] показано, как включить встроенные числа. Однако после нескольких таких заплаток вы получите нечто настолько напоминающее подход с использованием инициальных моделей, что
9 Не каждый сочтет это недостатком.
лучше уж прямо воспользоваться мощным аппаратом, развитым в рамках этой традиции.
Причина интереса к моделям заключается как раз в том, что стандартная модель может обеспечить реализатору четкий стандарт корректности, а программисту — ясную модель того, что можно ожидать от программы при ее реальном исполнении.
Причина интереса к стандартной интерпретации в конкретных семантических областях некоторых сортов, функций и операций (в то время как другие остаются свободными) заключается в том, что это позволяет использовать стандартные алгоритмы для решения конкретных задач в таких областях, например алгоритмы линейного программирования над вещественными числами. Это дает большую гибкость, поскольку для других сортов можно по-прежнему использовать инициальность (т. е. абстракцию). Ниже мы покажем, что таким образом создается хорошая основа для программирования с ограничениями.
Равенство
Эквациональная логика, которая по существу является логикой подстановки «равных вместо равных», составляет фундамент языков функционального программирования. Например, в [18] фактически дается эквациональное описание языка FP, предложенного Бэкусом [2]; в [24] описывается язык «эквацио- нального программирования»1); язык OBJ2, который объединяет семантику инициальных алгебр для исполнимых «объектов» (определяемых самыми общими наборами условных упорядоченно-сортных тождеств, заданных пользователем) и «пустую» алгебраическую семантику для неиспользованных «теорий» (определяемых произвольными наборами тождеств).
В контексте логики первого порядка равенство в общем случае рассматривается как специальное отношение, которое не просто аксиоматизируется, а интерпретируется как настоящее семантическое равенство в моделях. В этом смысле говорят о «логике первого порядка с равенством» и о «хорновой логике с равенством». Для этих логических систем известны полные наборы правил вывода. Вторая из них была использована для объединения логического и функционального программирования [11]. Мы сформулируем соответствующие правила вывода для упорядоченно-сортной хорновой логики с равенством.
В этом языке имеется ряд сильных ограничений нет повторения переменных в левых частях тождеств и перекрытия (т е. унифицируемости подвыражений левых частей) тождеств, есть только один сорт данных, нет условных тождеств и существует условие строгой последовательности применения тождеств. В то же время по набору тождеств, удовлетворяющих таким ограничениям, гораздо легче скомпилировать эффективный код.
Равенство оказывается полезным также в программировании с ограничениями, потому что тождества можно использовать для определения базовых структур данных, а затем различные интересующие нас отношения можно определять рекурсивно над этими структурами данных и/или делать их встроенными.
Инициальность
Инициальные модели позволяют отвлечься от какого-либо конкретного представления, т. е. обеспечивают абстракцию. В частности, концепция инициальности позволяет с большой гибкостью и удобством обращаться с абстрактными типами данных в языках логического программирования. Ее можно использовать и для определения функций и отношений над встроенными типами [11]. Инициальные модели создают также основу концептуального мира программы, будучи «замкнутыми мирами» или «стандартными моделями». В частности, они дают реализатору стандарт корректности, а программисту — модель того, что можно ожидать от программы. Наконец, инициальность является «универсальным» свойством (в смысле существования единственного отображения, удовлетворяющего определенным условиям). Между тем хорошо известно, что использование универсальной характеризации объектов часто позволяет построить более ясную математическую теорию с более простыми и концептуальными доказательствами по сравнению с использованием конкретных конструкций для этих объектов [21]. Обычная характеризация понятия «свободная модель» посредством существования единственного отображения с определенными свойствами, расширяющего другое отображение, фактически является специальным случаем инициальности.
Концепцию инициальности можно лучше понять, рассмотрев условия «отсутствия мусора» («по junk») и «отсутствия смешений» («по confusion»), введенные в [7]; их можно также трактовать как условия полноты и непротиворечивости соответственно. Предположим, что сигнатуры содержат символы для построения предложений1), включая функции и константы (в 2) и отношения (в П), а модели содержат элементы данных. Если заданы сигнатура 2, П и множество ^ предложений этой сигнатуры, то 2,П-модель называют стандартной, когда
отсутствует мусор*, каждый элемент данных обозначается некоторым термом, использующим функциональные символы (и константы) из 2 (элементы данных, которые нельзя построить таким образом, называются мусором);
отсутствует смешение*, предикат истинен на некоторых элементах данных тогда и только тогда, когда это можно
’) То есть замкнутых формул. — Прим, перев.
доказать, исходя из заданных предложений; в частности, два элемента совпадают в том и только в том случае, если их равенство можно доказать, исходя из заданных предложений (говорят, что два равных элемента данных, равенство которых нельзя доказать, образуют смешение).
В случае хорновой логики — с равенством или без, упорядоченно-сортной, многосортной или односортной — эти два условия определяют элементы данных однозначно с точностью до переименования, т. е. определяют модель с точностью до изоморфизма. Бол^е того, отсутствие мусора эквивалентно структурной индукции над исходной сигнатурой1), а одновременное выполнение обоих условий эквивалентно условию «единственности гомоморфизма», называемого инициальностью (подробности см. в [22]).
Ограничения
Ограничение в обобщенном смысле — это логическое соотношение, которому должны удовлетворять возможные решения. В принципе, такими ограничениями могли бы быть произвольные формулы первого порядка, содержащие произвольные (интерпретированные или неинтерпретированные) отношения; но на практике используют лишь атомарные формулы, такие, как
a*X + b*Y<c*Z + d, a*X + X + b*X + c = 0, a*X + YUb*X + c^Z.
В первых двух ограничениях переменные пробегают множество чисел некоторого вида (например, целые, или рациональные, или комплексные), а в третьем — множество множеств строк некоторого фиксированного алфавита (* в первых двух ограничениях обозначает умножение, а в третьем — конкатенацию, продолженную на множества). Хотя Пролог в принципе мог бы быть идеальным языком для программирования с ограничениями, на практике его оказывается недостаточно из-за ограниченных возможностей встроенных отношений. Кроме того, расширение традиционной семантики Пролога на встроенные элементы требует дополнительных усилий и оказывается довольно сложным (см., например, [19]).
Встроенными мы называем такие сорта, функции и отношения, которые интерпретируются в фиксированной (стандартной)
!) Только если структурная индукция формулируется как правило вывода в логике второго порядка. — Прим перев.
модели. Два очевидных примера таких моделей — числа и бесконечные деревья с обычными функциями и отношениями на них. В пионерской работе [19] ив работе [20] эти и ряд других примеров рассматриваются в контексте языка логического программирования с ограничениями CLP. В этих работах разрабатываются и другие темы, часть которых мы здесь не рассматриваем, в том числе отрицание как неудача и условия компактности [19].
Логическое программирование
Различные виды логик охватывают различные аспекты языков программирования. Функциональный аспект программирования охватывается эквациональной логикой [9]. Строгая типизация охватывается многосортной логикой. Логическое программирование (которое, чтобы избежать заблуждений, можно было бы назвать реляционным или хорновым программированием) охватывается хорновой логикой. Объектно-ориентированное программирование охватывается рефлексивной логикой, в которой тексты программ образуют встроенный абстрактный тип данных [12]. Развитие логического программирования наводит на мысль, что правильный путь к объединению различных парадигм программирования заключается в выявлении лежащих в их основе логик, объединении их и использовании объединенной логики в качестве основы языка. Это позволяет выбирать нужные черты различных языков программирования и смешивать их. Например, комбинация функционального и логического программирования охватывается хорновой логикой с равенством [И]. Комбинация функционального и объектно-ориентированного программирования охватывается рефлексивной эквациональной логикой (соответствующий язык называется FOOPS, см. [12]). В настоящее время мы полагаем, что рефлексивная упорядоченно-сортная хорнова логика с равенством хорошо подходит для объединения функциональной, реляционной и объектно-ориенти- рованнуй парадигм в едином простом языке программирования, обладающем также мощными возможностями для работы с базами данных.
Теория институций [10] может обеспечить формальный базис логического программирования. На содержательном уровне институция — это логическая система с формализованными понятиями предложения, модели и выполнимости. При этом язык, логического программирования $ связан с такой институцией (т. е. такой логической системой) 3\ что .
— утверждения языка $ — это предложения из 3\
— операционная семантика языка $ — это (достаточно эффективный) логический вывод в 3\
— денотационная семантика языка $ задается классом моделей в 3 (предпочтительно инициальных моделей).
2. УПОРЯДОЧЕННО-СОРТНАЯ АЛГЕБРА
Дальнейшее изложение предполагает знакомство читателя с S-сортными множествами и функциями (где S — набор сортов), многосортными алгебраическими сигнатурами (S, 2), 2-алгебрами и 2-гомоморфизмами (см. [22]). Эти понятия обобщаются на упорядоченно-сортные алгебры1).
Определение 1. Упорядоченно-сортной сигнатурой называется тройка (S, ^, 2) где (S,2)—многосортная сигнатура (S, ^) — частично упорядоченное множество2) и функциональные символы удовлетворяют следующему условию монотонности3):
если er е 2wi, si П 2W2, s2 и wl^w2, то sl^s2.
Мы пишем 2 вместо (S, 2), если понятно, о каком множестве сортов S идет речь. Аналогично мы пишем 2 вместо (S, ^,2), если понятно, о каком частичном порядке (S, ^) идет речь. Мы также можем писать су: w->s вместо oe2w>s, чтобы подчеркнуть, что о обозначает функцию с арностью w и коарностью (или сортом значения) s. Важным частным случаем является
° S-сортное множество М — это семейство множеств (Ms | seS); S-сортная функция f: М->М' (где М'— также S-сортное множество)—это семейство отображений (fs : Ms -> Ms | s е S). Многосортная алгебраическая сигнатура — это пара (S, 2), где 2 = (2W, s|we S*, s е S) —семейство множеств функциональных символов. 2-алгебра А состоит из набора носителей As, s е S, и набора операций Аа : Aw -> As для всех о е 2W< s; здесь Aw=SlASi X ... X А если w = Si ... sn, и А;Д{*} фиксированное одноэлементное множество (X = пустая цепочка). 2-гомоморфизм h:A^B одной 2-алгебры в другую — это семейство отображений (hs : As В5 | s е S), удовлетворяющих обычному условию подстановоч- ности:
hs (А„ (а„ ..ап)) = Во (hSi (а]), ..(а„))
для всех сг е 2W, s, w е S*, <at... an> e Aw. — Прим, nepee.
Упорядочение ^ на S продолжается на цепочки равной длины из S* по правилу Sj . .. sn ^ Sj ... sn ^=> Sf ^ Sj для 1 sC i ^ п. Аналогично ^ продолжается на пары <w, s> из S* X S по правилу (w, s) ^ <w', df
s^^^-w^w' и s ^ s'.
Хотя это весьма естественное условие не является необходимым для справедливости наших результатов, оно исключает некоторые «причудливые» модели.
пустая цепочка w = X, при этом о е 2л, s обозначает константу сорта s.
Регулярные сигнатуры позволяют определить наименьший сорт терма и обобщить обычную конструкцию алгебры термов на упорядоченно-сортный случай. На содержательном уровне регулярность говорит о том, что перегруженные операции, у которых наборы сортов аргументов больше, чем заданная цепочка сортов, совместимы при ограничении аргументов на подсорта.
Определение 2. Упорядоченно-сортная сигнатура 2 называется регулярной, если для любых wO ^ wl из S* и о из 2wi, si существует наименьшая такая пара <w, s) g S*X S, что о e e 2W, s и wO < w. Если, кроме того, каждая компонента связности 9 частично упорядоченного множества сортов имеет наибольший элемент, то регулярная сигнатура называется когерентной.
Определение 3. Пусть (S, ^, 2)—упорядоченно-сортная сигнатура. Тогда (S, ^, ^-алгеброй называется такая (S, 2)- алгебра А, что
если s^sz в S, то As ^ As';
если or 2wi, si П ^w2, s2, где sl^s2 и wl ^w2, то Aa:Awi->Asi и Aa:AW2-^As2 равны на Awi.
Если ясно, о каком частично упорядоченном множестве (S, ^) идет речь, (S, ^, 2)-алгебры называются упорядоченносортными IL-алгебрами. Вместо Ао; Aw^-As можно писать Aq ’.
Определение 4. Пусть (S, ^, 2)—упорядоченно-сортная сигнатура, и пусть А и В — упорядоченно-сортные (S, ^, 2)-алгебры. Тогда (S, 2)-гомоморфизм h:A^B называется (S, ^, 2)-гомоморфизмом, если он удовлетворяет следующему условию сужения;
если s^sz и 3gAs, то hs (а) = hS'(а).
Если ясно, о каком частично упорядоченном множестве (S, ^) идет речь, (S, ^, 2)-гомоморфизмы называют также упорядоченно-сортными ^-гомоморфизмами. (S, ^, 2)-алгебры и (S, ^, 2)-гомоморфизмы образуют категорию, которую мы обозначаем через OSAlgs.
Упорядоченно-сортная алгебра строго обобщает многосортную алгебру в том смысле, что любая многосортная (S, 2)- алгебра является упорядоченно-сортной (S, ^, 2)-алгеброй с тривиальным упорядочением ^ на S, при котором s ^s'^=> <=>s=s'; при этом OSAlg2 = Algs и забывающий функтор OSAlgs-^Algs является тождественным. Аналогично приведенные ниже правила упорядоченно-сортного логического вывода становятся правилами многосортного вывода для такого упорядочения.
Определение 5. Для заданных упорядоченно-сортной сигнатуры (S, ^, 2) и упорядоченно-сортной 2-алгебры А упорядоченно-сортной iL-конгруэнцией = на А называется такая многосортная 2-конгруэнция = = {=s|s е S}, что для всех s, s' е S и а, а' е А из s < sz следует a =s az <=> a =sz з'.
Пусть f: А —>- В — упорядоченно-сортный 2-гомоморфизм. Тогда ядром f называется S-сортное семейство отношений эквивалентности = f, которое определяется правилом a=f,sa'^=> ^*-fs(a) = fs(a') и обозначается ker(f). Легко проверить, что ker(f) является упорядоченно-сортной 2-конгруэнцией. Для заданных когерентной упорядоченно-сортной сигнатуры (S, ^, 2), упорядоченно-сортной 2-алгебры А и упорядоченно-сортной 2-конгруэнции = на А фактор-алгеброй К/= алгебры А по = называется упорядоченно-сортная 2-алгебра, определяемая следующим образом: для каждого сорта s носитель максимального сорта в компоненте связности s определяется как (A/=)max(s) = = Amax(s)/=max(s), з носителем сортз s будет (A/=)s = = qmax(s)(As), где qmaX(S) : AmaX(S) -^ (А/=)тах(8) — кзноническзя проекция, отобрзжающзя кзждый элемент з в его класс эквивалентности по отношению =maX(s). Операции определяются равенством (A/=)ff( [al], ..., [an] ) = [Ао(а1, ..., ап)]; это определение корректно, так как отношение = является упорядоченно-сортной 2-конгруэнцией. Для упорядоченно-сортной алгебры А/= существует канонический сюръективный упорядоченно-сортный 2-гомоморфизм q:A—>-А/=, определяемый сужением qmax(s) на остальные сорта, такой, что ker(q) = =. Этот гомоморфизм называется каноническим отображением на фактор-алгебру, ассоциированным с конгруэнцией =.
Лемма 6: универсальное свойство фактор-алгебр. Пусть 2 — когерентная упорядоченно-сортная сигнатура, А — упорядоченно-сортная ^-алгебра и =—упорядоченно-сортная конгруэнция на К. Тогда каноническое отображнеие на фактор-алгебру q-Д—^д/= обладает следующим универсальным свойством: если f:A->-B— такой упорядоченно-сортный ^-гомоморфизм.
что = ^ker(f), то существует единственный ^-гомоморфизм и : А/= ->■ В, для которого и ° q = f.
Для заданной упорядоченно-сортной сигнатуры 2 мы строим упорядоченно-сортную алгебру Ъ-термов 5Г ^ как наименьшее семейство {^2» s]se 8} множеств, удовлетворяющее следующим условиям (здесь мы несколько педантично, но временно используем формальные синтаксические символы ( и ) для обозначения скобок) :
Sx.s^^s.s, для s е S;
9"e.s'E^s, если s' ^s;
если aeSw, s и ti^^2tSi при w = sl...sn ^ X, то цепочка символов o(tl...tn) принадлежит ^s, s; кроме того, пусть 9~о : £TW -> £TS, где о е Sw, s отображает tl, . . ., tn в цепочку символов o(tl...tn).
Эти термы являются основными, т. е. не содержат переменных. Термы с переменными получаются из основных термов в результате обогащения сигнатуры 2 дополнительными константами, играющими роль переменных. Мы предполагаем, что каждой переменной приписан единственный сорт, так что переменные образуют S-сортное множество X, причем XsQXs'=0, если s sz. Таким образом получается расширенная сигнатура 2 (X) (которая остается регулярной) и алгебра £Г2(Х), которая обозначается также через £Г2(Х). Хотя термы в упорядоченносортной алгебре термов могут иметь много различных сортов, мы все же располагаем следующим фактом.
Факт 7. Для регулярной сигнатуры 2 каждый терм t в 9” ^ имеет наименьший сорт, который обозначается через LS(t).
Определение 8. Пусть 2 — упорядоченно-сортная сигнатура. Тогда упорядоченно-сортная S-алгебра I называется инициальной в классе всех упорядоченно-сортных 2-алгебр, если существует упорядоченно-сортный 2-гомоморфизм из I в любую другую упорядоченно-сортную 2-алгебру.
Теорема 9. Пусть 2 — регулярная упорядоченно-сортная сигнатура. Тогда 9”^ — инициальная упорядоченно-сортная И-адт гебра.
Факт 10. Пусть А—упорядоченно-сортная S-алгебра, X — некоторое S-сортное множество переменных, и пусть f:X-^A является S-сортной функцией (причем X не пересекается с S). Такая функция называется оценкой переменных из X в А. Тогда (благодаря инициальности) существует единственный упорядо-
ченно-сортный 2-гомоморфизм f* : £Г2(Х) —>-А, являющийся рас* ширением f.
Этот факт обычно формулируют так: ^S(X) является свободной упорядоченно-сортной 2-алгеброй над (образующими из) X.
Для когерентной упорядоченно-сортной сигнатуры (5,^,2) и двух S-сортных множеств переменных X, Y подстановкой называется S-сортное отображение 6 : X—^£Tv(Y); это специальный вид оценки, для которого значения переменных лежат в алгебре термов. Единственный упорядоченно-сортный 2-гомоморфизм 6*: ^s(X)^-^s(Y), .являющийся расширением 6, также будет обозначаться через 6.
УПОРЯДОЧЕННО-СОРТНАЯ ТЕОРИЯ МОДЕЛЕЙ
Упорядоченно-сортные модели служат обобщением упорядоченно-сортных алгебр, допуская предикаты наряду с функциональными символами, а упорядоченно-сортная хорнова логика допускает произвольные хорновы предложения, а не только условные тождества. Упорядоченно-сортная хорнова логика имеет ряд преимуществ перед односортной логикой; в общем случае эти преимущества являются следствием таких преимуществ упорядоченно-сортной алгебры перед односортной алгеброй, как большая выразительная сила, достигаемая за счет перегрузки операций и строгой, но все же гибкой типизации, и возможность обработки ошибок. Дополнительное преимущество упорядоченно-сортной хорновой логики, имеющее огромное практическое значение, состоит в том, что иногда поисковое пространство и требуемое время для доказательства теорем могут существенно сокращаться благодаря использованию подсортов, как показано, например, в работе [27] на примере «парового катка».
В этом параграфе базовые алгебраические понятия обобщаются на модели, а затем формулируются правила вывода для упорядоченно-сортной хорновой логики с равенством и доказывается их полнота. Затем мы строим инициальную модель, определяемую множеством хорновых предложений, и доказываем теорему Эрбрана — как для общего случая, так и для специального случая, когда все сорта непусты. В заключение мы доказываем существование свободных расширений и применяем это к встроенным средствам.
Основные определения
Определение 11. Упорядоченно-сортной сигнатурой с предикатами называется четверка (S, ^, 2, П), где (S, ^, 2) —когерентная упорядоченно-сортная сигнатура, а П—{nw|we
е= S+} — семейство предикатных символов, удовлетворяющее приведенным ниже условиям. Для обозначения предикатных символов используются прописные буквы Р, Q, Рь Р2, .... Вместо Р е nw можно писать Р : w, при этом w называется арностью предикатного символа Р. Как и в случае функциональных символов, допускается перегрузка предикатных символов, т. е. Р может иметь несколько арностей. Мы делаем два предположения:
В П содержится предикатный символ равенства =, имеющий арность ss для каждого сорта s, являющегося наибольшим элементом в какой-либо компоненте связности частично упорядоченного множества сортов S.
Регулярность. Для каждого wO, для которого имеется p:wl, причем wO ^ wl, существует наименьшее такое w, что р : w и wO < w.
Когда ясно, о каком множестве сортов S и частичном упорядочении ^ идет речь, мы пишем 2, П вместо (S, ^, 5, П).
Определение 12. Пусть (S, <7, 2, П)—упорядоченно-сортная сигнатура с предикатами. Тогда (S, ^, 2, ТГ)-моделью называется упорядоченно-сортная (S, ^, 2)-алгебра М вместе с приписыванием каждому P:w из П некоторого подмножества Мр е Mw таким образом, что
) если Р — предикат равенства =:ss, ему приписывается тождественное отношение, т. е.
(М=) = {(а, а) | а е Ms);
(и) если P:wl и Р : w2, где wl^w2, то Мр1 = Mwi Я Мр2.
Определение 13. Пусть 2, П — упорядоченно-сортная сигнатура с предикатами, и пусть М и М/ — упорядоченно-сортные 2, П-модели. Тогда 2, TV-гомоморфизмом h: М^М7 называется такой упорядоченно-сортный S-гомоморфизм, что для каждого Р : w из П
hw (аь ..., an) е Mpw, если (аь . .., ап) е Мр. 9
П-модели и 2, П-гомоморфизмы образуют категорию, которую мы обозначаем Mod2,n
Теория упорядоченно-сортных моделей является строгим обобщением теории многосортных моделей в том смысле, что любая многосортная (S, 2, П)-модель является упорядоченно-
4) Для заданных S-сортного отображения h: М—>-М' и непустой цепочки w = si...sn, w е S+, через hw обозначается вектор-функция hs X . • • X hs : Mw-> М^,. — Прим, перев.
сортной (S, ^, 2, П)-моделью с тривиальным упорядочением ^ на S, при котором s^sz<=>s = s'. Аналогично, правила упорядоченно-сортного логического вывода, приводимые ниже, для этого тривиального упорядочения превращаются в правила многосортного логического вывода.
Для заданной упорядоченно-сортной сигнатуры S, П с предикатами можно определить 2,П-модель 9"^ п, состоящую из S-алгебры термов 9"s и имеющую (^"s, п)р=0 для каждого Р : w из П, отличного от предиката равенства (конечно, = интерпретируется как настоящее равенство). Для заданного S-сортного множества переменных X, не пересекающегося с S, модель 9”2, п(Х) определяется аналогичным образом путем обогащения 2 константами из X. После этого понятие инициальной алгебры немедленно обобщается на модели и проверяются следующие утверждения.
Теорема 14. Пусть 2, П — упорядоченно-сортная сигнатура с предикатами. Тогда ^2,п является инициальной упорядоченно-сортной ^,П-моделью.
Факт 15. Пусть М— упорядоченно-сортная 2, П-модель, X— некоторое S-сортное множество переменных, не пересекающееся с S, и пусть fiX-^-M—некоторая S-сортная оценка. Тогда в силу инициальности существует единственный упорядоченносортный S, П-гомоморфизм f*: £Ts n (X) —>• М, расширяющий f. Этот факт обычно формулируют так: ^21п(Х) является свободной S, П-моделью над (образующими из) X.
Теперь введем обозначения для атомов и хорновых предложений. Для заданной упорядоченно-сортной сигнатуры с предикатами 2,П определим Т^П-атомы как выражения вида P(tb . .., tn), где tb . .., tn — S-термы (возможно, с переменными) и существует такое w = Si .. . sn, что терм Т имеет сорт Sj для i = 1, ... , п, причем Р : w в П. Таким образом, тождество t = t' является атомом, для которого Р — это отношение равенства. Будем обозначать атомы через А, В, Аь А2, ... . Если 6 — некоторая подстановка, a A = P(tb ..., tn)— некоторый атом, то 6А обозначает атом P(6[ti], ..., О[tn]). Мы интерпретируем множество атомов {Аь . .., Ап} как конъюнкцию. Хотя можно опускать фигурные скобки и писать Аь .. :, Ап, мы все же полагаем, что имеется в виду множество, поэтому порядок атомов не играет роли и среди них нет повторяющихся атомов. Пустое множество атомов имеет пустое обозначение, т. е*. записывается как пробел.
Хорновым ^.П-предложением называется выражение
(УХ)Ач=Вь .... Bm,
где X содержит все переменные, вводящие в термы атомов А, Вь • • • , Вт. Будем называть А заголовком, а набор Вь .., Вт телом. Когда тело пусто, хорново предложение называется атомарным (универсальным) предложением и запись (VX)A<= сокращается до (УХ)А. Когда все атомы в качестве предикатных символов имеют предикат равенства, хорново предложение называется условным тождеством; если, кроме того, предложение имеет пустое тело, то его называют тождеством.
Определение 16. Для заданных упорядоченно-сортной сигнатуры с предикатами 2, П, 2, П-модели М и хорнова 2, П-пред- ложения (VX)A<=BH . . .,Bm будем говорить, что это предложение выполняется в М, если (в предположении, что A = Q(tH . . .,tn), Bj = Pf^tf], . . ., tinj) для любой оценки f:X^-M, удовлетворяющей условиям *)
(f*M ...,Г(Ц))еМ^ для i=l, . ..,m,
имеет место соотношение
(Пй), ....поемг
Аналогично, для множества хорновых предложений ^ будем говорить, что ^ выполняется в М, если в М выполняется каждое предложение из "g7, при этом такая модель называется 2,П,^- моделью, а категория всех таких моделей обозначается через Mods, п, <^.
Упорядоченно-сортный логический вывод
Здесь мы сформулируем новую теорему о полноте для упорядоченно-сортной хорновой логики с равенством. Эта теорема создает основу для корректной реализации языков, подобных языку Eqlog [11], а также для разработки семантической теории языков с ограничениями.
Для заданных упорядоченно-сортной сигнатуры с предикатами 2,П и множества ^ хорновых 2, П-предложений имеют место следующие правила вывода атомарных предложений.
Рефлексивность*, каждое тождество вида (VX)t = t выводимо.
Симметричность*, если выводимо (VX)t = t', то выводимо (vx)f = t.,
Транзитивность*, если выводимы тождества (VX)t = tz и (VX)t' = V\ то выводимо (VX)t = t".
Заметим, что в силу регулярности наименьшая арность wi предиката Pi определена однозначно
Конгруэнтность; если tp t[e^2(X)s для i=l, . ..,п и если (VX) tj = tf выводимо для i = 1, .. ., п, то
для любого or: sb . . ., sn >s из 2 выводимо тождество (VX)a(t„ ..., tn) == ст (t', . . ., t');
для любого Р: sb . . ., sn из П (отличного от предиката равенства) из выводимости предложения (VX) X X Р (tp • • •, tn) следует выводимость (VX) Р ftp ..., t^).
Модус поненс; если предложение (VX) Ач=Вь ..., ВП1 принадлежит ^ и подстановка 6: X—>£TS(Y) такова, что для каждого Вь входящего в тело этого предложения, выводимо атомарное предложение (У¥)6ВЬ то выводимо предложение (VY)0A.
Для заданного S-сортного множества переменных X определим 2, П-модель ZT^ty^^ следующим образом. Прежде всего заметим, что для термов t и V одного сорта условие «предложение (VX)t = tz выводимо из ^ по правилам (1) — (5)» определяет на ^2(Х) упорядоченно-сортную 2-конгруэнцию ^^), поскольку, согласно правилам (1) — (4), отношение ~(х> является многосортной 2-конгруэнцией. Кроме того, оно является упорядоченно-сортной 2-конгруэнцией, так как для любого сорта s, для которого t, V г ZTS(X)S, выполнение t ~$>, stz равносильно выводимости (VX)t = tz из ^ по правилам (1) — (5) (свойство, не зависящее от s)1). Таким образом, мы можем определить упорядоченно-сортную 2-алгебру ZT^^^X) как фактор- алгебру алгебры ZT^ (X) по упорядоченно-сортной конгруэнции ~сх). Алгебре 9"s,<^(Х) можно придать структуру 2,П-модели, положив, что ([tj, .. ., [tn]) ^ZT^ п,<^(Х)р тогда и только тогда, когда (VX)P(tb ..., tn) выводимо из ^ по правилам (1) — (5) (где w = sb ..., sn и ti имеет сорт si). Это определение не зависит от конкретного представителя класса эквивалентности й в силу (4). Теперь мы можем доказать следующие утверждения.
Лемма 17. ^ выполняется в ZT^y^.
Доказательство. Пусть (VY) А<= Вь . .., Вт — хорново предложение из ^ (где, скажем, A = Q(tb .. .,tn), Bi = Pi(tib ... ,.., tin.)), и пусть 60: Y->^2:,n,^(X) —такая S-сортная оценка,
9 То есть выполнено требование определения 5.—Прим, перев.
что (бо(1ц)» • • •, Oo(tinj)) е ^2, п,<^(Х)р^ для i= 1, . ..,m. Выбрав представителя te^s(X)s каждого класса [t] = 0О (у), у е Ys> получим подстановку 6: Y-^^S(X), для которой, согласно нашему предположению (и благодаря тому, что в силу инициаль- пости 9" х п (У) выполняется 6o = qo0, где q: 9"^п(Х)-> 9* 2, п, ^(Х)— каноническое отображение на фактор-модель), предложения (VX)0Bj выводимы из $ по правилам (1)— (5) для i = l, ..., m. Отсюда, используя (5), получаем, что предложение (УХ)0А выводимо из $ по правилам (1) — (5), т. е. (O^t^, • • •» e*(tn)) e^ ^.^X)^ , что и требовалось доказать.
Теорема 18: теорема о полноте. Для заданных упорядоченносортной сигнатуры Х,П, множества хорновых 5^-предложений ^ и атомарного Т^П-предложения (УХ) А следующие утверждения эквивалентны*.
— (УХ) А выводимо из ^ по правилам (1) — (5);
— (УХ)А выполняется во всех упорядоченно-сортных S, 11- моделях, в которых выполняется Ч?*
Доказательство. Оставим читателю проверку корректности, т. е. того, что из первого утверждения следует второе, и сосредоточимся на доказательстве полноты, т. е. выводимости любого предложения, которое выполняется во всех моделях. Пусть (VX)P(tb .. ., tn)— предложение, выполняющееся во всех S, П, ^-моделях. Тогда оно выполняется в T^n^Q^Y В частности, для оценки q: X-> ^*2, п. <^(Х), связанной с каноническим отображением на фактор-алгебру q: ^"2, п(Х)—>^*Stn, <^(Х), справедливо
([|,1
Но это по определению означает, что предложение (VX)P(ti, ..
..., /п) выводимо из ^ по правилам (1)— (5). □
Следствие 19: теорема об инициальности. Для заданных упорядоченно; сортной сигнатуры с предикатами S, П и множества хорновых ^ И-предложений ^ модель ^"2, п. <^(0) (которую мы будем обозначать ^2^,^) является инициальной в классе всех 5,П,^-моделей, аТ^ п, <^(Х) является свободной моделью над X в том же классе.
Доказательство. Пусть М — некоторая упорядоченно-сортная модель, в которой выполняется %, и пусть а:Х—>М — некоторая оценка. Мы должны показать, что существует единственный
упорядоченно-сортный 2, П-гомоморфизм а&: 9"s, п,<^(Х)-->М, расширяющий а, т. е. такой, что а& (q (х)) = а (х) для всех х g X, где q обозначает каноническое отображение на фактор-модель q: ^s, n(X)->5rs,n, <^(Х). Существование а& вытекает из теоремы о полноте следующим образом.
Для каждого тождества (VX)t = I', выводимого из ^ по правилам (1) — (5), выполняется a*(t) = a*(tz). Это значит, что ^^) ^ ker (а*) и в силу универсального свойства фактор-алгебр (лемма 6) существует единственный упорядоченно-сортный 2-гомоморфизм а&: 9” х, ^(Х) -> М, для которого a* = a&oq.
Выполнение ([tj, . .., [tn])^^2 п <^Wp равносильно (для любых представителей ti сорта Si при w = sb .. ., sn) выводимости предложения (VX)P(tb ..., tn) из ^ по правилам (1) — (5), что по теореме о полноте равносильно выполнению предложения (VX)P(tb . . ., tn) во всех моделях, в которых вы полняется ^.
Таким образом, (а& [tj, . .., а& [tn]) = (a* (tj, .. ., a* (tn)) е Мр, откуда следует, что а& является 2, П-гомоморфизмом. Теперь единственность а& вытекает из комбинации универсального свойства 2Г ^ п(Х) как свободной упорядоченно-сортной модели над X с универсальным свойством q как канонического отображения ф
на фактор-модель. Действительно, пусть а : 9"^п,^(Х) ->М- ф
другой упорядоченно-сортный гомоморфизм, такой, что a (q(x))= = а(х) для всех хеХ. Тогда, поскольку 9~2,п(Х) является свободной упорядоченно-сортной моделью над X, мы имеем а* = а$ ° q и в силу универсального свойства q как канонического отображения а$ = а&, что и требовалось доказать. В случае пустого S-сортного семейства X = 0 это доказывает, что 5Г ^ п, <^(0) = 9”^ п, ^ является инициальной моделью в классе всех моделей, в которых выполняется <6.□
3.3. Теорема Эрбрана
Обычно в логическом программировании рассматриваются запросы вида Вь ..., Вп. На запрос дается положительный ответ, если находится такая подстановка 6, что каждое предложение 0Bi выводимо из набора предложений ^ составляющих программу. Такой запрос — это просто экзистенциальная формула вида (ЗХ)ВЬ ..., Вп, и требуется установить, истинна ли она во всех моделях, в которых выполняется ^. Теорема Эрбрана сводит доказуемость такой формулы к выполнимости ее в инициальной модели. Здесь система правил вывода упорядоченно-сортной логики расширяется для обработки экзистенци-
ально квантифицированных конъюнкций атомов на основе очень простого доказательства общей теоремы Эрбрана, которая справедлива для любой спецификации (S, П, ^^ в упорядоченносортной хорновой логике с равенством. До появления метода резолюций в работах по доказательству теорем (см. [25]) для доказательства экзистенциальной формулы использовались методы «насыщения», которые были методами грубой силы и перебирали всевозможные элементы инициальной модели, пока не находилось подходящее наполнение. В предположении, что все сорта инициальной модели непусты, можно сформулировать более простые правила вывода (без явной квантификации) и доказать второй вариант теоремы Эрбрана. Этот вариант создает основу для доказательств методом резолюций в широком контексте упорядоченно-сортной логики с равенством.
Определение 20. Для заданной упорядоченно-сортной сигнатуры с предикатами 2, П будем называть 2, П-экзистенциадь- ной конъюнкцией {атомов) экзистенциальную формулу вида (ЗХ)В1, ..., Вп, где X — S-сортное множество переменных, содержащее все переменные, которые входят в термы 2,П-атомов Вь ..., Вп. Мы говорим, что S, П-модель М ^выполняет эту экзистенциальную конъюнкцию (или что эта конъюнкция выполняется в М), если существует такая оценка а:Х->М (называемая свидетелем), что
(aft.)“' (М) 65"
(в предположении, что В{ = Р1^П, . . .,tin.)> где Pi: 8И .. . s^ и tij имеет сорт s^).
Теорема 21: теорема Эрбрана. Пусть заданы упорядоченно-сортная сигнатура с предикатами 2, П, множество хорновых 2, П-предложений ^ и 2, П-экзистенциальная конъюнкция (ЗХ)В1, ..., Вп. Тогда следующие утверждения эквивалентны:
(ЗХ)ВЬ ..., Вп выполняется во всех 2, П, ^-моделях;
(ЗХ) Вь .. ., Вп выполняется в инициальной 2, П, ^-модели Ts, п, <е*
Доказательство. Конечно, если формула (ЗХ)ВЬ ..., Вп выполняется во всех S, П, ^-моделях, то она выполняется и в инициальной. Обратно, если 6: X ->9”^, п.^ — свидетель для (3X)Bi, ..., Вп в модели 9"s, п, <^ и если М является 2,П,‘F- моделью с единственным 5, П. ^-гомоморфизмом h: 9"^ п, -^•Ж, то из свойства гомоморфности h следует, что h°0— свидетель для (ЗХ)ВЬ ..., Вп в модели М.
Следствие 22. В результате добавления следующего правила к правилам (1) — (5) упорядоченно-сортного логического вывода получается корректная и полная система правил вывода (для заданного множества <8? хорновых ^ДХ-предложений^ всех истинных универсальных атомарных формул и всех истинных !) экзистенциальных конъюнкций атомов.
Введение квантора существования: если для 1=1, .. ,,п выводимо (V 0)6ВЬ где 6: Х-уЕГ^, то выводимо (ЗХ)ВЬ ...,вп.
До сих пор в этой статье не требовалось, чтобы носители всех сортов в модели были непустыми. Существуют серьезные причины для того, чтобы не накладывать на модели такого ограничения. Действительно, исключение пустых носителей привело бы к тому, что инициальных моделей в общем случае не существовало бы и средства параметризации стали бы довольно неуклюжими (см. [13]). Тем не менее при наличии экзистенциальной квантификации отсутствие в моделях пустых носителей приобретает определенные преимущества. Это происходит в точности тогда, когда все носители инициальной алгебры £Г2 непусты, где 2 — рассматриваемая упорядоченно-сортная сигнатура функциональных символов; при этом мы говорим, что упорядоченно-сортная сигнатура с предикатами 2, П имеет непустые сорта. Мы покажем, что в этом случае правила вывода упрощаются. Сначала докажем лемму, которая справедлива для всех сигнатур. Самым простым доказательством этой леммы было бы теоретико-модельное доказательство, основанное на непротиворечивости. Мы, однако, предпочитаем теоретико-доказательное доказательство, которое явно показывает, почему правило подстановки не является небходимым.
Лемма 23: лемма о подстановке. Для заданных упорядоченно-сортной сигнатуры с предикатами S, П и множества хорновых ^Д!-предложений ^ имеет место следующее правило:
Подстановка: если (VX)A выводимо из ^ по правилам (1) — (5) и задана подстановка 6 : X-^-^s(Y), то (VY)6A также выводимо.
Доказательство. Выводимые формулы можно получить за счетное число шагов, причем на (п + 1)-м шаге добавляются новые формулы, которые можно получить из формул, выведенных за п шагов, по правилам (1) — (5) с использованием ^. На первом шаге мы имеем все тождества вида (VX)t = t (в силу реф-
*) В обоих случаях имеется в виду истинность во всех 5, П, ^-моделях. — Прим, перев.
лексивности) и все атомарные предложения вида (VY)0A для каждого (VX)A из ^ и произвольной подстановки 0:Х-> -^2Г2(У) (в силу модус поненс/. Следовательно, первый шаг тривиально замкнут относительно подстановки. Сделаем индукционное предположение, что n-й шаг замкнут относительно под* становки; остается показать, что (п+1)-й шаг тоже замкнут»
— Если (VX)t = f получено за п шагов, то в силу симметричности (VX)t' = t выводится на (п+1)-м шаге. То же самое справедливо для (VY) 0(f) = 0(t), так как по предположению индукции (VY)0(t) = 0(f) выводится за п шагов.
— Если тождества (VX)t = tz, (VX)t' = t" выводятся за п шагов, то в силу транзитивности (VX)t = tzz выводится на (п+1)-м шаге. То же самое справедливо для (VY)0(t) = 0(tz/), так как по предположению индукции тождества (VY) 0) (t) = 0 (tz), (VY) 0 (tz) = 0 (tzz) выводятся за n шагов.•
— Если t., tfe^2(X)s для i = l, ...,k и если тождества (VX)tj = tz для i=l, .. .,k выводятся за п шагов, то по правилу конгруэнтности
для любого су: sb..Sk—>*s из 2 тождество (VX) ^(tp • • •, tk) = a (tz, . . ., tz) выводится на (п+1)-м шаге, и то же самое справедливо для тождества (VY) <т (9 (tj, . .., 9 (У) = <т (о (У, .... 9 (У), если применить предположение индукции к исходным тождествам;
для любого Р: Sp..Sk из П (отличного от предиката равенства), если (VX) Р (tb .. ., tk) выводится за п шагов, то (VX)P(tz, ...,tz) выводится на (п+1)-м шаге, и то же самое справедливо для (VY) X Р (0 (tz)> . . ., 0 (tz)), если применить предположение индукции к исходным тождествам и к предложению (VX)P(tb .. .,tk).
— Если (VX)A^=Bb .. .,Bm принадлежит ^ и если 0: X->^s(Y) — такая подстановка, что для каждого Вь входящего в тело, атомарное предложение (VX)0B{ выводится за п шагов, то в силу правила модус поненс предложение (VY)0A выводится на (п+1)-м шаге, и то же самое справедливо для (VZ)p0A, если применить предположение индукции к предложениям (VY)0Bi для i = = 1, . .., ш.□
С помощью леммы о подстановке можно доказать следующий вариант теоремы Эрбрана для сигнатур с непустыми сортами.
Следствие 24: теорема Эрбрана для непустых сортов. Пусть заданы упорядоченно-сорт пая сигнатура с предикатами и непустыми сортами Х,П, множество хорновых Х,П-предложений ^ и X,XV-экзистенциальная конъюнкция (3X)Bi, ..., Вп. Тогда следующие утверждения эквивалентны:
— (ЗХ)ВЬ . . ., Вп выполняется во всех 2, П, ^-моделях}
—существует такая подстановка 6: X—>^s(Y), что (VY)6BI выводимо из ^ по правилам (1) — (5) для z = 1, ..., п.
Доказательство. По теореме Эрбрана достаточно доказать, что второе утверждение выполняется при некоторой подстановке 0:X->£Ts(Y) в том и только в том случае, если оно выполняется при некоторой основной подстановке (У : X-^ $Г^. А это действительно так, поскольку в силу предположения о непустоте сортов мы всегда можем определить подстановку p:Y^^s, а по лемме о подстановке всегда можем сделать второе утверждение истинным при 0Z = роб. □
Непустые сорта позволяют избавиться от квантификации переменных. В этом также легко убедиться с помощью леммы о подстановке, если использовать следующее утверждение, которое показывает, что выбор надмножества X, включающего множество входящих в атом А переменных, несуществен для истинности универсального предложения.
Следствие 25. Пусть заданы упорядоченно-сортная сигнатура с предикатами и непустыми сортами X, П, некоторый X, Патом А -и множество хорновых ^^-предложений ^. Тогда (УХ) А выводимо из ^ по правилам (1) — (5) в том и только в том случае, если выводимо предложение (Vvars(A))A, где vars(A)—S-сортное множество переменных, входящих в К (и, конечно, Nais^K^ ^Х).
Доказательство. Достаточность становится очевидной, если применить правило подстановки к включению vars(A)^X^
Необходимость вытекает из того, что в силу предположения о непустоте сортов всегда можно определить подстановку Х-> -^^s(vars(A)), тождественную на vars(A), если отображать переменные из множества X — vars(A) в основные термы. □
Сформулируем теперь упрощенные и обобщенные правила вывода, образующие корректное и полное исчисление для случая
непустых сортов. Мы делаем неявной универсальную квантификацию атомов и хорновых предложений и рассматриваем выводимость не только атомарных предложений, но и конъюнкций Вь • • •, Вп. Мы также упрощаем экзистенциальную квантификацию, опуская множество переменных, так как следствие 25 вместе с теоремой Эрбрана для непустых сортов показывает, что выбор надмножества переменных несуществен также и для экзистенциальной квантификации; мы просто пишем ВВЬ ..., Вп.
Вот правила вывода для упорядоченно-сортной сигнатуры с предикатами и непустыми сортами 2, П и множества хорновых 2, П-предложений, предназначенные для вывода (неявно универсальных) конъюнкций атомов и экзистенциальных конъюнкций атомов.
Рефлексивность*, каждое тождество вида V = t выводимо.
Симметричность: если t = V выводимо, то выводимо Г = t
Транзитивность: если t = tz, V = V' выводимо, то выводимо t = tzz.
Конгруэнтность: если tp t'e^~2(X)s для i=l, ...,п и если тождества ^ = t', ..., tn = t' выводимы, то
для любого су: Sp.-Sn —> s из X тождество су (tb . . ., tn) = = су (tp .. ., t') выводимо;
для любого Р : Si . . . sn из П (отличного от предиката равенства) из выводимости P(tb ..., tn) следует выводимость Р (tj, . . ., t').
Модус поненс: если А^=ВЬ . ..,Вт принадлежит ^ и если 0:Х—>-£Ts(X)—такая подстановка, что 0ВЬ ... . . . , 0Bm выводимо, то выводимо 0А.
Введение конъюнкции: если Вь ..., Bm выводимы, то выводима конъюнкция Вь . .., Вт.
Введение квантора существования: если при некоторой подстановке 0 выводимо 0ВЬ .. ., 0Bm, то выводимо ЗВЬ • • • , Вт.
Оценивая лишние переменные из X элементами модели М, обозначаемыми основными термами, легко убедиться, что в случае сигнатур с непустыми сортами выполнимость хорнова предложения или экзистенциальной конъюнкции атомов не зависит от надмножества квантифицированных переменных, и поэтому ее можно определить для неявно квантифицированных предложений. Выполнение конъюнкции Вь . .. , Bm определяется как одновременное выполнение каждого из ее членов. Таким образом, мы получаем следующую теорему.
Теорема 26: теорема о полноте для непустых сортов. Для за* данных упорядоченно-сортной сигнатуры с предикатами и непустыми сортами 2,П, множества хорновых 2, IV-предложений ^ и (^неявно универсальной) конъюнкции ^.XY-атомов Вь ..., Вт или экзистенциальной конъюнкции атомов Вь ..., Вт, которая обозначается через S, следующие утверждения эквивалентны:
— (VX)S выводимо из ^ по правилам (1) — (7);
— (VX)S выполняется во всех упорядоченно-сортных 5,П- моделях, в которых выполняется <6.
Правила (1) — (7) положены в основу гораздо более эффективной операционной семантики языка Eqlog, которая опирается на переписывание термов, сужение,' упорядоченно-сортную унификацию и резолюцию. Поскольку вычисления в языке Eqlog ограничены объектами и не допускаются для теорий, можно для удобства параметризации разрешить пустые сорта в теориях, сохраняя требование непустоты сортов для исполнимой части. Например, теория POSET частично упорядоченных множеств может иметь пустой сорт Element, но любая конкретизация через отображение POSET в некоторый объект должна отображать Element в непустой сорт.
Операционная семантика
Два приведенных нами набора правил вывода — один вполне общий, другой для случая непустых сортов — сами по себе недостаточно эффективны для реализации языка, который действительно использовался бы для программирования, хотя второй набор является улучшением первого. Эти наборы правил, скорее, предназначены для теоретических исследований, таких, как теорема о полноте и теорема Эрбрана, и могут послужить мостиком для перехода к действительно эффективной операционной семантике. На наш взгляд, операционная семантика языка логического программирования — это эффективная теория доказательств для его логики. Например, упорядоченно-сортное переписывание [16} обеспечивает эффективную теорию доказательств для упорядоченно-сортной эквациональной логики, и тем самым для языка OBJ [9], точно так же, как обычное переписывание термов обеспечивает эффективную теорию доказательств для обычной эквациональной логики. Аналогично метод резолюций для хорновых предложений (с некоторыми хитрыми приемами для поэтапного накопления подстановок и т. д.) обеспечивает эффективную операционную семантику для обычной хорновой логики, и тем самым для языка Пролог.. Наконец, эф-
фективная операционная семантика языка Eqlog [11] является комбинацией упорядоченно-сортной резолюции и упорядоченносортного сужения (которое само по себе является комбинацией переписывания и унификации). Это подробно описано в наших совместных работах с Гертом Смолкой по упорядоченно-сортной операционной семантике языка Eqlog [26] и по упорядоченносортной унификации [23].
Свободные расширения
Итак, мы рассмотрели свободные и инициальные модели для упорядоченно-сортной хорновой логики с равенством. Можно, однако, рассматривать свойства инициальности и свободы относительным образом: можем ли мы расширить заданную модель подспецификации до модели надспецификации таким образом, чтобы это расширение было инициальным или свободным? Этот вопрос естественным образом связан с семантикой параметрических модулей, в которой модель теории, описывающей требования к параметрам, свободно расширяется до модели теории тела модуля. Свободные расширения связаны также с моделями, которые частично являются встроенными, а частично интерпретируются как инициальные модели множества аксиом (т. е. программы), причем эти модели являются свободными расширениями их встроенных частей. Мы покажем, что такие свободные расширения существуют и могут быть получены с помощью теоретико-доказательных конструкций. Непосредственное обобщение нашего доказательства (с небольшими вариациями, обусловленными синтаксическими отличиями и возможностью неинъективного отображения сортов) позволяет строить свободное расширение по морфизму спецификаций (называемому представлением в языках Eqlog и OBJ) V : (S, П, ^)(S', П',
т. е. показывает, что упорядоченно-сортная хорнова логика с равенством является либеральной институцией (в смысле [10]).
Рассмотрим вложение спецификаций упорядоченно-сортной хорновой логики с равенством J : (S, П, ^ (S', П', ^^^ т. е. S с S', П с П' и ^ = ^ Тогда любую S', П', Ф'-модель М' можно рассматривать как S, П,^-модель, просто «забывая» операции из 2 — S' и предикаты из П— П'; разумеется, этот процесс «забывания» является функтором Mods'ir,^-> —>Modz, п, <^« Возможно, что под расширением S, П, ^-модели М мы интуитивно понимаем такую S', П', ^'-модель М', которая содержит М в качестве S, П,^-подмодели. Однако в общем случае такой модели М' может не существовать из-за того, что (содержащее больше аксиом, чем ^) обусловливает отождествление различных элементов модели М, Поэтому лучше обоб-
щить наше интуитивное представление и потребовать, чтобы М и М' были связаны 2, П-гомоморфизмом f:M—^М/, т. е. чтобы модель М/ содержала образ М. Таким способом мы получаем категорию Extj(M), объектами которой являются все такие расширения f:M^Mz, а морфизмами h : (f: M-^MZ)(fz: М-> ^-Mz) — такие Sz, П'-гомоморфизмы h, которые, сохраняют образ М, т. е. такие, что fz = h»f. Проблему существования свободных расширений теперь можно сформулировать в виде следующего вопроса:
имеет ли категория Extj(M) инициальный объект?
Этот вопрос в точности совпадает с вопросом о том, имеет ли забывающий функтор Mods', пл <^' = Mods, и.^ сопряженный к нему слева функтор (см. [21]). Ответ на этот вопрос будет положительным, и мы обозначим такой инициальный объект через Fj(M). Фактически мы покажем, что Extj(M) можно аксиоматически задать как класс моделей, определяемый хорновыми предложениями. Поскольку мы уже доказали, что в таком классе есть инициальная модель, то отсюда сразу следует указанный результат. Нам нужно лишь построить сигнатуру SZ(M), в которой элементы модели М добавляются как новые константы, и ввести понятие позитивной диаграммы модели М, которая обозначается Diag+(M) и является множеством 2 (М), П-предло- жений вида (V 0)a(al, . .., an) = Mq (al, . . ., ап) для (al, . . ., . .., an) e Mw и cr: w —> s из 2 или вида (V 0) P (al, . . ., an) для (al, ..., an) e Mp и P : w из П.
Лемма 27. Пусть заданы включение J : (2, П, ^^ (Sz, IT, ^z) спецификаций упорядоченно-сортной хорновой логики с равенством и S,!!,^-модель М. Тогда категории Exty(M) и ^0(^S'(M). II', ^'U Diag^CM) изоморфны.
Доказательство. Задать SZ(M), П, ^-модель — это то же самое, что задать Sz, IF, ^'-модель М' вместе с S-сортной функцией f:M->Mz, которая задает интерпретацию в Mz для каждой константы из M(S — множество сортов сигнатуры 2). Аналогично Sz (М), П-гомоморфизм — это просто S', П-гомомор- физм h : Mz ^Mzz, сохраняющий константы из М, т. е. такой, что fz = h<>f, где f и V — функции, интерпретирующие М-константы в М' и в Mzz. Итак, нам нужно лишь убедиться, что SZ(M),IF, ^'-модель f: М^-М/ выполняет Diag+(M) в том и только в том случае, если f является 2,П-гомоморфизмом, но это очевидно по построению. □
Следствие 28. Для заданных упорядоченно-сортной сигнатуры с предикатами 2,П и lL.Tl-модели Ж имеет место изомор-
физм
М /х/ ОТ ,J S(M), П, Diag+(M)*
Доказательство. Выберем в качестве J тождественное включение (S, П, 0) ^ (2, П, 0) и заметим, что тождественный гомоморфизм 1м:М^М, очевидно, является инициальной моделью в Extj(M). □
Теперь мы можем обсудить частный случай свободного расширения, когда 2,П-модель М считается встроенной и новых сортов и функциональных символов не добавляется, а добавляются лишь новые предикатные символы, в результате чего получаются новая предикатная сигнатура П' и новая программа ^ которая аксиоматизирует новые предикатные символы и является множеством хорновых предложений с заголовками, содержащими только предикаты из П' — П. Этот подход также развивается в [19], однако в нашей конструкции свободного расширения за счет общих принципов удается получить то, что в [19] описывается как «наименьшая неподвижная точка» довольно сложного непрерывного оператора.
Следствие 29. Пусть заданы включение J : (2, П, 0) ^ (2, П', ^9 спецификаций упорядоченно-сортной хорновой логики с равенством, где Ч?'— множество хорновых IL, 11-предложений с головами из П'— П, и И^П-модель М. Тогда расширяющее отображение M-^Fj(M) является 11,11-изоморфизмом.
Доказательство. Имеем Fd (М) = ^^ n ^UDiag+(М), но если рассмотреть правила упорядоченно-сортного логического вывода, то очевидно, что предложения из ^ не добавляют новых 2, П-предложений к тем, которые получаются из Diag+(M). Поскольку функциональные символы остаются теми же, это означает, что после забывания предикатных символов из П' — П модель ^есм), п, ^uDiag+(M) превращается в ^'2(М)> и Diag+ <Мр а мы уже видели, что эта последняя модель изоморфна М. □
Языки со встроенными средствами и ограничениями
Любую 2,П-модель можно аксиоматизировать ее диаграммой. Однако такая аксиоматизация в общем случае не будет конечной. Но даже если имеется конечная аксиоматизация, удовлетворяющая требованиям корректности операционной семантики (например, что тождества образуют конфлюентную и завершаемую систему правил переписывания), и на нее можно опираться при решении запросов, в которых используется стандартная операционная семантика упорядоченно-сортной логики
с равенством, все-таки хотелось бы иметь более эффективный встроенный специализированный алгоритм решения таких запросов. Для многих широко используемых моделей, таких, как числа, бесконечные деревья и т. д., такие алгоритмы существуют. Слегка упрощая картину, предположим, что имеется алгоритм SoIm, который для заданного запроса (т. е. экзистенциальной формулы ВВЬ . .., Вп) выдает решение тогда и только тогда, когда эта формула выполняется в М. Такой алгоритм называется полным, если он перечисляет полное множество решений, т. е. множество So1m(Bi, .. ., Вп) таких подстановок 6, что каждый свидетель f :Х^М, решающий ЗВь ..., Вп, раскладывается как f = F ° 6 для некоторой подстановки 6 из этого множества, и обратно, каждая композиция такой подстановки 6 с любой оценкой в М является свидетелем. Другими словами, каждое «частное» решение описывается некоторым элементом семейства «общих» решений.
Предположим, что мы хотим сделать 2,П-модель М встроенной, используя алгоритм SoIm, и что мы также хотим свободно расширить М некоторыми дополнительными предикатами и предложениями1) таким образом, чтобы отображение М—>•
>Fj(M) было изоморфизмом. В 3.5 было доказано, что оно является изоморфизмом, когда заголовки новых предложений содержат только новые предикатные символы, и здесь мы будем предполагать, что это условие выполняется.
Как скомбинировать разрешающий алгоритм SoIm со стандартной упорядоченно-сортной операционной семантикой для невстроенной части расширения, чтобы получить полный алгоритм решения запросов? Для ответа на этот вопрос можно рассмотреть свободное расширение Fj(M) как инициальную модель ^(Mt.ir.-ruDiag+tMp гДе (2> п3 ^З — спецификация (с непустыми сортами), содержащая старые функциональные символы, старые и новые предикатные символы и новые хорновы предложения. Теперь любой запрос, который нужно решать, будет иметь вид З^ь • • •, ^j, Bi, ... , Bk, где ^i, ..., ^j являются S, П-атомами (т. е. используют только встроенные элементы), а все Bi являются атомами, предикатные символы которых при-
*) Это тот случай, который обрабатывался в [19] с помощью метода наименьшей неподвижной точки и который действительно довольно ограничителен. В общем случае хотелось бы расширять М дополнительными сортами и функциями наряду с предикатами и предложениями таким образом, чтобы свободное расширение Fj (М) предохраняло встроенную модель М, т. е. чтобы при ограничении Fj(M) на сигнатуру встроенных элементов получалась модель, изоморфная М. Если все дополнительные функциональные символы являются конструкторами, то все наши рассуждения легко обобщаются. Однако наиболее общий случай требует дальнейшего изучения.
надлежат ГТ — П. По теореме Эрбрана этот запрос имеет решение тогда и только тогда, когда существует свидетель f : X -> -^Fj(M). Такой свидетель a fortiori является свидетелем для запроса 3^1, ..., ^j, поэтому имеется такая подстановка 9е е8о1м(^1, . ^j), что f раскладывается в композицию с 6. Это означает, что запрос З^ь . . ., ^j, Вь . . ., Вк имеет решение тогда и только тогда, когда для некоторой подстановки 6 е е8о1м(^1, . ^j) запрос 30В1, ..., 0Вк имеет решение, Вспомним теперь, что Fj (М) ^ (М)> п, ^,UDiag+(М). Таким образом, после выбора конкретной подстановки 0 из 5о1мС8Т, --- .^j) следующим шагом в поиске возможных решений будет, конечно, резолюция. Ее можно выполнять только для предложений из ^ так как позитивная диаграмма содержит только старые предикатные символы. Более конкретно, если 0В1 = = P(t], . .., tn) и ^ содержит предложение вида
то можно сформировать новую подцель, заменив 0В1 на ti = 4- ...,tn = t; ^, в;,..„в;.
Следующим шагом может быть выбор подстановки 0А из множества SolM (tj = t', . . ., tn = f, ^p ..., ^), в результате чего мы получим общую подцель
0'В', ..., 0'В', 0' о ев2, ..., 0z о 6Вк,
Такой процесс чередования обращений к SolM с резолюциями, использующими предложения из ^^ дает полную стратегию решения исходного запроса.
Однако эта стратегия может оказаться слишком дорогой, если дорого стоят обращения к SoIm. Она также может оказаться неприменимой на практике, если наше упрощенное предположение о том, что алгоритм SolM можно применить к любой конъюнкции 2, П-предложений, не выполняется. Это происходит в том случае, когда предложения, к которым можно применять некоторый алгоритм, должны удовлетворять ряду ограничений, которые выполняются только после достаточного наполнения подстановками. Таким образом, альтернативная полная стратегия заключается в задержке обращений к SolM до тех пор, пока все атомы с новыми предикатами не будут устранены из цели в результате революционных шагов. Это означает, что «сомнение толкуется в пользу» атомов, содержащих встроенные предикаты. При этом поисковое пространство расширяется,
хотя для невстроенных предикатов оно может исследоваться быстрее. Возможна также смешанная стратегия, предусматривающая немедленный вызов алгоритма SoIm для тех предикатов, с которыми он работает эффективно (например, для равенства, которое можно свести к унификации, если используются только конструкторы, или к унификации без проверки циклов, если М состоит из бесконечных деревьев), и предусматривающая задержку вызовов SoIm для предикатов, для которых он неэффективен, или в тех случаях, когда для применения алгоритма требуется конкретизация аргументов. Все эти варианты стратегии остаются полными, так как все они эквивалентны выполнимости в модели ^2(м) П; ^,uDiag+( мр которая является нашим стандартом корректности.
Итак, мы наметили определенный подход к языкам с ограничениями, в основу которых положена упорядоченно-сортная хорнова логика с равенством. Денотационная семантика задается любой моделью, которая является инициальной в классе всех моделей, имеющих некоторые фиксированные (встроенные) сорта, функции и отношения, интерпретированные в фиксированной упорядоченно-сортной модели. Операционная семантика задается как комбинация резолюции и встроенных алгоритмов. Главный аргумент в пользу этого подхода заключается в эффективности реализации такого рода языков. Мы обсудили некоторые тонкие вопросы, которые возникают в этом контексте.
ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ
В этом параграфе мы обсудим весьма общий подход к логическому программированию, основанный на понятии институции [10], которое на высоком уровне абстракции объединяет формальный синтаксис с теорией моделей и логическим выводом. Пока что институции дают скорее общий взгляд на вещи, чем формальные основания для всех аспектов исследования стилей программирования и их комбинаций. Однако и то, чем мы располагаем сейчас, создает реальную основу для исследований и открывает для логического программирования более широкие перспективы, чем любые другие известные концепции. Кроме того, в еще не полностью формализованных областях открываются интересные возможности дальнейших исследований.
Абстрактность и общность рассматриваемого здесь материала делает теорию категорий весьма подходящим языком описания понятий и их свойств. Поскольку в статье такого объема невозможно «с нуля» ввести все необходимые понятия теории категорий, мы предполагаем, что с основными из них читатель знаком; вводный материал можно найти в работах [21], [1].
Институции и языки логического программирования
Сейчас информатика переживает период бурного роста как в области практических средств, так и в области теории. Это вызывает острую потребность в унификации понятий, так как без нее мы утонем в потоке неусвоенной информации. В частности, наблюдается «демографический взрыв» логических систем, которые включают логику первого порядка, эквациональ- ную логику, модальную логику, логику высших порядков, временную логику, интуиционистскую логику, динамическую логику, упорядоченно-сортную хорнову логику и большое число специализированных логик, используемых в различных системах верификации программ и доказательства теорем.
Институции (см. [10], [6]) формализуют понятие логической системы и, по-видимому, могут оказаться полезными для описания основных черт языков спецификаций и языков программирования независимо от специфики языка или логики, а также для унификации стилей программирования. Институции не связаны с какой-либо конкретной логической системой, а осуществляют построения сразу для всех систем на высоком уровне общности. Помимо уже упоминавшихся предложений, моделей и отношения выполнимости, институции позволяют описывать гомоморфизмы моделей и дедукции между предложениями. Можно сказать, что институции обобщают классическую теорию моделей, релятивизируя ее относительно сигнатур. Сформулируем это в виде следующего лозунга:
Истина инвариантна относительно изменения обозначений.
Этот материал тесно связан с абстрактной теорией моделей, которую изучают логики (см., например, [3]). В формальных определениях мы будем пользоваться следующими обозначениями: категории выделяются жирным шрифтом, а |С| обозначает класс объектов категории С.
Определение 30. Институция 3 состоит из
категории сигнатур Sign;
функтора Mod : Sign -> Catop, дающего ^-модели и ^-морфизмы,;
функтора Sen : Sign -> Cat, дающего lL-предложения и ^-доказательства;
— отношения выполнимости |=s ^ | Mod (2) | X I Sen (2) | для каждого S ^ | Sign |. Отношение выполнимости удовлетворяет условиям
инвариантности;
m' l=s' Sen (<p) s <=ф Mod (ф) т' {= s s
для всех т' е [ Mod (2) |, s е | Sen (S) |, ф: 5 -> S' из Sign;
непротиворечивости*, если m[=ss и s —> s'е Sen (5), то m^s' для me|Mod(5)|.
Теперь мы дадим неформальное толкование понятия «логическое программирование».
Определение 31. Язык логического программирования $ связан с институцией 3 следующим образом:
программа Р языка $ состоит из сигнатуры 2 из 3 и конечного множества 5-предложений);
операционная семантика ^-программ Р задается доказательствами из 3, переводящими поступивший запрос в ответ в некоторой нормальной форме );
денотационная семантика ^-программы Р над сигнатурой 5 задается некоторым классом 5-моделей в 3^.
В функциональном программировании за основу берется некоторая институция эквациональной логики — односортной, многосортной или упорядоченно-сортной, возможно первого или высшего порядка, — ив результате вычислений заданное предложение редуцируется к нормальной форме. Так, в языке FP (см. [2]) используются фиксированные программы Р высшего порядка и вычисления заключаются в приведении определяемого пользователем выражения к нормальной форме. Язык OBJ (см. [9]) основан на упорядоченно-сортной эквациональной логике первого порядка; пользователь сначала задает программу Р, возможно, неявно — как комбинацию других программ (т. е. модулей), а вычисления опять-таки заключаются в приведении правильно построенного выражения к нормальной форме. В чистом логическом программировании за основу берется институция хорновой логики первого порядка — бессортной, многосортной или даже упорядоченно-сортной. Пользователь задает программу Р и запрос Q, содержащий некоторые переменные; затем с помощью операционной семантики делается попытка
вывести некоторое наполнение Q из Р и в случае успеха выдается соответствующая подстановка. Язык Eqlog (см. [11]) делает во многом то же самое, но он основан на институции упорядоченно-сортной хорновой логики с равенством, поэтому его предложения имеют значительно более общий вид, чем в обычном логическом программировании. Язык Eqlog возвращает как подстановку, так и соответствующее наполнение запроса, и таким образом функциональное программирование в стиле языка OBJ оказывается здесь частным случаем. Язык FOOPS (см. [12]) является комбинацией языков функционального и объектно-ориентированного программирования и основан на рефлексивной упорядоченно-сортной эквациональной логике первого порядка, а вычисления в нем модифицируют не только задаваемое пользователем выражение, но и программу. Хотя нам известны предложения и правила вывода этой логики, мы еще не знаем, какие сюда подходят модели, так что это еще не институция.
Определение 31 на самом деле является еще более общим, чем мы показали, поскольку оно также охватывает языки спецификаций. Разница между языком логического программирования и языком спецификаций заключается в эффективности логического вывода. Поскольку это свойство отчасти субъективно, а отчасти является вопросом техники, мы не даем его формального определения. Вместо этого мы просто скажем, что язык спецификаций — это неэффективный язык логического программирования. Некоторые языки спецификаций обладают «пустой» семантикой в том смысле, что в качестве денотата заданных предложений рассматривается класс всех моделей этих предложений; примером является язык Clear (см. [5]). В этом случае для определения абстрактных типов данных в языке необходимы некоторые довольно причудливые предложения, такие, как «ограничения данных» в [10]. Другие языки спецификаций используют в качестве денотата программ только инициальные модели, как, например, ACT ONE (см. [8]), а некоторые вообще ограничиваются фиксированным набором структур данных, такими, как S-выражения или числа; примером является первоначальная система доказательства теорем Бойера— Мура [4]. Вместо того чтобы задавать выражения, требующие редуцирования, или запросы, требующие ответов, пользователь языка спецификаций может, как правило, формулировать весьма общие утверждения о свойствах программы; таким образом, вычисления становятся довольно общим процессом доказательства* теорем. Кроме того, взаимодействие с пользователем здесь в общем случае гораздо свободнее, чем для языка программирования: на некоторых этапах процесса доказатель-
ства пользователь принимает в нем непосредственное участие. В этом контексте OBJ и Eqlog являются языками «широкого спектра», так как в них есть вполне эффективные подмножества, достаточно эффективные подмножества, которые можно использовать для быстрого макетирования (например, ассоциативнокоммутативная унификация), и такие подмножества (например, верификация теорий), которые реально подходят только для спецификации и проектирования.
ЗАКЛЮЧЕНИЕ
Мы показали, что «более теоретико-модельные» методы могут обладать рядом преимуществ по сравнению с традиционными методами логического программирования. Например, они упрощают определение семантики языков с ограничениями, а также позволяют сочетать логическое и функциональное программирование и использовать упорядоченно-сортную логику. Мы также показали, что упорядоченно-сортная хорнова логика с равенством (особенно в сочетании со встроенными средствами) позволяет получить такой выразительный и общий язык логического программирования, какой только можно пожелать (если мы хотим обойтись без состояний и объектов). Кроме того, мы более подробно описали семантику языка Eqlog, чем это было сделано в [11]; в частности, мы привели два набора правил вывода для упорядоченно-сортной хорновой логики с равенством; один совершенно общий, а второй для случая, когда все сорта непусты; мы также доказали теоремы о полноте, об ини- циальности, теорему Эрбрана и теорему о свободном расширении. Именно теорема о свободном расширении служит семантической основой для языков с ограничениями. Мы показали, что этот теоретико-модельный подход составляет привлекательную альтернативу более синтаксическим подходам. В частности, привлекательно то, что абстракция, т. е. независимость от представления, входит в этот формализм явным образом. Мы также описали некоторые детали очень общего формализма для логического программирования, основанного на понятии институции, и показали, как различные случаи, которые рассматривались в статье, укладываются в этот формализм. Наконец, был поднят ряд новых вопросов, в том числе вопрос о более общих теоремах о свободном расширении и о поиске подходящей теории моделей для объектно-ориентированного программирования.
ЛИТЕРАТУРА
Arbib М. A., Manes Е Arrows, Structures and Functors. Academic Press, 1975.
Backus J. Can programming be liberated from the von Neumann Style? Communications of ACM, 21, 1978, No 8, p. 613—641.
Barwise J. Axioms for Abstract Model Theory. Annals of Mathematical Logic, 7, 1974, p. 221—265
Boyer R., Moore J A Computational Logic. Academic Press, 1980.
Burstall R., Goguen J. Putting Theories Together to Make Specifications. Proceedings, Fifth International Joint Conference on Artificial Intelligence, 5, 1977, p. 1045—1058.
Burstall R., Goguen J. The Semantics of CLEAR, a Spesifications Language Lecture Notes in Computer Science, 86, 1980, p. 292—332.
Burstall R, Goguen J. Algebras. Theories and Freeness: An Introduction for Computer Scientists Proceedings, 1981 Marktoberdorf NATO Summer School, Reidel, 1982.
Ehrig FL, Mahr B. Fundamentals of Algebraic Specification 1: Equations and Initial Semantics. Springer-Verlag, 1985.
Futatsugi K., Goguen J , Jouannaud J.-P., Meseguer J. Principles of OBJ2. Proceedings, Symposium on Principles of Programming Languages, ACM, 1985, p 52—66.
Goguen J, Burstall R. Institutions: Abstract Model Theory for Computer Science. CSLI-85-30, Center for Study of Language and Information, Stanford University, 1985. Более ранний вариант опубликован в Lecture Notes in Computer Science, 86, 1984, p. 221—256.
Goguen J, Meseguer J Eqlog: Equality, Types, and Generic Modules for Logic Programming, in: Functional and Logic Programming, Douglas DeGroot, Gary Lindstrom, Eds. Prentice-Hall, 1986, p. 295—363. Более ранний вариант опубликован в Journal of Logic Programming, 1, 1984, No 2, p. 179—210.
Goguen J., Meseguer J Extensions and Foundations for Object-Oriented Programming Готовится к печати Более ранний вариант опубликован в SIGPLAN Notices, 21, 1986, No 10, р 153—162.
Goguen J., Meseguer J. Remarcs on Remarcs on Many-Sorted Equational Logic. Bulletin of EATS, 30, 1986, p. 66—73.
Goguen J, Meseguer J. Order-Sorted Algebra I: Partial and Overloaded Operations. Errors and Inheritance. Готовится к печати в SRI International, Computer Science Lab., 1987.
Goguen J, Meseguer J. Order-Sorted Algebra Solves the ConstructorSelector Problem. Готовится к печати
Goguen J., Jouannaud J.-P, Meseguer J Operational semantics of Order- Sorted Algebra Proceedings, ICALP, 1985. Springer-Verlag, 1985.
Goguen J, Thatcher J, Wagner E. An Initial Algebra Approach to the Specification, Correctness and Implementation of Abstract Data Types. Current Trends in Programming Methodology, IV, ed. R. Yeh. PrenticeHall, 1978, p 80—149.
Halpern J. Y., Williams J H., Wimmers E. L., Winkler T. Denotational Semantics and Rewrite Rules for FP Proceedings, Simposium on Principles of Programming Languages, ACM, 1985, p. 108—120.
Jaffar J., Lassez J-L Constraint Logic Programming. Monash University, Australia, 1986. Draft.
Jaffar J , Michailov S Methodology and Implementation of a Constraint Logic Programming System. Monash University, Australia, 1986. Draft.
MacLane S. Categories for Working Mathematician. Springer-Verlag, 1971.
Meseguer J., Goguen J. Initially, Induction and Computability. Algebraic Methods in Semantics, eds. M. Nivat, J. C. Reynolds. Cambridge University Press, 1985, p. 459—541.*
Meseguer J.. Goguen J , Smolka G. Order-Sorted Unification. SRI International, 1987. Готовится к печати.
O’Donnell М. Equations! Logic as a Programming Language. MIT Press, 1985.
Robinson J. A A Machine-oriented Logic Based on the Resolution Principle. Journal of ACM, 12, 1965. [Имеется перевод. Робинсон Дж. Машинно-ориентированная логика, основанная на принципе резолюций. —- Кибернетический сборник (новая серия), вып. 7, с. 194—218.]
Smolka G, Goguen J., Meseguer J. Order-Sorted Equational Computation. SRI International, 1987. Готовится к печати
Walther C Unification in Many-Sorted Theories Advances in Artificial Intelligence. Proceedings. Sixth European Conference on Artificial Intelligence. North-Holland, 1984.
ДОКАЗАТЕЛЬСТВА КАК ОПИСАНИЯ ВЫЧИСЛЕНИЙ)
к. А. ГОУД
Резюме. Доказательство утверждения УхЗуф (х, у) можно рассматривать как описание алгоритма, который удовлетворяет спецификации, заданной предикатом ф Для выполнения такого доказательства (т е. нахождения для некоторого значения х такого значения у, что выполняется ф(х, у)) можно использовать различные методы теории доказательств. Доказательства отличаются от обычных программ тем, что содержат больше информации об алгоритме, чем необходимо для его исполнения В работе рассматриваются (1) возможность использования этой дополнительной информации для автоматического преобразования алгоритмов, в частности для адаптации алгоритмов к специальным случаям, и (2) эффективные методы выполнения и преобразования доказательств. Система обработки доказательств программно реализована В работе описываются результаты экспериментов по специализации алгоритма упаковки корзин
ВВЕДЕНИЕ
Основная цель доказательства — предоставление неопровержимых свидетельств истинности утверждения. Однако в некоторых случаях доказательства могут находить и другие применения.
Предположим, что мы располагаем доказательством существования объекта с заданными свойствами. Иногда им можно воспользоваться для нахождения конкретного объекта с этими свойствами. Если наложить некоторые ограничения на используемые способы вывода, то можно гарантировать, что доказательство будет давать (в том или ином смысле) такую дополнительную информацию. Например, конструктивное доказательство утверждения Зхф(х) всегда дает значение v, для которого верно ф(у), т. е. указывает метод вычисления такого v (осуществимый или неосуществимый на практике). Однако конструктивность — слишком сильное требование. Во-первых, доказательство утверждения Зхф(х) может давать значение v, удовлетворяющее ф, но при этом истинность ф может доказываться неконструктивными методами. Во-вторых, если ограничить сложность ф (например, если ф— бескванторная формула арифметики первого порядка), то любое классическое доказатель-
ство Зхф(х) позволяет получить реализацию в том же смысле и теми же формальными методами, что и конструктивное доказательство. (Реализацией утверждения Эхф(х) называется значение, удовлетворяющее предикату ф.)
Если доказательство существования формализовано, т. е. допускает автоматическую обработку; то можно надеяться на автоматизацию перехода от доказательства к значению, реализующему утверждение о существовании. Результаты теории доказательств показывают, что реализацию доказательств можно автоматизировать для разных формальных систем и разными способами. Например, с помощью процедуры нормализации Пра- вица можно преобразовать доказательство существования в системе естественного вывода в прямое доказательство, которое (при достаточно общих условиях) явно указывает реализацию
Если имеется доказательство утверждения вида УхЗуф(х, у), то очевидно, что с помощью этих методов теории доказательств можно найти функцию f со свойством Ухф(х, f(x)). Для этого достаточно применить общий результат УхЗуф(х, у) к входному значению и затем воспользоваться нормализацией (или любым другим имеющимся методом) для получения реализации. Таким образом, доказательство формулы УхЗуф(х, у) служит программой вычисления функции, удовлетворяющей «спецификации» ф.
Чем интересно использование доказательств в качестве программ для программирования как науки и для практических вычислений? Вот один из возможных ответов.
Существующие языки программирования большей частью спроектированы так, чтобы запись выражений была экономной: в программе, написанной на таком языке, формализована лишь та информация, которая необходима для выполнения поставленной задачи. С другой стороны, в доказательстве формализовано много информации, несущественной для простого выполнения вычислений, например: описание выполняемой задачи, обоснование метода и перечень зависимостей между различными фактами, касающимися вычислений. Этой дополнительной информацией можно воспользоваться для преобразований методов вычисления (например, для адаптации методов к новым ситуациям). Это неудивительно, поскольку данные, позволяющие преобразовывать алгоритмы, должны быть шире, чем данные, необходимые для простого выполнения.
Мы рассмотрим специальное множество преобразований алгоритмов, называемых преобразованиями подрезки1). Эти пре-
Иногда «подрезка» (pruning) переводится как «прополка». Однако термин «подрезка» кажется нам более подходящим для рассматриваемых в работе преобразований. — Прим,, перев.
образования удаляют лишние вычисления, используя определенную информацию о зависимостях, которая не встречается в обычных программах. В доказательствах, построенных людьми, обычно нет лишних вычислений, которые удаляются с помощью подрезки. Таким образом, преобразования подрезки оказываются не очень полезными, если их применять к оригинальным алгоритмам. Однако доказательства, полученные в результате автоматических процессов, часто имеют лишние части.
Предположим, например, что имеется алгоритм А(х), кото- торый нужно использовать в ситуации, когда заранее известно, что все входные данные имеют специальный вид, заданный термом t(yb . .., уп). Тогда А можно автоматически адаптировать для эффективного применения в такой ситуации, выполняя в символьном виде код А для терма t и затем применяя к полученному результату оптимизирующие преобразования. (В работах [2], [7] этот метод специализации рассматривается в применении к обычным программам.) Если алгоритм А представлен доказательством П, то результат выполнения П на терме t в символьном виде зачастую содержит лишние части, которые удаляются подрезкой, даже если исходное доказательство П не имело лишних частей. Таким образом, эффективность автоматической специализации можно повысить, если добавить подрезку в арсенал оптимизирующих приемов, которые применяются в ходе специализации.
Существующие стандартные методы теории доказательств оказываются неэффективными для специализации алгоритмов. Однако мы разработали методы выполнения и подрезки доказательств, позволяющие справиться с этой проблемой. В данной статье рассматриваются эти новые методы и их применение в специализации. Методы включены в систему обработки доказательств, реализованную на компьютере PDP-10 Стэнфордской лаборатории искусственного, интеллекта. Предварительное экспериментальное исследование эффективности подрезки в специализации алгоритмов проведено на примере алгоритма упаковки корзин.
Эта статья представляет собой неформальное введение в круг идей, на которых основано применение доказательств к вычислениям. Мы не стремимся дать полное изложение всех наших методов. Вместо этого основные особенности подрезки и выполнения доказательств иллюстрируются простыми примерами. Более полную информацию можно найти в диссертации автора [9].
Статья построена следующим образом. В § 2 приведен пример специализации с помощью подрезки в применении к простому доказательству разбором случаев. В этом примере
используется один из стандартных методов теории доказа* тельств — процедура нормализации Правица. В § 3 рассказы* вается об использовании в вычислениях частично формализованных доказательств. В § 4 обсуждаются недостатки существующих методов теории доказательств и в общих чертах описывается наш метод. В § 5 приводятся результаты экспериментов с алгоритмом упаковки корзин. Статья заканчивается кратким обсуждением соответствующих работ из области программирования (§ 6).
В заключение вводного параграфа сделаем несколько общих замечаний об использовании доказательств как описаний вычислений.
Следует отметить, что в этой статье рассматриваются автоматические преобразования уже существующих доказательств, а не автоматическое построение новых доказательств. Используемый в экспериментах алгоритм упаковки корзин был написан «вручную» и вручную введен в ту часть нашей системы обработки доказательств, которая отвечает за проверку доказательств. Если построение доказательств, описывающих методы вычислений, можно частично или полностью автоматизировать — тем лучше. Однако это выходит за пределы нашей статьи.
При построении доказательств, предназначенных для описаний вычислений, нужно все время помнить о вычислениях. Лучшее (самое краткое, элегантное или понятное) доказательство утверждения Vx3y<p(x, у) часто приводит к плохому алгоритму. И наоборот, доказательство, формализующее хороший алгоритм, обычно выглядит весьма неестественно с точки зрения простого установления истинности утверждения. В этой статье доказательства рассматриваются как средство формулировки алгоритмических идей. При получении доказательства, которое предполагается использовать для решения вычислительных задач, следуют той же процедуре, что и при написании обычной программы. А именно, сначала придумывается разумный алгоритм, который затем формализуется в виде доказательства. Если доказательство приведено со всеми подробностями (для проведения вычислений это необязательно, см. § 3), то в нем содержится обоснование корректности алгоритма, который оно формализует. Отсюда сразу следует, что формализация алгоритмов в виде доказательств дает возможность автоматизированной верификации алгоритмов.
Существуют и другие способы применения доказательств, рассматриваемых как описания алгоритмов, в вычислениях. Вот несколько примеров, (а) Доказательства с недоказанными «целями» могут играть роль антецедентных или консеквентных тео-
рем языка Плэннер ([13]), с той разницей, что они в отличие от теорем Плэннера могут и доказываться, и исполняться. (Ь) Использование подрезки во время выполнения доказательств имеет тот же эффект, что и перебор с возвратами, управляемый зависимостями ([6], [20]). (с) Подрезка может оказаться полезной при анализе побочных эффектов. Однако в этой статье мы ограничимся использованием доказательств для специализации алгоритмов.
ПРИМЕР
В этом параграфе мы с помощью одного примера неформально поясним суть и способы применения операций подрезки, а также использование нормализации для выполнения доказательств.
Простейшие алгоритмы, к которым успешно применяются операции подрезки, — это алгоритмы, использующие только разбор случаев. Мы приведем очень маленький алгоритм, использующий разбор случаев, который тем не менее позволяет проиллюстрировать две главные мысли: (1) что с помощью подрезки можно повысить эффективность специализации алгоритмов; (2) что обычные описания алгоритмов не содержат информации, необходимой для такого повышения эффективности с помощью подрезки. Рассмотрим алгоритм вычисления некоторой верхней грани суммы и произведения двух положительных рациональных чисел х и у, заданный в виде условного выражения и (х, у) = if х ^ 1 then у + 1 else (if у ^ 1 then х + 1 else 2ху).
Будем обозначать буквой и как сам алгоритм (рассматриваемый как абстрактный метод, который можно формализовать различными способами), так и конкретный приведенный нами условный терм.
Предположим, что заранее задано значение 0.5 величины у и что мы хотим оптимизировать и с учетом этой информации. Лучшее, что можно сделать, если в качестве описания алгоритма мы располагаем лишь этим условным выражением, — исполнить это выражение в символьном виде на аргументах х, 0.5. В результате получим
и (х, 0.5) = if х ^ 1 then 1.5 else х + 1.
Мы увидим, что формализация этого алгоритма нахождения верхней грани в виде конструктивного доказательства позволяет с помощью символьного исполнения и подрезки автоматически упростить выражение и(х, 0.5) до выражения х + 1. Величина х + 1 является верхней гранью величин х + 0.5 и 0.5х
вне зависимости от того, меньше ли х единицы; информация об этим содержится в доказательстве и позволяет автоматически устранить лишнюю проверку условия х ^ 1. Заметим, что оптимизация с помощью подрезки имеет необычное свойство: она меняет функцию, вычисляемую выражением, к которому применяется подрезка. Тем не менее подрезка гарантирует сохранение правильности алгоритма относительно спецификации, заданной заключительной формулой доказательства, которое описывает алгоритм. Отметим также, что никакие преобразования обычных описаний вычислений не могут иметь тот же эффект, что и подрезка. Обычные описания содержат информацию лишь о вычисляемой функции, а не о цели вычисления, и поэтому корректные преобразования таких описаний должны в отличие от подрезки сохранять экстенсиональное значение.
Ниже мы приведем конструктивное доказательство существования, формализованное в системе естественного вывода, которое описывает алгоритм нахождения верхней грани и. Мы не предполагаем знакомства читателя с теорией доказательств и поэтому даем неформальное объяснение процесса нормализации в применении к доказательствам разбором случаев. В книге Правица [23] можно найти более подробную информацию о системах естественного вывода ^ и методах нормализации, применяющихся к таким системам. В заключение мы описываем операции подрезки и их влияние на алгоритм нахождения верхней грани.
Доказательство в системе естественного вывода в смысле Правица представляет собой вывод заключения из посылок. Мы пользуемся обозначениями из [23]: доказательства представляются в древовидной форме, а посылки2) записываются в квадратных скобках. Например, правило У"УДаления3) записывается в следующем виде:
[А][В]
Hiп2
VE1VBс с
с
Здесь П1 — доказательство формулы С с посылкой А, а П2 — доказательство С с посылкой В. Это правило вывода позволяет устранить посылки А и В. Смысл правила в том, что если С мо-
жно вывести из любой из посылок А и В и известно, что выполняется AVB, то С можно вывести без посылок А и В.
Приведем доказательство в системе естественного вывода, формализующее алгоритм и нахождения верхней грани. Формула ^(х, у, z) будет использоваться как сокращенное обозначение формулы z ^ х + у Д z ^ ху. Листья дерева доказательства, не заключенные в квадратные скобки, служат для обозначения аксиом или лемм. В доказательстве имеются три недоказанные леммы: "x^Izd^x, у, у+1)", "y^lzD'Ptx, у, х + 1)" и zz(x > 1) Л (у > 1) zd V (х, у, 2xy)zz. Мы увидим, что отсутствие доказательств лемм не снижает ценности доказательства для проведения вычислений. (Дальнейшее обсуждение использования неполных доказательств для проведения вычислений можно найти в § 3.) Формулы х ^ 1 V х > 1 и у ^ 1 V у > 1 рассматриваются как аксиомы. Это доказательство мы будем обозначать буквой U.
Lv<l] У<О*(х.у.х +1)DE—— 1Ч*(х,у,х4-1)31y<lVy>l3rP(x,y,z)VE——Lv<l] У<О*(х.у.х +1)DE—— 1Ч*(х,у,х4-1)31y<lVy>l3rP(x,y,z)VE——ЗгЧЧх.у.г)ЗгЧЧх.у.г)[x<l] x^ClDtptx.v.y + l)DE*(x.y.y-H)31x<1Vx>13z'P(x,y.z)VEЗгФ(х.у.г)[x<l] x^ClDtptx.v.y + l)DE*(x.y.y-H)31x<1Vx>13z'P(x,y.z)VEЗгФ(х.у.г)[х>1][у>1]Alх>1Ау>1(x>l)A(y>l)D'p(x,y,2xy)DE♦(х,у2ху)31Зг'Их.у.г)[х>1][у>1]Alх>1Ау>1(x>l)A(y>l)D'p(x,y,2xy)DE♦(х,у2ху)31Зг'Их.у.г)
Lv<l] У<О*(х.у.х +1)
DE—— 1
Ч*(х,у,х4-1)31
y<lVy>l3rP(x,y,z)
VE——
Lv<l] У<О*(х.у.х +1)
DE—— 1
Ч*(х,у,х4-1)31
y<lVy>l3rP(x,y,z)
VE——
ЗгЧЧх.у.г)
ЗгЧЧх.у.г)
[x<l] x^ClDtptx.v.y + l)DE
*(x.y.y-H)31
x<1Vx>13z'P(x,y.z)
VE
ЗгФ(х.у.г)
[x<l] x^ClDtptx.v.y + l)DE
*(x.y.y-H)31
x<1Vx>13z'P(x,y.z)
VE
ЗгФ(х.у.г)
[х>1][у>1]
Al
х>1Ау>1(x>l)A(y>l)D'p(x,y,2xy)
DE
♦(х,у2ху)
31
Зг'Их.у.г)
[х>1][у>1]
Al
х>1Ау>1(x>l)A(y>l)D'p(x,y,2xy)
DE
♦(х,у2ху)
31
Зг'Их.у.г)
Отметим, что мы не связали квантором всеобщности переменные х, у, чтобы получить доказательство в стандартной V3-форме, описанной во введении. В данном простом случае удобнее не записывать кванторы в явном виде. Вместо этого мы будем считать, что входные значения для доказательства, рассматриваемого как алгоритм, должны подставляться вместо свободных переменных. Точнее, для того чтобы вычислить верхнюю грань суммы и произведения двух входных величин vi и V2 с помощью нормализации, нужно сначала подставить Vj и v2 вместо х, у в доказательство U, а затем нормализовать доказательство.
Процедура нормализации — это метод пошагового преобразования доказательства, который, грубо говоря, удаляет из дока-
зательства некоторые разновидности обходных путей. Доказательство, из которого удалены все такие пути, называется доказательством в нормальной форме. Для наших целей достаточно следующего важнейшего свойства нормальных доказательств: нормальное доказательство формулы, утверждающей существование, дает значение, реализующее эту формулу (при условии» что в доказательстве не содержится свободных переменных или открытых1) посылок). Таким образом, если подставить в доказательство U вместо переменных х, у конкретные значения vi, v2, то нормальная форма полученного в итоге доказательства даст нам некоторое значение v3 переменной z, для которого выполняется Ч^Уь v2, V3).
Процедура нормализации определяется набором правил редукции, которые применяются последовательно, пока применимо хотя бы одно из них. Нормализация простого доказательства разбором случаев, такого, как U, соответствует выполнению условных термов посредством многократного применения следующих правил редукции:
Cl: (if TRUE then else 12)=^
C2: (if FALSE then else t2)=>t2
Al: R (tj, t2) => TRUEесли R —атомарное отноше
ние, tb t2 — замкнутые термы и имеет место R(t1,t2).
А2: R (t!,t2)=>FALSEесли R —атомарное отноше
ние, tb t2 — замкнутые термы и имеет место nR(t],t2).
Нам еще нужны правила редукции для упрощения таких замкнутых термов, как 0.5+1- Однако ни используемое представление чисел, ни вид правил упрощения для замкнутых термов не имеют отношения к нашим рассуждениям.
Следующие правила редукции доказательств в точности соответствуют правилам редукции условных термов:
01:
П, А
[А]
[В]
П,
VI
AVB
П2
С
Пз С
[А]
VE
с
—
П2 С .
*) То есть неустраненных.— Прим ред.
02:02:П]вVIAVBVE-П]вVIAVBVE-[А] [В]П2 ПзС с[А] [В]П2 ПзС сП, [В] Пз С .П, [В] Пз С .Р1:Р1:
02:
02:
П]в
VI
AVB
VE-
П]в
VI
AVB
VE-
[А] [В]
П2 Пз
С с
[А] [В]
П2 Пз
С с
П, [В] Пз С .
П, [В] Пз С .
Р1:
Р1:
Аксиома: R (tj ,t2) V ~] R (tj Л2) =^ VIАксиома: R (tj ,t2) V ~] R (tj Л2) =^ VIАксиома: R(t!,t2)
Аксиома: R (tj ,t2) V ~] R (tj Л2) =^ VI
Аксиома: R (tj ,t2) V ~] R (tj Л2) =^ VI
r^wvTrKT)’’
если имеет место R(ti, t2).
Аксиома ~1 R (ti ,t2) rhTuvTrTwJ ’Аксиома ~1 R (ti ,t2) rhTuvTrTwJ ’Р2:
Аксиома ~1 R (ti ,t2) rhTuvTrTwJ ’
Аксиома ~1 R (ti ,t2) rhTuvTrTwJ ’
Аксиома: R (t,, t2) V П R (t,, t2) =^ VI
если имеет место R(t1(t2).
Здесь выражение вида
П,IF]
П2
означает результат подстановки П1 вместо открытых вхождений посылки F в П2. (Отметим, что в доказательстве U формулу ti > t2 следует рассматривать как сокращение формулы И (й <t2).)
Сформулированные правила редукции можно применять в любом месте дерева доказательства: как только в доказательстве встречается применение правила У"УДаления> соответствующее левой части правила 01 или 02, его можно заменить конкретным частным случаем правой части того же правила. Это же относится к правилам Р1 и Р2. Как мы уже говорили, нормализация заключается в последовательном применении правил редукции (в произвольном порядке), пока применимо хотя бы одно из них. Для многих систем вывода показано, что такая последовательность редукций всегда конечна и что окончательный результат не зависит от порядка выполнения редукций. Результат такого типа обычно называют «сильной теоремой нормализации».
Пусть П — доказательство дизъюнкции AVB, не содержащее свободных переменных и открытых посылок. Тогда с
помощью нормализации П можно определить, какой из членов дизъюнкции верен. Ответ «закодирован» в нормальной форме доказательства П, имеющей один из следующих видов:
ПП
АВ
yi или yi
AVBAVB
Таким образом, правила редукции играют роль «встроенных процедур», разрешающих атомарные отношения.
Мы уже отмечали, что, как и в случае дизъюнкций, нормализация доказательства формулы Зхф(х) (не содержащего открытых посылок и свободных переменных) дает значение, удовлетворяющее ф. Это значение входит в нормальное доказательство в качестве аргумента последнего шага вывода — введения квантора существования. Это значит, что нормальная форма вывода Зхср(х) имеет вид
П
ф(1)
31—2—
Зхф (х)
Результатом выполнения этого доказательства будет t.
Наконец, предположим, что имеются редукции, которые упрощают замкнутые термы. Это далеко не полный набор правил редукции для всей системы естественного вывода, однако этого достаточно для выполнения доказательств, состоящих только из разбора случаев. Например, читатель может проверить, что результатом нормализации доказательства U для входных значений х = 2 и у = 0.5 является доказательство
ZD ЕZD Е0.5<10.5<10.5 < 1 dY(2, 0.5, 3)0.5 < 1 dY(2, 0.5, 3)Ф(2, 0.5, 3) 31—SzV (2, 0.5, z)Ф(2, 0.5, 3) 31—SzV (2, 0.5, z)
ZD Е
ZD Е
0.5<1
0.5<1
0.5 < 1 dY(2, 0.5, 3)
0.5 < 1 dY(2, 0.5, 3)
Ф(2, 0.5, 3) 31—
SzV (2, 0.5, z)
Ф(2, 0.5, 3) 31—
SzV (2, 0.5, z)
Результатом выполнения этого доказательства будет 3. Нормализация соответствует выполнению терма и с использованием соответствующих правил редукции для условных термов.
Теперь мы можем описать операции подрезки и способ их применения для специализации доказательства U. Операции подрезки для V-удаления имеют следующий вид. (Существует также операция подрезки для 3-удаления, но она нам здесь не
понадобится.)
П1 П2 П3
AVB С С П2
VE^ если А не входит в П2 в качестве от-
СС крытой посылки.
П1 П2 П3
AVB С С| П3
VEесли А не входит в П3 в качестве от-
СС крытой посылки.
Для того чтобы специализировать алгоритм U для фиксированного значения у = 0.5, нужно подставить 0.5 вместо у и нормализовать результат. В результате мы получим следующее специализированное доказательство:
X<lVx>l VE—X<lVx>l VE—[х<1] x<lD^(xD5, Н)*(х.О5, 15)31Bz^x.OS, z)[х<1] x<lD^(xD5, Н)*(х.О5, 15)31Bz^x.OS, z)0 5<1 0 5<lD*(xOS. х + 1)DEх + 1) 31ЗгЧЧх.ОЗ, z)0 5<1 0 5<lD*(xOS. х + 1)DEх + 1) 31ЗгЧЧх.ОЗ, z)3z'k(x,0 5, 7)3z'k(x,0 5, 7)
X<lVx>l VE—
X<lVx>l VE—
[х<1] x<lD^(xD5, Н)
*(х.О5, 15)
31
Bz^x.OS, z)
[х<1] x<lD^(xD5, Н)
*(х.О5, 15)
31
Bz^x.OS, z)
0 5<1 0 5<lD*(xOS. х + 1)
DE
х + 1) 31
ЗгЧЧх.ОЗ, z)
0 5<1 0 5<lD*(xOS. х + 1)
DE
х + 1) 31
ЗгЧЧх.ОЗ, z)
3z'k(x,0 5, 7)
3z'k(x,0 5, 7)
Это доказательство соответствует специализированному условному терму if х ^ 1 then 1.5 else х + 1». К ‘специализированному доказательству можно применить еще одну операцию оптимизации, не применимую к условному терму, а именно подрезку. Вторая малая посылка применения правилаУ"УДаления в специализированном доказательстве не зависит от посылки х> 1. Именно эта информация о структуре зависимостей в вычислении формализована в доказательстве U (но не в условном терме и) и позволяет применить подрезку. В результате применения подрезки получаем
0.5 <1 0.5<1 zdW(x, 0.5, х+1)
ZD Е.
, W(x, 0.5, х+1)31—1L
• 3z¥ (х, 0.5, z)
Это доказательство описывает тот же алгоритм, что и условный терм «х + 1».
Отметим, что если сравнение — «дешевая» операция, а сложение— «дорогая», то в среднем эффективность терма «х + 1» может оказаться меньше, чем у терма «if х ^ 1 then 1.5 else х+1». Это показывает, что подрезка не гарантирует повышения
эффективности. Но все же подрезка часто повышает эффективность алгоритма и всегда уменьшает его размер. (Уменьшение размера — важный результат экспериментов с упаковкой корзин, см. § 5.)
ВЫЧИСЛЕНИЯ С НЕПОЛНОСТЬЮ
ФОРМАЛИЗОВАННЫМИ ДОКАЗАТЕЛЬСТВАМИ
В вычислениях, которые описывает доказательство V3-теоремы, используются не все части этого доказательства. Для вычислений не нужны доказательства атомарных формул и формул, построенных из атомарных формул и формул, начинающихся с отрицания, с помощью конъюнкции, импликации и квантора всеобщности. Мы уже встретились с этим явлением в § 2: в доказательстве U несколько лемм использовалось без доказательств. Располагая некоторым доказательством, можно автоматически выбрать из него ту часть, которая нужна для проведения вычислений.
На методы, используемые в «невычислительной» части доказательства, не накладывается тех ограничений, которые существенны для вычислительной части. В частности, нет причины ограничивать использование неконструктивных рассуждений в доказательствах невычислительных лемм. Следовательно, если требуется построить доказательство, описывающее заданный алгоритм, но не содержащее формальной верификации этого алгоритма, то доказательства невычислительных лемм можно опустить.
При проведении экспериментов с упаковкой корзин неполные доказательства (то есть содержащие недоказанные леммы) допускались в той части системы программ, которая отвечает за проверку правильности доказательств, — при условии, что доказательства «вычислительно полны». Вычислительная полнота означает, что имеющаяся часть доказательства полностью описывает метод вычисления.
Р-ИСЧИСЛЕНИЕ
В традиционной теории доказательств известны два метода выполнения доказательств. Во-первых, существуют методы, преобразующие сами доказательства. К этой разновидности относятся процедура устранения сечений Генцена ([8]) и процедура нормализации Правица. Во-вторых, существуют методы, выделяющие из доказательств тот или иной код, после чего выполняется этот код, а не само доказательство. Примерами методов второго типа являются ингерпрстации реализуемости Клини
([15]) для арифметики и Крайзеля ([17]) для анализа, а также диалектическая интерпретация Гёделя ([10]).
Ни один из этих подходов не отвечает нашим целям. Методы нормализации неудовлетворительны вследствие их неэффективности. Во всех представляющих практический интерес случаях доказательство содержит много информации, не относящейся ни к выполнению, ни к подрезке. (Это остается верным, даже если опустить доказательства невычислительных лемм.) Тем не менее в процессе нормализации вся дополнительная информация будет подвергаться преобразованиям. С другой стороны, методы, выделяющие из доказательств некоторый код, оставляют только информацию, необходимую для вычислений; при этом теряются дополнительные данные, необходимые для осуществления преобразований подрезки. Это не вызывало бы затруднений, если бы мы собирались применять преобразования подрезки только к доказательствам в их первоначальном виде. Однако при использовании доказательств для специализации алгоритмов требуется, чтобы при символьном исполнении эти дополнительные данные сохранялись.
Наше решение указанной проблемы состоит в использовании расширенного Х-исчисления, которое мы будем называть ^-исчислением. В p-исчислении предусматривается сохранение в точности той информации, содержащейся в доказательстве в системе естественного вывода, которая необходима для выполнения доказательства и операций подрезки. Термы р-исчисления можно получать непосредственно из обычных доказательств в системе естественного вывода и эффективно выполнять с помощью интерпретатора, аналогичного интерпретаторам языков, основанных на Х-исчислении, таких, как Лисп или SCHEME (см. [25]).
Для того чтобы получить p-исчисление, нужно к обычному Х-исчислению с функцией спаривания добавить операторы ОЕ и ЕЕ, которые в точности соответствуют правилам V -удаления и 3-удаления в системе естественного вывода. Оператор ОЕ можно рассматривать как условный оператор, который запоминает информацию о зависимостях, необходимую для подрезки.
Для получения p-исчисления к Х-исчислению с функцией спаривания добавляются следующие индуктивные предложения: если х — переменная, a tb t2, tg— термы p-исчисления, то термами являются также
OE(x,ti,t2,t3),
EE(x,ti,t2).
Переменная х в выражениях ОЕ(х, tb t2, t3) и ЕЕ(х, t, t2) считается связанной в термах t2, t3, но не в терме Е. Эта
переменная соответствует открытым посылкам, устраняемым с помощью правил V-удаления или 3-удаления. Она введена для запоминания информации о зависимостях, необходимой для подрезки.
Процедура выделения р-термов из доказательств основана на хорошо известном соответствии между операциями, с помощью которых строятся доказательства в системе естественного вывода, и элементарными операциями применения (аппликации) и абстракции, используемыми .при построении описаний функций в Х-исчислении. В так называемых исчислениях конструкций (см., например, [5], [14], [24]) это соответствие вводится явно. При этом для построения доказательств и для описания функций используются одни и те же формальные операции.
При выделении р-термов структура доказательства полностью сохраняется. В сущности, р-терм — это скелет доказательства, сохраняющий правила вывода, но не сами формулы, к которым они применяются. Открытые посылки доказательства отображаются в свободные переменные выделяемого терма, а устранение посылок соответствует связыванию переменных. При таком отображении мы обращаемся со всеми правилами вывода, кроме V -удаления и 3-удаления, так же, как в исчислении конструкций (см. [14]). Тем не менее именно благодаря этому различию в трактовке V-удаления и 3-удаления оказывается возможным применение операций подрезки к р-термам.
Обозначим отображение выделения р-терма через S. Применение 6 к доказательству
[А] [В]
П1 П2 Пз
AVB С С
VE
С
дает терм ОЕ(а, б^), 6(П2), 6(П3)), где а — переменная, соответствующая посылкам, устраняемым с помощью правила V-удаления. Операции подрезки для ОЕ имеют следующий вид:
OE(x,t1,t2,t3)=>t2, если х не входит свободно в t2;
ОЕ (x,t1,t2,t3)=>t3, если х не входит свободно в t3.
Процедура выполнения в p-исчислении, так же как в лямбда- исчислении и в системе естественного вывода, задается множеством правил редукции, которые последовательно применяются для выполнения (или нормализации) заданного терма. Редукции, используемые в р-исчислении, — это редукции, используе-
мые в лямбда-исчислении, плюс редукции, которые нужны для выполнения операторов ОЕ и ЕЕ.
В p-исчислении, как и в лямбда-исчислении, существуют термы, которые нельзя привести к нормальной форме никакой конечной последовательностью редукций. Однако термы р-ис- числения, выделенные из доказательств, обладают сильным свойством нормализации: любая последовательность редукций, применяемая к такому терму, за конечное число шагов приводит к одной и той же нормальной форме. Если к набору редукций, используемых для нормализации, добавить операции подрезки, то по-прежнему любая последовательность редукций будет конечной. Однако такая расширенная система редукций не будет обладать сильным свойством нормализации: в зависимости от порядка применения правил редукции можно будет получить разные нормальные формы. Следует отметить, что это не недостаток, а преимущество операций подрезки. Если не требовать, чтобы любой порядок редукций приводил к одному и тому же результату, можно получить более короткие последовательности редукций. Это следствие того, что подрезка повышает эффективность вычислений путем изменения вычисляемой функции.
Корректность метода выделения терма б подтверждается следующей теоремой.
Теорема. Пусть П — доказательство замкнутой формулы VxBy<p(x,y), не содержащее открытых посылок. Тогда Хх. (Л (б(П) (х))) вычисляет функцию f, обладающую свойством Vx<p(x,f (х)).
Здесь Л обозначает оператор, выделяющий из пары первый элемент, а «вычисление» означает нормализацию (с подрезкой или без нее) в p-исчислении. Эта теорема применима к тому же классу теорий, к которому применяются обычные интерпретации реализуемости в теории доказательств. Среди таких теорий — теории первого порядка индуктивно заданных областей (каноническим примером являются арифметика первого порядка и некоторые теории объектов высших типов, такие, как арифметика всех конечных типов [28] и теория видов [26]). При этом следует учитывать требование вычислительной полноты (см. § 3).
Технология, которая используется для эффективной интерпретации языков, основанных на Х-исчислении, легко переносится на p-исчисление. Реализованный интерпретатор (нормализатор) для p-исчисления, который использовался в экспериментах с алгоритмом упаковки корзин, моделируется в интерпретаторе языка SCHEME, описанном в [25].
СПЕЦИАЛИЗАЦИЯ АЛГОРИТМА УПАКОВКИ КОРЗИН
В этом параграфе описываются эксперименты, которые должны были дать предварительную информацию о том, насколько часто в практических вычислениях встречаются лишние части, поддающиеся подрезке. Эксперименты проводились со специализацией алгоритма одномерной упаковки корзин с возвратами, основанного на принципе «первая подходящая». Этот алгоритм при заданном списке Li размеров блоков и списке L2 размеров корзин осуществляет поиск возможного размещения блоков по корзинам. Принцип назван «первая подходящая» потому, что в процессе поиска алгоритм сначала пытается поместить очередной блок в первую же подходящую корзину. Известно, что задача упаковки корзин NP-полна и гарантированная оценка времени выполнения этого алгоритма экспоненциально зависит от объема входных данных. Однако при небольшом объеме входных данных задача вполне поддается решению. Интересно узнать, насколько можно ускорить работу алгоритма в этой ситуации.
Алгоритм упаковки корзин был формализован в виде доказательства в системе естественного вывода в теории списков и чисел первого порядка. Терм p-исчисления мы выделяли из этого доказательства. Было проведено несколько экспериментов, каждый из которых включал специализацию алгоритма для решения задач конкретных размеров и структур. Например, специализированный алгоритм упаковки шести блоков, упорядоченных по убыванию размеров, в три корзины одного размера был получен из универсального алгоритма упаковки корзин в результате следующих шагов. (1) Терм p-исчисления, описывающий универсальный алгоритм, выполнялся для символьных входных данных Li =«ii, i2,1з, 14,is, ie>>, L2 =<<n, n, п» где ij, n — числовые переменные и ii ^ i2 ^ . .. ^ ie. Полученный в результате терм p-исчисления имел вид дерева решений. (2) Дерево решений подвергалось оптимизации: устранялся разбор случаев, выполнение условий которых гарантировалось выше на этой ветке дерева. Эта оптимизация проводилась с помощью симплекс-метода (поскольку все предикаты при разборе случаев в алгоритме упаковки корзин имеют вид неравенств между суммами). Эти два шага процесса можно было бы легко выполнить как с обычной программой, так и с доказательством или термом p-исчисления. Однако затем (3) применялась подрезка. Главным образом нас интересовал следующий вопрос: какое, увеличение скорости и уменьшение размера алгоритма получается в результате подрезки?
На практике было бы невозможно осуществить шаги (1) и (2) раздельно, так как дерево решений, полученное на шаге (1),
оказалось бы слишком большим. Вместо этого нормализация и оптимизация проводились параллельно: дерево решений оптимизировалось в ходе построения.
Эксперименты такого типа были проведены для всевозможных комбинаций числа щ блоков и числа п2 корзин, таких, что 2 ^ п2 ^ щ ^ 6. Здесь мы лишь приведем результаты одного небольшого эксперимента (щ = 3, п2 = 2) и одного типичного большого эксперимента (ni = 6, п2 — 3).
Для ni = 3, п2 = 2 после шагов (1) и (2) получалось следующее дерево решений (записанное в виде условного терма, а не терма р-исчисления):
if ii < n then
if ii + 12^ n then
if ii + 12 + ig^n then((l, 1, l))else((l J ,2)) else
if ^ + i3^n then ((1,2,1))
if 12 + 1зСп then((1,2,2))else(( )) else« »
Список <<a, b, c>> означает размещение блоков ib i2, 1з в корзины с номерами а, b, с соответственно. В данном случае есть две корзины с номерами 1 и 2. Список << >> означает невозможность размещения.
В результате подрезки получаем
if ii ^ n then
if i2 + i3 ^n then((l ,2,2))else (( )) else O
Этот улучшенный (и, более того, оптимальный) алгоритм проверяет только один вариант размещения, а именно <<1,2, 2>>. Если возможна хотя бы одна упаковка, то возможна и эта. Мы «автоматически» установили это в результате анализа зависимостей на стадии подрезки.
Для щ = 6, п2 = 3 дерево решений оказывается слишком большим для того, чтобы можно было его здесь привести. Дерево решений, полученное после шагов (1) и (2), имеет 87 узлов и глубину 14. В результате подрезки это дерево сокращается до 15 узлов и глубины 8. Если измерять время выполнения алгоритма упаковки корзин числом проводимых сравнений, то наихудшее время исполнения исходного алгоритма на специально подобранных входах равняется 174. Наихудшее время выполнения алгоритма, заданного деревом решений, при таком способе измерения просто равняется глубине дерева. Таким образом.
симплекс-оптимизация и подрезка в совокупности дают улучшение примерно в 22 раза (от 174 к 8), если сравнивается время выполнения в наихудших случаях.
Проведенные эксперименты позволяют сделать следующие выйоды.
Симплекс-оптимизация (с подрезкой или без нее) приводит к значительному повышению быстродействия алгоритма.
Подрезка существенно уменьшает размеры специализированного алгоритма, заданного деревом решений, и дает небольшое повышение быстродействия.
Таким образом, в данном случае основной эффект подрезки заключался в получении быстрого специализированного алгоритма разумных размеров. При проектировании комбинаторных алгоритмов для работы с конечным числом случаев быстродействие не является единственной проблемой, так как зачастую можно использовать просмотр таблицы для получения очень быстрого, но очень громоздкого алгоритма. Трудно получить алгоритм, который был бы и компактным, и быстрым.
АНАЛОГИЧНЫЕ РАБОТЫ В ОБЛАСТИ
ПРОГРАММИРОВАНИЯ
Связь этой работы с работами по теории доказательств обсуждалась в предыдущих параграфах. Здесь мы кратко опишем результаты по выделению информации из доказательств, полученные в области программирования.
Грин ([12]) рассматривал проблему выделения информации из доказательств, проведенных методом резолюций. Бишоп ([31]) и Констэбл ([4]) предложили использовать конструктивные системы доказательств как языки программирования. Гото ([11]) реализовал диалектическую интерпретацию Гёделя для интуиционистской арифметики первого порядка. В статье Такасу [27] обсуждалось использование процедуры Генцена удаления сечения ([8]) в этой же формальной системе. В статье [22] описан метод выполнения секвенциальных доказательств, отличающийся от удаления сечения, а в работе [21]—метод автоматического синтеза программ, использующий одновременное построение целевой формулы в системе естественного вывода и программы, реализующей (в некотором смысле) эту формулу. Бэйтс ([1]) построил конструктивную «логику усовершенствования» (refinement logic) и показал, как можно получать программы из доказательств, проведенных в рамках этой логики. Программа на Прологе ([16]) представляет собой набор аксиом, имеющих вид хорновых дизъюнктов. Выполнение такой программы — это поиск доказательства в ограниченном исчислении резолюций. На выходе получается терм, выделенный из этого доказательства.
На практике выходной терм строится в процессе поиска доказательства.
Следует подчеркнуть, что цели всех перечисленных работ существенно отличаются от цели данной работы. В первых формальные доказательства рассматриваются лишь как сосуды, из которых нужно извлечь некоторое вычислительное содержание стандартного вида. Мы же ставили перед собой задачу исследования различий между доказательствами и традиционными описаниями вычислений. В частности, мы показали, как можно автоматизировать новые операции над алгоритмами с помощью дополнительной информации, которую можно найти в доказательствах.
БЛАГОДАРНОСТИ
Эта работа получила финансовую поддержку Агентства перспективных исследований министерства обороны по контракту MD903-80-C-0102. Своим интересом к применению доказательств в вычислениях автор обязан профессору Г. Крайзелю, чьи идеи изложены, например, в программных работах [18] и [19]. Автор благодарит профессора Крайзеля за поддержку и помощь в процессе проведения этой работы.
ЛИТЕРАТУРА
Bates J. L. A logic for correct program development. PhD Thesis, Dept, of Computer Science, Cornell University, August 1979.
Beckeman L., Haraldsson A., Oskarsson O., Sandewall E. A partial evaluator and its use as a programming tool. Artificial! Intelligence Journal, 7, 1976, p. 319—357.
Bishop E. Mathematics as a numerical language. Intuitionism and proof theory. Proceedings of the summer conference at Buffalo, N. Y., 1968, A. Kino, J. Myhill, R. E. Vesley eds. North-Holland, Amsterdam, 1970, p. 53—71.
Constable R. L. Constructive mathematics and automatic program writers. IFIP Congress, 1971.
de Brujin N. G. The mathematical language AUTOMATH, its usage and some of its extensions. Lecture Notes in Mathematics, 125, Springer-Ver- lag, 1970, p. 29—61.
Doyle J. Truth maintenance systems for problem solving. M. I. T. AI lab technical report AI-TR-419, January 1978.
Ershov A. P. On the essense of compilation. IFIP Working Conference on Formal Descriptions of Programming Concepts, Saint Andrews, New Brunswick, 1, 1977, p. 1.1 —1.28
Gentzen G. The collected papers of Gerhard Gentzen (M. E. Scabo ed.). North-Holland, Amsterdam, 1969. [Переводы большинства работ имеются в кн.: Математическая теория логического вывода. — М.: Наука, 1967.]
Goad С. A. Computational uses of the manipulation of formal proofs. PhD Thesis, Stanford University, готовится к печати.
Godel К. Uber eine bisher noch nicht benutzte Erweiterung des finiten Standpunktes. Dialectica, 12, 1958, p. 280—287. [Имеется перевод: Гёдель К. Об одном еще неиспользованном расширении финитной точки зрения. — В кн.: Математическая теория логического вывода. — М.: Наука, 1967.]
Goto S. Program synthesis from natural deduction proofs. International Joint Conference on Artificial Intelligence, Tokyo, 1979.
Green С. C Application of theorem proving to problem solving. Proceedings of the International Joint Conference on Artificial Intelligence, Washington D. C., 1969, p. 219—239.
Hewitt C Procedural embedding of knowledge in Planner. Proceedings of the International Joint Conference on Artificial Intelligence, London, 1971.
Howard W. A. The formulae-as-types notion of construction, in Festschrift on the occasion of H. B. Curry’s 80th birthday. Academic Press, New York, San Francisco, London, готовится к печати.
Kleene S. C. On the interpretation of intuitionistic number theory. Journal of Symbolic Logic, 10, 1945, p. 109—124.
Kowalski R. Predicate logic as a programming language. Proc, of the IFIP Congress 1974, p. 569—574.
Kreisel G. Interpretation of analysis by means of Constructive functionals of finite type, in Constructivity in Mathematics. North-Holland, Amsterdam, 1959, p. 101 — 128.
Kreisel G. Some uses of proof theory for finding computer programs. Colloque International de Logique, Clermont-Ferrand (July 1975), Col- loques Internationaux du Centre National de la Researche Scientifique, 249, 1975, p. 123—134. [Имеется перевод: Крайзель Г. Некоторые приложения теории доказательств к поиску программ для ЭВМ.-—В кн.: Крайзель Г. Исследования по теории доказательств. — М.: Мир, 1981J [19] Kreisel G. From foundations to science: justifying and unwinding proofs.
Recueil des Travaux de LTnstitut Mathematique, Belgrade, Nouvelle Serie, 1.2, 1977, p. 63—72.
London P. E. Dependency networks as a representation for modeling in general problem solvers. PhD Thesis., Univ. Maryland, Department of Computer Science, Technical Report 698, 1978.
Manna Z., Waldinger R. A deductive approach to program synthesis. Fourth Workshop on Automated Deduction, Austin, Texas, 1979, p. 129— 139.
Miglioli P., Ornaghi M. A logically justified computing model. Fundamenta Informaticae, готовится к печати.
Prawitz D. Natural Deduction. Almqvist and Wicksell, Stockholm, 1965.
Scott D. Constructive Validity. Lecture Notes in Mathematics, 125, Sprin- ger-Verlag, 1970, p. 237—275.
Sussman G. J., Steele G. L. SCHEME, an interpreter for extended lambda calculus. MIT AI Memo 349, 1975.
Tait W. W. A realizability interpretation of the theory of species. Logic Colloguium Proceedings, 1972—1973, A. Dold, B. Eckmann eds., Lecture Notes in Mathematics, 453, Springer-Verlag, 1975, p. 240—251.
Takasu S. Proofs and programs. Proceedings of the Third IBM Symposium on the Mathematical Foundations of Computer Science—Mathematical Logic and Computer Science, Kansai, 1978.
Troelstra A. S. Intuitionistic Formal Systems, in Metamathematical Investigations of Intuitionistic Arithmetic and Analysis, A. S. Troelstra ed. Lecture Notes in Mathematics, 344, Springer-Verlag, 1973, p. 1—96.
МАТЕМАТИЧЕСКАЯ ЛОГИКА
В ПРОГРАММИРОВАНИИ
ОБЗОР
в. М. АНТИМИРОВ, А. А. ВОРОНКОВ,
А- И. ДЕГТЯРЕВ, М. В. ЗАХАРЬЯЩЕВ, В. С. ПРОЦЕНКО
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
Традиционное программирование. Верификация программ и логика Хоара
. Функциональное программирование
Лямбда-исчисление и язык Лисп
Нормальные алгорифмы Маркова и язык Рефал
Комбинаторная логика и язык Миранда
. Логическое программирование. SLD-резолюция и язык Пролог
Формальные методы спецификации программ
VDM (венский метод построения программ)
Логико-алгебраические спецификации
2 1. Теоретические основы: инициальные модели хорновых формул
.2.2. Примеры спецификаций
4 3 Анализ формальных спецификаций
Программисты-теоретики сталкиваются с теми же вопросами, над которыми логики ломают голову уже около 80 лет . Поэтому, — если, конечно, логики не совсем сбились с пути, — их исследования могут служить по крайней мере полезным источником идей.
Дж. Р. Хиндли
ВВЕДЕНИЕ
Вряд ли кто мог предположить в начале нашего века, когда зарождалась математическая логика, и даже в 30—40-е годы, в пору ее расцвета, что эта чисто теоретическая дисциплина, относящаяся скорее к области «философии математики», найдет практическое применение. И тем не менее это произошло уже в
50-е годы, в первое десятилетие компьютерной эры, а в 70-е годы появился даже термин «вычислительная логика».
Столь же маловероятно, чтобы кто-нибудь из программистов-практиков 50-х годов мог подумать, что «искусство программирования» имеет что-либо общее с наукой логикой. И тем не менее один из ведущих специалистов в области информатики Д. Грис в 1981 г. заявляет (см. [Грис 84]): «Из-за нашего невежества мы потратили очень много времени на то, чтобы бить по воде вместо того, чтобы плавать. Задним числом я могу сказать, что мне лучше всего было бы пройти хороший курс логики 10 лет назад». Сегодня курс математической логики и теории алгоритмов стал обязательным для студентов-программистов многих университетов, а в число специальных курсов часто входит логическое программирование.
Своим бурным развитием в начале нашего века математическая логика обязана кризису в основаниях математики, который вызвали открытые Б. Расселом и др. парадоксы наивной теории множеств. Д. Гильберт видел выход из кризиса в идее представления математических теорий в виде формальных логико-математических исчислений, а математических рассуждений, т. е. доказательств, — в виде выводов в этих исчислениях. Теорию можно было бы считать обоснованной, если бы удалось «финитными» методами доказать ее непротиворечивость, т. е. то, что в ней нельзя построить выводы некоторого утверждения и его отрицания. Знаменитая теорема Гёделя показала, однако, невыполнимость этой программы, поскольку для доказательства непротиворечивости формальной арифметики мы должны выйти за пределы финитного, точнее, выйти за пределы тех средств, которыми располагает формальная арифметика.
Но джинн уже был выпущен из бутылки — математическая логика как наука уже состоялась и продолжала развиваться. Еще до появления первых вычислительных машин в ее рамках были рассмотрены математически точные понятия вычислимой функции и алгоритма, которые впоследствии стали использоваться в теории программирования и нашли свое воплощение в практических языках функционального программирования, таких, как Лисп, Рефал и др. Глубокому анализу были подвергнуты выводы в логических исчислениях, что позволило с появлением компьютеров выдвинуть идею автоматического доказательства теорем, вылившуюся затем в концепцию логического программирования и язык программирования Пролог.
В 60-е годы ситуация, заставившая математиков обратиться к логике, в какой-то степени повторилась в программировании: мы имеем в виду то, что часто называют кризисом программного обеспечения. «Языки программирования оказались в труд-
ном положении», — утверждал Дж. Бэкус в своей знаменитой Тьюринговской лекции [Backus 78]. Сфера применения компьютеров к этому времени значительно расширилась, и соответственно выросла сложность и масштабность решаемых на них задач. Кроме того, наблюдался быстрый прогресс в развитии аппаратных средств вычислительной техники, что привело к резкому возрастанию их производительности и значительному удешевлению. Все это стало приходить в противоречие с имевшимися средствами программирования, не позволявшими быстро создавать дешевый и, что самое важное, надежный программный продукт. Вот как Д. Тёрнер [Turner 82] изображает доли стоимости программного обеспечения и аппаратных средств в общей стоимости вычислений:
Кризис программного обеспечения заставил программистов- теоретиков заняться анализом основ своей науки. Выход из создавшегося положения виделся одним в разработке соответствующей методологии программирования на традиционных языках (в качестве примера можно привести структурное программирование Дейкстры [Dijkstra 76]). Другие выдвигали идеи (тоже не выходящие за рамки традиционных языков), которые в конечном счете сводились к формализации основных программистских понятий и разработке формальных способов рассуждений о программах с целью доказательства их свойств (например, правильности, остановочности и т. п.). Третьи находили истоки кризиса в императивной сущности и машинной ориентированности традиционных языков (проявляющихся прежде всего в наличии деструктивного оператора присваивания) и предлагали перейти к декларативным языкам программирования и, быть может, к новой машинной архитектуре.
Поиски новых подходов к методологии программирования продолжаются до сих пор. На этом пути возникли новые пара-
дигмы программирования, такие, как функциональное, логическое и объектно-ориентированное программирование. И хотя программирование, несомненно, является новой и своеобразной областью деятельности, выяснилось, что основания программирования имеют много общего с основаниями математики. В этой статье мы обсудим некоторые идеи, возникшие в математической логике и нашедшие свое отражение в программировании.
Нашу статью нельзя рассматривать как исчерпывающий обзор использования математической логики в программировании, поскольку написать полный обзор по столь обширной тематике, на наш взгляд, просто не представляется возможным: для этого потребовалось бы, вероятно, несколько томов. Поэтому мы не будем вдаваться в подробности и детально описывать современное состояние дел и перспективы развития обсуждаемых областей применения логики в программировании. Цель статьи, да, впрочем, и всего сборника, — привлечь внимание программистов к тому богатому запасу идей и методов, которым располагает математическая логика. (В свою очередь программирование также оказывает значительное стимулирующее влияние на логику, ставя перед ней все новые и новые проблемы, — свидетельством тому является, например, создание целой серии логик (программных, временных, немонотонных и т. п.), служащих для формального описания поведения программ, для работы с базами знаний и т. д.; однако эта сторона взаимодействия двух наук выходит за рамки данной статьи.)
Мы старались излагать материал так, чтобы он был понятен и логикам, и программистам. Критерием его отбора был следующий принцип: рассматривать только те направления, которые уже принесли пользу в практическом программировании. Благодаря этому нам удалось избежать соблазна затронуть приложения конструктивной логики или, скажем, теории моделей. В то же время мы сочли нужным включить в список литературы достаточное число работ, с тем чтобы заинтересованный читатель смог найти все, что ему нужно.
L ТРАДИЦИОННОЕ ПРОГРАММИРОВАНИЕ.
ВЕРИФИКАЦИЯ ПРОГРАММ И ЛОГИКА ХОАРА
Написать большую программу нелегко. Еще труднее написать ее правильно. Как убедиться в том, что программа работает именно так, как нам хоцется? Как правило, в нашем распоряжении имеется лишь одно средство: отладка тестированием.
т. е. исполнение программы на некоторых контрольных входных данных. Однако, как заметил Д. Грис [Грис 84], «само слово «отладка» подразумевает наличие ошибок, избавиться от которых полностью очень трудно: сколько бы мух мы ни перебили, они снова появятся».
Чтобы быть абсолютно уверенным в том, что программа работает правильно, лучше всего было бы иметь доказательство ее правильности. Здесь существует две возможности: доказывать правильность готовых программ (этот подход называется верификацией программ) и строить программы a priori правильными, параллельно с доказательством их правильности (такой подход называют синтезом программ). Синтез программ тесно связан с формальными спецификациями, которые мы обсудим в разделе 4.
В этом разделе речь пойдет о верификации традиционных, процедурных программ (хотя термин «верификация», естественно, применяется и для любых других видов программ). Мы не будем давать полный обзор верификации программ, а рассмотрим лишь логику Хоара, лежащую в основе верификации.
Идея построения доказательства правильности программы вместо ее отладки путем тестирования на отдельных входах принадлежит Дж. Маккарти [McCarthy 61]. Соответствующая формальная система доказательства была построена в статье Т. Хоара [Hoare 69], в которой использовались идеи более ранних работ П. Наура [Naur 69] и Р. Флойда [Floyd 67]. Язык этой формальной системы, названной впоследствии логикой Хоара, является расширением языка логики предикатов утверждениями вида P{a}Q, где Р и Q — формулы логики предикатов, а а— программа на некотором языке программирования. Это утверждение означает, что если до выполнения Программы а была верна формула Р, то после завершения а (если она завершается) будет верна формула Q (частичная правильность программы & относительно предусловия Р и постусловия Q).
Правила вывода логики Хоара содержат все аксиомы и правила вывода классического исчисления предикатов первого порядка, а также правила вывода формул вида P{a}Q, зависящие от того языка, на котором пишутся программы а. Приведем пример логики Хоара для простого языка программирования, состоящего из присваиваний х:=е, операции а; р последовательного выполнения программ аир, условного оператора if р then a else р и оператора цикла while р do а. Помимо аксиом и правил вывода классического исчисления предикатов она содержит следующие аксиомы и правила вывода:
(:=) Рх{х:=е)Р,
где Рх означает формулу, полученную из Р заменой всех свободных вхождений х на выражение е;
Р {a} Q Q {р} R
’ Р {«; р} R
„£х Р & Q {а} R P&nQ{P}R
(if) ;
Р {if Q then a else p} R
P {while Q do a} P & —] Q
RdP P {a} Q Q zd S
(zd) •
R {a} S
Как мы видим, эта логика отражает семантику языка программирования в терминах пред- и постусловий. Приведем теперь пример доказательства частичной правильности программы вычисления факториала
fact := 1; i := 0;
while i =# n do
(i :=i + 1;
fact := fact * i)
относительно тождественно истинного предусловия true и постусловия fact = n!:
true {fact := 1} fact=l [правило (:=)]
fact = O! = l {i ;= 0} fact = i! [правило (:=)]
fact = i! {i := i -|- 1} fact = (i — 1)! [правило (:=)]
fact = (i — 1)!zzDfact * i = i! [свойство факториала]
fact*i —i! {fact := fact * i} fact —i! [правило (:=)]
fact = (i—1)! {fact := fact * i} fact = i!
[правило (zd) из 4,5]
fact = i! {i :=i+ 1; fact := fact * i} fact = i!
[правило (;) из 3,6]
fact = i! & i ^= n zd fact = i! [тавтология]
fact = i! & i #= n {i := i + 1; fact := fact * i} fact = i!
[правило (zd) из 7,8]
fact = i!
{while i #= n do (i:=i+l; fact := fact * i)}
fact = i!&i = n [правило (while) из 9].|
fact=l
{i := 0; while i #= n do (i :=i + 1; fact := fact * i)} fact = n! [правило (;) из 2,10].
true
{fact := 1; i:=0; while i #= n do (i:=i + 1; fact := fact*!)} fact = n! [правило (;) из 1,11].
Интересно, что практическое использование логики Хоара вскрывает некоторые недостатки традиционных языков программирования. Одним из преимуществ системы обозначений, принятой в математике, является ее референциальная прозрачность [Russel, Whitehead 10, 25; Quine 60]: одно выражение употребляется (в пределах одного текста) для обозначения одного и того же значения. Напротив, в традиционных языках программирования значение выражения внутри одной и той же программы может меняться из-за наличия оператора присваивания. Поэтому при проведении доказательств в логике Хоара все время чувствуешь себя немного неуютно: часто бывает непонятно, как ведет себя то или иное выражение в разных частях доказательства. Это подтверждает тезис, согласно которому достоинства и недостатки языков программирования отражаются и проявляются в свойствах соответствующих им логик.
Приведенный пример, конечно же, не исчерпывает всех особенностей верификации процедурных программ. Так, например, мы не касались доказательства свойства остановочности программ и проблем автоматической верификации. Идеи логики Хоара были положены в основу метода пошагового построения программ, который позволяет сразу строить правильные (относительно пред- и постусловий) программы, а не доказывать корректность уже готовых программ. Этот метод в деталях изложен в книге Д. Гриса [Грис 84]. С верификацией программ можно подробно ознакомиться в книгах [Непомнящий, Рякин 89] и [Андерсон 82].
ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ
Традиционные, процедурные языки программирования предназначены для описания процессов вычислений на машинах с фон-неймановской архитектурой. Именно в этом многие видят причины того, что программы, написанные на процедурных языках, трудно понимать и трудно доказывать их правильность. Первой альтернативой традиционному подходу явился функциональный подход к программированию, который начал разрабатываться с конца 50-х годов в связи с задачами обработки символьной информации. Функциональным это программирование
называется потому, что программы в нем представляют собой описания функций.
Первый язык функционального программирования — Лисп — быстро и прочно завоевал популярность среди специалистов по искусственному интеллекту. В основе Лиспа лежит формализм лямбда-исчисления, заимствованный из математической логики. Однако введенные в него процедурные описания, аналог оператора присваивания, а в некоторых диалектах и аналог оператора перехода go to не позволяют рассматривать Лисп в качестве образца чисто функционального языка.
Функциональное программирование как раздел теоретического программирования сформировался через добрых два десятка лет после появления Лиспа, когда стали активно развиваться другие языки и формализмы, основанные на математическом понятии функции. Наиболее известными функциональными языками являются Рефал [Турчин 68, 71а—д], ML [Milner 84], а также серия языков, разработанных Д. Тёрнером и его коллегами: KRC, Sasl и Миранда [Turner 82, 83, 85, 86]. Большую роль в развитии функционального программирования сыграла Тьюринговская лекция Дж. Бэкуса [Backus 78].
Во всех языках функционального программирования способы описания функций базируются на тех или иных формализмах, созданных в свое время в математической логике: лямбда-исчислении, комбинаторного логике, нормальных алгорифмах Маркова, рекурсивных уравнениях Эрбрана — Гёделя. В более современных языках, таких, как Миранда, используются и некоторые другие достижения математики, например теоретико-множественная нотация. Не случайно поэтому процесс написания программ на этих языках в чем-то сродни математическому мышлению.
В чистых языках функционального программирования обычно имеется одна главная операция — применение функции к аргументу, или аппликация, из-за чего их часто называют ап- пликативными. Прозрачная математическая семантика этой операции позволила Д. Тёрнеру говорить о «семантической элегантности» аппликативных языков.
Следует, однако, ясно осознавать, что, как бы ни была велика роль математической логики в функциональных или логических языках программирования, ни те, ни другие полностью к логике не сводятся. Представим себе, например, что два человека — программист и логик — начинают с одной и той же идеи, скажем, описания функций при помощи Х-термов. Программист, скорее всего, изберет стратегию, которую можно было бы назвать стратегией расширения ядра: исходя из программистского аналога обычных Х-термов, он гтянет добавлять к нему те сред-
ства, без которых ему было бы трудно или неудобно писать программы. Логик поставит себе совсем иную задачу: его будет интересовать минимальный набор средств, обладающий нужными свойствами. Логику достаточно будет доказать, что Х-термами можно представить все вычислимые арифметические функции, в то время как программисту эти функции нужно явно определять.
Далее в этом разделе мы кратко обсудим логические формализмы, предназначенные для описания функций, и основанные на них языки программирования.
Лямбда-исчисление и язык Лисп
Лямбда-исчисление было разработано в начале 30-х годов А. Чёрчем с целью формализации математического понятия функции, причем функции, трактуемой как правило, закон или вычислительное предписание. Лямбда-исчисление дает язык для такого представления функций и выражения некоторых их свойств.
Понятие функции, особенно в такой интерпретации, является фундаментальным не только в математике, но и в программировании. Именно поэтому формализмы, введенные полвека назад в математической логике для обращения с функциями, нашли свое место в современных языках программирования.
Математики обычно обозначают функцию f, зависящую от аргумента х, через f(x). Однако эту запись, как заметил Чёрч, можно понимать двояко: она может означать и то, что f есть функция от х, и значение этой функции в точке х. Чтобы избежать двусмысленности, Чёрч ввел запись Xx.f(x) для обозначения того, что f— это функция от х, и явно использовал операцию аппликации, т. е. применения функции к аргументу. Такого неформального объяснения, мы надеемся, будет достаточно для понимания приведенной ниже аксиоматики лямбда-исчисления.
Начнем с языка. Будем считать, что у нас имеется алфавит, состоящий из символов переменных хь х2, . . . , символов констант сь с2, ..., а также символов * (аппликация), X (абстракция) и = (равенство). Дадим индуктивное определение Х-тер- мов:
любая переменная или константа есть Х-терм;
если х — переменная, а М— Х-терм. то Хх.М— Х-терм;
(3)'если М и N — Х-термы, то M*N — Х-терм.
Символ аппликации в Х-термах, как и символ умножения в арифметике, поинято для краткости опускать и писать вместо М -::- N Просто ММ.
Формулой лямбда-исчисления называется любое выражение вида М = N, где М и N — Х-термы.
Аксиомы и правила вывода лямбда-исчисления представляют собой законы, которым должны подчиняться произвольные функции.
Аксиомы лямбда-исчисления*.
М = М;
(Хх.М) N = М (N/x) (p-конверсия);
Лх.М = Лу.М {у/х} (а-конверсия);
Здесь запись вида M{N/x} означает выражение, получаемое заменой в терме М всех свободных (т. е. не находящихся в области действия Хх) вхождений переменной х на терм N. При этом две последние аксиомы удовлетворяют следующему ограничению: ни переменная у, ни свободные вхождения переменных из терма N не оказываются связанными в М после подстановки.
Правила вывода:
M = N M = NN=P
N = M ’M = P
M = NМ = NМ = N
MP = NP ’PM —PN ’ Ax.M = Ax.N *
Очень кратко поясним интуитивную идею, лежащую в основе лямбда-исчисления, и его семантику. Мы уже говорили, что лямбда-исчйсление предназначено для формализации понятия функции, но трактуемой не в теоретико-множественном смысле (т. е. как график или множество пар вида (аргумент, значение)), а как правило, вычислительное предписание или программа. Основной операцией является аппликация, т. е. применение функции к аргументу, причем аргументами вычислительного предписания также являются вычислительные предписания. Таким образом, рассматриваемое исчисление является бестипо- вым: переменные служат для обозначения произвольных функций, константы обозначают некоторые фиксированные функции, а применение (аппликация) функции х к функции у дает в результате новую функцию, представляемую термом ху. Лямбда- терм Хх.М означает, что М рассматривается как функция аргумента х.
Идея Х-термов как вычислительных предписаний содержится в правиле ^-конверсии. Это правило позволяет заменять редекс, т. е. терм вида (%x.M)N, на M{N/x}. Вычисление Х-терма представляет собой последовательность применений p-конверсии. Эта
идея используется и в языке Лисп с той лишь разницей, что функции в Лиспе могут иметь имена и поэтому вместо (Xx.M)N употребляется запись вида (fN), где f — имя функции Хх.М.
Несмотря на свою кажущуюся простоту, лямбда-исчисление является очень выразительным: с помощью Х-термов можно представить любые вычислимые функции. Некоторые детали этого представления приводятся в статье Хиндли, включенной в данный сборник. Однако читатель может попробовать самостоятельно описать с помощью Х-термов, скажем, умножение, чтобы убедиться в том, что чистое лямбда-исчисление мало пригодно в качестве практического языка программирования. Одно из главных неудобств заключается в отсутствии рекурсивных определений. Логики знают, как смоделировать рекурсию с помощью Х-терма, вычисляющего неподвижную точку, но для программиста такой способ, очевидно, неудобен. Поэтому Лисп— язык программирования, основанный на лямбда-исчислении,—- включает в себя многое из того, что нс входит в лямбда-исчисление непосредственно. По сути, Лисп заимствовал из лямбда- исчисления три основных идеи. Во-первых, для определения функций используются Х-термы. Во-вторых, основным правилом вычисления является [3-конверсия. Наконец, в-третьих, определения функций (аналоги Х-термов) являются полноправными данными.
Язык Лисп, предназначенный для обработки списков, был реализован в конце 50-х — начале 60-х годов Дж. Маккарти и его студентами в Массачусетском технологическом институте [McCarthy 62]. Выражения в Лиспе представляются с помощью списков. У каждого выражения имеется значение. Значением выражения (А В ... С) является результат применения функции с именем А к аргументам В, ..., С. Для любого выражения S существует другое выражение, значением которого будет само S, а именно (QUOTE S) (ради краткости во многих диалектах Лиспа вместо этого обозначения используется запись 'S). Пустой список обозначается через NIL. Элементами списков могут быть атомы, числа или списки. Атомы обозначаются последовательностями символов, первым из которых нс может быть цифра. Подобно тому как в лямбда-исчислении Х-термы используются и для обозначения функций, и для обозначения данных, на которых действуют эти функции, в Лиспе списки используются и как данные, и как описания функций.
Синтаксис Лиспа замечательно прост: в нем нет ничего, кроме атомов, чисел и списков. Функции в нем определяются с помощью выражений вида
(DEFUN NAME (LAMBDA (ARG1...ARGN)...BODY...))
Здесь NAME — имя определяемой функции, ARG1,..., ARGN~ список (имен) ее аргументов, а ... BODY ... — выражение, задающее правила вычисления функции. Например, тождественную функцию (которая в лямбда-исчислении обозначается Х-тер- мом Хх.х) в Лиспе можно определить следующим образом:
(DEFUN IDENTITY (LAMBDA (X) X)).
Функции, задаваемые Х-термами Хх. (Ху.х) и Хх.Ху. (у х), в Лиспе можно определить как функции от двух аргументов
(DEFUN К (LAMBDA (X Y) X)),
(DEFUN REVAPPLY (LAMBDA (X Y) (Y X)))
В Лиспе имеется много встроенных функций, предназначенных' для работы со списками, наиболее важные из которых CONS, CAR, CDR, NULL, EQUAL, ATOM описываются следующим образом:
(CONS X Y) —это список, в котором первым элементом (головой) является X, a Y — оставшаяся часть (хвост) списка;
(CAR X) — это первый элемент (голова) списка X;
(CDR X) —это список, полученный из списка X выбрасыванием первого элемента, т. с. хвост списка X;
(NULL X)—это атом Т, если X — пустой список, и NIL в остальных случаях;
(EQUAL X Y) —это атом Т, если значения выражений X и Y равны, и NIL в остальных случаях;
(ATOM X) —это атом Т, если X — атом, и NIL в остальных случаях.
Более сложные определения функций записываются с помощью конструкции
(COND (УСЛОВИЕ! РЕЗУЛЬТАТ!)
* (УСЛОВНЕЙ РЕЗУЛЬТАТ^)
Семантика этого выражения такова: если значение УСЛОВИЕ! нс равно NIL, то значением всего выражения будет значение выражения РЕЗУЛЬТАТ!; иначе, если значение УСЛОВИЕ2 не равно NIL, то значением всего выражения считается РЕЗУЛЬ- ТАТ2, и т. д.
Уже имеющийся набор конструкций даст очень мощный язык описания функций.
Пример. Функция, заменяющая в списке все вхождения атома А на атом В:
(PEFUN АВ (LAMBDA (LIST)
(COND ((NULL LIST) NIL)
((EQUAL (CAR LIST) 'A) (CONS 'B (AB (CDR LIST)))) ('T (CONS (CAR LIST)
(AB (CDR LIST))))))).
Это определение (при наличии некоторой привычки к синтаксису Лиспа) можно прочитать следующим образом: если список LIST пустой, то значение (АВ LIST)—пустой список; иначе, если голова LIST есть А, то значение (АВ LIST) —список, головой которого является В, а хвостом — результат применения АВ к хвосту LIST; в остальных случаях значение (АВ LIST) — список, головой которого является 'голова списка LIST, а хвостом — результат применения функции АВ к хвосту LIST.
Вычисление значений выражений в Лиспе аналогично применению p-конверсии: для того, чтобы вычислить значение выражения (А В ... С), в тело определения функции с именем А вместо аргументов подставляются значения В ... С и затем это тело вычисляется как новое выражение. В то же время у Лиспа есть множество отличий от чистого лямбда-исчисления. Например, существуют функции, которые при вызове нс вычисляют сразу значения своих аргументов. Таковыми являются, скажем, QUOTE и COND. Благодаря этому можно отличать списки, воспринимаемые как значения, от списков, воспринимаемых как указания к вычислению функций. В семантике лямбда-исчисления нет различий между функциями и данными, тогда как в языках программирования данные, отличные от функций, конечно, должны предусматриваться. В то же время функции (вернее, их определения) являются полноправными данными Лиспа — идея, присутствующая в семантике лямбда-исчисления.
В отличие от лямбда-исчисления, Лисп допускает многоместные функции и даже функции с нефиксированным числом аргументов (как, например, COND), а также рекурсивные определения функций; атомы в Лиспе могут иметь значения, меняющиеся в ходе вычислений с помощью вызова аналога оператора присваивания SETQ, и т. д. Таким образом, реальный язык Лисп достаточно далек от чистого лямбда-исчисления. Логика, соответствующая достаточно большому подмножеству Лиспа, рассматривается в книге [Hayashi, Nakano 88].
Нормальные алгорифмы Маркова и язык Рефал
Теперь мы рассмотрим соответствие между понятием нормального алгорифма, введенным А. А. Марковым [Марков 54; Марков, Нагорный 84] во второй половине 40-х годов для ис* следования свойств алгоритмов и вычислимых функций, и основанным на этом понятии языком функционального программирования Рефал, который был создан в 60-е годы В. Ф. Турчиным [Турчин 68, 71а—д]. Это еще один пример того, как абстрактная логическая концепция нашла применение в практическом программировании.
Нормальные алгорифмы Маркова — это одно из формальных уточнений интуитивного представления об алгоритмах. Как и машины Тьюринга, нормальные алгорифмы работают со словами некоторого алфавита, однако в отличие от машин Тьюринга, которые концептуально ближе фон-неймановской модели вычислений и, стало быть, соответствуют скорее процедурным (алголоподобным) языкам программирования, главной операцией в нормальных алгорифмах является подстановка одного слова вместо другого, что позволяет понимать алгоритм не как последовательность действий, приводящих к вычислению значения функции, а как ее рекурсивное описание.
Дадим основные определения. Пусть у нас есть конечный алфавит А = {аь ..., ап}. Словом в алфавите А называется любая конечная последовательность bi ... bk символов из А. Число к будем называть длиной этого слова. Слово длины 0 назовем пустым. Нормальные алгорифмы перерабатывают одни слева в другие. Пусть символы ->■ и i—-> нс принадлежат алфавиту А. Схемой нормального алгорифма является конечная последовательность выражений вида P->Q или Рь—>Q, где Р и Q — слова алфавита А. Эти выражения принято называть формулами подстановки, причем выражение первого вида называется простой формулой, а второго — заключительной. Для того чтобы описать функционирование алгорифма, заданного подобной схемой, нам понадобится еще несколько понятий.
Будем говорить, что слово Р входит в слово Q, если Q имеет вид RPS, где R и S — некоторые слова. В этом случае будем также говорить, что тройка <R; Р, S> определяет вхождение Р в Q. При этом такая тройка определяет самое левое вхождение Р в Q, если для любой другой тройки <Ri,P, Si>, определяющей вхождение Р в Q, длина слова Ri нс меньше длины R.
Пусть а — схема нормального алгорифма. Определим два отношения P->aQ (Р переводится в Q) и P^>aQ (Р заключительно переводится в Q), которые моделируют один шаг действия нормального алгорифма, задаваемого схемой а. Предполо-
жим, что а имеет виджим, что а имеет видPi=^QiPi=^Qi
жим, что а имеет вид
жим, что а имеет вид
Pi=^Qi
Pi=^Qi
Pn=>Qn,
где в каждой строке => означает один из символов -> и ь->, и пусть даны два слова Р и Q. Возьмем наименьшее число к, для которого слово Рк входит в Р. Пусть тройка <R, Pk, S> определяет самое левое вхождение Рк в Р. Тогда отношение P~>flQ (соответственно Р ь—>а Q) выполняется в том и только в том случае, если Q есть RQkS и k-я формула подстановки из схемы а имеет вид Pk-^Qk (соответственно Pk«—>Qk). Будем гоорить, что схема а применима к слову Р, если существует такое слово Q, что Р =>а Q.
Итак, чтобы выяснить, применима ли схема а к слову Р, надо просматривать все формулы подстановки из а до тех пор, пока нс встретится формула Р5 => Q5, левая часть которой входит в Р. Заменяя самое левое вхождение слова Pi в Р на Qi, мы получим слово, в которое слово Р переводится (или заключительно переводится) схемой а.
Говорят, что схема а преобразует слово Р в слово Q, если существует такая последовательность слов Ро, ..., Рп, что
Ро совпадает с Р;
Рп совпадает с Q;
для всех i ^ {О, .п — 2} имеет место Pi ->а Pi+ь
либо Рп-1«—> Рп, либо схема а нс применима к слову Рп и Рп-1 Рп.
Пример. Рассмотрим следующую схему Ь над алфавитом (Ь +}:
I +->• + I
1>
Нетрудно доказать, что эта схема определяет операцию сложения, т. е. преобразует слово
В СЛОВО
Так, например, преобразование слова | + | | + | | осуществляется следующим образом:
1 + 11 + 11—ь + 111 +1|->ь + Н +11|->ь + | +1Ш->Ь++11111^ + 11111^11111.
Действие нормального алгорифма на словах алфавита опре* деляется достаточно просто: с помощью правил подстановки одних слов вместо других. Тем не менее нормальные алгорифмы позволяют определить любую вычислимую функцию.
Посмотрим теперь, каким образом приведенное определение нормального алгорифма используется в языке программирования Рефал. Естественно, что, как и в случае лямбда-исчисления, потребовалось немало усилий для того, чтобы сделать абстрактные логические идеи практически применимыми.
Рассмотрим сначала несколько иное представление формул подстановки в схемах нормальных алгорифмов. Говоря не очень строго, выражение Р-^Q в схеме алгорифма означает следующее: нормальный алгоритм переводит слово CiPe2 в слово CiQe2, где Ci и е2 — некоторые слова. Если добавить в наш синтаксис переменные ei, значениями которых являются слова, то схему нормального алгорифма можно записать в более наглядной форме с использованием выражений вида eiPe2-^eiQe2. Первое отличие языка Рефал от нормальных алгорифмов состоит в том, что при определении функций разрешается использовать образцы, содержащие переменные. Далее, каждая схема нормального алгорифма задает только одну функцию слов. Определяя новый нормальный алгоритм, мы не можем пользоваться именами уже имеющихся алгорифмов. С точки зрения программирования это равносильно отказу от использования подпрограмм. Наконец, слова хотя и составляют достаточно удобный тип данных, однако имеют один существенный недостаток: они не структурируемы. Скажем, для соединения трех слов Р, Q и R в одно, но так, чтобы в дальнейшем мы могли выделять эти составные части, требуется строить новое слово, подобное Р * Q * R, в котором 41= — символ алфавита, не входящий в Р, Q и R. В Рефале имеется простое, но мощное средство структурирования выражений: так называемые структурные скобки ( ), отличающиеся от символов алфавита «(» и «)» и позволяющие использовать вмество R # Q # R запись (Р) (Q) (R).
После этого краткого неформального обсуждения мы можем описать несколько упрощенный синтаксис языка Рефал. Предположим, что у нас есть (потенциально бесконечный) набор примитивных символов. Будем называть эти символы именами и записывать их в виде последовательностей, состоящих из рус-
ских и латинских букв, цифр и символов подчеркивая _, причем обязательно начинающихся с буквы. Дадим индуктивное определение Р-выражений, (т. с. выражений языка Рефал). Пусть имеются два опять-таки бесконечных алфавита переменных: переменные Si, значениями которых являются символы, и переменные Ci, значениями которых являются выражения. Тогда
любое имя является Р-выражением;
любая переменная Si или ei является Р-"выражением;
если Р и Q — P-выражения, то PQ — также Р-выражение;
если Q — Р-выражение, то (Q) —также Р-выражение;
если Q — P-выражение, a F — имя или переменная, то <F р> — Р-выражение.
Примитивным P-выражением называется такое Р-выражение, которое нс содержит переменных и вхождений подвыражений вида <F Р>. Длина примитивного выражения вычисляется так: длина имени или выражения (Р) равна единице, а длина выражения PQ равна сумме длин выражений Р и Q. Образцом будем называть Р-выражение, не содержащее подвыражений вида <F Р>. Пример образца — это Р-выражение, полученное из образца подстановкой вместо всех переменных некоторых примитивных P-выражений, причем вместо переменных Si подставляются только символы (имена).
Определением функции F называется последовательность выражений
F
Pi-*Qi
РпQn,
где F — имя, Pi — образец, a Qj — Р-выражение, все переменные которого входят в Pi (i = 1, . .. , п).
Рефал-программа — это произвольная конечная последовательность определений функций, удовлетворяющая единственному ограничению: все определяемые в ней функции имеют разные имена.
На содержательном уровне выражение <F Р> означает применение функции с именем F к выражению Р, а выражение P->Q в определении функции F означает, что функция F «переписывает» любое выражение вида Р на выражение вида Q.
Пусть Р — примитивное выражение, a S — образец, все переменные которого, перечисленные последовательно слева направо, суть Xi, ..., хп. Отождествлением S с Р называется подста-
новка 6= {Pi/xi, • • •> Рп/хп}, применение которой к S дает Р. Разумеется, возможно несколько различных отождествлений S с Р. Введем на множестве всех таких отождествлений отношение порядка ^: будем считать, что {Pi/xi, ..., Pn/xn} ^ {Ri/xb ... ..., Rn/xn} тогда и только тогда, когда либо эти подстановки совпадают, либо существует такой номер i (1 ^ i < п), что длина Pi меньше длины Ri, а для всех j (1 ^ j < Р) Pj совпадает с Rj. Отождествление 0 образца S с примитивным выражением Р называется самым левым отождествлением S с Р, если 0 ^ 0j для любого отождествления 0! образца S с Р. Например, для образца CiC2 существуют три отождествления с выражением АБ, состоящим из двух символов, а именно
{ /е!,АБ/е2}, {А/е,,Б/е2}, {АБ/е^ /е2},
первое из которых оказывается самым левым отождествлением. Определение действия функции на выражении является обобщением соответствующего определения для алгорифмов Маркова. Сначала введем отношение P->aQ, где Р и Q — Р-вы- ражения, a a — Рефал-программа. Прежде всего определим частный случай отношения ->е, когда Р имеет вид <F R>, F — имя, а R — примитивное выражение. В этом случае отношение (F R)->aQ справедливо тогда и только тогда, когда
в программе а имеется определение функции
F
Ri ~> Qi
Rn> Qn;
хотя бы один из образцов Ri (1 ^ i ^ п) отождествляется с R, причем если Ri — первый такой образец, а 0 — самое левое отождествление Ri с R, то Q получается из Qi в результате применения подстановки 0.
Рассмотрим теперь общий случай. Пусть S — произвольное выражение, нс содержащее переменных. Возьмем его самое левое подвыражение вида <F R> с примитивным R. Тогда S->eSi в том и только в том случае, если существует такое выражение Q,’ что (F R)->0Q и SI получается в результате замены этого вхождения <F R> на Q.
Наконец, определим отношение R н-^а S {программа а преобразует R в S). Оно справедливо тогда и только тогда, когда существует последовательность P-выражений Ro = R, Ri, ... ..., Rn-ь Rn = S, где S — примитивное выражение и Ri->aRi4-i для всех 0 ^ i ^ п — 1. В этом случае будем говорить, что S —• значение выражения R при заданной программе а.
Пример. Следующая Рефал-программа заменяет в слове все вхождения символа А на символ Б:
А_на_Б
е1Ае2->е1Б(А_на_Б е2)
Ci->6!
Пример. Рефал-программа, заменяющая А на Б нс только «на верхнем уровне», но и внутри всех структурных скобок, получается из предыдущей программы добавлением следующего определения:
А_на_Б_всюду
01 (е2)е3->(А„на_Б ej
((А_на_Б_всюду е2» ^А_ыа_Б_всюду е3) 01^(А_на_Б 01)
Эти примеры подчеркивают особенности функциональных языков программирования: программы на этих языках состоят из описаний функций и поэтому могут пониматься декларативно, без учета поведения конкретных вычислительных машин. Как и другие языки функционального программирования, Рефал позволяет описывать функции высших порядков. Вот, например, описание функции mapcar, которая на аргументе вида F(Pi) .. . ... (Рп) принимает значение (Qi) . .. (Qn), где Qi — результат применения функции F к Ри
mapcar
5^63)63->«5! е2» (mapcar st e3>
Мы закончим этот параграф двумя примерами, демонстрирующими использование образцов.
Пример. Следующая функция заменяет в последовательности символов все вхождения идущих подряд одинаковых символов одним таким символом:
выч__один
CiS2s2e3->Ci (выч_один s2e3) ei->ei
Пример. Следующая функция принимает значение «ДА», если ее аргументом является палиндром (т. с. слово, которое читается одинаково как справа налево, так и слева направо), и
«НЕТ» в остальных случаях:
палиндром
8^28!(палиндром С2)
->ДА
Si-> ДА в! -> НЕТ
2.3. Комбинаторная логика и язык Миранда
В 70—80-е годы Д. Тёрнер разработал несколько языков функционального программирования с целью сделать его более выразительным и приблизить программистскую систему обозначений к той лаконичной и выразительной системе, которая сформировалась в течение многих веков в математике. Способы определения функций и способ исполнения программ (редукция графов) в последнем языке этой серии — Миранде — указывают на близкое родство данных языков с одним из разделов математической логики — комбинаторной логикой.
Синтаксис Х-термов, служащих для описания функций в лямбда-исчислении, недостаточно прост и нагляден хотя бы потому, что в нем имеются связанные и свободные переменные. Функция К = ХхАу.х, рассматриваемая как функция от двух переменных, ведет себя следующим образом: для любых Х-термов М и N мы имеем К М N=M. Более наглядно эту функцию можно было бы описать так:
К х у = х.
В данном описании уже нс используется оператор Х-абстракции: для определения К достаточно аппликации. Идея определения функций с помощью одной лишь операции аппликации лежит в основе комбинаторной логики, которая активно исследуется уже с 20-х годов (см. [Barendregt 81]). Другим фундаментальным принципом комбинаторной логики является предположение о неограниченной выполнимости функциональной абстракции. Это означает, что если у нас имеется терм t, состоящий только из переменных хь ... , хп, констант и операций аппликации, то существует такая функция f, что
fx^.Xn^t.
Задаваемая таким образом функция f называется комбинатором.
Комбинаторная логика, описываемая ниже, очень близка К лямбда-исчислению, и определяемые в ней комбинаторы — это просто Х-термы без свободных переменных.
Язык комбинаторной логики образуют термы, построенные из переменных и двух констант S и К с помощью двухместной операции* (аппликации). Как и прежде, будем обозначать терм M*N через MN и считать операцию аппликации левоассоциативной (т. е. запись KL ... М означает ((KL) .. . М)). Формулами комбинаторной логики, как и в лямбда-исчислении, являются равенства термов.
Аксиомы:
К М N = М;
SLMN-LN(MN)
(здесь L, М и N — произвольные термы).
Правила вывода:
М = NМ = N М = N
М L = N L ’ L М = L N ’ N = М ’
M = N N = L
M = L *
Понятие доказуемости определяется стандартным образом.
Почему в аксиоматике явно выделены свойства двух констант S и К? Ответ очень прост: этих констант достаточно для определения любых других комбинаторов при помощи операции аппликации. Точнее, если М — произвольный терм языка комбинаторной логики с переменными хь . . . , хп, то существует такой терм N, составленный только из констант S и К, что формула Nxi .. . хп = М доказуема в комбинаторной логике. Это значит, что любую функцию, определимую с помощью тождеств, можно задать с помощью некоторой комбинации S и К. Например, комбинатор I, такой, что
1х = х,
можно определить как SKK- В самом деле, из аксиом для S и К следует, что SKKx = Кх(Кх) = х.
Таким образом, комбинаторные термы можно вычислять с помощью редукций вида SLMN-^LN(MN) и KLM-^L. Любой комбинатор несет в себе вычислительное предписание, позволяющее рассматривать его как вычислимую (с помощью цепочки редукций) функцию.
Комбинаторная логика, как мы убедились, дает очень изящный и наглядный язык построения (комбинирования) новых вычислимых функций из уже имеющихся. Неудивительно поэтому.
что в конце концов появились языки программирования, основанные на идеях комбинаторной логики. Это прежде всего языки ML [Milner 84) и Миранда [Turner 85, 86].
Здесь мы расскажем только о языке Миранда, разработанном Д. Тёрнером и его коллегами в университете г. Кента. Мы остановились именно на этом языке, поскольку он имеет ряд интересных черт, связанных с математической логикой.
Программа на Миранде (авторы языка предпочитают называть ее нс программой, а сценарием) фактически состоит из комбинаторных определений с той лишь разницей, что в определениях допускается использование рекурсии. Это делает сценарии похожими на рекурсивные равенства Эрбрана — Гёделя. Однако сценарии отличаются от рекурсивных равенств в первую очередь наличием функций высших порядков и их использованием.
Вот простой пример сценария:
х = а + b
у = sq х
а = 8
Ь = 3
sq n = п * п
Функции в Миранде, как и в комбинаторной логике, являются полноправными данными и могут выступать в качестве аргументов и значений других функций. Операция применения функции к аргументу лсвоассоциативна, т. с. запись fxy означает ((fx)y). Ниже приведен пример сценария, в котором функции используются и в качестве аргументов, и в качестве значений: answer = four О four = twice twice sue twice f x = f (f x) sue x = x + 1
Исполнение программ на Миранде — это, по существу, редукция комбинаторных термов, выполняемая в соответствии со стратегией так называемых вычислений с полной задержкой, или «ленивых» вычислений. Вот, например, последовательность редукций, вычисляющая значение выражения answer:
answer—> four 0—> twice twice sue 0—> twice (twice sue) 0-> twice sue (twice sue 0) —> twice sue (sue (sue 0)) —>
sue (sue (sue (sue 0)))-> sue (sue (sue 0)) + 1->
(sue (sue 0) + 1) + 1 -> (((sue 0) + 1) + 1) + 1
(((0+l)+l)+l)+l^((l + l)+l)+l->(2 + l)+l->3+l->4.
Язык Миранда очень лаконичен и в то же время понятен — главным образом потому, что в нем используется много общепринятых математических обозначений. Хотя эти обозначения и выходят за рамки теории комбинаторов, мы все же приведем их здесь, чтобы не нарушить целостность картины.
Определения разбором случаев. Математики часто определяют функции следующим образом:
( . . ., если . . ., f (х) = <
( . . . в остальных случаях.
Аналогичный способ определения предусмотрен и в Миранде. Это так называемые охраняемые равенства. Вот пример определения функции наибольшего общего делителя двух чисел на Миранде:
gcd a b = gcd (а — b) b, а > b= gcd a (b — а), а < b= а, otherwise
Локальные обозначения. Нередко в математике используются так называемые локальные обозначения, такие, например, как
а = sin (х), где х — . . .
Такой же способ определения предусмотрен и в Миранде: это конструкция where (где). Мы проиллюстрируем ее примером определения функции вычисления корней квадратного уравнения ах2 + Ьх + с = 0:
quadsolve a b с ~ error «нет вещественных корней», delta < 0 — [midroot], delta = 0
— [midroot + distance, midroot — distance],
delta > 0 where
delta = b * b - 4* a * c
midroot = -— b/(2 * a) distance = radix/(2 * a) radix = sqrt delta
Использование образцов. Как и во всех языках функционального программирования, в Миранде имеются обозначения для списков. Пустой список обозначается через [ ], а список с головой а и хвостом х — через а : х. Для определения функций над списками и натуральными числами в Миранде часто
используются образцы. Ниже приведены определения функции fib, вычисляющей числа Фибоначчи, и функции nth, значение которой на аргументах п и х равно n-му элементу списка х:
fib 0 = 0
fib 1 = 1
fib (n + 2) = fib (n + 1) + fib n
nth n [ ] = error «недостаточная длина списка»
nth 0 (a : b) = a
nth (n + 1) (a : b) = nth n b
Отметим, что образцы с натуральными числами часто применяются и в теории рекурсивных функций для определения так называемых примитивно рекурсивных функций.
Использование обозначений из теории множеств. В Миранде допускается использование выражений из теории множеств Цер- мело — Френкеля (ZF-выражений), что подчас позволяет получить очень выразительные и короткие сценарии. Эти выражения имеют вид
[тело ' ограничители],
где ограничители являются или генераторами вида var ^ ехр, где var — переменная, а ехр — выражение (запись var ехр означает, что var принадлежит списку, являющемуся значением ехр), или фильтрами, т. е. выражениями со значением true или false. В некоторых конструкциях, связанных с итерациями по элементам списка, использование ZF-выражений приводит к лаконичным и емким определениям. Например, следующий сценарий определяет функцию, которая вычисляет все перестановки заданного списка:
perms [ ] = [[ ]]
perms х = [а : у } а <~ х; у <- perms (х[а])]
Здесьобозначает операцию вычитания списков. Еще более красивый пример — сценарий решения задачи о расстановке восьми ферзей, занимающий всего четыре строки (оба примера заимствованы из работы [Turner 86]):
queens 0 = [[ ]]
queens (n + 1) = [q : b ] b « queens n; q [0. .7]; safe q b]
safe q b = and [~ checks q b i i [0. . * b — 1]]
checks q b i = (q b ! i) V (abs (q — b ! i) = i + 1)
Здесь использованы следующие обозначения:— отрицание
булевского выражения, *—длина списка, diid— конъюнкция
набора булевских выражений, abs — абсолютная величина числа, b! i — i-й элемент списка Ь.
Суммируя сказанное, можно сделать следующий вывод: Миранда — очень выразительный и чистый функциональный язык, обладающий ясной семантикой. Этим своим достоинством он во многом обязан использованию достижений математической логики. В то же время опыт применения Лиспа и Пролога заставляет усомниться, что столь чистый язык окажется жизнеспособным без каких-либо радикальных изменений, поскольку расхождения реального программирования и математической логики представляются неизбежными.
ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ.
SLD-РЕЗОЛЮЦИЯ И ЯЗЫК ПРОЛОГ
Логическое программирование является, пожалуй, наиболее впечатляющим примером применения идей и методов математической логики (точнее, одного из ее разделов — теории логического вывода) в программировании.
Идея использования языка логики предикатов первого порядка в качестве языка программирования возникла еще в 60-е годы [Green 69], когда создавались многочисленные системы автоматического доказательства теорем и основанные на них вопросно-ответные системы. Суть этой идеи заключается в том, чтобы программист нс указывал машине последовательность шагов, ведущих к решению задачи, как это делается во всех процедурных языках программирования, а описывал на логическом языке свойства интересующей его области, — иначе говоря, описывал мир своей задачи. Другие свойства и удовлетворяющие им объекты машина находила бы сама путем построения логического вывода. (В сущности этот же подход реализуется и в функциональном программировании — с тем лишь уточнением, что речь в нем идет о свойствах функций. В связи с этим Дж. Робинсон [Robinson 83] предлагает назвать такой стиль программирования утвердительным (assertional)).
Первые компьютерные реализации систем автоматического доказательства теорем появились в конце 50-х годов, а в 1965 г. Робинсон [Robinson 65] предложил свой метод резолюций, который и по сей день лежит в основе большинства систем поиска логического вывода. К концу 60-х годов выявились принципиальные трудности, препятствующие широкому применению таких систем. Главная проблема заключается в практической неэффективности известных методов построения логического вывода. Стремление обойти эту преграду привело к созданию различных линейных стратегий метода резолюций (в том числе
стратегии SL-резолюции [Kowalski, Kuehner 71]), которые в сущности являются прообразами современных интерпретаторов языка Пролог. В 1971 г. один из авторов SL-резолюции Р. Ковальский прочитал несколько лекций по автоматическому доказательству теорем в лаборатории Искусственного интеллекта Марсельского университета. Работающий там А. Колмероэ и его коллеги вскоре поняли, каким образом можно использовать SL-резолюцию в качестве основы нового языка программирования. Так в 1972 г. родился язык Пролог [Colmerauer et al. 73], быстро завоевавший популярность во всем мире.
К началу 80-х годов круг задач, решаемых на компьютерах, значительно расширился и на первый план выдвинулись задачи обработки знаний. Область деятельности, связанная с решением таких задач, была названа инженерией знаний. В то же время появились новые перспективные технологии производства компьютеров нетрадиционной высокопараллельной архитектуры. Возникла новая проблема: как связать между собой инженерию знаний и новые технологии? Японцы решили выбрать в качестве недостающего звена логическое программирование, что привело к его бурному развитию в начале 80-х годов. Выявились, например, источники параллелизма в логическом программировании, вследствие чего открылись перспективы его применения в параллельных компьютерах.
Проследить всю историю логического программирования в рамках этой статьи вряд ли возможно (тем более, что в общих чертах она прекрасно отражена в переведенной на русский язык лекции создателя метода резолюций Дж. Робинсона [Robinson 83])- На первых порах, как это часто случается, применялся довольно сложный логический аппарат, однако в конце концов все свелось к достаточно простому (с точки зрения логики) исчислению— SLD-резолюции, описываемой ниже. Для более глубокого ознакомления с логическим программированием мы рекомендуем обзоры [Kowalski 83; Агафонов и др. 88] и книги [Hogger 84, Lloyd 84, Агафонов 88].
Логическая или, точнее, хорновская логическая программа состоит из набора предложений языка логики предикатов первого порядка, которые часто называют фактами, и правилами. Структура этих предложений такова, что, с одной стороны, с их помощью довольно естественно описываются многие задачи, а с другой стороны, они допускают простую процедурную интерпретацию. Два этих обстоятельства и позволяют использовать язык фактов и правил в качестве языка программирования. (В принципе идея логического программирования достаточно нейтральна как в отношении класса используемых формул, так и в отношении метода поиска вывода, однако, как показал практический
опыт, далеко не все процедуры построения вывода оказываются эффективными.)
Фактом называется формула вида
P(t tn),
где Р — предикатный символ, a ti, . .., tn — термы, построенные из переменных, констант и функциональных символов. С точки зрения математической логики факты — это атомарные формулы. Наличие в программе факта P(ti, . .., tn), содержащего переменные Хь . . . , Xm, означает, что для любых объектов Хь ..., Хт имеет место P(tb .. ., tn). Например, факт
X <Х+ 1
(представленный в инфиксной, а не префиксной форме) можно прочитать как утверждение о том, что X меньше X + 1 для любого X, а факт
нравится (Х,Х)
означает, что любой объект X нравится сам себе.
Правилом называется формула вида
Aj & ... & Ап =э Ао,
где все At — атомарные формулы (таким образом, факт — это частный случай правила). В обозначениях Пролога эту формулу принято записывать по-иному:
Ао: А), ..., Ап или
Ао if А1, . .., Ап.
Если в таком правиле встречаются переменные Хь ..., Хт, то читается оно следующим образом: для всех объектов Хь . . . . . ., Хт из Аь . .., Ап следует Ао (или, что эквивалентно, для всех Хь ..., Хт, если верны утверждения Аь . . ., Ап, то верно также Ао). Например, правило
светлый (X): — белый (X)
можно понимать как утверждение: если объект X белый, то он светлый.
Запросом к логической программе называется формула вида
Л[ &... & Ап,
где все Ai — атомарные формулы. Следуя синтаксису Пролога, вместо этой формулы мы написали бы
?-Аь Ап
Запрос, не содержащий переменных, читается так: верно ли, что А! и и Ап? Если же в атомарных формулах запроса содержатся переменные Хь . . . , Хт, то его следует читать иначе: для каких объектов Хь .. . , Хт верно Ai и ... и Ап? При этом, разумеется, считается, что машине «известна» только та информация, которая представлена в программе (и, быть может, свойства некоторых встроенных предикатов и функций, таких, как =, (или +), и ответ на запрос должен логически вытекать из этой информации. Таким образом, логические программы имеют простую и естественную семантику, запрос G: ?— Аь .. . , Ап (с переменными Хь . . . , Хт) к программе ,^ понимается как требование вычислить все значения переменных Хь . - . , Хт, при которых утверждение Ai и .. . и Ап логически следует из утверждений, содержащихся в ^. Например, имея логическую программу
белый (снег)
желтый (лимон)
светлый (свет)
светлый (X) : — белый (X)
светлый (X): — желтый (X)
на запрос
? — светлый (X)
мы вправе ожидать ответы
X = свет;
X = снег;
X = лимон.
поскольку утверждения светлый (свет), светлый (снег) и светлый (лимон) логически следуют из данной программы.
Поиск ответов на запросы к программам осуществляется путем построения логического вывода в системе SLD-резолюции. Чтобы точно определить эту разновидность метода резолюций, введем несколько новых понятий.
Основной операцией, позволяющей вычислять ответы на запросы, является подстановка термов вместо переменных, в результате которой две (вообще говоря, различные) атомарные формулы становятся одинаковыми. Такую подстановку называют унификатором. Например, если в программе имеется факт
нравится (X ,Х)
то для нахождения одного из возможных ответов на запрос ? — нравится (миша, Y)
(т. е. кто нравится Мише?) достаточно унифицировать две формул ы :
нравится (X,X) и нравится (миша, У).
В данном случае эта задача решается просто: нужно подставить вместо X константу миша и, следовательно, той же константой заменить У, получив в результате ответ У = миша. (Содержательное рассуждение, соответствующее этому вычислению, очевидно: нам дано, что каждый объект нравится сам себе и, стало быть, Мише нравится Миша.)
В общем случае под подстановкой мы понимаем множество 0={t1/Xi, . .., tn/Xn}, где все Xi (i = L • • . , n)—различные переменные, a Т—термы, отличные от X. Результат применения подстановки 0 к выражению Е (т. е. результат одновременной замены всех переменных Хь . . . , Хп на термы tb . . . , tn соответственно) обозначается через ЕВ. Композиция 0л подстановок 0 и л определяется естественным образом и удовлетворяет условию (Е0Ц = Е(0Х) для любого выражения Е.
Унификатором выражений Ei и Е2 называется такая подстановка 0, что Е10 = Е20. Вообще говоря, у двух выражений Ei и Е2 может быть бесконечно много унификаторов, однако среди них всегда имеется наиболее общий (или самый общий) унификатор о, такой, что все остальные унификаторы получаются в результате действия на о некоторыми подстановками. В качестве упражнения читатель может попробовать самостоятельно написать на любом из обсуждавшихся языков алгоритм унификации, вычисляющий для любых двух унифицируемых выражений их наиболее общий унификатор.
Как мы уже говорили, все переменные, содержащиеся в фактах и правилах, находятся в области действия (явно не указанных) кванторов всеобщности. Поэтому, не меняя смысла программы, мы можем изменять имена переменных, избегая тем самым их коллизии при унификации. Переименованием переменных в выражении Ei относительно выражения Е2 называется любая подстановка вида 0 = {Yi/Xi . .., ¥П/ХИ}, такая, что Yi, . .., Yn— различные переменные, не входящие в Еь и выражения ЕД и Е2 общих переменных не имеют.
Теперь у нас есть все необходимое для формального определения SLD-резолюции. Состоянием будем называть всякую пару вида <G, 0>, где G — запрос, а 0 — подстановка (пустой запрос принято обозначать через □, а пустую подстановку — через е). Для каждой программы ^ определим на множестве состояний бинарное отношение > <р. Допустим, что G имеет вид Л], . . . , Ап и в программе присутствует правило
Вг-Вп Вк
(или факт В, если к = 0). Пусть, далее, 01 — переименование В, Bi, ..., Вк относительно G, и пусть О2 = {ti/Xi, ..., tn/Xn}—наиболее общий унификатор Ai и B0i при некотором i (1 ^ i ^ п), причем термы tj и формулы Aj не имеют общих переменных. В этом случае мы пишем
((Аь . .., Ап), 0) ->^((Ai, ..., Aj__ 1, В101, . . ., Bk0i, Ai+b ..., Ап)02,00г) и называем запрос (Аь .. . , Ai—1, Bi0i, . . ., Bk0i, Ai+i, . . . , An)02 резольвентой запроса G и указанного выше правила.
Будем говорить, что состояние & переводится программой ^ в состояние S" (обозначение: S'-->^S"), если существует такая последовательность состояния So, ---, Sk, что
S0 = S/;
=
О, ->^®1И для любого i^k.
Последовательность So, • • • , ©к называют SLD-выводом из 9 и So-
Подстановка 0 называется ответом на запрос G к программе 9, если
(G, е) (□ ,0).
Ответ 0 содержит требуемые значения целевых переменных из запроса G.
Таким образом, SLD-резолюция позволяет выводить из одних состояний другие. Мы начинаем с исходного состояния <G, е> и пытаемся, исходя из программы ^, свести запрос G к более простым запросам путем построения SLD-вывода. Наша цель — прийти в такое состояние, когда все вопросы решены, и извлечь требуемый ответ. (Существует несколько формулировок SLD-резолюции. Мы привели ту модификацию, которая наиболее точно отражает операционную семантику Пролога.)
Система SLD-резолюции является корректной, т. е. если 0 — ответ на запрос G вида
? —Аь Ап
к программе 9, то формула
(Ai&...&An)0
является логическим следствием 9. Более того, SLD-резолюция полна в том смысле, что если G(Xi, . .., Xk)—запрос к программе 9, содержащий переменные Хь ..., Xk, и если G(ti, ... .. . , tk) — логическое следствие 9, то
<О1е)^<П,е>>
причем G(ti, ..., tk)—частный случай G0, т. е. G(ti, . ..., tk) = G00i для некоторой подстановки 0ь
SLD-резолюцию нетрудно представить в более привычной для логиков форме с помощью хорошо известных правил вывода— подстановки и обобщенного правила
А(Х)
A(t)
А&А^-.А&Ап А1&...&Ап=эВ
А & В
А^.Ап Ai & ... & An zd В
В
Подобно тому как правила лямбда-исчисления лежат в основе механизма исполнения Лисп-программ, правило SLD-резолюции (т. е. правило получения резольвенты) является основой механизма исполнения программ, написанных на Прологе. Прежде чем перейти к обсуждению Пролога, имеет смысл рассмотреть причины неэффективности системы SLD-резолюции, осознание которых позволит лучше понять устройство интерпретаторов этого языка.
Предположим, что мы, используя SLD-резолюцию, ищем ответы на запрос G к программе ^. Как мы уже выяснили, эта задача сводится к нахождению всех таких состояний <□, 0>, для которых
Их поиск удобнее всего представлять себе как поиск в дереве состояний, корнем которого является исходное состояние <G, е>, а непосредственные последователи каждого состояния ©' суть все такие состояния ©", что ©'-><?©". Таким образом, ветвления в этом дереве могут происходить в тех узлах S'= <G', 0'>, для которых существует несколько состояний ©', выводимых из ©' за один шаг.
Недетерминированность поиска в дереве состояний возникает по двум причинам. Во-первых, в G' может содержаться несколько атомарных формул Ai, . . . , Ап и при получении резольвенты может использоваться любая из них. Во-вторых, для каждой формулы Aj из G' может существовать несколько утверждений программы ^, которые применимы к Aj. Разворачивать сразу все дерево состояний, т. е. строить параллельно все его ветви, чрезвычайно неэффективно. Вместо этого в Прологе используется стратегия поиска в глубину, согласно которой дерево разво-
рачивается по принципу «сначала вглубь» и в памяти машины в каждый момент времени хранится ровно одна ветвь вычислений. Но такая стратегия поиска в силу наличия ветвлений требует некоторых уточнений. Если текущее состояние имеет вид <(АЬ ..., Ап), 0\ то какую из формул А; выбрать для получения очередной резольвенты, т. е. каково правило вычислений? Далее, если мы выберем некоторую подцель Ai, то какое утверждение из программы выбрать для сведения Л; к новым подцелям, т. е. каково правило поиска? Эти проблемы решены в Прологе чрезвычайно просто: правило вычислений всегда выбирает первую слева подцель Aj, правило поиска выбирает из программы самое первое правило
В: — Вь Bk
(или факт В), которое применимо к Ai, т. е. такое, что В унифицируется с Аь Если вычисление заходит в тупик, т. с. ни одно из утверждений программы не применимо к текущему состоянию, то происходит возврат назад по построенной ветви и для предыдущего состояния пробуется первое из еще не применявшихся к нему утверждений программы. Такая стратегия обхода дерева называется поиском в глубину с возвратом.
Эта простая и на первый взгляд совершенно безобидная С1ратегия на деле приводит к тому, что программирование на Прологе оказывается весьма далеким от чистого логического программирования. Во-первых, ответ на запрос может быть не найден просто потому, что интерпретатор попадает в ловушку бесконечной ветви. В связи с этим программист должен задумываться о расположении утверждений в своей программе, хотя с логической точки зрения порядок утверждений в программе никакого значения нс имеет. Во-вторых, для обеспечения большей эффективности в Пролог были добавлены примитивы, управляющие этой конкретной стратегией обхода дерева, такие, как отсечение (обозначается через !). Например, правило
а : — b,!, с
означает, что если мы с его помощью свели цель а к подцелям Ь, !, с и затем успешно решили Ь, то альтернативные пути решения 1) при возврате рассматриваться не будут. Таким образом, действие оператора отсечения определяется не в логических, а скорее в операционных терминах. Если в программе ^ отношение а описывается только одним утверждением
а (X) : — b (X) J
и, кроме того, имеется утверждение
с(Х):-а(Х)
то в нем нельзя заменить формулу а(Х) на ее определение, т. е. преобразовать последнее утверждение к виду
с(Х):-Ь(Х),!
хотя в чисто логических программах (без использования отсечения) такая замена корректна. Более того, введение в Пролог оператора отсечения, вообще говоря, приводит к потере всех хороших логических свойств SLD-резолюции.
Пролог часто подвергается критике за использование средств, выходящих за рамки логики. Однако нам кажется, что программирование и не может оставаться чисто логическим. Для того чтобы некоторая сугубо логическая концепция могла найти применение в реальном программировании, ее надо основательно «подпортить». В этом убеждает нас опыт, например, функционального программирования. Каждый, кто писал на Прологе программы хотя бы среднего размера, знает, как трудно обойтись без оператора отсечения. Полный отказ от него грозит неуправляемым комбинаторным взрывом. Логики зачастую не понимают этого, так как попросту не сталкиваются с проблемами памяти и быстродействия. Теорема о полноте логического программирования при использовании стратегии поиска в ширину служит лишь слабым утешением для тех, кто пытался такой поиск реализовать.
Таким образом, логическое программирование в каком-то смысле проходит те же этапы, что и функциональное. При реальном программировании на Прологе трудно ограничиться только одной логикой. Возможны и другие крайности, когда, например, в описании Пролога идет речь о том, как реализовать аналог оператора go to. Во избежание экстремизма следует, наверное, помнить, что термин «логическое программирование» состоит все-таки из двух слов.
ФОРМАЛЬНЫЕ МЕТОДЫ СПЕЦИФИКАЦИИ ПРОГРАММ
В настоящее время главными представителями формального направления в спецификации программ являются метод VDM и алгебраический метод. В то время как алгебраический метод требует аксиоматического описания всех данных и операций над ними, VDM позволяет описывать необходимые объекты явным образом в терминах предопределенных типов данных с помощью известных (интуитивно ясных) теоретико-множественных и логических конструкций. Поэтому иногда при сопоставлении с алгебраическим методом VDM классифицируют как конструктивный метод спецификации npoipaMM |Duce D. Л., Fielding Е. F.G,
. Более точной является его классификация как модельноориентированного метода, основанная на наличии в нем первичных (предопределенных) объектов, взятых из конкретной модели. Однако как VDM, так и алгебраический метод делают упор на функциональный стиль описания, поэтому VDM-спецификации и алгебраические спецификации, как правило, достаточно просто транслируются друг в друга. Что касается доказательства правильности спецификаций, то в обоих случаях речь идет о проверке для специфицируемых функций и отношений заранее заданных пред- и постусловий, выраженных соответствующими этим методам средствами [Jones С. В. 86].
VDM (венский метод построения программ)
Венский метод построения программ VDM (Vienna Development Method) как формальный метод разработки программного обеспечения оформился в конце 70-х годов. Он основан на работах по спецификации семантики языков программирования [Bjorner 77а] и их реализации [Bjorner 77b, 82].
При построении трансляторов с языков программирования возникает следующая проблема принципиального характера. С одной стороны, необходимо иметь точное описание (спецификацию) семантики того языка, для которого создается транслятор, а с другой стороны, нужно реализовать эту спецификацию в виде машинного кода. При переходе от спецификации к коду неизбежно возникают сомнения в корректности реализации и, стало быть, требуются систематические методы, делающие данный переход «безболезненным».
Семантика языка программирования достаточно абстрактна, тогда как машинный код, наоборот, конкретен, и соотношение между ними далеко не очевидно. В качестве промежуточного звена, достаточно абстрактного, чтобы связать его с семантикой, и в то же время отражающего конкретное устройство вычислительной машины, авторы VDM выбрали так называемые абстрактные машины, которые Дж. Маккарти [McCarthy 63] предложил использовать для определения языков программирования.
На самом общем уровне семантику процедурного (императивного) языка можно описать, определив множество состояний и правила или функции перехода из состояния в состояние. Кроме того, нужно выделить набор конечных состояний, в которых вычисления заканчиваются. В качестве иллюстрации своего метода Маккарти описал простейший язык программирования, названный им Микроалгол. Программы на этом языке представляют собой конечные последовательности операторов присваивания и условных переходов (goto). Состояния абстрактной ма-
шины, реализующей Микроалгол, характеризуются тройками (mem, count, prog),
где mem — отображение из множества переменных в множество вещественных чисел, предназначенное для моделирования памяти, prog — программа, a count — счетчик команд, указывающий следующую выполняемую команду. Оператор присваивания меняет mem и увеличивает на единицу count, тогда как оператор go to изменяет только count. Разумеется, реальные языки программирования гораздо богаче, чем этот игрушечный Микроалгол, и имеют более сложную и структурированную семантику.
Большую роль в описании семантики языков программирования играет денотационная семантика. С помощью определяемых в этой семантике областей можно моделировать очень сложные пространства состояний и определять на них вычислимые функции.
Метод VDM — это универсальный язык спецификаций, делающий упор на денотационное описание [Bjorner 78]. Теоретическую основу VDM составляют простая теория типов Чёрча, функциональные языки (типа LCF), типовые выражения, рекурсивные определения типов и теория неподвижной точки. В основе VDM лежит метаязык META-1V, для которого характерны использование неподвижных точек при задании функций и типов, а также функциональный стиль спецификаций.
Результатом процесса построения системы программирования с помощью VDM является последовательность спецификаций [Bjorner 83]. Самому верхнему уровню соответствует абстрактное описание тех функций, которые должна выполнять система. Каждая последующая спецификация конкретнее и ближе к реализации, чем предыдущая, причем переход от одной спецификации к другой сопровождается обоснованием (формальньш или неформальным) его корректности. Спецификация самого нижнего уровня должна быть устроена таким образом, чтобы ее можно было перевести непосредственно в коды конкретной машины.
Прежде чем перейти к примерам спецификаций, рассмотрим основные элементы языка META-IV (Bjorner 80].
Элементарные данные в этом языке представлены следующими предопределенными типами: булевским (BOOL), целым (INTO, а также подтипы No, Ni) и лексемами (TOKEN). Булевский тип содержит значения true, false и традиционный набор операций. Целый тип содержит значения {. . . , —2, —1, 0, 1, 2, . . .} (No = {0, 1,2,.. .}, Ni = {1, 2, ...}), традиционные операции целочисленной арифметики +, —, •*, div, mod и операции
сравнения =, #=, >, С, ^, ^. Тип TOKEN образует некоторую бесконечную счетную область объектов, не имеющих представления. Над лексемами определены только операции = и ^£=, Использование лексем позволяет непосредственно реализовать объекты, не уточняя их путем спецификации.
Составные данные метаязыка комбинируются из других данных и включают множества, списки, таблицы и структурные объекты (деревья). Для всех этих типов определены конструкторы, позволяющие строить отдельные объекты каждого типа, и операции над объектами, являющиеся «интуитивно очевидными». Для описания областей составных данных введены опера* цип над областями, которые позволяют строить выражения и уравнения над областями, используя имена в качестве переменных.
Если А — некоторая область объектов, то выражение A-set определяет новую область, которая содержит все конечные множества объектов из области А. Конструировать объекты из A-set можно явным или неявным образом. Если а — объект области А, то {а} и { } —объекты из A-set: одноэлементное множество и пустое множество соответственно. Неявным образом множество можно задать с помощью некоторого предиката Р, определенного на области А, и объекта as из области A-set. Так, можно определить (aeas|P(a)}— подмножество as, на элементах которого предикат Р истинен. Наконец, если m и п — целые числа, то пара {ш : п} задает объект из INTG-set— множество {i | m ^ i ^ п}. Над множествами определены традиционные отношения и операции: е (принадлежности), U, (объединения), П (пересечения) и cz. =, ^ (сравнения). Выражения (Vaeas)X X (Р(а)) и (Saeas) (Р (а)), где as — объект из A set, а Р — предикат на элементах А, предполагают традиционную математическую интерпретацию.
Через А* обозначается область всех упорядоченных конечных списков (включая пустой) объектов из А; при этом < > и <а) явно задают пустой список и список, состоящий из одного элемента а. Если f(i) —функция или выражение, зависящее от целого значения i и вырабатывающее (вычисляющее) объект из А, a m и п — целые числа, то <f(i)|m^i^n>— неявный конструктор списка из А*. Если al — список из А*, то через len al обозначается длина списка, через hd al — голова списка, а через tl al — хвост списка, т. е. список al без первого элемента. Наконец, через al [i], где 1 ^ i ^ len al, обозначается i-й элемент списка al. Для любых списков определены операции сравнения и э^-
Если А и В — некоторые области объектов, то А-^В определяет область всех таблиц (конечно определенных отображе-
ний) со входами из А и со связанными с ними значениями из В. Любой объект области А—>В можно трактовать как конечное множество пар {(аь bj, . .. (an, Ьп)}, где а!, ап е А, причем все ai различны, и Ьь Ьп е В. Это множество пар представляет собой график некоторого конечно определенного отображения из А в В. Конструкторы [ ] и [а-^b], где аеА, ЬеВ, задают объекты области А—> В, которые соответствую! всюду неопределенному отображению и отображению, определенному в одной точке а и принимающему в этой точке значение Ь. Если m— объект из А—* В, то операция dom m определяет конечное множество из A-set — область определения отображения (таблицы) гп. Если а^ dom m, тот (а) —применение т ко входу а — это элемент из области В, связанный со входом а. Если m А —> В и as е A-set, то операция m \ as формирует «сужение» таблицы т, удаляя из нее все входы а е as. Неявно эту таблицу можно описать так:
m \ as = [а b | а ^ (dom m \ as) Д m (а) = Ь].
Если Ш! ,т2 е А—>В и dom пц П dom т2 = { }, то операция mt U т2 формирует таблицу, которая называется слиянием таблиц mi и т2 и неявно описывается следующим образом.
mj (J m2 = [а —> b | (а ^ dom пр Д тj (а) = b) VV (а dom т2 Д т2 (а) = Ь].
Если dom т2 с dom ть то операция пр 4* т2 формирует таблицу, которая называется наложением таблицы т2 на таблицу пр и неявно описывается следующим образом:
пр + пр = [а Ь | (а ^ dom пр \ dom пр Д тt (а) = b) V
V а dom т2 Д т2 (а) = Ь].
Над таблицами определены операции сравнения — и
Если Вь . . . , Вп — некоторые области, а А — некоторое имя, то правило А : : s_nmi • Bi ... s_nmn : Вп задает область А структурных объектов (деревьев), помеченных именем А (имена селекторов s_nmb . .., s_nmn могут опускаться). Каждый объект из этой области содержит п компонент из областей Bi, 1 i
п, и имя А. Над деревьями определены операции сравнения = и #=. Если Ь] ^ В], . . . , Ьп ^ Вп, то конструктор mk-A(bb . . . ..., Ьп) явно формирует помеченное дерево из области А. Если а = mk—А(&ь . .., Ьп)—помеченное дерево из области А, то доступ к отдельным его компонентам осуществляется с помощью операции селекции, использующей имена селекторов s-nmh . ..
. . . , s_nmn:
Ь^з.птДа), . . , bn = s„nmn(a).
Язык META-IV позволяет описывать области объектов, используя выражения над областями. Простейшее выражение — это имя области элементарных данных (BOOL, INTO, TOKEN) или ранее введенной области. Более сложные выражения строятся с помощью операций над областями A-set,А*,А -> В. Кроме того, используются операция А|В, формирующая область объектов {а|аеА\/аЕВ}, и операция [А], формирующая область объектов, состоящую из элементов области А и дополнительного особого элемента (константы) nil. (Для группировки и указания предшествования операций в выражении используются круглые скобки.) Новые области объектов вместе с их именами можно также вводить с помощью правил абстрактного синтаксиса. Эти правила имеют вид А = В или С : : S-nuit : : Dh . .., s_nmn : Dn, где А и С — имена областей, s_nmb . .. . .., s_nmn — имена селекторов, а В, Di, . .., Dn— выражения над областями. Правило первого вида определяет область, задаваемую выражением В, а правило второго вида — область деревьев, помеченных именем С.
В общем случае для определения областей объектов используется система правил абстрактного синтаксиса, дающая, вообще говоря, рекурсивное определение типов. Операции над областями, используемые в метаязыке, соответствуют непрерывным ретрактам, и имеется общий метод построения решения с использованием наименьшей неподвижной точки [Stoy 80].
Каждое правило абстрактного синтаксиса вводит не только имя А (или С) области, но и предикат is_A(x) (или is_C(x)), который проверяет принадлежность любого объекта к этой области.
Для спецификации действий над объектами в метаязыке используются функции, заданные с помощью Z-нотации. Если e(xi, . .., Хп) —некоторое выражение, которое зависит от хь . . . , Хп, принимающих значения в областях Di, . . . , Dn соответственно, и вырабатывает значение из области В, то запись f (хь . . . , хп) = е(хь . . . , хп) или f = X(xi, . . . , хп)е(х], . . . , хп) определяет тотальную функцию с именем f типа type f: DjD2 ... . . . DnВ, если выражение e(xi, . . . , хп) определено для любых значений хь . . . , хп из областей Di, • • • , Dn, или частичную функцию с именем f типа type f: DiD2 .. • Dn > В. Если при этом имя f используется в выражении е(хь . .., хп), то определение является рекурсивным. В таком случае f обозначает функ-
цию, которая получается в результате применения оператора вычисления наименьшей неподвижной точки.
Для того чтобы иметь возможность вводить локальные сокращения, которые затем можно было бы использовать в выражениях, метаязык содержит let-нотацию. Конструкция (let х = = a in с(х)), где х — имя, а — выражение, не зависящее от х, а е(х)—выражение, зависящее от х, фактически представляет собой аналог ^-выражения ((Хх.е)а). Ее разновидностью является выражение (let xEas in е(х)), где as е A-set непустое множество и имя х связывается с некоторым элементом множества as.
Основными способами определения различных путей вычисления результата в метаязыке являются условное выражение
if р then С] else е2
и условное выражение Маккарти
(Pi ->еь .рп->епЛ ->еп + 1),
где р, рь . . . , рп — булевские выражения (предикаты).
В качестве первого примера рассмотрим спецификацию алгоритма унификации. Исторически унификация связана с методом резолюций и автоматическим поиском доказательств, однако ее роль возрастает по мере развития логического программирования и методов оперирования формальными спецификациями. В связи с этим необходимо исследовать свойства различных версий унификации, исходя из их формальных представлений. Мы опишем простейшую (робинсоновскую) версию алгоритма унификации (VDM-спецификация более эффективного алгоритма унификации (с полиномиальной памятью) исследуется в [Va- dera 88]).
Необходимые нам области объектов описываются следующими правилами:
Term = Var | Cmpterm
Var : : Name;
Cmpterm: : n_fn : Name s_arg:Term*
Name = TOKEN.
Здесь Term — термы, Var — переменные, Name—имена переменных и функций, Cmpterm — составные термы. Любой терм te Term есть либо переменная t = mk_Var(x) с именем х, либо составной терм t = mk_Cmpterm(f,tl)— результат применения операции с именем f к списку аргументов (термов) tl.
Предикат is_in_term (v, t), проверяющий, входит ли переменная v в терм t, задается спецификацией
is_in_term (v, t) =
if is_Cmpterm (t) then
(let tl = s_arg (t) in
(Bi e {1; len tl}) (is_in_term (v, tl [i]))) else v = t
type is_in_term : Var Term-* BOOL.
Область подстановок описывается так:
Subst — Var -—> Term.
В рассматриваемом алгоритме унификации будут использоваться только подстановки s ^ Subst, для которых истинен предика!
is_wf_subst (s) = (Vv,vz е dom s)(~ is_in_term (v',s(v))), т. e. только идемпотентные подстановки.
Опишем простые функции для работы с подстановками apply(t, s) и comp-sub(sb s2), реализующие операции умножения терма на подстановку и композиции подстановок:
apply (t, s) =
if is_Cmpterm (t) then
(let tl = s_arg(t) in
let til = (apply (tl [i],s) | 1 ^ i ^len tl) in mk_Cmpterm (s_fn (t), tl 1)
)
else if t e dom s then s (t) else t
type apply : Term Subst-*Term
comp_sub (S|, s2) =
if S| = [ ] then s2 else
(let v ^ dom Si in
let sub=comp_sub (s \ {v} ,s2) in
sub U [v —► apply (Si (v), s2)]
type comp_sub : Subst Subst-* Subst
Наиболее общий унификатор термов ti и t2 вычисляют функции unify(tb t2) и unify—list:
unify (ti ,t2) =
(is_Var (tj Д is_Var (t2)
if ti = t2 then [ ] else [tt —> t2], is_Var (tj ->
if is_in_term (t|, t2) then nil else [t| -> t2), is_Var (t2) —>
if is_in_term (t2,ti) then nil else [t2 -> tj,
T->
if s_fn (tj) =/= s_fn (t2) then nil else unify_list (s_arg (tj, s_arg (t9)) )'"
type unify: Term Term-> [Subst]
unify_list (tlj, tl2) =
if th =< > V tl2 = < > then [ ] else
(let S! = unify__list (tl tlb tl tl2) in
if Sj = nil then nil else
(let s9 = unify (apply (hd tl^sj, apply (hd tl2, sj) in
if s9 = nil then nil else comp_sub (sj, s9)
) ~“
type unifу__ 1 ist: Term* Term* -> [Subst]
Остановимся на некоторых свойствах функций, реализующих унификацию.
Пусть t ^ Term и s е Subst. Рассмотрим множества переменных vars_term(t) и vars_sub(s), для которых
v е vars_term (t)-^- is_in_term (v Л),v e vars_sub(s)<=>(Bv' e dom s)(is_in_term (v,s(v')).
Если t'—apply(t, s) и is-wf_subst(s), to
vars term (tz) £ (vars._term (t) \ dom s) U vars_sub (s)
Функция comp-sub(sb s2) всегда применяется к подстановкам Si и s2, для которых выполняется условие
is_wf_subst (sj Д is _wf_subst (s2) A
dom (sj П dom (s2) = { } A dom Si Q vars_sub (s2) = { };
если s = comp_sub(sb s2), то is_wLsub(s), причем
dom s = (dom Sj U dom s2) Д
Д (vars_sub (s) = (vars.sub (sj) \ dom s2) U vars_sub (s2)).
Функция unify(tb t2) применима к любой паре термов; если эта пара не унифицируема, то unify(tb t2) = nil, иначе unify(tb 12) = s, так что is_wLsnbs(s) и s — наиболее общий унификатор ti и 12.
Функция unify—list(tlb 112) применяется к спискам термов th и 112, для которых len th = len 112. Она вычисляет подстановку s = unify—list (tlb tl2), наиболее общую среди таких подстановок, что (Vi е {1 : len th}) (apply (th [i], s) = apply (tl2 [i], s), т. e. представляет собой одновременный наиболее общий унификатор. Если искомой подстановки не существует, вырабатывается результат nil.
Отмеченные свойства помогают установить правильность приведенных функций по отношению к аксиоматическому (неявному) определению наиболее общего унификатора, или, что то же самое, доказать выполнимость соответствующего постусловия. Это доказательство опирается на известный факт, что если списки th и 112 непусты и существуют одновременный наиболее общий унификатор Si = unify—list(ti tlb tl tl2) и наиболее общий унификатор s2 = unify (apply (hd tlb Si), apply(hdtl2, sj), to наиболее общий (одновременный) унификатор s списков th и tl2 существует и равен композиции унификаторов Si и s2, т. е. s = comp.sub(si, s2) [Andrews 68]. Разумеется, речь здесь идет не об установлении выводимости постусловия в некоторой выбранной формальной системе (логико-математическом исчислении), а о доказательстве в обычном математическом смысле в рамках теории множеств.
Отметим, что приведенное выше VDM-описание унификации— это не что иное, как функциональное представление алгоритма унификации, определяемого следующей логической! программой из [Eriksson 84]:
mgu (а , b,и):—variable (а),variable (b), а = b,и = О
mgu (а ,b,и):—variable (а), variable (b), И а = Ь,
и = pair (а ,Ь).О
mgu (а, Ь, и):—variable (a), variable (b), И а = Ь, u = pair(b,a).O
mgu (а,b,и):—variable (a),function (b),
~| occurs, in (a, b), и — pair (a,b).O
mgm(a,b, u):—function (a),variable (b),
П occurs (b, а),и = pair (b, а).О
mgu (а,b,и):—function (a),function (Ь),
а = termfun (s, ai), b = termfun (s, bi), mgu (ahbhu)
mgu (a ,b,u):—termlist (a), termlist (b),a=0,b = 0,u = 0 mgu (a, b,u):—termlist (a),termlist (b), a = at. ai,
b = bt.b[,mgu(ai,b[,U[),
a! = subst(at,ui),bi = subst (bt,U[), mgu (a], bt, ut), и = substconc (щ, щ)
Здесь подстановка — это список пар; pair — конструктор пары; .(cons) и 0 (пустой список)—конструкторы списка. Конструктор составного терма termfun соответствует в нашей спецификации конструктору mk_Cmpterm; предикату occurs-in соответствует предикат is_in_term; предикатам variable и function— предикаты is_Var и is_Cmpterm соответственно; функции substconc соответствует comp_sub, и т. д. Предикату mgu (а, Ь, и) соответствует функциональное представление u = unify (а, Ь) если а, b— термы, u = unify—list (а, b), если а, b — списки.
Эта программа была формально синтезирована из аксиоматического определения наиболее общего унификатора путем построения естественного вывода в логическом исчислении, названном его авторами исчислением логического программирования [Hansson 79].
Мы еще встретимся с унификацией в § 4.2, где в форме алгебраической спецификации будет дано недетерминированное представление рассмотренного выше алгоритма.
Следующий пример демонстрирует использование формул логики первого порядка в VDM-спецификациях. Широкие классы логических формул используются также в языках CIP-L, ЮТА, SPECIAL и др. (-см. обзор [Агафонов 84]). Опишем упорядочение на мультимножествах, которое применяется в ряде методов установления нётеровости переписывающих систем [Dershowitz 82].
Пусть А — некоторая область объектов. Область Multis задает мультимножества объектов из А:
Multis = A-^Nt
Если s е Multis, то элемент а е А входит в мультимножество s, когда а ^ dom s; при этом s(a)>0 — число вхождений а в s. Следующий предикат gt_point(sb s2, а) истинен для любых мультимножеств sb s2 и элемента а ^ А тогда и только тогда,
когда а входит в St большее число раз, чем в s2:
gt_point (sj ,s2,a) =
if a e dom s( fl dom s2
then S| (a) > s2 (a)
else ~ (a! e dom s2)
type gt_point: Multis Multis A —> BOOL.
Предположим, что на области А определен предикат gr type gr : А А —► BOOL, который задает некоторое строгое частичное упорядочение на А, т. е. обладает свойствами иррефлексивности и транзитивности: для любого зеА справедливо — gr (а, а); для любых х,у,2Е А справедливо gr(x, у) Л gr(y, z) zd gr(x, z).
Следующий предикат great (sb s2) распространяет частичное упорядочение, заданное предикатом gr на А, на область Multis:
great (s1,s2) =
(si =/= s2) Д
(Vxe dom s2)
(gt_point(sl,s2,x) V
(3y edom sj(gr (y,x) A gt_point(s1,s2,y) )
type great: Mults Mults-^Bool.
Для обоснования правильности этого распространения достаточно доказать транзитивность отношения great (sb s2). Для этого необходимо установить ряд свойств функции great, которые не отражены явно в приведенной спецификации. Остановимся на одном из них.
Определим вспомогательную функцию add(s, а) добавления элемента к мультимножеству:
add (s,a) = if а ее dom s then s + [a -> s (a) + 1]
else s U [a —> 1]
type' add : Multis A -> Multis.
Для этой функции справедлива следующая лемма:
(Vs!,s2^Multis)(VaeA)(great(sj,s2)=great(add(sj, a),add (s2,a))).
Эта лемма служит отправной точкой построения алгебраической спецификации приведенной выше функции упорядочения мультимножеств. Действительно, в алгебраической спецификации
тип данных мультимножество удобнее определять не с помощью таблицы, а с помощью конструктора «добавление элемента». При этом сформулированная для add(s, а) лемма оказывается одним из равенств в алгебраическом определении рассматриваемого упорядочения. Что касается ее роли в анализе VDM-cne- цификации, то она расширяет набор логических средств правилом индукции по общему числу элементов в мультимножестве, т. е. по Г У s(x)\ seMultis.
\х е dom s /
Упорядочение на мультимножествах можно описать и на естественном языке: мультимножество Mi больше мультимножества М2, если М2 можно получить из Mi заменой одного или более элементов Mi любым (конечным) числом элементов универсума А, каждый из которых меньше одного из замещаемых элементов Мь 1
Кому-то может показаться, что строгое и детальное выписывание спецификаций — занятие утомительное и бесполезное (особенно если учесть, что некоторые спецификации реальных задач содержат по нескольку страниц формул). Но ведь спецификация длинна не из-за своей формальности, а исключительно из-за нетривиальности семантики специфицируемой конструкции. Вот что говорит по этому поводу один из авторов метода VDM К. Джоунз [Jones 87]: «Не нужно думать, что формальные спецификации больших систем длинны. Формальное описание языка PL/1 содержит около 120 страниц формул. Аккуратность и готовность переработать отдельные части такой спецификации могут помочь сделать саму модель намного понятнее...» Добавим, что руководство пользователя по этому языку занимает несколько сотен страниц.
Логико-алгебраические спецификации
Существенной особенностью описанного выше подхода к спецификациям в рамках метода VDM является его модельная ориентация: спецификации фиксируют представление объектов предметной области с помощью предопределенных структур: списков, множеств, деревьев и т. д. Это снижает уровень абстракции спецификаций. С середины 70-х годов развивается альтернативный подход, который называют аксиоматическим, абстрактным, логическим и т. п. Все эти названия подчеркивают следующие основные особенности этого подхода: предметная область описывается как формальная теория в некотором логикоматематическом языке, а семантикой такого описания считается некоторый подкласс моделей этой теории, замкнутый относительно изоморфизма (т. е. абстрактный класс в терминологии
универсальной алгебры и теории моделей [Мальцев 67]). Исторически этот подход впервые был применен в рамках алгебраических спецификаций типов данных, поэтому соответствующие языки часто называют алгебраическими, хотя точнее было бы называть их логическими. С другой стороны, последнее название прочно закрепилось за языками типа Пролога (см. раздел 3 настоящего обзора), поэтому мы остановимся на термине логико-алгебраические спецификации (и языки).
Напомним, в чем состоит алгебраический подход к спецификациям абстрактных типов данных (более подробно об этом см. [Агафонов 82, 84]). В программировании под абстрактным типом данных (АТД) понимают совокупность процедур, работающих над некоторой общей для них структурой данных и помещенных вместе с этой структурой в некоторую синтаксическую оболочку, называемую модулем (иногда кластером, пакетом, капсулой и т. п.). Такая конструкция «скрывает» конкретное представление структуры данных внутри модуля: внешние по отношению к модулю части программы могут работать с этой структурой только посредством обращения к процедурам модуля.
В современных процедурных языках программирования (таких, как Клу, Модула-2, Ада и некоторые другие) принято разделять АТД на две части: спецификацию (или видимую часть) и реализацию (или скрытую часть). В первой из них описываются только заголовки процедур и имя реализуемого АТД, во второй — программный код каждой процедуры и внутреннее представление АТД. При этом внешние пользователи «видят» только спецификацию и абстрагируются от внутреннего представления этого АТД.
В результате такого построения появляется возможность менять реализационную часть АТД (при неизменной спецификации) без какого-либо изменения остальной части программы. Таким образом, спецификация действительно представляет собой некоторую абстракцию данных. Однако сразу возникает естественный вопрос: как определить семантику АТД, не обращаясь к его реализационной части (т. е. независимо от его внутреннего представления, которое может меняться)? Группа авторов, назвавших себя «группой ADJ», в работе [Goguen et al. 78], которая уже стала классической, предложила следующий ответ на этот вопрос: АТД формализуется как класс изоморфных алгебр, являющихся инициальными в категории моделей множества тождеств (или, в другой терминологии, свободными алгебрами без образующих в многообразии, задаваемом множеством тождеств [Мальцев 67]). С тех пор этот «инициальный» подход к спецификациям интенсивно развивался во многих на-
правлениях. Одним из результатов этого развития явилось осознание и практическое подтверждение того факта, что логикоалгебраические спецификации можно с успехом использовать не только для задания семантики АТД, но и как мощное средство формального описания разнообразных предметных областей, а также как язык программирования сверхвысокого уровня.
В этом параграфе мы изложим современный взгляд на логико-алгебраические спецификации и их использование в программировании. Сначала кратко осветим основные теоретические и методологические принципы, а затем приведем ряд практических примеров спецификаций.
Теоретические основы*, инициальные модели хорновых формул
Отправной точкой использования логико-алгебраических спецификаций является представление предметной области в виде алгебраической системы, т. е. конечного набора множеств вместе с конечным набором функций и отношений, заданных на этих множествах. (Вместо термина «алгебраическая система» в математической логике иногда используется термин «модель» или «структура».) Первый из указанных наборов называют носителем алгебраической системы, а второй — сигнатурой. Неформально, носитель представляет объекты предметной области, разбитые на однородные группы, типы данных, а сигнатура содержит операции и предикаты, определенные на этих объектах (можно провести аналогию между сигнатурой и видимой частью модуля, реализующего АТД).
Такое уточнение неформального понятия предметной области можно рассматривать как первый принцип логико-алгебраического подхода к спецификациям. Второй принцип состоит в том, что предметная область (т е. алгебраическая система) задается посредством описания ее свойств в виде аксиом, сформулированных в языке логики первого порядка с равенством; точнее говоря, используются либо атомарные формулы, либо отрицания атомарных формул, либо формулы вида
Ai & А2 & ... & Ak zz> Ак+ь
где Ai — атомарные формулы. Сигнатура используемого языка включает в себя сигнатуру описываемой алгбераической системы и, возможно, дополнительные функции и отношения (по аналогии с использованием вспомогательных процедур для реализации АТД).
Формулы перечисленных выше видов называются хорновыми и хорошо известны в математической логике (см., например,
[Мальцев 67]). Почему в качестве аксиом используются именно такие формулы, мы поясним чуть позже, а пока рассмотрим простой пример.
Пусть требуется построить спецификацию натуральных чисел с операциями сложения, умножения и отношением порядка «меньше или равно». Представим эту предметную область как алгебраическую систему 91 с носителем N (множеством натуральных чисел) и сигнатурой S ^=± { + , *, ^). Для построения спецификации используем два вспомогательных функциональных символа: константу 0, обозначающую минимальное натуральное число, и функцию следования s:N->N, принимающую на аргументе к значение к 4-1. Спецификация (назовем ее SPNAT) включает следующие аксиомы:
х + 0 = х;
х + s (у) = s (х + у);
х * 0 = 0;
х + s (у) = (х * у) + х;
О^х;
х ^ у zd s (х) ^ s (у);
s(x)^s(y)ZDX^y.
Забудем теперь на минуту об алгебраической системе 91 и посмотрим на SPNAT как на спецификацию некоторого абстрактного типа данных Nat. Естественно потребовать, чтобы все допустимые реализации Nat удовлетворяли аксиомам 1—7. С этой точки зрения алгебраическая система 91 является допустимой реализацией (точнее, 91 является моделью аксиом 1—7). Однако существуют и другие реализации, удовлетворяющие этим аксиомам. Одни из них изоморфны 91, т. е. отличаются только внутренним представлением натуральных чисел; такие реализации нас вполне устраивают. Другие совершенно не похожи на 91; примером является алгебраическая система 91 с носителем А = [0,1], для которой
) 0 является значением константы 0;
) интерпретация операций определяется равенствами s(0) = 0; s(0=l,
0 4-0 = 0,0 +1=0,1+0=1,1 + 1 = 1,
0*0 = 0,0*1 = 1,1*0 = 0,1*1 = 1.
) ^интерпретируется как тождественно истинный предикат, т. е. для всех х,уеА соотношение х^у истинно.
Отметим, что в алгебраической системе 51 не выполняется такое «привычное» свойство операций 4* и *, как коммутативность.
Как устранить системы, подобные 51, из класса допустимых реализаций? Первое, что приходит в голову, — дать более полное описание интересующей нас предметной области 9t, т. е. добавить новые аксиомы (возможно, нс только хорновы). Например, можно «отсеять» алгебраическую систему 51, если расширить спецификацию SPNAT аксиомами коммутативности
х 4- у = у 4- х, х к у = у * х.
Однако на этом пути нас ждет разочарование: из фундаментальных теорем математической логики следует, что никакого конечного (и даже рекурсивно перечислимого) множества аксиом в логике первого порядка нс достаточно для полного описания алгебраической системы 9L Другими словами, у любой такой спецификации найдутся модели, нс эквивалентные 9L
Поэтому было найдено другое решение, которое можно считать третьим основным принципом логико-алгебраического подхода к спецификациям: в качестве допустимых моделей рассматриваются только так называемые термальные модели (носители которых построены из основных термов спецификации, см. обзор Юэ и Оппена в данном сборнике), а из всех термальных моделей выбирается в определенном смысле минимальная (вместе со всеми ей изоморфными). Чтобы пояснить это, вернемся к спецификации SPNAT.
Множество Т2 основных термов этой спецификации состоит из константы 0 и термов вида s(tj, Ч 4-t2, h * t2, где tb t2 — основные термы. Выделим из этого множества подмножество термов вида 0, s(0), s(s(0)), .... которое в точности совпадает с множеством основных термов сигнатуры Q = {0, s} ^ S. Будем обозначать терм s(. . . s(0) . ..), k ^ 1, через sk(0).
Нетрудно убедиться, что с помощью аксиом 1—4 спецификации SPNAT любой терм из Т2 можно преобразовать в терм из Tq (используя правила вывода эквациональной логики). Поэтому в качестве носителя термальной модели возьмем Tq, а операции и отношения будем интерпретировать так:
s(sk (0)) = sk+I (0),
О 4-1 = t + 0 = t,
sk (0) 4- sm (0) = sk+m (0),
O*t = t *0 = 0,
sk (0) * sm (0) = skx m (0),
sk (0) ^ sm (0) <=> k ^ m
для всех t^To, к, m ^ 1. Очевидно, что построенная термальная модель изоморфна алгебраической системе 9t.
У спецификации SPNAT есть. и другие термальные модели, однако построенная нами модель является минимальной в следующем смысле: в ней истинны те и только те основные атомарные формулы сигнатуры S, которые выводятся из аксиом 1—7 по правилам логики первого порядка с равенством; это свойство называют отсутствием склеек, (см. статью Гогена и Мезегера в данном сборнике). Наша модель характеризуется также тем, что она является инициальной, т. е. из нее существует единственный гомоморфизм в любую другую модель спецификации SPNAT.
Оказывается, что для любого непротиворечивого множества хорновых аксиом наименьшая термальная модель всегда существует и вместе со всеми изоморфными ей моделями образует абстрактный класс инициальных моделей. В случае использования аксиом более общего вида таких моделей может не быть. Именно поэтому в логико-алгебраических спецификациях обычно ограничиваются хорновыми формулами. Такое ограничение вполне оправдано, поскольку чем проще аксиомы, тем проще решаются вопросы автоматического доказательства теорем. Более того, можно отказаться от чисто негативных аксиом (отрицаний атомарных формул), поскольку их наличие не влияет на вид инициальной модели (однако может влиять на непротиворечивость спецификации). Далее, можно избавиться от отношений в сигнатурах спецификаций, заменяя их булевозначными функциями, соответствующими характеристическим функциям этих отношений. При этом алгебраические системы становятся (многоосновными) алгебрами, а аксиомы спецификаций — тождествами и квазитождествами. (Последние иногда называют условными тождествами и записывают в виде
t = t' if t, = t;,.... tk = t'. )
Именно такие алгебраические спецификации сейчас наиболее популярны. Многие языки спецификаций основаны на тождествах и квазитождествах: CLEAR [Burstall 80]. ACT ONE [Ehrig 85], OBJ [Goguen 84, Futatsugi 85], LARCH [Непомнящий 89], SL [Антимиров 88] и ряд других. Эта популярность объясняется тем, что только для такого типа спецификаций в на стоящее время существуют относительно эффективные алгоритмы исполнения, превращающие язык спецификации в язык программирования сверхвысокого уровня; все эти алгоритмы основаны на той или иной разновидности переписывания термов (см. обзор Юэ и Оппена в данном сборнике). Обобщение таких
алгоритмов на хорновы формулы более общего вида, аналогичное предложенному в языке EQLOG [Goguen 84], связано с определенными трудностями.
Логикам и философам, не привыкшим ограничивать себя в выразительных средствах, язык тождеств и квазитождеств может показаться слишком бедным для описания реальных предметных областей. Однако программирование имеет дело только с конструктивными моделями ^позитивными в терминологии книги [Ершов 80]). Поэтому следующий фундаментальный результат, полученный в [Bergstra 87], закрывает вопрос о «недостаточной выразительной силе» логико-алгебраических спецификаций:
любую позитивную алгебру можно специфицировать как инициальную модель конечного множества (квази)тождеств, возможно, в расширенной сигнатуре.
Примеры спецификаций
Продемонстрируем теперь на простых примерах практическое использование логико-алгебраических спецификаций. Для определенности будем записывать спецификации на языке OBJ. Этот язык имеет более чем десятилетнюю историю развития (первая публикация о нем появилась в трудах международной конференции в рамках рабочей группы ИФИП в 1978 году) и, пожалуй, наиболее разработан как в теоретическом плане (см. статью Гогена и Мезера в данном сборнике), так и в плане реализации. Отметим, что OBJ является исполнимым языком, т. е. может рассматриваться как язык программирования; это делает его весьма ценным инструментом макетирования (англ, prototyping) больших программных систем.
Сначала кратко опишем те средства языка, которые будут использоваться в примерах. В языке OBJ в качестве специфицируемых объектов выступают упорядоченно-сортные алгебры, которые описываются посредством одного или нескольких иерархически связанных модулей. Каждый модуль имеет уникальное имя и может содержать следующие разделы:
раздел сортов, в котором вводятся имена областей данных (т. е. имена носителей специфицируемой алгебры);
раздел подсортов, в котором определяются включения одних сортов в другие; запись St < s2 означает, что сорт St является подсортом сорта s2, т. е. множество значений сорта Si включается в множество значений сорта s2;
раздел операций, где вводятся имена и формы записи операций (в том числе констант), их сортность (список сортов аргументов и сорт результата) и, возможно, некоторые атрибуты»
указывающие на такие свойства операций, как ассоциативность, коммутативность и идемпотентность (операции могут быть полиморфными, т. е. иметь несколько сортностей; при этом сорта вместе с операциями должны образовывать регулярную сигнатуру);
раздел переменных, в котором вводится набор переменных и описываются их сорта;
раздел аксиом, который содержит набор (условных) тождеств, определяющих семантику спецификации (в рамках инициального подхода).
Кроме того, модуль может содержать список параметров (тогда он является параметрическим, или родовым) и список импорта, в .котором после ключевого слова using указываются имена импортируемых модулей.
Язык OBJ содержит весьма небольшой набор предопределенных средств (ср. с языком Мета-IV). В принципе, выразительные возможности алгебраических спецификаций позволяют обойтись вообще без предопределенных сортов и операций — их можно задать модулями языка; однако при этом возникают некоторые проблемы с обозначениями чисел и строк (нужно представлять их основными термами). Поэтому натуральные числа (сорт Nat), целые числа (Int) и булевские значения (Bool) вместе с обычными операциями и константами считаются заданными в предопределенных модулях NAT, 1NT и BOOL соответ* ственно. Кроме того, для каждого сорта s считаются автоматически определенными
i) булевозначная операция равенства _==_ : s, s -> Bool
с обычной семантикой;
) функция разбора случаев
if_then_else_fi : Bool,s,s >s, удовлетворяющая двум аксиомам
if true then х else у fi = х,if false then x else у fi = y,
где x, у — переменные сорта s.
Подчеркивания _ в описаниях операций указывают места аргументов соответствующего сорта (слева направо); это позволяет определять инфиксные, префиксные, постфиксные и даже «миксфиксные» (как функция разбора случаев) формы операций. Если подчеркивания нс указаны, то имеется в виду либо константа того единственного сорта, который стоит после двое-
точия, либо операция, используемая в выражениях в обычной функциональной форме.
В качестве первого примера рассмотрим спецификацию мультимножеств целых чисел, на которых заданы операции объединения и проверки включения одного мультимножества в другое. Соответствующая алгебра описывается посредством двух модулей — BAG и BAG1:
module BAG using INT
sorts Bag
ops 0 : Bag
{-} : Int-*Bag
_ U _ • Bag,Bag—>Bag(assoc,comm)
vars В : Bag.
axioms
BU 0 =B.
end BAG.
module BAG1
using BAG,BOOL
ops _s_ : Bag,Bag—* Bool
_e_ : Int,Bag-> Bool
del : Bag, Int-> Bag
vars A, В : Bag; x, у: Int
axioms
0 s В = true.
({x} U A) s В = (x e B) A (A = del(B,x)).
x e 0 = false.
xe ;v} = x == y.
x e (A U B) = (x e A) V (x e B).
del(0,x)= 0.
del ({y} U A,x) = if y==x then A else {y} U del (A,x) fi.
end BAG 1.
В первом из этих модулей вводится сорт мультимножеств Bag, описываются константа «пустое мультимножество» 0, операция построения синглетона (одноэлементного мультимножества) {_} и операция объединения мультимножеств -U-, атрибуты которой assoc и comm указывают, что она ассоциативна и коммутативна. Эти операции составляют базис специфицируемого типа данных, так как любое конечное мультимножество
{еь ей} можно представить в виде основного терма {eJu U {е2} U • • • U {бк}. Другими словами, эти операции являются базовыми конструкторами сорта Bag (см. обзор Юэ и Оппена в данном сборнике).
Второй модуль расширяет первый предикатом включения мультимножеств _^_ вместе с двумя вспомогательными операциями: del (удаление элемента из мультимножества) и __е_ (принадлежность). Нетрудно заметить, что аксиомы определяют эти операции с помощью рекурсии по базовым конструкторам. Отметим, что вспомогательные операции можно сделать скрытыми внутри модуля (т. е. недоступными извне): в языке OBJ есть соответствующие средства,—однако мы не будем рассматривать этот вопрос в настоящем обзоре.
На основе построенной спецификации можно доказать следующие три теоремы:
А А = true
А <= С = true if А^ВД В^С;
А = В if А^ВДВ^А.
В силу этих теорем отношение включения мультимножеств является частичным упорядочением, что служит косвенным подтверждением правильности спецификации по отношению к «подразумеваемой модели». О методах доказательств таких теорем говорится в § 4.3.
В заключение первого примера отметим одну деталь: в построенную спецификацию не потребовалось включать информацию о числе вхождений каждого элемента в мультимножество. Между тем для построения модельного описания мультимножеств на языке Мета-IV (см. §4.1) мы вынуждены с самого начала включать эту информацию в определение области данных, что провоцирует выбор не самой адекватной програмной реализации.
Второй пример связан с сортировкой последовательностей (линейных списков). На этом примере мы продемонстрируем мощное средство языков OBJ — параметрические модули. С их помощью можно определять параметрические (родовые) типы данных и операции, причем параметрами служат сорта и операции, удовлетворяющие задаваемым пользователем требованиям. Эти требования формулируются в виде так называемых теорий. Синтаксически теории отличаются от модулей только начальным ключевым словом theory вместо module. Однако в семантике теорий используются все модели, а не только инициальные.
Следующая теория LINORD определяет сорт Elm, на котором задано отношение линейного порядка (предикат _^_):
theory LINORD using BOOL
sorts Elm
ops : Elm, ElmBool
vars x,y,z : Elm
axioms
x ^ x = true.
x^z = true if x^yAy^z.
x = у if x ^ у Л у ^ x
end LINORD.
Опишем теперь параметрический модуль LIST, в котором специфицируется область данных для сортировки — списки — вместе с операцией isord, проверяющей, упорядочен ли список по отношению
module LIST[X : LINORD]
using BOOL
sorts List, NeList
subsorts NeList < List
ops nil: List
: Elm, ListNeList
isord : List-> Bool
vars ,x,y : Elm. L * List
axioms
isord (nil) = true.
isord (x : : nil) = true.
isord (x : : у : : L) = (x ^ y) A isord (y : : L).
end LIST.
После имени модуля в квадратных скобках указан формальный параметр X и его метатип (термин из [Burstall 80]) —теория, описывающая требования к сортам и операциям фактических модулей, которые можно подставлять вместо формального ’параметра, конкретизируя сорт Elm и предикат _^_ и порождая различные конкретные типы списков. Отметим, что константа nil (пустой список) и операция _: :_ (приписать элемент к списку) являются базовыми конструкторами сорта List; подсорт NeList обозначает множество непустых списков.
Теперь все готово для определения родовой функции qsort сортировки списков. Она определяется в модуле QSRT. Из раз-
личных возможных способов определения этой функции мы выбрали тот, который ассоциируется с идеей алгоритма быстрой сортировки; при этом используются вспомогательные функции 1р и gp, выделяющие из списка подсписок элементов, меньших (соответственно больших) заданного, а также операция конкатенации
module QSRT [X : LINORD]
using LIST [X]
ops qsort : List -> List
Ip : Elm, List -> List
gp : Elm, List-> List
_*_ : List,ListList
vars x,y: Elm.L,R : List.
axioms
qsort (nil) = nil.
qsort (x : : L) = qsort (Ip (x, L)) * (x: : qsort (gp (x,L))).
Ip (y,nil) = nil.
Ip (y,x :: L) = if y^x then lp(y,L)
else x : : lp(y,L) fi.
gp (y,nil) = nil.
gp (y, x : : L) = if y<x then x::gp(y,L) else gp(y,L) fi.
nil * R = R
(x : : L) * R = x : : (L * R).
end QSRT.
Конкретизируя параметр X построенного модуля, можно получить различные функции сортировки для разных типов элементов списка и разных упорядочений на них. Однако для всех этих конкретизаций будет справедлива следующая теорема, которая доказывается на основе аксиом теории LINORD и модулей LIST, QSRT:
isord (qsort (L)) = true.
По поводу доказательства этой теоремы см. § 4.3. Условное тождество вида
ti = t2 if 0
означает то же самое, что и квазитождество
P = true о t, = t2.
В качестве последнего примера построим логико-алгебраическую спецификацию задачи нахождения наиболее общего унификатора термов, о которой шла речь в § 4.1. Для решения этой задачи воспользуемся функцией unif, которая по множеству уравнений ti = t-, i = 1, ..., п, находит их решение—наиболее общий одновременный унификатор всех пар термов, образующих уравнения. В частности, наиболее общий унификатор пары термов tb t2 равен unif({ti = t2}).
Для определения операции унификации конкретный набор функциональных символов и переменных, используемых в термах, не имеет значения. Поэтому соответствующие сорта Fname и Var мы делаем параметрами и описываем их в теории ИМЕНА. Помимо этой теории спецификация содержит семь параметрических модулей, образующих следующую иерархическую структуру:
(стрелками показаны направления импорта модулей).
В модуле БАЗА_ТЕРМ определяются два взаимно рекурсивных сорта — Term (термы) и Tlist (списки термов)—вместе с их базовыми конструкторами. В разделе подсортов указывается, что любая переменная является термом.
В модуле ТЕРМ определяются функции 1еп (длина списка термов) и полиморфная инфиксная операция _in_, проверяющая, есть ли вхождение переменной в терм или список термов.
В модуле БАЗА-ПОДСТ определяется тип данных «подстановка» (сорт Subst) с базовыми конструкторами id (тождественная подстановка) и -+- (добавление компоненты к подстановке); при этом используется вспомогательный сорт Стр (компонента подстановки). Аксиомы этого модуля таковы, что тип данных «подстановка» можно с точностью до изоморфизма рассматривать как отображение из переменных с термы (ср. с областью Subst в спецификации на языке META-IV в § 4.1).
В модуле ПОДСТ определяется операция умножения терма или списка термов на подстановку _*_. При этом используется вспомогательная функция val, вычисляющая значение подстановки (как отображения) на переменной.
В модуле БАЗА-ТОЖД определяются сорта Eq (уравнения) и Set (множества уравнений) вместе с их базовыми конструкторами -=_ (построение уравнения из двух термов), {_} (синглетон), 0 (пустое множество) и -U- (объединение множеств). Атрибуты операции объединения указывают на то, что она ассоциативна, коммутативна и идемпотентна (т. е. M|JM=M для любого множества М).
В модуле ТОЖД вводится функция conn построения множества уравнений по паре списков термов, а операции умножения на подстановку -*_ и проверки вхождения переменной _in_ продолжаются на сорт множеств уравнений.
В последнем в этом наборе модуле УНИФИКАЦИЯ определяется сорт Unifier, который расширяет сорт подстановок константой попе, обозначающей «пустую» подстановку, т. е. отсутствие унификатора; при этом операция -+- продолжается на этот расширенный сорт. Здесь же определяется функция unif, решающая задачу унификации. (Сорт Unifier необходим для описания области данных этой функции, которая не всегда возвращает подстановку, так как термы могут быть неунифицируе- мыми; отметим, что это типичный прием, который используется в языке для определения частичных функций с помощью всюду определенных функций. Существуют и другие подходы к описанию частичных функций; см., например, [Антимиров 88].)
Приведем сам текст спецификации:
theory ИМЕНА using BOOL
sorts Fname,Var
ops _==_ : Fname,Fname ^ Bool.
_== : Var, Var > Bool
vars x,y : Fname.u,v : Var.
axioms
x == x = true.u == v = true.
x = y if x == y. u = v if u==v.
x — = v = false.
end ИМЕНА.
module БАЗА_ТЕРМ [N : ИМЕНА]
sorts Term, Tlist
subsorts Var < Term
ops nil : Tlist
: Term, Tlist—► Tlist
_[_]: Fname,Tlist ^Term
end BA3A_TEPM
module ТЕРМ [N : ИМЕНА] using БАЗА_ТЕРМ (N],NAT
ops len : Tlist —* Nat
_in_ : Var.Term -* Bool
_in_ : Var.Tlist—* Bool
vars V,U : Var.T : Term.F : Fname.L : Tlist.
axioms
len (nil) = 0.
len(T; L) = 1 + len (L).
V in U = V== U.
V in F[L] = V in L.
V in nil = false.
V in T; L=(V in T) V (V in L).
end ТЕРМ.
module БАЗА_ПОДСТ [N : ИМЕНА] using БАЗА_ТЕРМ [N]
sorts Subst, Cmp
ops id : Subst
_ : Var.Term-*Cmp
: Subst, Cmp—* Subst
vars U.V: Var.S : Subst.T1.T2: Term.
axioms
(S + (V<-T1)) + (V*-T2) = S + (V^-T2)
(S + (V^-T1)) + (U*-T2) = (S + (U^-T2)) +
+ (V<-T1) if~|(U==V).
S + (V<-V) = S.
end БАЗА_ПОДСТ.
module ПОДСТ [N : ИМЕНА] using ТЕРМ [N], БАЗА_ПОДСТ [N]
ops_*_ : Term, Subst -» Term
: Tlist,Subst->Tlist
val: Subst,Var—>Term
vars U,V ". Var.F : Fname.T : Term.L : Tlist. S : Subst.
axioms
V* S=val(S,V).
F[L]* S = F[L* S],
nil * S =nil.
(T; L)*S = (T*S); (L * S).
val (id, V) = V.
val(S + (V*-T),U) = if V == U then Т
else val (S,U) fi end ПОДСТ.
module БАЗА_ТОЖД [N : ИМЕНА] using BA3A_TEPM[N] sorts Eq,Set
ops_=_ : Term,Term —> Eq
0 • Set
{_}: Eq -> Set
_ U - : Set, Set -* Set (assoc, comm, idp)
vars E : Set
axioms E J 0 = E
end БАЗА_ТОЖД
module ТОЖД [N : ИМЕНА] using БАЗА_ТОЖД[П] ПОДСТ [N]
ops conn : Tlist.Tlist-* Set
: Set, Sub-> Set
: Set.Cmp -> Set
_in_ : Var.Set ->Bool
vars T1,T2 : Term.L.R : Tlist.El,E2 : Set.S : Subst.V : Var. axioms
conn (nil,R)= 0.
conn (L,nil) = 0.
conn(Tl; L,T2; R) = {T1 = T2} U conn (L,R).
El *id = El.
0 * S = 0.
(T1 = T2) * S = {T1 * S = T2* S}.
(El U E2) * S = (E1 * S)(J(E2* S).
El *(V*-T1) = E1 *(id + (V^Tl)).
in 0 =false.
in (T1 =T2} = (V in Tl) V (V in T2).
in (El U E2) = (V in El) V (V in E2).
end ТОЖД.
module УНИФИКАЦИЯ [N : ИМЕНА] using TOЖД[N]
sorts Unifier
subsorts Subst < Unifier
ops none : Unifier
unif: Set —> Unifier
_+_ : Unifier, Cmp —> Unifier
vars T : Tcrm.L,R : Tlist.F,G : Fname.V '. Var.E : Set.
axioms
unif (0) = id.
unif ({T = T} U E) = unif (E).
unif ({V e= F [L]} U E) = none if V in L
unif ({V = T} U E) = unif (E * (V <— T)) +
+ (V <—T * unif (E * (V <-T))) if п (V in T).
unif ({T ^ V} U E) = unif ({V = T} U E).
unif ({F [L] = G [R]} U E) = if (F ~ G)A(len (L) == len (R)) then unif (conn (L,R) U E) else none fi.
none + (V <- T) = none.
end УНИФИКАЦИЯ.
Одним из подтверждений корректности построенной спецификации является доказательство теоремы
unif ({ti = t2}) = 0 zd 0 = none V b * 0 = t2 * 0,
которая говорит о том, что функция unif действительно вычисляет унификатор. Тот факт, что этот унификатор будет наиболее общим, можно выразить (и доказать), предварительно специфицировав операцию композиции подстановок
comp_sub : Subst, Subst—> Subst.
Это несложное упражнение мы оставляем любознательному читателю.
4.3. Анализ формальных спецификаций
Как мы уже отмечали, и VDM, и алгебраический метод обладают определенными достоинствами с точки зрения доказательного программирования. Оба метода используют мощные логические средства как на уровне синтаксиса, так и на уровне семантики. Тем самым в каждом из них заложены богатые возможности строго формулировать и доказывать свойства спецификаций. Постараемся показать, какая степень реализации этих предпосылок уже достигнута и какие существуют потенциальные возможности.
Для доказательства свойств алгебраических спецификаций, выражаемых равенствами, конечно, в первую очередь нужно
применять эквациональную логику и различные процедуры установления выводимости в этой логике (Goguen 85; Воронков 87; Дегтярев 86]. Однако чисто эквациональных средств оказывается достаточно лишь для доказательства тождеств, истинных во всем классе алгебр, удовлетворяющих аксиомам спецификации. Что касается истинности в инициальной алгебре — стандартной семантике спецификации, — то для ее установления может потребоваться индукция по структуре объектов этой алгебры, т. е. термов, если в качестве предметной области выбирается термальная модель (см. § 4.5 обзора Юэ и Оппена в данном сборнике). Этот принцип формального доказательства корректности алгоритмов индукцией по структуре данных впервые был последовательно проведен для словарных функций, задаваемых нормальными алгорифмами [Марков 84, 51] . Иногда указанную индукцию можно имитировать некоторой версией процедуры пополнения Кнута — Бендикса — так называемой безындуктивной индукцией (inductionless induction), см. § И того же обзора Юэ и Оппена, а также [Musser 80; Goguen 80; Huet 1982; Jouan- naud 86; Bachmair 88; Кучеров 87].
Чтобы продемонстрировать использование индукции по структуре термов, обратимся к приведенной выше спецификации алгоритма быстрой сортировки. Правильность этой специфика* ции выражается теоремой
VL isord (qsort (L))^=true.
Опишем схему индуктивного доказательства этой теоремы. Базе индукции соответствует случай L = nil. Очевидно, что при этом
isord (qsort (nil)) = isord (nil) = true.
Если список L не пуст, то он имеет вид х : : I/ для некоторого элемента х и списка U. Индуктивный переход заключается в доказательстве теоремы для х : : I/ в предположении, что она верна для I/, т. е. в доказательстве утверждения
isord (qsort (х : : I/)) =
= isord (qsort (Ip (x, L')) * x: : qsort (gp (x, L'))) = true
Для доказательства потребуются две леммы о свойствах функции isord. Мы докажем эти леммы, а полное доказательство самой теоремы о правильности qsort оставим читателю, чтобы он имел возможность лучше оценить значение указанных выше работ по машинно-ориентированным методам безындуктивной индукции.
Будем считать, что мы располагаем достаточным запасом свойств используемых операций над списками.
Лемма 1.
Vx,yVL isord ((L * х : : nil) * у: : nil) = isord (L * x : : nil) A x ^ y.
Доказательство. Воспользуемся индукцией no L. Если L = = nil или L = z : : nil, то утверждение леммы вытекает непосредственно из определения isord.
Пусть L = zi :: z2 : : L'. Предположим, что для z2 : : U утверждение леммы справедливо. Тогда
isord ((zt : : z2: : I/ * х : : nil) * у: : nil) =
= isord (zt : : z2: : ((I/ * x: : nil) * у: : nil)) =
= Zj ^ z2 A isord (z2:: ((I/ * x :: nil) * у: : nil)) =
= Zj ^ z2 Д isord ((z2: : I/ * x : : nil) * у : : nil) = (по предложению индукции)
= Zt ^ z2 Д isord (z2: : Lz * x : : nil) A x ^ У =
= Zt ^ z2 A isord (z2: : (I/ * x : : nil)) A x < у =
= isord (zt : : z2: : (I/ * x : : nil)) A x ^ у =
= isord (zj : : z2: : I/ * x : : nil) A x ^ y.
Лемма 2.
VLh L2Vx isord (Lt * x : : L2)=isord (Lt * x : : nil) A isord (x : : L2).
Доказательство. Воспользуемся индукцией no L2. Если L2 = = nil, то утверждение леммы очевидно.
Пусть L2 = y : : L' и
VLtVx isord (Li * х : : L2) = isord (Lt * x : : nil) A isord (x : : L2)
Тогда
isord (Lt * x : : у : : L2) = isord ((Lt * x : : nil) * у : : L2) =
(по предположению индукции)
= isord ((Lt * x : : nil) * у : : nil) A isord (y -: : L2) =
(по лемме 1)
= isord (Lt * x : : nil) A x ^ у A isord (y : : L2) =
= isord (Lt * x : : nil) A isord (x : : у : : L2).
Доказательства теорем такого типа об алгебраических спецификациях проводятся по той же схеме, что и доказательства правильности рекурсивных программ, использующие структурную индукцию. Многочисленные примеры таких доказательств приводятся в [Андерсон 1982].
Рассмотрим теперь предпосылки применения методов безын- дуктивной индукции.
Пусть SP = <S, S, Е> — алгебраическая спецификация, где S — множество сортов (возможно, с упорядочением), 5 — сигнатура, Е — множество аксиом (равенств над T(S, X), где X = {Xs}sgeS — семейство множеств переменных). Равенство t = s истинно в инициальной модели I (SP) = Т(S)/=Е, или, другими словами, является тождеством в 1(8Р),если Е^=т(щ(t=: = s), т. е. t = s есть логическое следствие Е относительно всех термальных моделей SP. Это означает, что множества аксиом Е и Е U 0 = s} индуцируют одну и ту же наименьшую конгруэнцию на множестве основных термов T(S).
Предположим теперь, что эквациональные теории Е и Е (J U (t = s} удалось представить полными системами правил переписывания 5?i и 5^2 соответственно (см. обзор Юэ и Оппена в данном сборнике). Если при этом множество NFi нормальных форм термов из T(S) относительно системы 5?ь или ^-нормальных форм, вложено в множество ^-нормальных форм NF2, то отношения ^->^ и совпадают на T(S) и, следовательно, теории Е и Е U {t = s} эквивалентны на T(S).
Действительно, пусть существует такая пара основных термов p,q&'T(S), что p=EU{s_t}q и p^q, т. е. EU{s=t}^ k (P^Q) и Е К (Р= q)- Тогда, поскольку E^(p = q), то NFi (р) = р' Ф q' = NF! (q). Ho NF! ^ NF2 и p =E p',q =E q'. Следовательно, NF2(p) = NF2(p') = p', NF2(q) = q'. Поскольку E U (s = t) ^= (p = q), должно иметь место равенство p' = q/, которое противоречит ранее полученному утверждению о графическом неравенстве этих термов. Следовательно, для любого основного равенства р = q, если Е U {s—1} 1= (p=q), то Е[=(р =q).
В качестве примера рассмотрим спецификации функций h(n)=L^-J (целая часть от деления пополам) и d(n) = 2п в области натуральных чисел, для которой ранее были описаны конструкторы 0 и s. Сейчас S = {0, s, d, h}. Пусть множество Е уже представлено полной системой 91<.
^ = h(0)->0
h(s(0))~>0 h(s(s(x))) ->s(h(x)) d(0)-»0
d(s(x)) —> s (s (d (x))).
Пусть система ^?2 = <3?i U {h (d (x))-^ x} соответствует множеству аксиом E U{h(d (x)) = x}. Нетрудно убедиться, что система
^?2 также полна и NFi = NF2 = Т( {О, s}). Следовательно, равенство h(d(x)) = х истинно в области натуральных чисел, т. е. в инициальной модели Е. (Пример взят из [Toyama 86].)
Если системы ^, ^2 заранее не определены или не обладают требуемыми свойствами, то поиск подходящих систем осуществляется с помощью той или иной модификации алгоритма пополнения Кнута — Бендикса. Напомним, что системы 9U, ^ должны удовлетворять не только требованию полноты, но и ограничению на нормальные формы NFi ^ NF2. И хотя сама процедура Кнута — Бендикса использует лишь правила эквацио- нальной логики, последнее обстоятельство вновь вынуждает нас применять индуктивные рассуждения. Соответствующие модификации процедуры пополнения с применением дополнительных тестов к генерируемым правилам предлагаются в [Jouannaud 86, Fribourg 86, Kapur 86] и других работах. Наиболее общим представляется метод, описанный в [Bachmair 88]. Хотя в конечном счете безындуктивность таких методов оказывается относительной, повышенное внимание к этому подходу оправдано его машинной ориентированностью и высокой эффективностью его главной составной части—операции пополнения.
ЛИТЕРАТУРА
Агафонов В. Н. 1975 Сложность алгоритмов и вычислений- спецкурс для студентов НГУ. Ч 2.— Новосибирск: Изд-во НГУ, 1975
Агафонов В Н. (ред ) 1982. Данные в языках программирования абстракция и типология. — М Мир, 1982
Агафонов В. Н 1984. Языки и средства спецификации программ — В сб • Требования и спецификации в разработке программ — М.- Мир, 1984, с 285— 344.
Агафонов В Н., Борщёв В Б., Воронков А А. 1988 Логическое программирование в широком смысле (обзор) —В кн : Логическое программирование.—М: Мир, 1988, с 298—367.
Андерсон Р. 1982. Доказательство правильности программ —М : Мир, 1982.
Антимиров В. М. 1988 Методы и средства построения формальных спецификаций. Автореф дисс. канд физ.-мат. наук —Киев. КГУ, 1988
Ахо А., Хопкрофт Дж., Ульман Дж 1979 Построение и анализ вычислительных алгоритмов. — М* Мир, 1979.
Бабаев Й. О, Лавров С. С., Нецветаева Г. А, Новиков Ф. А, Шувалов Г. М. 1983. СПОРА — система программирования с автоматическим синтезом программ —Всес. конф «Применение методов математической логики», Таллинн, 1983, с. 29—41.'
Барздинь Я М. 1965. Сложность распознавания симметрии па машинах Тьюринга —Проблемы кибернетики, вып 15, с 245—248.
Барздинь Я- М., Бразма А. Н , Кинбер Е. Б. 1987. Индуктивный синтез программ: состояние, проблемы, перспективы. — Кибернетика, 1987, № 6, с 81—87.
Белов В. П, Брановицкий В И, Вершинин К П, Гецко Л. Н Довгял- ло А. М, Ефименко С П. Колос В. В. 1986. Пролог—язык логического
программирования. — В кн.: Прикладная информатика, вып. 10. — М.: Финансы и статистика, 1986, с. 24—58.
Борщёв В. Б. 1986а. Пролог — основные идеи и конструкции. — Прикладная информатика, вып. 2, 1986, с. 49—78.
Борщёв В. Б. 19866. Логическое программирование — Известия АН СССР, Техническая кибернетика, 1986, № 2, с. 89—109.
Ван Хюльзен Я., Калме Ж. 1986. Применения компьютерной алгебры.— В кн.: Компьютерная алгебра. Символьные и алгебраические вычисления.-* М.: Мир, 19 86, с. 308—325.
Волож,, Б. Б., Мацкин М. В., Минц Г. Е., Тыугу Э. X. 1982. Система ПРИЗ и исчисление высказываний. — Кибернетика, 1982, № 6, с. 63—70.
Воронков А. А., Дегтярев А. И. 1986. Автоматическое доказательство теорем I. — Кибернетика, 1986, № 3, с. 27—33.
Воронков А. А. 1986а. Логические программы и их синтез. — Препринт ИМ СО АН СССР, 1986, № 23.
Воронков А. А. 19866. Синтез логических программ. — Препринт ИМ СО АН СССР, 1986, № 24.'
Воронков А. А., Дегтярев А. И. 1987. Автоматическое доказательство теорем II. — Кибернетика, 1987, № 4, с. 88—95.
Воронков А. А. 1989. Логическое программирование и Х-программирова- ние. — Кибернетика, 1989, № 1, с. 67—72.
Глушков В. М. 1986. Кибернетика. Вопросы теории и практики. — М.: Наука, 1986.
Глушков В. М, Цейтлин Г. Е., Ющенко Е. Л. 1978. Алгебра, языки, программирование —Киев: Наукова Думка, 1978.
Гончаров С. С. Свириденко Д. И. 1985. ^-программирование.— В кн.: Логико-математические основы проблемы МОЗ (Вычислит. системы, вып. 107). — Новосибирск, 1985, с. 3—29.
Грис Д. 1984. Наука программирования. — М.: Мир, 1984.
Дегтярев А. И. Воронков А. А. 1986. Методы управления равенством в машинном доказательстве теорем. — Кибернетика, 1986, № 3, с. 33—41.
Дейкстра Э. 1978. Дисциплина программирования.—М/ Мир, 1978.
Домёлки Б. 1988. Использование Пролога в Венгрии. — Программные продукты и системы, 1988. № 1, с. 53—57.
Ершов А. П. 1977. Введение в теоретическое программирование. Беседы о методе. — М.: Наука, 1977.
Ершов А. П. 1982. Вычислимость в произвольных областях и базах.— Семиотика и информатика, 1982, т. 19, с. 3-—58.
Ершов Ю. Л. 1977. Теория нумераций —М.: Наука, 1977.
Ершой Ю. Л. 1980. Проблемы разрешимости и конструктивные модели.— М.: Наука, 1980.
Ершов Ю. Л. 1983. Динамическая логика над допустимыми множествами.—ДАН СССР, 1983, т. 273, № 5, с. 1045—1048.'
Ершов Ю. Л. 1986. Язык Х-выражений. — В кн/. Логические вопросы теории типов данных . (Вычислит, системы, вып. 114).— Новосибирск, 1986, с. 3—10.
Капитонова Ю. В., Дегтярев А. И., Лялецкий А. В. 1973. Использование эвристик в программах для доказательства теорем (обзор). — Кибернетика, 1973, № 4, с. 76—89.
Кахро М. И., Калья А. П., Тыугу Э. X. 1981. Инструментальная система программирования ЕС ЭВМ (ПРИЗ). — М.: Финансы и статистика, 1981.С
Климов А. В., Романенко С. А. 1987. Система программирования РЕФАЛ-2 для ЕС ЭВМ. Описание библиотеки функций. — Препринт ИПМ АН СССР им. М. В. Келдыша, 1987, № 200.
Климов А. В., Романенко С. А. 1987. Система программирования РЕФАЛ-2 для ЕС ЭВМ. Описание входного языка. — Препринт ИПМ АН СССР им. М. В. Келдыша, 1987.
Крицкий С. П., Хандрос В. Л. 1986. Средства описания данных в языке спецификации СЛЭНГ. — В кн.: Прикладная логика (Вычислит, системы, вып. 116). — Новосибирск, 1986, с. 101—119.
Кучеров Г. А. 1985. Системы подстановок термов. — Препринт ВЦ СО АН СССР, 1985, № 601.
Кучеров Г. А 1987. Об алгоритме доказательства свойств абстрактных типов данных —Препринт ВЦ СО АН СССР, 1987, № 750.
Лавров С. С, Силагадзе Г. С. 1978. Автоматическая обработка данных. Язык ЛИСП и его реализация. — М: Наука, 1978.
Лавров С. С. 1982. Синтез программ. — Кибернетика, 1982, № 6, с. 11—16.
Ломп А. А. 1986. Идеал логического программирования Пролог и Утопист.— Тезисы IV Всес. конф. «Применение методов математической логики», секция «Представление знаний и синтез программ», Таллинн, 1986, с. 91—93.
Мальцев А. И. 1965. Алгоритмы и рекурсивные функции. — М.: Наука, 1965.
Мальцев А. И. 1967. Алгебраические системы. — М,- Наука, 1967.
Манин Ю И. 1980. Вычислимое и невычислимое. — М.: Сов. радио, 1980.
Манна 3. 1978. Теория неподвижной точки программы. — Кибернетический сборник, вып. 15, с. 38*—-100.
Манцивода А. В. 1988. ФЛЭНГ— функционально-логический язык программирования.— Всес. конф, по искусственному интеллекту, М., 1988, т. 3, с. 440—445.
Марков А. А. 1954. Теория алгорифмов. — М. — Л.- Цзд-во АН СССР, 1954.
Марков А. А. 1957 Математическая логика и вычислительная математика — Вестник АН СССР, № 8, с. 21—25.
Марков А. А., Нагорный Н. М. 1984. Теория алгорифмов. — М.: Наука, 1984.
Мартьянов В И., Николенко А. Б. 1988. Язык логического программирования ПИФОР. — В кн.: Инструментальные системы и моделирование, Новосибирск, 1988, с 27—32.
Маслов С. Ю 1964. Обратный метод установления выводимости в классическом исчислении предикатов. — ДАН СССР, 1964, т. 159, № 1, с. 17—20
Маслов С. Ю. 1968. Обратный метод установления выводимости для логических исчислений.—Труды МИАН СССР, 1968, т. 98, с. 26—87.
Маслов С. Ю. 1986. Теория дедуктивных систем и ее применения. — М.: Радио и связь, 1986.
Маслов С. Ю., Минц Г. Е. 1983. Теория поиска вывода и обратный метод— В кн'.: Мат. логика и автоматическое доказательство теорем. — М.: Наука, 1983, с. 291—314.
Минц Г. Е. 1982. Логические основы синтеза программ. — Препринт АН ЭССР, Таллин, 1982.
Минц Г. Е. 1987. Некоторые формальные системы логического программирования.— Кибернетика, 1987, № 6, с. 97—98.
Минц Г. Е., Тыугу Э. X. 1985. Семантика описаний в языке Утопист и автоматический синтез программ. — Программирование, 1985, № 5, с. 3—11.
Михайлов В. Ю. 1983. Об одной системе автоматического синтеза программ.— В кн : Автоматический синтез программ, Таллин, 1983, с. 71—88.
Михайлов В. Ю. 1986. Программирование технологий.— Тезисы IV Всес. конф. «Применение методов мат. логики», секция «Представление знаний и синтез программ», Таллинн, 1986, с. 120—122.
Нейман В. С. 1988. Логическое программирование в системе PROVE.— Тезисы Всес. конф, по искусственному интеллекту, ч. 1, М., 1988, с. 458—463.
Непейвода Н. Н. 1978. Соотношение между правилами естественного вывода и операторами алгоритмических языков высокого уровня. — ДАН СССР, т. 239, № 3, 1978
Непейвода Н. Н. 1979а. Применение теории доказательств к задаче построения правильных программ. — Кибернетика, 1979, № 2, с. 43—47.
Непейвода Н. Н. 19796. Об одном методе построения правильных программ из правильных подпрограмм. — Программирование, 1979, №1,
с. 15—25
Непейвода Н. Н., Свириденко Д. И. 1981. Программирование с логической точки зрения.'—Препринт Т-1, ИМ СО АН СССР, 1981.
Непейвода Н. Н., Свириденко Д. И. 1981а. Логическая точка зрения на программирование. — Препринт Т-2, ИМ СО АН СССР, 1981.
Непейвода Н. Н., Свириденко Д. И. 1982. К теории синтеза программ.— В сб.: Математическая логика и теория алгоритмов (Труды Института математики, т. 2). — Новосибирск: Наука, 1982, с. 159—175.
Непейвода Н Н. 1982. Логический подход к программированию. — Алгоритмы в современной математике и ее приложениях, т. 2. Новосибирск, ВЦ СО АН СССР, 1982, с. 32—63
Непейвода Н. Н. 1985. Математическая теория синтеза программ (обзор).— В сб.: Синтез программ. — Устинов, 1985, с. 4—8.
Непомнящий В. А., Рякин О. М. 1989. Практические методы верификации программ. — М.: Радио и связь, 1989.
Пильщиков В. Н. 1983. Программирование на языке Плэнер. — М.: Наука. 1983.
Семенов А. Л., Успенский В. А. 1986. Математическая логика в вычислительных науках и вычислительной практике. — Вестник АН СССР, № 7, с. 93—103.
Турчин В. Ф. 1968. Метаалгоритмический язык —Кибернетика, 1968, № 4, с. 45—53.
Турчин В. Ф. 1971а. Программирование на языке РЕФАЛ. 1. Неформальное введение в программирование на языке РЕФАЛ. — Препринт ИПМ АН СССР, 1971, № 41.
Турчин В. Ф. 19716. Программирование на языке РЕФАЛ. 2. Формальное описание и принципы реализации РЕФАЛа. — Препринт ИПМ АН СССР, 1971, № 43.
Турчин В. Ф. 1971в. Программирование на языке РЕФАЛ. 3. Программирование на базисном РЕФАЛе. — Препринт ИПМ АН СССР, 1971, № 44.
Турчин В. Ф. 1971г. Программирование на языке РЕФАЛ. 4. Использование рекурсивных переменных в языке РЕФАЛ. — Препринт ИПМ АН СССР, 1971, № 48.
Турчин В. Ф. 1971д. Программирование на языке РЕФАЛ. 5. Использование метафункций в языке РЕФАЛ. — Препринт ИПМ АН СССР, 1971, № 49.
Тыугу Э. X. 1984. Концептуальное программирование. — М.: Наука, 1984.
Успенский В. А., Семенов А. Л. 1987. Теория алгоритмов: основные открытия и приложения. — М.: Наука, 1987.
Adelsberger Н. 1984. Prolog as a simulation language.— Proc. 1984 Winter Simulation Conf., Dallas, 1984.
Aiso H. 1988. The fifth generation computer systems project. — Future Generation Computer Systems, 1988, v. 4, N 3, p. 159—175.
Alexi W. 1988. Extraction and verification of programs by analysis of formal proofs. — Theoretical Computer, Science, 61(2—3), 1988, v. 61, N 2—3, p. 225—258.
Amble T. 1988. Logic programming and knowledge engineering. — Workingman: Addison-Wesley, 1988.
Andrews Р. В. 1968. Resolution with merging. — J. ACM, 1968, v. 15, N 3, p. 367—381.
Apt K. R., Van Emden M. H. 1982. Contributions to the theory of logic programming. — J. ACM, 1982, v. 29, p 841—862.
Apt K. R. 1988. Introduction to logic programming (revised and extended version). — Stichtung Mathematisch Centrum, Amsterdam, Report CS-8826, 1988.
Bachmair L. 1988. Proof by consistency in equational theories. — Proc. Symp. Logic in Comp. Sci., 1988, p. 228—233
Backus J. 1978. Can programming be liberated from the von Neumann style? A functional style and its algebra of programs — Comm. ACM, 1978, v. 21, N 8, p. 613—641.
Backus J. 1981. The algebra of‘functional programs: functional level reasoning, linear equation and extended definitions. — In: Int. Col. on Formalization of Programming concepts, Lecture Notes Comp. Sci. 1981, v 107, p. 1—43. [Имеется перевод в данном сборнике: Бэкус Дж. Алгебра функциональных программ: функциональный уровень рассуждений, линейные уравнения и расширенные определения.]
Barendregt Н. Р. 1981. The lambda calculus, its syntax and semantics.— Amsterdam: North-Holland, 1981. [Имеется перевод* Барендрегт X. Ламбда- исчисление, его синтаксис и семантика. — М.: Мир, 1985.]
Barendregt Н. Р, Van Leeuven М. 1986. Functional programming and the language TALE. — In: Current Trends in Concurrency, Lecture Notes Comp. Sci., 1986, v. 224, p. 122—207.
Barwise J. 1975. Admissible sets and structures. — Berlin: Springer-Verlag, 1975.
Bates J. L., Constable R. L. 1985. Proofs as programs. — ACM Trans, on Programming languages and systems, 1985, v. 7, N 1, p. 113—136
Bergstra J. A., Tucker J. V. 1987. Algebraic specifications of computable and semicomputable data types. — Theor. Comp. Sci., 1987, v. 50, p. 137—181.
Bertoni A., Mauri G., Miglioli P., Ornaghi M. 1984. Abstract data types and their extension within a constructive logic. — Semantics of Data Types, Lecture Notes Comp. Sci, 1984, v. 173, p. 177—195.
Bibel W., Aspetsberger K. A. 1985. A bibliography on parallel inference machines. — J. Symb. Computation, 1985, v. 1, N 1, p. 105—118.
Bibel W. 1986a. Methods of automated reasoning. — In: Fundamentals of Artificial Intelligence, Lecture Notes Comp. Sci, 1986, v. 232, p. 171 — 217..
Bibel W. 1986b. Predicative programming revisited. — In: Math. Methods of Specification and synthesis of software systems’85, Lecture Notes Comp. Sci., 1986, v. 215, p. 25—40.
Bird R. S. 1986. An introduction to the theory of lists. — In: Logic Programming and Calculi of Descrete Design (M. Broy ed.), Springer-Verlag, 1986, p. 5—42.*
Bishop E. 1970. Mathematics as a numerical language. — In: Intuitionisrn and Proof Theory, North Holland, 1970, p. 53—71.
Bjorner D. 1977a. Programming languages: linguistics & semantics.— Proc, of Intern. Computing Symp., 1977, p. 511—536.
Bjorner D. 1977b. Programming languages: formal development of inter- pretators and compilers. — Ibid., p. 1—25.
Bjorner D. 1978. The Vienna Development Method: the Meta-Language.— Lecture Notes Como. Sci.. 1978, v. 61.
Bjorner D. 1980. Reference manual for the meta-language. — Lecture Notes Comp. Sci., 1980, v. 98, p. 607—624.
Bjorner D., Jones С, B. 1982. Formal specification and software development.— Prentice Hall, 1982.
Bjorner D., Prehs S. 1983 Software engineerings aspects of VDM.— Theory and practice of software technologies, 1983, p. 85—134.
Bledsoe W. W. 1977. Non-resolution theorem proving. — Artificial Intelligence, 1977, v. 9, N 1, p. 1—35.
Bobrow D , Raphael В 1974. New Programming languages for artificial intelligence research —ACM Computing Surveys, 1974, v. 6, p. 153—174.
Bowen K. A. 1985. Meta-language programming and knowledge representation.— New Generation Computing, 1985, v. 3, N 4, p. 359—383.
Boyer R. S., Moore J. S. 1984. Proof-checking, theorem proving and program verification. — In. Automated Theorem Proving: After 25 years, Contemporary Mathematics, 1984, v. 29, p 119—132.
Bratko I. 1986. Prolog programming for artificial intelligence. — Addison- Wesley P. C., 1986
Broda K, Gregory S. 1984 PARLOG for discrete event simulation. — Proc. 2nd Int. Logic Programming Conference, Uppsala, July, 1984.
Burstall R., Goguen J. 1980. The semantics of CLEAR, a specification language. — Leet. Notes Comp. Sci., 1980, v. 86, p. 292—332.
Burstall R. M., Macqueen D. B., Sanella D. T. 1980 Hope — an experimental applicative language. — Internal Report, Dpt. of Computer Sci., Univ, of Edinburgh, 1980.
Campbell J. A. (ed.) 1984. Implementations of Prolog. — Ellis Horwood, Chichester, 1984.
Chang C. L., Lee R. 1973. Symbolic logic and mechanical theorem proving.— N Y., Academic Press, 1973 [Имеется перевод: Чень Ч., Ли Р. Математическая логика и автоматическое доказательство теорем. — М/ Наука, 1983.]
Clark К. L, Stickel S. 1977. Predicate logic: a calculus for deriving programs. — In: 5th IJCAI, Cambridge, Mass, 1977.
Clark К L., Mckeeman W. M., Sickel S. 1982. Logic program specification of numerical integration — In: Logic Programming, Academic Press, 1982, p. 123—139. [Имеется перевод: Кларк К, Маккиман У., Зикель Ш Спецификация алгоритмов численного интегрирования на языке логических программ.— В сб.- Логическое программирование. — М.: Мир, 1988, с. 211—229.]
Clark К. L., McCabe F. G., Gregory S 1982. IC-PGOLOG language features —In: Logic Programming, Academic Press, 1982, p. 253—266 [Имеется перевод- Кларк К., Маккейб Ф., Грегори С. Средства языка IC-PRO- LOG. — В сб.: Логическое программирование.—М/ Мир, 1988, с 245—260.]
Clark К. L., Gregory S. 1986. PARLOG: parallel programming in logic.— ACM TOPLAS, 1986, v. 8, p. 1—49.
Clark K. L. 1986. PARLOG: the language and its applications. — In: Parallel Architectures and Languages Europe, v. 2: Parallel Languages, Lecture Notes Comp Sci., 1986, v. 259, p. 30—53
Cleary J., Cok К.-S., Unger B. 1985. Discrete event simulation in Prolog.— In: Artificial Intelligence, Graphics and Simulation (Birtwistle ed.), Proc. 1985 SCS Multiconference, SCS, 1985, p. 8—13.
Clement D., Despeyroux J., Despeyroux T, Kahn G. 1986. A simple applicative language: MINI-ML.— Rapport de Recherche en Informatique et en Automatique, 1986, N 529
Clocksin W. F., Mellish C. F. 1981. Programming in PROLOG. — Berlin: Springer-Verlag, 1981. [Имеется перевод: Клоксин У., Меллиш К- Программирование на языке Пролог. — М.: Мир, 1987.]
Cohn A., Milner R, 1982 On using Edinburgh LCF to prove correctness of a parsing algorithm —CSR-113-82, Computer Science Dpt, Edinburgh Univ., 1982
Colmerauer A., Kanoui H., Pasero R., Roussel P. 1973 Un systeme de communication homme-machine en Francais. — Research Report, Groupe Intelligence Artificielle, Universite aix Marseille, Luminy, 1973
Colmerauer А. 1989. Une introduction a Prolog III. — Foundations of Data Organization and Algorithms, Proc. 3rd Int. Conf., Paris, France, Lecture Notes Comp. Sci., 1989, v. 367, p. 264—288.
Constable R. L. 1972. Constructive mathematics and automatic program writers. —In: IFIP’71, North Holland, 1972, p. 229—233.
Constable R. L. et al. 1986. Implementing mathematics with the Nuprl proof development system. — Prentice Hall, 1986.
Coquand T., Huet G. 1985. Constructions: a higher-order proof system for mechanizing mathematics.— In: European Symp. on Computer Algebra, Lecture Notes Comp. Sci., 1985, v. 203, p.
Danforth S., Tomlison C. 1988. Type theories and object-oriented programming.— ACM Computing Surveys, 1988, v. 20, N 1, p. 29—72.
Dprlingtan J, Reeve M. 1981. 4LICE: a multi-processor reduction machine for the parallel evaluation of applicative languages. — In: Proc. 1981 ACM/MIT Conf, on functional programming languages and computer architecture, 1981, p. 65—75.
Darlington J., Henderson P., Turner D. A. (eds). 1982. Functional programming and its applications. — In: Cambridge Univ. Press. Cambridge, 1982.
Davis M. 1979. The prehistory of Automated Deduction. — In: 4th Workshop on Automated Deduction, Austin, Texas, 1979.
De Bruin N. G. 1980. A survey of the project AUTOMATH. — In: To H. B. Curry; Essays on Combinatory Logic, Lambda Calculus and Formalism, Academic Press, 1980, p. 579—606.
Delgrande J. P., Mylopoulos J. 1986. Knowledge representation: features of knowledge. — In: Fundamentals of Artificial Intelligence, Lecture Notes Comp. Sci., 1986, v. 232, p. 3—36.
Dershowitz N. 1982. Orderings for term-rewriting systems. — Theoretical Comp. Sci., 1982, v. 17, N 3, p. 279—301.
Deutsch T., Futo I., Papp I. 1986. The use of TC-Prolog for medical simulation.— In: Intelligent Simulation Environments (Luker and Adelsberger eds.), SCS, 1986, p. 29—34.
Dijkstra E. W. 1976. A discipline of programming. — Englewood Cliffs, N. Y., Prentice Hall, 1976. [Имеется перевод: Дейкстра Э. Дисциплина программирования — М.: Мир, 1978]
Domolki Р., Szeredi Р 1983. Prolog in practice. — In: IFIP’83, Elsevier Sci. Publishers (North Holland), 1983, p. 627—636. [Имеется перевод- До- мёлки Б., Середи П. Практическое использование Пролога. — В сб.: Логическое программирование.—М.- Мир, 1988.]
‘ Duce D. A., Fielding Е F. G. 1987. Formal specification — a comparison of two techniques. — The Computer J., 1987, v. 30, N 4, p. 316—327.
Van Emden M. Щ Kowalski R. A. 1976. The semantics of predicate logic as a programming language —J. ACM, 1976, v. 2 3, N 4, p. 733—742.
Ehrig Y„ Mahr B. 1985. Fundamentals of algebraic specifications. Vol. I: Equations and initial semantics. — EATCS (W. Broure, G. Rozenberg, A. Sa- lomaa eds.), Springer-Verlag, 1985.
Engeler E. 1986 Logic in computer science?—In: IFIP’86, North Holland, 1986, p. 393.
Eriksson L. H. 1984. Synthesis of a unification algorithm in a logic programming calculus. — J. of Logic Programming, 1984, v 1, N 3, p. 3—18.
Ershov A. P. 1977. On the partial computation principle. — Information processing letters, 1977, v. 6, N 2, p.
Ershov A. P. 1982. Mixed computation: potential applications and problems for study. — Theoretical Computer Science, 1982, v. 18, p.
Eisenbach S. (ed.) 1987. Functional programming: Languages, tools and architectures. — Chichester: Horwood, 1987.
Floyd R. 1967. Assigning meaning to programs. — In: Mathematical Aspects of Computer Science, Providence, 1967, p. 19—32.
Fribourg L. 1986. A strong restriction of the inductive completion procedure.— Proc. 13th ICALP, Leet. Notes in Comp. Sci., 1986, v. 226, p. 105—115.
Futatsugi K., Goguen J. A., Jouannaud J. P., Meseguer J. 1985. Principles of OBJ-2.— Proc. 12th ACM Symposium on Principles of Programming Languages (B. Reid ed.), ACM, 1985, p. 52—66.
Futo L, Gergeli T., Deutsch T. Logic Modelling. — In: Al applied to simulation (Kerckhoffs e. a. eds.), SCS, p. 117—129.
Gallier J. 1986. Logic for Computer Science. — New York: Harper and Row, 1986.
Garaviglia S. 1987. Prolog programming techniques and applications.— New York: Harper and Row, 1987.
Georgeff M. P., Lanski A. L., Bessiere P. 1985. A procedural Logic.— Proc. 9th IJCAI, Los Angeles, CA, 1985.
Gloess P. 1980. An experiment with the Boyer-Moore theorem-prover: a prove of the correctness of a simple parser of expressions. — In: 5th CADE, Lecture Notes Comp. Sci., 1980 v. 87, p. 154—169.
Goad C. A. 1980. Proofs as descriptions of computation. — 5th CADE, Lecture Notes Comp. Sci., 1980, v. 87, p. 39—52.
Goad C. A. 1980. Computational uses of the manipulation of formal proofs. — Stanford Univ. Department of CS, TR N STAN-CS-80-819, 1980.
Goguen J. A., Thatcher J. W., Wagner E. 1978. An initial algebra approach to the specification, correctness and implementation of abstract data types. — Current Trends in Programming Methodology (R. Yeh ed.). — Englewood Cliffs, NJ: Prentice Hall, 1978, p. 80—149.
Goguen J. A 1980. How to prove algebraic inductive hypotheses without induction. — Proc. 5th Conf. Autom. Deduct., Leet. Notes Comp. Sci, 1980, v. 87, p. 356—373.
Goguen J. A. 1984. Parameterized programming.— IEEE Transact, on Soft. Engineering, SE-10, 1984, N 5, p. 528—543.
Goguen J. A., Meseguer J. 1984. Equality, types, modules, and (why not?) generics for logic programming. — J. Logic Progr. 1984, v. 2, p. 179—210.
Goguen J. A., Meseguer J. 1985. Completeness of many-sorted equational logic. — Houston J. Mathematics., 1985, v. 11, N 3, p. 307—334.
Goncharov S. S., Ershov Y. L., Sviridenko D. I. 1986. Semantic programming.— IFIP’86, North Holland, 1986, p. 1093—1100.
Gordon M., Milner R., Wadsworth C. 1979. Edinburgh ICF: a mechanized logic of computation. — Lecture Notes Comp. Sci., 1979, v 87.
Grabowski J., Lescanne P., Wechler W. (eds.) 1988. Algebraic and logic programming. — Akademie-Verlag, Berlin, 1988.
Green C. 1969. Theorem proving by resolution as a basis for questionanswering systems. — Machine Intelligence, 1969, v. 4, p. 183—205.
Gregory S. 1987.
Parallel logic programming in PARLOG. — Addison-Wesley, 1987.
Hansson A., Tarnlund S. A. 1979. A natural programming calculus. — Proc.- 6th IJCAI, Tokyo, 1979, p. 348—360.
Hayashi S., Nakano H. 1988. PX: a computational logic. — MIT Press, 1988.
Heisei M., Reif W., Stephan W. 1988. Implementing verification strategies in the KIV-System. — Lecture iMotes Comp. Sci., 1988, v. 310, p. 131—140.
Hennessy M. 1988. Algebraic theory of processes. — MIT Press, 1988.
Henson M. S. 1987. Elements of functional languages. — Exford: Blackwell, 1987.
Henderson P. 1980. Functional programming. Application and implementation.— Englewood Cliffs: Prentice Hall Int., 1980 [Имеется перевод: Хендер-
сон П. Функциональное программирование. Применение и реализация. — М.: Мир, 1983.]
Hill R. 1974. LUSH-resolution and its completeness. — DCI Memo N 78, Univ, of Edinburgh, Dept, of Artificial Intelligence, 1974.
Hindley J. R., Lercher B., Seldin J. P. 1972. Introduction to combinatory logic. — Cambridge University Press, 1972.
Hoare C. A. R. 1969. An axiomatic basis of computer programming.— Comm. ACM, 1969, v. 12, p. 576—580.
Hoare C. A. R. 1985. The mathematics of programming. — Lecture Notes Comp. Sci., 1985, v. 206, p. 1 —18.
Hoare C. A. R., He Jifeng. 1986a. The weakest prespecification. Part 1.— Fundamenta Informaticae, 1986, v. 9, N 1, p. 51—84.
Hoare C. A. R., He Jifeng 1986b. The weakest prespecification. Part 2.— Fundamenta Informaticae, 1986, v. 9, N 2, p. 217—251.
Hoare C. A. R. 1989. The varieties of programming language. — TAP- SOFT’89, Lecture Notes Comp. Sci., 1989, v. 351, p. 1 —19.
Hoare C. A. R., Wirth N. 1973. An axiomatic definition of the programming language Pascal. — Acta Informatica, 1973, v. 2, p. 335—355.
Hogger C. J. 1984. Introduction to logic programming. — Academic Press, 1984 [Имеется перевод: Хоггер К. Введение в логическое программирование.— М.: Мир, 1988.]
Huet G., Hullot J. М. 1982. Proofs by induction in equational theories with constructors. — J. Comput. Syst. Sci., 1982, v. 87, p. 356—373.
Huet D. 1986a. Computation and deduction. — Carnegy Mellon Univ., 1986.-
Huet D. 1986b. Deduction and computation. — Fundamentals of AI, Lecture Notes Comp. Sci., 1986, v. 232, p. 39—74.
Hdghes J. 1982. Graph reduction with super-combinators. — Oxford Univ., Computing Lab., Technical Monograph PRG-28, 1982.
Hunt W. 1986. The mechanical verification of a microprocessor. H. D. L. Description to Guaranteed Correct Circuit Design. — North Holland, New York, 1986.
Ida T., Tanaka J. 1983. Functional programming with streams. — IFIP’83, North Holland, 1983, p. 265—270.
Jones С. B. 1986. Systematic software development using VDM. — Prentice Hall, 1986.
Jouannaud J. P., Kounalis E. 1986. Automatic proofs by induction in equational theories without constructors. — Proc. Symp. Logic in Comp. Sci., 1986, p. 358—366.
Kapur D., Narendran P., Rosenkrantz D. J., Zhang H., 1986. Proof by induction using test sets. — Leet. Notes Comp. Sci., 1986, v. 230, p. 99—117.
Kowalski R., Kuehner D. 1971. Linear resolution with selection function.— Artificial Intelligence, 1971, v. 2, p. 227—260.
Kowalski R. 1974. Predicate logic as a programming language. — In: IFIP’74, North Holland, 1974, p. 569—574-.
Kowalski R. 1979. Logic for problem solving. — North Holland, 1979.
Kowalski R. 1982a. Logic programming in the fifth generation. — In: Fifth Generation Conf., SPL International, London; July, 1982.
Kowalski R. 1982b. Logic as a computer language. — In: Logic Programming, Academic Press, 1982, p. 3—16.
Kowalski R. 1983. Logic programming. — IFIP’83, Elsevier Sci., 1983, p. 133—145. [Имеется ^перевод: Ковальский P. Логическое программирование.— В сб.: Логическое программирование.—М.: Мир, 1988.]
Kowalski R. 1984а. The relationship between logic programming and logic specification. — Philosophical Trans, of the Royal Soc. of London, 1984, v. 312. p. 345—357.
Kowalski R. 1984b. Logic for knowledge representation. — 4th conf. FST&TCS, Lecture Notes Comp. Sci., 1984, v. 181, p. 1 —12.
Kowalski R. A., Bowen K. A eds. 1988. Logic Programming. Vol. 1, 2.— MIT Press, 1988
Lenat D. 1984. Automated theory formation in mathematics. — In: Contemporary Mathematics, 1984, V. 29, p. 287—314.
Levi G. 1986a. New research directions in logic specification languages — IFIP’86, North Holland, 1986, p. 1005—1008.
Levi G. 1986b. Logic programming: the foundations, the approach and the role of concurrency. — In: Current Trends in Concurrency, Lecture Notes Comp. Sci., 1986, v. 224, p. 396—441.
LLoyd J. W. 1984. Foundations of logic programming. — Springer-Verlag, 1984.
Loveland D. W. 1968. Mechanical theorem proving by model elimenation.— J. ACM, 1968, v. 15, N 2, p. 236—251.
Loveland D. W. 1970. A linear format for resolution. — Proc. IRIA Symp. Automatic Demonstration, LNM 125, Springer-Verlag, 1970, p. 147— 162.
Loveland D. W. 1978. Automated theorem proving: a logical basis.— North Holland, 1978.
Loveland D. W. 1984. Automated theorem proving: a quarter century review.— In: Contemporary Mathematics, 1984, v. 29, p. 1—45.
Luckham D., Nilsson N. J. 1971. Extracting information from resolution proof trees. — Artificial Intelligence, 1971, v. 2, N 1, p. 27—54.
Manna Z., Waldinger R. 1971. Towards automatic program synthesis.— Lecture Notes Math., 1971, v. 188'
Manna Z., Waldinger R. 1979. Synthesis: dreams -> programs. — IEEE Trans, on Software Engineering, 1979, v. 5, N 4, p. 294—328.
Manna Z., Waldinger R. 1985. The logical basis for computer programming. Vo) 1: Deductive reasoning. — Addison-Wesley, 1985.
Martelli A, Montanari U. 1982. An efficient unification algorithm. — ACM TOPLAS, 1982, v. 4, N 2, p 258—282.
Martin-Lof P. 1982. Constructive mathematics and Computer Programming — In: Proc. 6th Int. Congress on Logic, Methodology and Philosophy of Sci, North Holland, 1982, p 153—178.
McCarthy J. 1961. A basis for a mathematical theory of computation — Proc. Western Joint Comp. Conf, Los Angeles, May 1961, p. 225—238.
McCarthy J., Abrahams P. W, Edwards D. J, Hart T. P., Levin M. I. 1962. The Lisp 15 Programmer’s Manual. — MIT Press, Cambridge (Mass).
McCarthy J. 1963. Towards a mathematical science of computation. — Proc. IFIP-63, p. 21—28
McDermott D., Doyle J. 1980. Non-monotonic logic I.—Artificial Intelligence, 1980, v. 13, N 1—2, p. 41—72
Miller D., Nadathur G 1986. Higher order logic programming. — 3rd Int. Logic Programming Conf., 1986, p. 448—462.
Milner R. 1984. The standard ML core language. — Univ of Edinburgh, Department of Computer Sci., 1984.
Musser D. 1980. On proving inductive properties of abstract data types — Proc. 7th ACM Symp. on Principles of Programming Languages, 1980, p. 154—162.
Nadathur G., Miller D. 1988 An overview of XProlog —5th Int. Symp. on Logic Programming, 15—19 August 1988, Seattle, Washington.
Naish L. Negation and control in Prolog. — Lecture Notes Comp. Sci., v. 238, 119 p.
Naur P. 1969. Proofs of algorithms by general snapshots. — BIT, 1969, v 6, p 310—316.
Nemeti Т. 1986. On logic in computer science. — In: IFIP’86, North Holland, 1986, p. 395.
Nepeivoda N. N. 1982. Logical approach to programming. — In: Proc. 6th Int. Congress on Logic, Methodology and Philosophy of Science, North Holland, 1982, p. 109—122.
Nokel K„ Rehbold R., Richter M. M. 1987. Remarks on SASL and the verification of functional programming languages. — In: Computation Theory and Logic, Lecture Notes Comp. Sci., 1987, v. 270, p. 265—276.
Oest O. N. 1986. VDM from research to practice. — In: IFIP’86, North- Holland, 1986, p. 527—533.
Parikh R. 1986. Some recent contributions of logic to computer science.— IFIP’86, North-Holland, 1986, p. 391—392.
Paterson M. S., Wegman M. N. 1978 Linear unification. — J. of Computer and System Sci., 1978, v. 16, p. 158—167.
Pereira L. M. Nasr R. 1984. Delta-Prolog: a distributed logic programming language. — In: Proc. Int. Conf, on Fifth Generation Systems, Tokyo, 1984, p. 263—290.
Pereira L. M., Monteiro J. C., Cunha J., Aparicio J. 1986. Delta Prolog: a distributed backtracking extension with events. — Proc. 3rd Int. Conf, on Logic Programming, July 1986.
Peyton-Jones S. L. 1987. The implementation of functional programming languages. — Prentice Hall Int., 1987.
Quine W. V. O. 1960. Word and object. — MIT Press, Cambridge, 1960.
Robinson J. A., Sibert E. E. 1982. LOGLISP: Motivation, Design and Implementation. — Logic Programming, Academic Press, 1982, p. 299—313. [Имеется перевод: Робинсон Дж., Зиберт Э. Логлисп: мотивировка, основные возможности и реализация — В об/. Логическое программирование. М/. Мир, 1988.]
Robinson J. А. 1965. A machine-oriented logic based on the resolution principle.— J. ACM, 1965, v. 12, p. 23—41. [Имеется перевод: Робинсон Дж. Машинно-ориентированная логика, основанная на принципе резолюции.— Кибернетический сборник, вып. 7, 1970, с. 194—218.]
Robinson J. А. 1983.
Logic programming: past, present and future. — New Generation Computing, 1983, v. 1, p. 107—124. [Имеется перевод: Робинсон Дж. Логическое программирование- прошлое, настоящее и будущее. — В сб : Логическое программирование.— М.: Мир, 1988]
Robinson J. А. 1986. The future of logic programming. — IFIP’86, North Holland, 1986, p. 219—224.
Russell B., Whitehead A. N. 1910, 1925. Principia Mathematica. — Cambridge University Press, 1910, 1925
Sakama C., Itoh H. 1988. Partial evaluation of queries in deductive databases.— New Generation Computing, 1988, v. 6, № 2—3, p. 249—258.
Santane-Toth E., Szeredy P. 1982. Prolog applications in Hungary. — In: Logic Programming, Academic Press, 1982, p. 17—31.
' Saraswat V. A. 1987. The concurrent language CP: Definition and operational semantics. — Proc. 14th Symp. on Principles of Programming Languages, ACM, 1987, p. 49—62.,
Scherlis W. L_, Scott D. S. 1983. First steps towards inferential programming. — IFIP’83, 1983, North Holland, p. 199—212.
Scott D. S. 1976. Data types as lattices. — SIAM J. on Computing, 1976, v. 5, p. 522—587.
Scott D. S. 1981. Lectures on a mathematical theory of computation.— Oxford Univ., Computing Laboratory, PRG-19, 1981.
Shankar N. 1985. Towards mechanical metamathematics. — JAR, 1985, v. 1, N 4, p. 407—434.
Shapiro Е. 1986. Concurrent Prolog: a progress report. — Fundamentals of AI, Lecture Notes Comp. Sci., 1986, v. 232, p. 277—313.
Smets E. A. eds. 1988. Non-standard logics for automated reasoning.— Academic Press, 1988.
Smyth M. B. 1978. Power domains. — J. Comput. System Sci., 1978, v. 16, p. 23—36.
Sterling L., Shapiro E. 1986. The art of Prolog: Advanced programming techniques —MIT Press, Cambridge, Mass., 1986.*
Stickel M. E. 1986. An introduction to automated deduction. — In: Fundamentals of Artificial Intelligence, Lecture Notes Comp. Sci., 1986, v. 232, p. 75-132.
Stoy J.E 1980. Foundations of denotational semantics. — Leet. Notes Comp. Sci., 1980, v. 86, p 43—99.
Sokolowski S 1989. Applicative higher-order programming, or Standard ML in the Battlefield —Universitat Passau, Facultat fur Mathematik and Informa- tik, 1989.
Takasu S, Nakahara T. 1983. Programming with mathematical thinking.— IFIP’83, North Holland, p. 419—424.
Takasu S. 1986. Logic and computation. The future of logic in computer science. — IFIP’86, North Holland, p 397.
Tanaka J., Ueda K., Miyazaki T., Takeuchi A., Matsumoto Y., Furukawa K. 1986 Guarded Horn Clauses and Experience with paiallel logic programming — Proc. Fall Joint Conf., IEEE Computer Soc , 1986.
Toyama Y. 1986 How to prove equivalence of term-rewriting systems without induction. — Leet Notes Comp. Sci, 1986, v. 230, p. 118—127.
Turner D. A. 1979a. Another algorithm for bracket abstraction.—J. Symb. Log, 1979, v 44, N 2, p. 267-270.
Turner D. A. 1979b A new implementation tehnique for applicative languages. — Software Practice and Experience, 1979, v. 9, p. 31—49.
Turner D A. 1982 Recursive equations as a. programming language. — In: Functional programming and its applications, Cambridge University Press, 1982, p. 1—28.
Turner D. A. 1983. SASL language manual — revised version. — Univ, of Kent, Canterbury, 1983
Turner D. A. 1985. Miranda: a non-strict functional language with poli- morphic types — In- Functional Programming Languages and Computer Architecture, Lecture Notes Comp. Sci, 1985, v. 201, p I —16.
Turner D A. 1986 An overview of Miranda —SIGPLAN Notices, 1986, v 21, N 12, p 158—166.
Turner D. A. 1987. Functional programming and communicating processes. In: Parallel Architectures and Computers Europe, v. 2, Lecture Notes Comp Sci., 1987, v. 259, p 59—74.
Tyugu E. H 1986a. Language and examples of knowledge-based programming. - In: Mathematical methods of specification and synthesis of software systems, Lecture Notes Comp Sci., 1986, v. 215, p. 59—72.
Tyugu E. H 1986b. The future of logic programming. — IFIP’86, North Holland, p. 225—228
Uchida S. 1986. Towards the parallel inference machine. — CONPAR, Lecture Notes Comp. Sci, 1986, v 237, p. 404—418
Ueda K. 1986. Guarde Horn Clauses —PhD Thesis, University of Tokyo, 1986.
Vadera S. 1988. A theory of unification. — Software Engineering J., Sep- temb 1988, p. 149—160
Wang Hao 1960 Towards mechanical mathematics. — IBM J. Research and Development, 1960, v. 4, N 1, p. 2—22. [Имеется перевод: Ван Хао. На
пути к механической математике.—Кибернетический сборник (старая серия), вып. 5, 1962, с. 114—165.]
Warren D. Н. D. 1977 Implementing Prolog: compiling predicate logic programs. v 1 — Research Report N 39, Dpt of AI, Univ, of Edinburgh, May 1977.
Warren D. H. D. 1977 Implementing Prolog: compiling predicate logic programs, v. 2. — Research Report N 40, Dpt of AI, Univ of Edinburgh, May 1977.
Warren D. H. D. 1983. An abstract Prolog instruction set. — Technical Note 309, SRI International, October 1983
Weyhrauch R W„ 1980. Prolegomena to a theory of mechanized formal reasoning. — Artificial Intelligence, 1980, v. 13, p. 133--170.
Wos L. 1987. Automated reasoning: 33 basic research problems. — Prentice Hall, 1987.
СОДЕРЖАНИЕ
Предисловие редакторов перевода 5
Дж. Бэкус. Алгебра функциональных программ: мышление функционального уровня, линейные уравнения и обобщенные определения. Перевод Манциво- ды А. А 8
Дополнение переводчика 54
Д. С. Скотт. Области в денотационной семантике. Перевод Воронкова А. А. 56
Дж. Р. Хиндли. Комбинаторы и лямбда-исчисления. Краткий обзор. Перевод Найдича Д. Э. 119
С. Л. Пейтон Джоунз. Введение в суперкомбинаторы для вполне задержанных вычислений. Перевод Антимирова В. М. 141
Ж. Юэ, Д. Оппен. Равенства и правила переписывания. Обзор. Перевод Дегтярёва А. И. 176
Д. Миллер. Логический анализ модулей в логическом программировании. Перевод Воронкова А. А 233
Дж. А. Гоген, Ж. Мезегер. Модели и равенство в логическом программировании. Перевод Антимирова В. М. 274
К. А. Гоуд. Доказательства как описания вычислений. Перевод Воронкова А. А 311
В. М. Антимиров, А. А. Воронков, А. И. Дегтярёв, М. В. Захарьящев, В. С. Проценко. Математическая логика в программировании. Обзор .... 331
Научное издание
МАТЕМАТИЧЕСКАЯ ЛОГИКА В ПРОГРАММИРОВАНИИ
Сборник статей
Заведующий редакцией академик В.И. АрнольдЗам. зав. редакцией А.С. Попов. Научный редактор О.Р. Чуян.Мл. научи, ред. Т.Н). Дехтярева. Художник Н.Я. Вовк.Художественный редактор В.И. Шаповалов.Технический редактор И.М. Кренделева. Корректор В.И. Киселева.
ИБ № 7327
Сдано в набор 13.04. 90 г. Подписано к печати 20.02.91 г. Формат 60 х 90/16.
Бумага офсетная №1. Печать офсетная. Гарнитура латинская. Объем 12,75 бум. л. Усл. печ. л. 25,50. Усл. кр. отт. 26,00. Уч. изд. л. 23,90. Изд. № 1/7626.
Тираж 7000 экз. Зак. № 12 09 Цена 6 р.
Издательство ’’Мир”. 129 820, ГСП, Москва, И-110, 1-й Рижский пер., 2.
Ордена Трудового Красного Знамени Московская типография №7’’Искра революции”. 103001, Москва, Трехпрудный пер., 9.
5. ПРИСВАИВАНИЕ ТИПА В КОМБИНАТОРНОЙ ЛОГИКЕ
Типовые термы соответствуют стандартному понятию функ
жет быть определена без предварительного указания ее области
4) Пусть для заданного частично упорядоченного множества (S, ^) через = обозначается транзитивное симметричное замыкание ^. Тогда =
3) Во многих случаях этим классом будет класс инициальных моделей, в которых выполняется Р.
*) См. также книгу [Ершов Ю. Л., Палютин Е. А. Математическая логика. — М.: Наука, 1987] и статью Г. Генцена в сборнике [Математическая теория логического вывода. — М.: Наука* 1970]. — Прим. ред.
2) Иначе — допущения или гипотезы —Прим. ред.
3) Или правило «разбора случаев».—Прим. ред.
СОДЕРЖАНИЕ
МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ
МАТЕМАТИЧЕСКАЯ
ЛОГИКА
В ПРОГРАММИРОВАНИИ
Сборник статей
Перевод с английского
под редакцией
М. В. Захарьящева и Ю. И. Янова
Москва «Мир» 1991
ББК 32.973
М34
УДК 681.3
Математическая логика в программировании: Сб. статей М34 1980—1988 гг.: Пер. с англ.—М.: Мир, 1991.—408 с.
ISBN 5-03-001635-Х
Сборник работ зарубежных специалистов, отражающий новые результаты в теоретическом и практическом программировании на основе применения идей и методов математической логики. В него включены статьи по функциональному программированию, лямбда-исчислению, автоматическому поиску логического вывода, методам работы с равенствами. Среди авторов статей—известные специалисты: Дж. Бэкус, Д. Оппен, Д. Скотт (США), Дж. Р. Хиндли, С. Л. Пейтон Джоунз (Англия).
Для программистов разной квалификации, специалистов в области языков программирования и математической логики, аспирантов и студентов вузов.
ББК 32.973ББК 32.973М J6^^^2^ 20-90
ББК 32.973
ББК 32.973
041(00—91
Редакция литературы по математическим наукам
ISBN 5-03-001635-ХISBN 5-03-001635-Х© состав, М. В. Захарьящев, Ю. И. Янов 1991
ISBN 5-03-001635-Х
ISBN 5-03-001635-Х
© перевод на русский язык, с дополнениями, коллектив переводчиков, 1991