Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Sb99055

.pdf
Скачиваний:
6
Добавлен:
13.02.2021
Размер:
411.94 Кб
Скачать

% Назначаем произвольный цвет каждому узлу (стране)

1 {color(X, C) : colors(C) } 1 :- countries(X). % Соседние страны (узлы) не могут иметь один цвет

:- color(X1, C), color(X2, C), neighbour(X1,X2). % Удаление симметричных решений

:- color(germany, red).

:- color(france, red).

#show color/2.

В результате будет получено 4 набора ответов следующего вида:

color(belgium,red) color(netherlands,green)

color(france,green) color(germany,blue)

color(denmark,red)

Следует отметить, что ограничения целостности, удаляющие симметричные решения, не являются обязательными. Без их использования получается 12 симметричных решений.

2.4. Задача о максимальной клике

Кликой в графе называется набор узлов, в которых есть дуга между каждой парой узлов. Задача о максимальной клике подразумевает поиск в графе клики максимального размера.

% Исходные данные с двумя кликами (1,2,4) and (3, 5)

edge(1, (1;2;4)). edge(2, (1;2;4)).

edge(4, (1;2;4)). edge(3, (3;5)). edge(5, (3;5)). % Вершина графа node

node(X) :- edge(X,Y).

node(Y) :- edge(X,Y).

% Минимальный размер клики

#const n = 2.

% in - входит в клику (с учётом минимума n)

n {in(X) : node(X)}. % Критерии клики

:- in(X), in(Y), node(X), node(Y), X!=Y, not

edge(X,Y), not edge(Y,X).

% Поиск максимальной клики

#maximize { 1,X : in(X), node(X)}.

#show in/1.

21

В результате будет следующий набор ответов:

Answer: 1 in(3) in(5)

Optimization: -2

Answer: 2 in(1) in(2) in(4)

Optimization: -3

OPTIMUM FOUND

2.5.Судоку

Взадаче судоку дано поле 9×9, которое поделено на 9 групп клеток 3×3.

Вкаждую клетку может быть записана цифра от 1 до 9. При этом должны выполняться условия: каждая цифра должна ровно один раз встретиться в каждой строке, в каждом столбце и в каждой группе клеток. Первоначально в судоку заполнены часть клеток цифрами.

% Исходные данные для задачи x(1, 4, 7). x(1, 5, 9).

x(2, 3, 5). x(2, 4, 8). x(2, 6, 1). x(2, 7, 6). x(2, 8, 7).

x(3, 1, 3). x(3, 6, 6).

x(4, 2, 9). x(4, 3, 3). x(4, 5, 6). x(4, 7, 5). x(5, 1, 6). x(5, 6, 5). x(5, 7, 3). x(5, 9, 1). x(6, 6, 9). x(6, 9, 4).

x(7, 1, 7). x(7, 4, 1). x(7, 6, 3). x(7, 7, 8). x(9, 4, 6). x(9, 6, 8).

% Значения, которые могут записываться в клетки val(1..9).

% Границы групп клеток border(1;4;7).

% Проверка уникальности цифр в группе клеток

1 { x(X,Y,N) : val(X), val(Y), X1<=X, X<=X1+2, Y1<=Y, Y<=Y1+2 } 1 :- val(N), border(X1), border(Y1).

% Проверка уникальности цифр по строкам и столбцам

1 { x(X,Y,N) : val(N) } 1 :- val(X), val(Y). 1 { x(X,Y,N) : val(X) } 1 :- val(N), val(Y). 1 { x(X,Y,N) : val(Y) } 1 :- val(N), val(X).

%Альтернативы

%:- 2 { x(X,Y,N) : val(N) }, val(X), val(Y).

22

%:- 2 { x(X,Y,N) : val(X) }, val(N), val(Y).

%:- 2 { x(X,Y,N) : val(Y) }, val(N), val(X).

В результате получается один набор ответов.

2.6.Упражнения

1.Напишите программу вычисления чисел Фибоначчи: x(n) = x(n-1) + x(n-2). Вычислите сумму всех чётных элементов, не превышающих 1 миллион.

2.У посетителя ресторана 1505 рублей. Стоимости блюд заданы следующими фактами:

price(mixed_fruit,215). price(french_fries,275). price(side_salad,335). price(mozzarella_sticks,420).

price(samples_place,580). price(host_wings,355).

Необходимо написать программу, которая позволит купить блюда ровно на имеющуюся сумму.

