Содержание:
Условные отношения или правила в Prolog
Рассмотрим пример, когда факты связаны условным отношением с другими уже известными фактами, в таком случае они могут называться правилами:
likes(cindy, X):- likes(bill, X). /* Синди любит все, что любит Билл */ |
likes(cindy, X) является заголовком правила.
likes(bill, X) является телом правила или его хвостовой целью.
Чтобы правило стало истинным, необходимо чтобы его хвостовая цель/цели была/были истинными. Т.е. в нашем случае, если Билл любит что-то (т.е. если высказывание истинно), тогда и Синди любит это (т.е. тогда правило истинно).
Символ
:- имеет смысл «если», и служит для разделения двух частей правила: заголовка и тела.Можно вместо него использовать
if
Правило может содержать несколько хвостовых целей, которые должны быть истинными для того, чтобы правило было истинным:
babushka(X,Y):- mama(X,Z),mama(Z,Y). |
X является бабушкой Y, если X является мамой Z и Z является мамой Y.
И если смотрим по отцу, а не по матери:
babushka(X,Y):- mama(X,Z),papa(Z,Y). |
X является бабушкой Y, если X является мамой Z и Z является папой Y.
Или так:
Первое правило гласит, что X является бабушкой Y, если существует такой Z, что X является мамой Z, а Z — мамой Y. Второе правило гласит, что X является бабушкой Y, если существует такой Z, что X является мамой Z, а Z — папой Y.
Символ
, — это логическая связка «и», соответственно, вместо него можно писать and
Очевидно, что в примере X, Y и Z — это переменные.
Переменные могут быть свободными или связанными.
Свободная переменная пока не имеет значения. Такие переменные еще называют неконкретизированными.
Переменная, которая получила какое-то значение и оказалась связанной с определенным объектом, называется связанной.
Еще пример:
likes (bill, Something)if green(Something). |
Это правило можно интерпретировать, как «Билл любит все зеленое». В данном примере Something — это переменная, т.к. начинается с заглавной буквы и без кавычек.
Выполнение:
domains a=symbol b=integer predicates pol(a,a) vozrast (a,b) clauses pol(ivan,boy). pol(sergey,boy). pol(mary,girl). vozrast(ivan,3). vozrast(sergey,4). vozrast(mary,5). |
pol), затем с другим (vozrast)Составить базу данных о Мэри и Бет, которые любят фрукты и овощи. Но:
- Мэри любит яблоки только, если они зеленые,
- Бет любит вообще только зеленые фрукты и овощи,
- Мэри любит яблоки, только если их любит Бет.
Добавьте недостающие фрагменты и реализуйте запросы в окне dialog:
- любит ли Мэри яблоки,
- любит ли Бет апельсины.
Проанализируйте ответы на запросы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | domains a=symbol predicates likes (a,a) green(a) clauses likes (mary,apples). likes (beth,apples). likes(mary,oranges). likes (mary, tomatoes). likes (mary,apples)if ________. likes(___,__) if likes(___,__). likes (___,__)if green(__). green(apples). green(goroh). |
Порядок выполнения команд компилятором TProlog
Пусть программа на Турбо-Прологе содержит факт:
likes(mary,apples). /* Мэри любит яблоки */ |
И правило:
likes(beth,X) if likes(mary,X). /* Бет любит это, если Мэри любит это */ |
Вводим цель:
likes(beth,apples). /* бет любит яблоки */ |
Турбо-Пролог воспринимает утверждение цели и начинает поиск правил и фактов программы для сопоставления с предикатом likes:
- Сопоставление с фактом:
likes(mary,apples).– ложь - Сопоставление с головной частью правила:
likes(beth,X)– переменнойХприсваивается значениеapples - Попытка выполнения условия:
if likes(mary,X) - Проверка подзадачи и подцели:
likes(mary,apples). - Сопоставление с фактом:
likes(mary,apples).– Истина.
Цель достигнута.
Правило или факт?
Если правило выглядит как:
likes (beth,apples)if likes(mary,apples). |
То это и правило и факт одновременно, т.к. голова правила имеет форму факт.
Но в другом случае, в голове правила может быть расположена переменная:
likes (beth,X)if likes(mary,X). |