Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

Фаза решения задачи

Согласование посл(1,U2). Самое последнее из отложенных це­левых утверждений - третье целевое утверждение в третьем обраще­нии: U2 is U3 * 1. Поскольку переменная U3 равна 1 в результате со­гласования второго целевого утверждения, U2 получает значение 1. Таким образом, посл(1,U2) согласуется при U2, равной 1.

Согласование посл(2,U). Предпоследнее отложенное целевое ут­верждение - третье целевое утверждение во втором обращении: U is U2 * 2. Так как переменная U2 равна 1 в результате согласования второго целевого утверждения, U получает значение 2. Итак, посл(2,и) согласуется при U , равной 2.

Согласование посл(3,Х). Предыдущее из отложенных целевых утверждений - третье целевое утверждение в первом обращении: Х is U * 3. Поскольку переменная U равна 2 в результате согласования второго целевого утверждения, X получает значение 6. Целевое утверждение посл(3,Х) согласуется при Х, равной 6.

Если отложенных целевых утверждений больше нет, Пролог определяет, при каком значении переменной удовлетворяется за­прос:

X=6

другие решения (да/нет)? нет

На рис.4.1.1 приведена полная трассировка запроса. Дуги, исхо­дящие из цели, помечены номером сопоставляемого утверждения и значениями переменных при сопоставлении. Значения переменных, при которых согласуется целевое утверждение, заключены в круглые скобки и записаны на той же строчке, что и соответствующее целе­вое утверждение. Метки на дугах, входящих в вершины со значения­ми переменных, являются целевыми утверждениями, которые при­водят к этим значениям.

Рис. 4.1.1. Трассировка запроса ?- посл(3,Х).

Пример 4.1.2

Требуется написать процедуру для вычисления ряда

f(x,n) = 1+х+х^2+х^3+...+х^n

при известных действительном числе х и натуральном числе n.

Поскольку утверждения Пролога определяют некоторое отноше­ние, а не вычисляют значение, как функции Паскаля, нам нужно ввести третий параметр, который обозначал бы сумму

1+х+х^2+х^3+...+х^n

для данных х и n. Тогда голова утверждения будет выглядеть следу­ющим образом: f(X,N,S). (Напомним, что переменные в Прологе должны начинаться с заглавной буквы.)

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

Это можно сделать, учитывая, что

f(x,0) = 1

f(x,l) = l + x = f(x,0) * x+l

f(x,2) = l + x + x^2 = f(x,l) * x+l

f(x,n) = 1 + x + x^2 + x^n = f(x,n-l) * х+ 1

Определим ряд рекурсивно:

f(x,0) = 1

f(x,n) = f(x,n-1) * x+ l

Такому определению соответствуют следующие утверждения Пролога:

/* ГРАНИЧНОЕ УСЛОВИЕ

f(x,0,l).

/* РЕКУРСИВНОЕ УСЛОВИЕ

f(x,n,s) :-

M is N-1,

f(X,M,R),

S is R * X+l.

На рис.4.1.2 показано, как Пролог согласует запрос ?- f(2,3,T).

4.2. Восходящая стратегия

Мы рассмотрели процесс разбиения задач на подзадачи и их ре­шения. Так, в примере 4.1.1 для определения посл(4,V) нужно вы­числить

посл(3,V2),посл(2,V3),...,посл(0,V5)

и построить решение, выбрав в качестве базиса граничное условие.

Рис.4.1.2. Трассировка запроса ?- f(2,3,T).

Другой подход заключается в том, чтобы, начав с граничного ус­ловия, строить решение до тех пор, пока не будет решена исходная задача. Следуя данному подходу и пытаясь найти четвертый член в последовательности, мы должны начать с граничного условия 1, вы­числить значение первого терма 1*1, второго - 1*1*2, третьего -1*1*2*3 и, наконец, четвертого - 1*1*2*3*4. Такую стратегию мы на­зываем восходящей.

В описанном методе решения целевое утверждение должно иметь два дополнительных параметра: один - для указания на «размер» ре­шенной к настоящему времени задачи, а второй - для записи проме­жуточного решения. При вызове утверждения параметры связыва­ются с граничным условием.

Пример 4.2.1

Если применить восходящую стратегию к решению задачи, взя­той из примера 4.1.1, мы получим следующие утверждения Пролога:

/* постр_посл(NS,VS,N,V) строит N-й

/* терм последовательности – V

/* VS - это значение NS-ro терма

/* в построенной к данному моменту

/* последовательности

/* Требуемое решение:

постр_посл(N,V,N,V).

/* Построение следующего решения

постр_посл(NS,VS,N.V) :-

NS1 is NS + 1,

VS1 is VS * NS1,

постр_посл(NS1,VS1,N,V).

Запрос включает граничное условие как решенную к настоящему времени задачу. На запрос

?- постр_посл(0,1,7,V).

получаем

V=5040

другие решения (да/нет)? Нет

Альтернативным вариантом является определение еще одного утверждения, которое маскирует дополнительные параметры в постр_посл:

посл_п(N,V) :- постр_посл (0,l,N,V).

так что

?- посл_п(7,V).

дает

V = 5040

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