Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2docx-1.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.27 Mб
Скачать

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й диагонали). Можно попытаться решить эту задачку методом перебора

  1. queens(N,Ys-Xs) :-

  2. range(1,N, Ns), length(Xs, N), members(Xs,Ns),

  3. 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|. Новая схема перебора будет выглядеть так

    1. 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 из мн-ва огр-й в опр-ие пр-ва перебора).

      1. queens(N,Ys) : — range(1,N, Ns), length(Ys, N), selects(Ys, Ns), safe(Ys).

Пр-во перебора сокращается с NN до N!. Теперь можно записать процедуру проверки.

        1. safe([Y|Ys]) :— noattack(Y,Ys), safe(Ys). // safe([]).

        2. noattack(Y,Ys) :— noattack(Y,Ys,1). //noattack(_,[],_).

        3. noattack(Q,[Y|Ys],D) : — abs(Q—Y) =\= D, D1 is D+1, noattack(Q,Ys,D1).

Переместим проверку огр-й в процедуру генерации. Выбирая положение очередного ферзя, проверяем его совместимость с расставленными ранее (объединим процедуры selects и safe в одну процедуру place_queens). Эта процедура имеет доп. аргумент Board, содержащий список уже расстав­ленных ферзей.

            1. queens(N, Ys) :- range(1,N,Ns), length(Ys,N), place_queens(Ys,Ns,[]).

            2. 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позицию в разн. стороны.

              1. queens(N,Ys) :- range(1,N, Ns), length (Ys, N), place_queens(Ns,Ys,_,_).

              2. place_queens([N|Ns], Ys, Us, [D|Ds]):- place1(N, Ys, Us, [D|Ds]),

              3. place_queens(Ns, Ys, [U|Us], Ds).

              4. place_queens([], _, _, _). //place1(N,[N|_], [N|_],[N|_]).

5 place1(N,[_|Cs],[_|Us], [_|Ds]):- place1(N,Cs,Us,Ds).

Заведем список пар (номер ферзя - список допустимых положений). Вначале кажд. ф получает полную свободу, список - [1,2,...N]. Размещая очередного ф, удаляем атаков-е им позиции из доп-х положений ост.ф, ограничивая возможность выбора.

                1. queens(N, Queens) :- range(1,N, Ns), init_vars(Ns, Ns, V), place_queens(V,Queens).

                2. init_vars([X|Xs],Ys,[X:Ys|V]) :- init_vars(Xs,Ys,V). // init_vars([], _, []).

                3. place_queens([X:Ys|V],[X-Y|Qs]) :- member(Y, Ys), prune(V, X, Y, V1),

                4. place_queens(V1,Qs). // place_queens([],[]).

              1. prune([Q:Ys|Qs], X,Y, [Q:Ys1|Ps]) :- sublist(noattacks(X,Y,Q), Ys, Ys1),

              2. Ys1 \== [], prune(Qs, X,Y, Ps). // prune([], _,_, []).

              3. noattacks(X1,Y1,X2,Y2) :- Y1 \== Y2, abs(Y2 - Y1) =\= abs(X2 - X1).

Изменим порядок расстанов­ки ф (убедимся, что нет таких, кот. нельзя разместить, затем- нет ли таких, для кот. сущ-ет только 1 вар.размещения, если есть, выбрать его). Теперь ф необяз-но будут размещаться по порядку, результат будем представлять в виде списка пар X-Y.

                1. place_queens(V, [X—Y|Qs]) : — queen_to_place(V,X:Ys,V1), member(Y, Ys),

                2. prune(V1, X, Y, V2), place_queens(V2,Qs).

                3. 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!.