3.Напишите программу, которая вычислит, какое наименьшее количество монет нужно, чтобы можно было оплатить любую одну покупку стоимостью до 1 рубля? Доступные монеты 1, 2, 5, 10, 20 и 50 копеек.

4.Если сложить все числа меньшие 10, которые без остатка делятся на 3

ина 7, то получится 25 (числа 3, 6, 9 и 7). Напишите программу, которая вычислит сумму всех чисел, которые без остатка делятся на 3 и на 7, меньшие

500.

5.Напишите программу, которая восстановит номер телефона, если да-

ны четыре номера: (946) 215 78 30, (860) 439 12 57, (164) 029 78 53, (682) 431 90 75. Известно, что в каждом из них четыре цифры стоят на правильных местах.

6.В вечеринке участвовали Betty, Chris, Donald, Fred, Gary, Mary и Paul,

они хотят сфотографироваться и у них есть следующие предпочтения:

– Betty хочет стоять рядом с Gary и Mary;

– Chris хочет стоять рядом с Betty и Gary;

– Fred хочет стоять рядом с Mary и Donald;

– Paul хочет стоять рядом с Fred и Donald.

Все ограничения не могут быть одновременно удовлетворены. Необходимо найти решение, которое максимизирует количество удовлетворённых ограничений.

23

7. В банк привезли несколько сумок с золотыми монетами. В сумках было 16, 17, 23, 24, 39 и 40 монет. Грабители украли несколько сумок. В сумме недосчитались 100 золотых монет. Необходимо написать программу, которая вычислит, сколько сумок было украдено.

3. Программирование с использованием ограничений

3.1. Использование ограничений в ASP

Программирование с использованием технологии ограничений реализовано в clingcon. ASP поддерживает только линейные ограничения. Для подключения вычислений с использованием ограничений необходимо включить модуль csp командой #include <csp>.

Ограничение на пространство значений задаются с использованием директивы &dom, при этом вывод результатов осуществляется с помощью &show. Важно, что дополнительные директивы clingcon принимают параметры не в круглых, а в фигурных скобках.

Минимальная программа может выглядеть следующим образом:

#include <csp>.

&dom {2..4;8} = x.

&show {x}.

Получаются следующие наборы ответов:

Answer: 1 x=8

Answer: 2 x=4

Answer: 3 x=3

Answer: 4 x=2

Вданном случае было сгенерировано необходимое количество термов x

сзаданными значениями. Можно добавить ограничения на результат сумми-

рования с помощью &sum:

#include <csp>.

&dom {2..4;8} = x.

&sum {x} > 3.

&show {x}.

Результирующие наборы ответов:

Answer: 1 x=8

Answer: 2 x=4

Или для нескольких значений:

24

#include <csp>.

&dom {2..4;8} = x.

&sum {x;(-1)} > 3.

&show {x}.

После вычитания единицы только одно значение больше 3:

Answer: 1 x=8

В данном случае &sum – линейное ограничение, которое поддерживает следующие сравнения: <=,=,>=,<,>,!=. При задании ограничений возможно использование фактов программы.

#include <csp>. v(a,4).

v(b,5).

&dom {2..M} = x(I) :- v(I,M). &sum {x(a);x(b)} > 7.

&show {x(a);x(b)}.

Результирующие наборы ответов.

Answer: 1 v(a,4) v(b,5) x(a)=4 x(b)=5

Answer: 2 v(a,4) v(b,5) x(a)=4 x(b)=4

Answer: 3 v(a,4) v(b,5) x(a)=3 x(b)=5

Присваивание значений из заданного домена осуществляется в данном примере, в котором использован составной терм, а ограничение максимального значения задаётся вторым параметром факта v.

Дополнительно к линейным ограничениям в следующем примере предусмотрена директива для минимизации &minimize.

#include <csp>. v(a,4).

v(b,5).

&dom {2..M} = x(I) :- v(I,M). &dom {2..M*2} = h :- v(I,M). &sum {x(a);x(b)} > h. &minimize {-h}.

&show {x(a);x(b);h}.

Результирующие наборы ответов.

Answer: 1 v(a,4) v(b,5) x(a)=4 x(b)=5 h=8

Optimization: -8

OPTIMUM FOUND

25

В данном примере добавлен ещё один терм h с ограничением значений от 2 до 10, указано, что сумма должна быть больше h, после чего h максимизирован и выведен в &show. Директива &minimize может минимизировать несколько значений, перечисленных через точку с запятой:

