Программирование на языке Пролог для искусственного интеллекта - страница 19
(1) в программе существует предложение С, такое, что
(2) существует такая его (С) конкретизация I, что
(a) голова I совпадает с G и
(б) все цели в теле I истинны.
Это определение можно распространить на вопросы следующим образом. В общем случае вопрос к пролог-системе представляет собой список целей, разделенных запятыми. Список целей называется истинным (достижимым), если все цели в этом списке истинны (достижимы) при одинаковых конкретизациях переменных. Значения переменных получаются из наиболее общей конкретизации.
Таким образом, запятая между целями обозначает конъюнкцию целей: они все должны быть истинными. Однако в Прологе возможна и дизъюнкция целей: должна быть истинной, по крайней мере одна из целей. Дизъюнкция обозначается точкой с запятой. Например:
>P :- Q; R.
читается так: P — истинно, если истинно Q или истинно R. То есть смысл такого предложения тот же, что и смысл следующей пары предложений:
>P :- Q.
>P :- R.
Запятая связывает (цели) сильнее, чем точка с запятой. Таким образом, предложение
>P :- Q, R; S, T, U.
понимается как:
>P :- ( Q, R); (S, T, U).
и имеет тот же смысл, что и два предложения
>P :- Q, R.
>P :- S, T, U.
2.6. Рассмотрим следующую программу:
>f( 1, один).
>f( s(1), два).
>f( s(s(1)), три).
>f( s(s(s(X))), N) :-
> f(X, N).
Как пролог-система ответит на следующие вопросы? Там, где возможны несколько ответов, приведите по крайней мере два.
(a)> ?- f( s( 1), A).
(b)> ?- f( s(s(1)), два).
(c)> ?- f( s(s(s(s(s(s(1)))))), С).
(d)> ?- f( D, три).
2.7. В следующей программе говорится, что два человека являются родственниками, если
(a) один является предком другого, или
(b) у них есть общий предок, или
(c) у них есть общий потомок.
>родственники( X, Y) :-
> предок( X, Y).
>родственники( X, Y) :-
> предок( Y, X).
>родственники( X, Y) :-
> % X и Y имеют общего предка
> предок( Z, X),
> предок( Z, Y).
>родственники( X, Y) :-
> % X и Y имеют общего потомка
> предок( X, Z),
> предок( Y, Z).
Сможете ли вы сократить эту программу, используя запись с точками с запятой?
2.8. Перепишите следующую программу, не пользуясь точками с запятой.
>преобразовать( Число, Слово) :-
> Число = 1, Слово = один;
> Число = 2, Слово = два;
> Число = 3, Слово = три.
2.4. Процедурная семантика
Процедурная семантика определяет, как пролог-система отвечает на вопросы. Ответить на вопрос — это значит удовлетворить список целей. Этого можно добиться, приписав встречающимся переменным значения таким образом, чтобы цели логически следовали из программы. Можно сказать, что процедурная семантика Пролога — это процедура вычисления списка целей с учетом заданной программы. "Вычислить цели" это значит попытаться достичь их.
Назовем эту процедуру >вычислить
. Как показано на рис. 2.9, входом и выходом этой процедуры являются:
входом — программа и список целей,
выходом — признак успех/неуспех и подстановка переменных.
Рис. 2.9. Входы и выходы процедуры вычисления списка целей.
Смысл двух составляющих выхода такой:
(1) Признак успех/неуспех принимает значение "да", если цели достижимы, и "нет" — в противном случае. Будем говорить, что "да" сигнализирует об успешном завершении и "нет" — о неуспехе.
(2) Подстановка переменных порождается только в случае успешного завершения; в случае неуспеха подстановка отсутствует.
>большой( медведь). % Предложение 1
>большой( слон). % Предложение 2
>маленький( кот). % Предложение 3
>коричневый ( медведь). % Предложение 4
>черный ( кот). % Предложение 5
>серый( слон). % Предложение 6
>темный( Z) :- % Предложение 7:
> черный( Z). % любой черный
> % объект является темным
>темный( Z) :- % Предложение 8:
> коричневый( Z). % Любой коричневый
> % объект является темным
>?- темный( X), большой( X) % Кто одновременно темный
> % и большой?
(1) Исходный список целевых утверждений:
>темный( X), большой( X).
(2) Просмотр всей программы от начала к концу и поиск предложения, у которого голова сопоставима с первым целевым утверждением
>темный( X).
Найдена формула 7: