Содержание:
Условные отношения или правила в 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). |