Программирование на языке Пролог для искусственного интеллекта
6ec30db9

Варианты программы полученые путем переупорядочивания предложений и целей



2. 6. 2.    Варианты программы, полученые путем переупорядочивания предложений и целей

Уже в примерах программ гл. 1 существовала скрытая опасность зацикливания. Определение отношения предок в этой главе было таким:

        предок( X, Z) :-
                родитель( X, Z).

        предок( X, Z) :-
                родитель( X, Y),
                предок( Y, Z).

Проанализируем некоторые варианты этой программы. Ясно, что все варианты будут иметь одинаковую декларативную семантику, но разные процедурные семантики.

В соответствии с декларативной семантикой Пролога мы можем, не меняя декларативного смысла, изменить

(1)        порядок предложений в программе и

(2)        порядок целей в телах предложений.

Процедура предок состоит из двух предложений, и одно из них содержит в своем теле две цели. Возможны, поэтому, четыре варианта данной программы, все с одинаковым декларативным смыслом. Эти четыре варианта можно получить, если

(1)        поменять местами оба предложения и


(2)        поменять местами цели в каждом из этих двух последовательностей предложений.

Соответствующие процедуры, названные пред1, пред2, пред3 и пред4, показаны на Рисунок 2.16.

Есть существенная разница в поведении этих четырех декларативно эквивалентных процедур. Чтобы это продемонстрировать, будем считать, отношение родитель определенным так, как показано на Рисунок 1.1 гл. 1. и посмотрим, что произойдет, если мы спросим, является ли Том предком Пат, используя все четыре варианта отношения предок:

        ?-  пред1( том, пат).
        да

        ?-  пред2( том, пат).
        да

        ?-  пред3( том, пат).
        да

        ?-  пред4( том, пат).

line();

%  Четыре версии программы предок
%  Исходная версия

пред1( X, Z) :-
       родитель( X, Z).

пред1( X, Z) :-
       родитель( X, Y),
       пред1( Y, Z).

%  Вариант  а:  изменение порядка предложений в исходной версии

пред2( X, Z) :-
       родитель( X, Y),
       пред2( Y, Z).

пред2( X, Z) :-
       родитель( X, Z).

%  Вариант  b:  изменение порядка целей во втором предложении
%  исходной версии

пред3( X, Z) :-
       родитель( X, Z).

пред3( X, Z) :-
       пред3( X, Y),
       родитель( Y, Z).

%  Вариант  с:  изменение порядка предложений и целей в исходной
%  версии

пред4( X, Z) :-
       пред4( X, Y),
       родитель( Y, Z).

пред4( X, Z):-
       родитель( X, Z).

line();



Содержание раздела