Минимизация суммы нескольких термов:

#include <csp>.

&sum {a; b; c} = 113. vars(a;b;c).

&show {X : vars(X)}.

&dom {1..100} = X :- vars(X). &minimize{1*c;100*a}.

#show.

Результирующие наборы ответов:

Answer: 1 a=2 b=11 c=100

Optimization: 300

Answer: 2 a=2 b=100 c=11

Optimization: 211

Answer: 3 a=1 b=100 c=12

Optimization: 112

OPTIMUM FOUND

С использованием директивы &distinct можно обеспечить уникальность заданных значений.

#include <csp>. v(a,5). v(b,5).

&dom {2..M} = x(I) :- v(I,M). &sum {x(a);x(b)} > 7. &distinct {x(a);x(b)}.

&show {x(a);x(b)}.

#show.

Результирующие наборы ответов:

Answer: 1 x(a)=5 x(b)=4

Answer: 2 x(a)=5 x(b)=3

Answer: 3 x(a)=4 x(b)=5

Answer: 4 x(a)=3 x(b)=5

Здесь директива #show отключает лишний вывод и факты v/2 не отображаются (сравните с предыдущими примерами). Если убрать требование

26

уникальности значений x(a) и x(b), то добавятся результаты x(a)=5 x(b)=5 и x(a)=4 x(b)=4.

3.2. Задача SEND+MORE=MONEY

Задача SEND+MORE=MONEY предполагает, что каждая буква даннного выражения – это цифра от 0 до 9, при этом разные буквы – это разные цифры. Необходимо подобрать такой набор значений букв, чтобы цифровое равенство было верным.

Решение без использования ограничений может выглядеть следующим образом:

letter(s; e; n; d; m; o; r; y). values(0..9). % Обеспечить одно появление каждой буквы

1 { x(L,Val) : values(Val) } 1 :- letter(L). % 0..1 не более 1 появления каждого значения

{ x(L,Val) : letter(L) } 1 :- values(Val). % Все значения разные

:- letter(L), letter(L1), x(L,V1), x(L1,V1), L!= L1. smm :- values(S;E;N;D;M;O;R;Y), x(s,S), x(e,E),

x(n,N), x(d,D), x(m,M), x(o,O), x(r,R), x(y,Y), M > 0, S > 0, S*1000+E*100+N*10+D + M*1000+O*100+R*10+E == M*10000+O*1000+N*100+E*10+Y.

:- not smm.

#show x/2.

Вычисление требует много времени (несколько минут).

Answer: 1 x(o,0) x(m,1) x(y,2) x(e,5) x(n,6) x(d,7)

x(r,8) x(s,9)

Задача может быть решена с использованием ограничений:

#include <csp>. letter(s;e;n;d;m;o;r;y).

&dom {0..9} = X :- letter(X).

&sum {1000*s; 100*e; 10*n; 1*d; 1000*m; 100*o; 10*r; 1*e; -10000*m; -1000*o; -100*n; -10*e; -1*y} = 0.

&sum {m} != 0.

&distinct {X : letter(X)}. &show {X : letter(X)}. #show.

27

И результат:

Answer: 1 s=9 e=5 n=6 d=7 m=1 o=0 r=8 y=2

На формирование ответа потребовалось 0,016 сек.

3.3.Упражнения

1.Дано два пятизначных числа X и Y, состоящих из цифр от 0 до 9. Необходимо вычислить минимальную разницу X-Y, все цифры должны быть использованы и только по одному разу.

2.Дано выражение DONALD+GERALD=ROBERT. Предполагается, что каждая буква выражения – это цифра, при этом разные буквы – это разные цифры. Необходимо подобрать такой набор значений букв, чтобы цифровое равенство было верным.

3.Гамильтонов цикл в ориентированном графе это цикл, который проходит через каждую вершину графа ровно один раз. Найти гамильтонов цикл

взаданном ориентированном графе, если он существует.

4.Механизмы вывода и доказательства, используемые в ASP

4.1.Общее описание

В ASP решение задачи сводится к поиску устойчивой модели посредством набора программ ее генерации (решателей) [4,5]. Процесс поиска реализуется надстройкой над DPLL-алгоритмом, который всегда конечен, является полным алгоритмом поиска с возвратом для решения задачи определения выполнимости булевых формул (задача SAT – сокращение от слова SATISFIABLE – выполнимость), записанных в конъюнктивной нормальной форме (КНФ), и основан на правиле резолюций.

