Скачиваний:
53
Добавлен:
01.05.2014
Размер:
565.76 Кб
Скачать

Нет (больше) решений

Рис. 6.2. Множество решений расщепления списка.

Протокол решения вопроса append([a,b],[c,d],Ls)? дающий ответ Ls = [а,Ь,с,d], в точности совпадает с протоколом на рис. 4.3. Рис. 4.5, содержащий протокол решения задачи о ханойской башне с 3 дисками, описывает также протокол вычисления программы hanoi, если эту программу рассматривать как программу на Прологе, решающую вопрос hanoi(s(s(s(0))),a.b,c,Moves)?. Протокол детерминированных вычислений программы одинаков независимо от того, считаем ли мы данную программу логической или программой на Прологе, если только порядок целей сохраняется.

Следующий пример состоит в поиске ответа на вопрос append(Xs.Ys,[a.b,c])? с использованием программы 3.15, определяющей отношение append. В этом случае имеется несколько решений. Дерево поиска для данной цели приводилось на рис. 5.3. На рис. 6.2 изображен протокол в Прологе.

quicksort([X | Xs],Ys)

partition (Xs,X,Littles,Bigs),

quicksort (Littles,Ls),

quicksort (Bigs ,Bs),

append (Ls,[X | Bs],Ys).

quicksort([ ],[ ]).

partition(lX | Xs],Y,[X | Ls],Bs) 

X  Y, partition(Xs,Y,Ls,Bs).

partition([X | Xs],Y,Ls,[X | Bs]) 

X > Y, partrtion(Xs,Y,Ls,Bs).

partition([ ],Y,[ ],[ ]).

quicksort([2,l,3],Qs)

partition([l,3],2,Ls,Bs)

1<2 Ls=[1 | Ls1]

partition([3],2,Ls1,Bs)

32 f Ls1=[3 | Ls2]

partition([3],2,Lsl,Bs)

3>2 Bs=[3 | Bs1]

partition([ ],2,Ls1,Bs1) Ls1=[ ]=Bs1

quicksort([1],Qs1)

partition([ ],1,Ls2,Bs2) Ls2=[ ]=Bs2

quicksort([ ],Qs2) Qs2=[ ]

quicksort ([ ],Qs3) Qs3=[ ]

append([ ],[1],Qsl) Qsl=[1]

quicksort([3],Qs4)

partition(l ])3)Ls3,Bs3) Ls3=[ ]=Bs3

quicksort([ ],Qs5) Qs5=[ ]

quicksort([ ],Qs6) Qs6=[ ]

append([ ],[3],Qs4) Qs4=[3]

append([1],[2,3],Qs) Qs[1 | Ys]

append([ ],[2,3],Ys) Ys=[2,3]

true

Результат: (Qs=[1,2,3])

Рис. 6,3. Протокол вычисления quicksort

Протоколирование вычислений облегчает понимание процесса выполнения программ на Прологе. Приведем пример чуть большего размера - упорядочение списка с помощью программы быстрой сортировки (программа 3.22 выписана повторно). Вычисления программы quicksort по существу детерминированы и демонстрируют алгоритмическое поведение программы на Прологе. На рис. 6.3 приведен протокол решения вопроса quicksort([2,1,3],Xs)?Считается, что арифметическое сравнение - элементарная операция, а для отношения append используется стандартная программа.

Введем различия между внешним и глубоким возвратами. Внешний возврат возникает при безуспешной унификации цели и предложения, в этом случае пробуется новое предложение. Глубокий возврат возникает при безуспешной унификации цели и последнего предложения процедуры, в этом случае происходит возврат к другой цели в дереве вычисления.

Иногда удобно вводить проверочные предикаты, находящиеся в начале тела предложения, как часть унификации. Тогда возвраты, возникающие в результате безуспешности подобных унификации, соответствуют внешним возвратам. Примером может служить рис. 6.3, содержащий выбор нового предложения при редукции цели partition([3],2,Ls1,Bs).

Упражнения к разд. 6.1

1. Постройте протокол вычислений при решении вопроса дочь (X, аран)? относительно программы 1.2.

2. Постройте протокол вычислений при решении вопроса sort([3,2,1],Xs)? относительно программы 3.21.

3. Постройте протокол вычислений при решении вопроса sort([3,2,1],Xs)? относительно программы 3.20.

Соседние файлы в папке 1-13