
- •1. Разл.Парадигмы пр-я и подходы к опр-ю выч-ти. Декларативные яп как альт. Императивным. Лп как алг-я модель, альт-я модели Тьюринга — фон Неймана.
- •3.Исчисление предикатов 1-го порядка. Понятие о формальной аксиоматической системе.Выводимость (|-) в форм. Аксиом. Системе.Правило вывода modus ponens.
- •4. Понятие о полноте, непротиворечивости и корректности логической системы. Связь логического вывода с общезначимостью. Тh о дедукции.
- •5.Алгоритмическая неразрешимость исчисления предикатов. Тh Черча. Th Геделя о неполноте формальной арифметики.
- •6. Норм-е формы. Дизьюнкты Хорна. Сведение ф-л лог.Пр-в к фразам Хорна.
- •7. Унификация. Правила унификации сложных структур.
- •8. Правило вывода modus tollens. Простое и обобщенное правило резолюции.
- •9. Метод резолюции для реализации эф-го логического вывода в логических программах на основе фраз Хорна. Стратегии резолюции. Sld-резолюция.
- •11. Декларативная и процедурная семантика языка лп. Примеры.
- •12. Отрицание в логическом программировании. Отрицание по неуспеху и предположение о замкнутости мира. Sldnf-резолюция.
- •14. Основные объекты языка Пролог: атомы, числа, константы, переменные, термы, структурные термы, предикаты.
- •15. Операторы. Представление и выч-ие арифметич-х выр-й. Опред-е польз-м операторы. Представление предикатов и правил структурными термами.
- •16. Подходы к организации циклов в лп. Примеры. Предикаты for, repeat.
- •17. Управление перебором и отсечение( cut). Предикат not.
- •18. Встроенные предикаты Пролога: read, write, nl.
- •21. Описание основных предикатов обработки списков: определение длины, взятие n-ого элемента, принадлежность элемента списку, конкатенация списков.
- •22. Описание основных предикатов обработки списков: удаление элемента из списка, определение подсписка, перестановки.
- •23. Порядковое представление списков в Прологе. Представ-е матриц. Примеры.
- •25. Деревья. Деревья поиска, основные операции с деревьями поиска.
- •26. Сбалансир-е деревья. Алгоритм добавления узла в сбалансир-е дерево.
- •27. Представления графов. Алгоритмы поиска пути (в глубину, в ширину).
- •28. Метод генерации и проверок для решения задач. Метод ветвей и границ. Явный и неявный перебор в Пролог-программах.
- •31. Операторы. Преобр.Симв.Выр.В дерево.Выч-е значений арифм.Выр.По строке.
- •30. Решение задач методом поиска в пространстве состояний. Пример. Принципы подбора алгоритма поиска пути в зависимости от задачи.
- •32. Символьные вычисления. Алгоритм символьного дифференцирования.
- •33. Подходы к символьному упрощению выражений.
- •34. Анализ ест-го языка с использованием контекстно-свободной грамматики. Подход к интерпретации знаний в естественно-языковом материале.
- •35. Учет контекстных усл. Работа со словарями. Глуб. И пов. Структуры в ест.Яз.
- •36.Расширение логического интерпретатора Пролога средствами языка. Мета-интерпритаторы. Примеры
- •24. Разностные списки. Хвостовая рекурсия. Сведение рекурсивного нехвостового определения к хвостовому. Примеры.
31. Операторы. Преобр.Симв.Выр.В дерево.Выч-е значений арифм.Выр.По строке.
Префиксная нотация – сначала запис-ся функтор-оператор, затем аргументы, принята в логике предикатов. В математике в ряде случаев исп-ся инфиксная (функтор запис-ся между аргументов) и постфиксная (после них) нотация. Инфиксная: x+y, т.е. +(x,y) в терминах логики. Постфиксная: x!. В Прологе предусмотрены инфиксная и постфиксная записи функциональных констант, такие константы наз-ся операторами. Ex. Выр-ие 1+2*(3+4+5) –прав.структурный терм, понимается как +(1,*(2,+(+(3,4),5))). Соотв-е дерево: (нарисовать!). Св-ва операторной записи: 1.Учитывается приоритет операций, струк.термы сначала групп-ся вокруг операций с бОльшим приоритетом; 2.Группировка скобками; 3.Операции имеют фиксир-ю арность, записанные подряд неск.операций одинак. приоритета групп-ся либо влево – левоассоциативные, либо вправо – правоас-е. (+,*-л, ^-п=>3+4+5 -> (3+4)+5). Операторная запись, соотв. ариф-метич.выр-ию, не приводит к выч-ию этого выр-ия, а лишь задает соотв. струк-й терм.
?- X = 1+2*(3+4+5). // X = 1+2*(3+4+5).
?- X = 1+2*(3+4+5), display(X). // +(1,*(2,+(+(3,4),5))). // X = 1+2*(3+4+5).
Для выч-ия арифм.выр-ий сущ-ет оператор is, правым арг-м кот-го явл-ся правильно построенное арифм.выр., в кот.все перем.должны быть конкретизированы, из конста-нт допускаются только числа; левый аргумент унифицируется с рез-м выч-ия выр-ия.
?- X is 1+2*(3+4+5). // X = 25.
?- X = +(1,*(2,+(+(3,4),5))), Y is X. // X = 1+2*(3+4+5). // Y = 25.
При отобр-и оператора, заданного в префиксной форме, исп-ся операторная нотация.
29. Осн.мет. сокр. перебора на примере з.крипт, расстановки ферзей, игры N^2-1.
Сокращ-й перебор предусматривает просмотр локальных областей пр-ва варьируемых вариантов. Такая локализация осущ-ся путем априорного сокращения характеристик оптимизируемой системы, напр. методом экспертных оценок. По принципу выборки и организации поиска методы сокр.перебора подразделяются на случ. и детерминир-1е основаны на случ. выборе варианта из мн-ва возможных. Ко 2м относятся методы ветвей и границ, градиентный и его модификации. Предположим, что нам требуется рассмотреть только те перестановки, для которых сумма |X[i]-i| равна 8. Все перестановки, начинающиеся на 8,7,... рассм. не нужно. Если на каком-то этапе сумма
|X[1]-1|+|X[2]-2|+...+|X[k]-k| уже больше 8, то рассм-ть все перестановки, начинающие-ся на X[1],...,X[k] уже не нужно - следует вернуться к X[k] и изменить его значение (отойти назад). Рассм. один общий метод, кот. почти всегда позволяет значит. сокр-ть перебор. Пусть искомое решение находится среди посл-тей вида X[1],...,X[N], где кажд. X[i] выбир-ся из некот. мн-ва вар-в A[i]. Предп. мы уже построили начало этой посл-ти X[1],...,X[k] (k<N) и хотим продолжить его до решения. Предп, что у нас есть некот. простой метод P(X[1],...,X[k]), кот. позволяет получить ответ на вопрос: можно продолжить X[1],...,X[k] до реш. (true) или нет (false). Значение true еще не гар-ет сущ-е такого продолжения, но зато значение false гар-ет непродолжаемость:
procedure Backtracking(k); // begin // for (y in A[k]) do // if P(X[1],...,X[k-1],y) then//
begin// X[k]:=y; // if k=N then {X[1],...,X[N] -решение}//Backtracking(k+1)// end// end;
Пример прим-я этого метода есть в задаче о ферзях. На шахм. доске N х N требуется расставить N ферзей, так, чтобы они не били друг друга. Позиция - набор из коорди-нат x и y всех ферзей, задачу на удовлетворение огр-й. Найти набор значений для x1, y1, x2, y2,..., x_N, y_N, из мн-ва [1..N] такой, что для всех разл. i и j вып-ся усл.: x_i != x_j (не стоят на 1й вертикали);y_i != y_j (не стоят на 1й горизонтали); |xi - xj| != |yi - yj| (не стоят на 1й диагонали). Можно попытаться решить эту задачку методом перебора
queens(N,Ys-Xs) :-
range(1,N, Ns), length(Xs, N), members(Xs,Ns),
length(Ys, N), members(Ys,Ns), safe(Ys-Xs).
Номера ферзей можно рассм-ть как корд. x и дост-но перебирать только корд. у. Новая форм-ка задачи: Найти набор (y1,y2,...,yN), 1<y_i<N такой, что для всех различных i и j вып-ся условия: yi=/=yj |yi-yj|=/=|i-j|. Новая схема перебора будет выглядеть так
queens(N,Ys) :- range(1,N, Ns), length (Ys, N), members(Ys, Ns), safe(Ys).
Среди коор-т у ферзей кажд. из чисел 1,2,...,N встречается ровно 1 раз, переформ. з: Найти набор разл-х (y1,y2,...,yn), 1<yi<N, такой что |yi - yj| =/= | i-j | при i =/= j. (переносим усл. yi =/= yj из мн-ва огр-й в опр-ие пр-ва перебора).
queens(N,Ys) : — range(1,N, Ns), length(Ys, N), selects(Ys, Ns), safe(Ys).
Пр-во перебора сокращается с NN до N!. Теперь можно записать процедуру проверки.
safe([Y|Ys]) :— noattack(Y,Ys), safe(Ys). // safe([]).
noattack(Y,Ys) :— noattack(Y,Ys,1). //noattack(_,[],_).
noattack(Q,[Y|Ys],D) : — abs(Q—Y) =\= D, D1 is D+1, noattack(Q,Ys,D1).
Переместим проверку огр-й в процедуру генерации. Выбирая положение очередного ферзя, проверяем его совместимость с расставленными ранее (объединим процедуры selects и safe в одну процедуру place_queens). Эта процедура имеет доп. аргумент Board, содержащий список уже расставленных ферзей.
queens(N, Ys) :- range(1,N,Ns), length(Ys,N), place_queens(Ys,Ns,[]).
place_queens([Y|Ys],Ns,Board) :- select(Y,Ns,Ns1), noattack(Y,Board), place_queens(Ys, Ns1, [Y|Board]). // place_queens([],_,_).
Будем исп-ть 2 списка Us и Ds, сод-е пер-е, "охраняющие" диагонали. Каждая пер-я представляет одну диагональ. При размещении очередного ферзя пер-я из списка Ys связ-ся с номером ферзя, одновременно связ-ся соотв. пер-е из Us и Ds. Процедура place_queens после выб.полож-я для ф "сдвигает"Us и Ds на1позицию в разн. стороны.
queens(N,Ys) :- range(1,N, Ns), length (Ys, N), place_queens(Ns,Ys,_,_).
place_queens([N|Ns], Ys, Us, [D|Ds]):- place1(N, Ys, Us, [D|Ds]),
place_queens(Ns, Ys, [U|Us], Ds).
place_queens([], _, _, _). //place1(N,[N|_], [N|_],[N|_]).
5 place1(N,[_|Cs],[_|Us], [_|Ds]):- place1(N,Cs,Us,Ds).
Заведем список пар (номер ферзя - список допустимых положений). Вначале кажд. ф получает полную свободу, список - [1,2,...N]. Размещая очередного ф, удаляем атаков-е им позиции из доп-х положений ост.ф, ограничивая возможность выбора.
queens(N, Queens) :- range(1,N, Ns), init_vars(Ns, Ns, V), place_queens(V,Queens).
init_vars([X|Xs],Ys,[X:Ys|V]) :- init_vars(Xs,Ys,V). // init_vars([], _, []).
place_queens([X:Ys|V],[X-Y|Qs]) :- member(Y, Ys), prune(V, X, Y, V1),
place_queens(V1,Qs). // place_queens([],[]).
prune([Q:Ys|Qs], X,Y, [Q:Ys1|Ps]) :- sublist(noattacks(X,Y,Q), Ys, Ys1),
Ys1 \== [], prune(Qs, X,Y, Ps). // prune([], _,_, []).
noattacks(X1,Y1,X2,Y2) :- Y1 \== Y2, abs(Y2 - Y1) =\= abs(X2 - X1).
Изменим порядок расстановки ф (убедимся, что нет таких, кот. нельзя разместить, затем- нет ли таких, для кот. сущ-ет только 1 вар.размещения, если есть, выбрать его). Теперь ф необяз-но будут размещаться по порядку, результат будем представлять в виде списка пар X-Y.
place_queens(V, [X—Y|Qs]) : — queen_to_place(V,X:Ys,V1), member(Y, Ys),
prune(V1, X, Y, V2), place_queens(V2,Qs).
place_queens([], []).
Процедура queen_to_place выбирает ф подлежащего размещению из списка не разм-х. Выбираем наиб.ограниченного ф (у кот.список возм.положений самый короткий.)
queen_to_place([V|Vs], Q, Vx) :— select_boundest(Vs, V, Q, Vx).
select_boundest([], Q, Q, []).
select_boundest([x|Xs],Q,Qm,[Q|R]):— shorter(X, Q), !, select_boundest(Xs, X, Qm, R).
select_boundest([X|Xs], Q, Qm, [X|R]) : — select_boundest(Xs, Q, Qm, R).
shorter(_:L1, _:L2) :— length(L1,N1), length(L2,N2), N1<N2.
При сокр. пр-ва перебора надо соотносить размер этого сокращения с затратами на его реализацию. На небольших досках эта программа оказ-ся медленнее - затраты на реал-ю более сложной схемы съедают весь выигрыш от сокращения. Время, вып-я программы растет как квадратный корень из N!.