Prolog урок 3. Факты и правила, родственные отношения

Цель урока: изучение синтаксиса построения фактов и правил на языке prolog, рассмотрение примеров с использованием родственных отношений

Условные отношения или правила в 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

Очевидно, что в примере XY и 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)
Задание Prolog 3_1:
Составить базу данных о Мэри и Бет, которые любят фрукты и овощи. Но:

  1. Мэри любит яблоки только, если они зеленые,
  2. Бет любит вообще только зеленые фрукты и овощи,
  3. Мэри любит яблоки, только если их любит Бет.

Добавьте недостающие фрагменты и реализуйте запросы в окне dialog:

  1. любит ли Мэри яблоки,
  2. любит ли Бет апельсины.

Проанализируйте ответы на запросы.

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:

  1. Сопоставление с фактом: likes(mary,apples). – ложь
  2. Сопоставление с головной частью правила: likes(beth,X) – переменной Х присваивается значение apples
  3. Попытка выполнения условия: if likes(mary,X)
  4. Проверка подзадачи и подцели: likes(mary,apples).
  5. Сопоставление с фактом: likes(mary,apples). – Истина.

Цель достигнута.

Правило или факт?

Если правило выглядит как:

likes (beth,apples)if likes(mary,apples).

То это и правило и факт одновременно, т.к. голова правила имеет форму факт.

Но в другом случае, в голове правила может быть расположена переменная:

likes (beth,X)if likes(mary,X).

* При использовании материалов обязательна ссылка на источник: Кузнецова Т.К., «Программирование Turbo Prolog» — Задачи и решения, Ростов-на-Дону, ПИ ЮФУ — 2011г.