После приведения исходной булевой формулы к КНФ происходит генерация SAT-решателей, определяющих возможность назначения всем переменным, встречающимся в формуле, значения ложь или истина так, чтобы формула стала истинной.

4.2. Принципы построения SAT-решателей

SAT-решатели строятся с использованием алгоритма CDCL (ConflictDriven Clause Learning – управляемое конфликтами обучение дизъюнктам), который основан на алгоритме DPLL и отличается, с одной стороны, использованием структуры данных – импликационного графа, фиксирующего

28

назначения переменным, и нехронологического возврата с запоминанием дизъюнктов в ходе анализа конфликта [6].

Решается задача поиска устойчивой модели, т. е. назначения всем переменным, встречающимся в формуле в форме КНФ, значения «ложь» (0) или «истина» (1) так, чтобы формула стала истинной. Данный поиск основан на DPLL-алгоритме и является поиском с возвратом на КНФ, на каждом шаге которого происходит присваивание значения «ложь» или «истина» выбранной переменной с последующим ветвлением, после чего упрощённая формула проходит рекурсивную проверку на выполнимость. Если встречается конфликт, т. е. полученная формула является невыполнимой, включается механизм возврата (бэктрекинга), при котором отменяются ветвления, в которых для переменной были опробованы оба значения. В DPLL-алгоритме используются хронологические возвраты, когда формула объявляется невыполнимой после возврата к ветвлению первого уровня.

В CDCL-алгоритме все встречающиеся в процессе поиска дизъюнкты могут быть: а) выполнимые (satisfied), когда среди входящих в дизъюнкт значений есть «истина»; б) невыполнимые (unsatisfied) – все значения «ложь»; в) единичные (unit) – все значения «истина», кроме одной переменной, которой значение ещё не присвоено, г) неразрешённые (unresolved) – все остальные.

После ветвления для вычисления логических следствий сделанного выбора выполняется процедура распространения переменной (unit propagation), которая основана на правиле единичного дизъюнкта, при котором выбор переменной и её значения однозначен.

4.3.Схема CDCL-алгоритма

Вобщем виде CDCL-алгоритм можно представить следующим образом:

Алгоритм CDCL(φ, ν) вход: φ - формула (КНФ)

ν- значения переменных в виде множества пар выход: SAT (формула выполнима) или UNSAT (невыполнима)

если UnitPropagationConflict(φ,ν)

то возврат UNSAT

L :=

0

--уровень решения

пока

NotAllVariablesAssigned(φ,ν)

(x,v) :=

PickBranchingVariable(φ,ν)--принятие решения

L := L +

1

 

 

29

ν :=

ν {(x,v)}

 

если

UnitPropagationConflict(φ,ν)--вывод последствий

то β

:= ConflictAnalysis(φ,ν) --диагностика конфликта

если β < 0 то возврат UNSAT

иначе Backtrack(φ,ν,β)

--возврат (бэктрекинг)

 

L := β

 

возврат SAT

Здесь значение переменных ν(vi) {0,u,1} для всех vi, где u обозначает ещё не назначенную переменную. Уровень решения L, на котором переменной было присвоено значение от −1 (не присвоено) до количества переменных.

Современные информационные технологии развиваются очень быстро, появляется множество новых способов решения задач, однако их поиск должен строиться на владении традиционными технологиями. Как писал философ Бернард Шартрский: «Мы как карлики, сидящие на плечах гигантов, и потому можем видеть больше и дальше, чем они».

Данное издание призвано способствовать формированию у читателя знаний, умений и навыков по программированию наборов ответов с использованием ASP.

Список литературы

1.Potassco website. URL: https://potassco.org.

2.Gebser M., Harrison A., Kaminski R., Lifschitz V., Schaub T. Abstract Gringo. Theory and Practice of Logic Programming, 15(4-5):449–463, 2015. Available at http://arxiv.org/abs/1507.06576. 9, 119.

3.My Answer Set Programming Page.

URL: http://www.hakank.org/answer_set_programming/

4.Зачем нам всем нужен SAT и все эти P-NP. URL: https://habr.com/ru/post/207112/.

5.SAT Solvers: Theory and Practice. URL: https://resources.mpiinf.mpg.de/departments/rg1/conferences/vtsa08/slides/barret1_sat.pdf.

6.CDCL basics. URL: https://ru.coursera.org/lecture/automated-reasoning- sat/cdcl-basics-2ag2H .

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]