Программирование набора ответов ( ASP ) — это форма декларативного программирования, ориентированная на сложные (в первую очередь NP-трудные ) задачи поиска . Она основана на семантике стабильной модели (набора ответов) логического программирования . В ASP задачи поиска сводятся к вычислению стабильных моделей, а решатели наборов ответов — программы для генерации стабильных моделей — используются для выполнения поиска. Вычислительный процесс, используемый при проектировании многих решателей наборов ответов, является усовершенствованием алгоритма DPLL и, в принципе, всегда завершается (в отличие от оценки запроса Prolog , которая может привести к бесконечному циклу ).
В более общем смысле ASP включает в себя все приложения наборов ответов для представления знаний и рассуждений [1] [2] , а также использование оценки запросов в стиле Пролога для решения проблем, возникающих в этих приложениях.
Ранним примером программирования наборов ответов был метод планирования , предложенный в 1997 году Димопулосом, Небелем и Кёлером. [3] [4] Их подход основан на связи между планами и стабильными моделями. [5] В 1998 году Сойнинен и Ниемеля [6] применили то, что сейчас известно как программирование наборов ответов, к проблеме конфигурации продукта . [4] В 1999 году термин «программирование наборов ответов» впервые появился в книге «Парадигма логического программирования» как название сборника из двух статей. [4] Первая из этих статей определила использование решателей наборов ответов для поиска как новую парадигму программирования . [7] В том же году Ниемеля также предложил «логические программы со стабильной семантикой модели» в качестве новой парадигмы. [8]
Lparse — это название программы, которая изначально была создана как инструмент заземления (front-end) для решателя набора ответов smodels. Язык, который принимает Lparse, теперь обычно называется AnsProlog, [9] сокращение от Answer Set Programming in Logic . [10] Теперь он используется таким же образом во многих других решателях наборов ответов, включая assat, clasp, cmodels, gNt, nomore++ и pbmodels. (dlv является исключением; синтаксис программ ASP, написанных для dlv, несколько отличается.)
Программа AnsProlog состоит из правил вида
< голова > :- < тело > .
Символ :-
("if") опускается, если <body>
пуст; такие правила называются фактами . Простейшим видом правил Lparse являются правила с ограничениями .
Еще одна полезная конструкция, включенная в этот язык, — это choice . Например, правило выбора
{ п , д , р }.
говорит: выберите произвольно, какой из атомов включить в стабильную модель. Программа Lparse, которая содержит это правило выбора и никаких других правил, имеет 8 стабильных моделей — произвольные подмножества . Определение стабильной модели было обобщено на программы с правилами выбора. [11] Правила выбора можно также рассматривать как сокращения для пропозициональных формул в рамках семантики стабильной модели . [12] Например, правило выбора выше можно рассматривать как сокращение для конъюнкции трех формул « исключенного третьего »:
Язык Lparse позволяет нам также писать «ограниченные» правила выбора, такие как
1 { п , д , р } 2.
Это правило гласит: выберите хотя бы 1 из атомов , но не более 2. Значение этого правила в рамках стабильной модельной семантики представлено пропозициональной формулой
Границы мощности можно использовать и в тексте правила, например:
:- 2 { п , д , г }.
Добавление этого ограничения в программу Lparse исключает стабильные модели, которые содержат не менее 2 атомов . Значение этого правила можно представить пропозициональной формулой
Переменные (с заглавной буквы, как в Prolog ) используются в Lparse для сокращения наборов правил, которые следуют одному шаблону, а также для сокращения наборов атомов в пределах одного правила. Например, программа Lparse
p ( a ). p ( b ). p ( c ). q ( X ) :- p ( X ), X ! = a .
имеет то же значение, что и
п ( а ). п ( б ). п ( в ). кв ( б ). кв ( в ).
Программа
п ( а ). п ( б ). п ( в ). { q ( X ):- п ( X )} 2.
это сокращение от
п ( а ). п ( б ). п ( в ). { д ( а ), д ( б ), д ( в )} 2.
Диапазон имеет вид :
( начало .. конец )
где start и end — константные арифметические выражения. Диапазон — это сокращенная форма записи, которая в основном используется для определения числовых доменов совместимым способом. Например, факт
а ( 1..3 ).
это сокращение для
а ( 1 ). а ( 2 ). а ( 3 ).
Диапазоны также можно использовать в текстах правил с той же семантикой.
Условный литерал имеет вид:
р ( Х ) : д ( Х )
Если расширение q
есть {q(a1), q(a2), ..., q(aN)}
, то указанное выше условие семантически эквивалентно написанию {p(a1), p(a2), ..., p(aN)}
на месте условия. Например,
q ( 1..2 ). a :- 1 { p ( X ) : q ( X )}.
это сокращение от
д ( 1 ). д ( 2 ). а :- 1 { п ( 1 ), п ( 2 )}.
Чтобы найти стабильную модель программы Lparse, хранящуюся в файле, ${filename}
мы используем команду
% lparse ${ имя_файла } | smodels
Опция 0 предписывает smodels найти все стабильные модели программы. Например, если файл test
содержит правила
1 { p , q , r } 2. s :- не p .
затем команда выдает вывод
% lparse test | smodels 0 Ответ: 1 Стабильная модель: qp Ответ: 2 Стабильная модель: p Ответ: 3 Стабильная модель: rp Ответ: 4 Стабильная модель: qs Ответ: 5 Стабильная модель: rs Ответ: 6 Стабильная модель: rqs
-Раскраска графа — это функция , такая что для каждой пары смежных вершин . Мы хотели бы использовать ASP, чтобы найти -раскраску заданного графа ( или определить, что она не существует).
Это можно сделать с помощью следующей программы Lparse:
в ( 1. . н ). 1 { цвет ( X , I ) : c ( I )} 1 :- v ( X ). :- цвет ( X , I ), цвет ( Y , I ), e ( X , Y ), c ( I ).
Строка 1 определяет числа, которые будут цветами. Согласно правилу выбора в строке 2, каждой вершине должен быть назначен уникальный цвет . Ограничение в строке 3 запрещает назначать один и тот же цвет вершинам , если есть ребро, соединяющее их.
Если мы объединим этот файл с определением , например,
v ( 1..100 ). % 1,...,100 — вершины e ( 1 , 55 ). % существует ребро из 1 в 55 . . .
и запустите на нем smodels, указав в командной строке числовое значение , тогда атомы формы в выходных данных smodels будут представлять собой -раскраску .
Программа в этом примере иллюстрирует организацию «генерировать и тестировать», которая часто встречается в простых программах ASP. Правило выбора описывает набор «потенциальных решений» — простое надмножество набора решений для данной задачи поиска. За ним следует ограничение, которое исключает все потенциальные решения, которые неприемлемы. Однако процесс поиска, используемый smodels и другими решателями наборов ответов, не основан на пробах и ошибках .
Клика в графе — это набор попарно смежных вершин. Следующая программа Lparse находит клику размера в заданном ориентированном графе или определяет, что она не существует:
н { в ( X ) : v ( X )}.:- в ( X ), в ( Y ), X ! = Y , а не e ( X , Y ).
Это еще один пример организации «генерируй и тестируй». Правило выбора в строке 1 «генерирует» все множества, состоящие из вершин. Ограничение в строке 2 «отсеивает» множества, которые не являются кликами.
Гамильтонов цикл в ориентированном графе — это цикл , который проходит через каждую вершину графа ровно один раз. Следующая программа Lparse может быть использована для поиска гамильтонова цикла в заданном ориентированном графе, если он существует; мы предполагаем, что 0 — одна из вершин.
{ в ( X , Y )} :- е ( X , Y ).:- 2 { в ( X , Y ) : е ( X , Y )}, v ( X ).:- 2 { в ( X , Y ) : е ( X , Y )}, v ( Y ).r ( X ) :- in ( 0 , X ), v ( X ).г ( Y ) :- г ( X ), в ( X , Y ), е ( X , Y ).:- не r ( X ), v ( X ).
Правило выбора в строке 1 «генерирует» все подмножества множества ребер. Три ограничения «отсеивают» подмножества, которые не являются гамильтоновыми циклами. Последнее из них использует вспомогательный предикат (« достижимо из 0»), чтобы запретить вершины, не удовлетворяющие этому условию. Этот предикат определяется рекурсивно в строках 6 и 7.
Эта программа является примером более общей организации «сгенерировать, определить и проверить»: она включает определение вспомогательного предиката, который помогает нам исключить все «плохие» потенциальные решения.
В обработке естественного языка синтаксический анализ на основе зависимостей можно сформулировать как проблему ASP. [13] Следующий код анализирует латинское предложение "Puella pulchra in villa linguam latinam discit", "красивая девушка изучает латынь на вилле". Синтаксическое дерево выражается предикатами дуг , которые представляют зависимости между словами предложения. Вычисляемая структура представляет собой линейно упорядоченное корневое дерево.
% ********** введите предложение ********** слово ( 1 , puella ). слово ( 2 , пульхра ). слово ( 3 , в ). слово ( 4 , вилла ). слово ( 5 , язык ). слово ( 6 , лат. ). слово ( 7 , дисцит ). % ********** лексикон ********** 1 { node ( X , attr ( pulcher , a , fem , nom , sg )); узел ( X , attr ( pulcher , a , fem , abl , sg )) } 1 :- слово ( X , pulchra ). узел ( X , attr ( latinus , a , fem , acc , sg )) : -word ( X , latinam ). 1 { узел ( X , attr ( puella , n , fem , nom , sg )); узел ( X , атрибут ( puella , n , fem , abl , sg )) } 1 :- слово ( X , puella ). 1 { узел ( X , атрибут ( villa , n , fem , nom , sg )); узел ( X , attr ( вилла , н , жен , абл , ед )) } 1 :- слово ( X, вилла ). узел ( X , атрибут ( linguam , n , fem , acc , sg )) :- слово ( X , linguam ). узел ( X , атрибут ( discere , v , pres , 3 , sg )) :- слово ( X , discit ). узел ( X , атрибут ( in , p )) :- слово ( X , in ). % ********** синтаксические правила ********** 0 { дуга ( X , Y , subj ) } 1 :- узел ( X , атрибут ( _ , v , _ , 3 , sg )), узел ( Y , атрибут ( _ , n , _ , nom , sg )). 0 { дуга ( X , Y , dobj ) } 1 :- узел ( X , атрибут ( _ , v , _ , 3 , sg )), узел ( Y , атрибут ( _ , n , _ , acc , sg )). 0 { дуга ( X , Y , атрибут ) } 1 :- узел ( X , атрибут ( _ , n , Пол , Случай , Число )), узел ( Y , атрибут ( _ , a , Пол , Случай, Number )). 0 { arc ( X , Y , prep ) } 1 :- node ( X , attr ( _ , p )), node ( Y , attr ( _ , n , _ , abl , _ )), X < Y . 0 { arc ( X , Y , adv ) } 1 :- node ( X , attr ( _ , v , _ , _ , _ )), node ( Y , attr ( _ , p )), не leaf ( Y ). % ********** гарантируя древовидность графа ********** 1 { root ( X ) : node ( X , _ ) } 1. :- arc ( X , Z , _ ), arc ( Y , Z , _ ), X ! = Y . :- дуга ( X , Y , L1 ), дуга ( X , Y , L2 ), L1 ! = L2 . путь ( X , Y ) :- дуга ( X , Y , _ ). путь ( X , Z ) :- дуга ( X , Y , _ ), путь ( Y , Z ). :- путь ( X , X ). :- корень ( X ), узел ( Y, _ ), X ! = Y , а не путь ( X , Y ). лист ( X ) :- узел ( X , _ ), а не дуга ( X , _ , _ ).
Рабочая группа по стандартизации ASP разработала стандартную спецификацию языка, названную ASP-Core-2, [14] , к которой стремятся современные системы ASP. ASP-Core-2 является эталонным языком для конкурса по программированию Answer Set, в котором решатели ASP периодически сопоставляются с рядом эталонных задач.
Ранние системы, такие как smodels, использовали возврат для поиска решений. По мере развития теории и практики решателей булевых SAT , ряд решателей ASP были построены поверх решателей SAT, включая ASSAT и Cmodels. Они преобразовывали формулу ASP в предложения SAT, применяли решатель SAT, а затем преобразовывали решения обратно в форму ASP. Более поздние системы, такие как Clasp, используют гибридный подход, используя конфликтно-управляемые алгоритмы, вдохновленные SAT, без полного преобразования в форму булевой логики. Эти подходы позволяют значительно улучшить производительность, часто на порядок, по сравнению с более ранними алгоритмами возврата.
Проект Potassco выступает в качестве зонтика для многих из перечисленных ниже систем, включая clasp , системы заземления ( gringo ), инкрементальные системы ( iclingo ), решатели ограничений ( clingcon ), язык действий для компиляторов ASP ( coala ), реализации распределенного интерфейса передачи сообщений ( claspar ) и многие другие.
Большинство систем поддерживают переменные, но только косвенно, принудительно заземляя, используя систему заземления, такую как Lparse или gringo в качестве front-end. Необходимость заземления может вызвать комбинаторный взрыв предложений; таким образом, системы, которые выполняют заземление на лету, могут иметь преимущество. [15]
Реализации программирования наборов ответов, основанные на запросах, такие как система Galliwasp [16] и s(CASP) [17], полностью избегают заземления, используя комбинацию резолюции и коиндукции .