Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ в ИС.doc
Скачиваний:
4
Добавлен:
25.09.2019
Размер:
399.87 Кб
Скачать

Пример 4.1

Backtracking

% facts

m1.1  like(mary, food). %f1

m1.2  like(mary, wine). %f2

m2.1  like(john, wine). %f3

like(john, mary). %f3

? - like(mary, X), like(john, X).

Алгоритм поиска:

Шаг 1:

? - like(mary, X). X = food

Пролог устанавливает маркер m1.1.

Шаг 2:

? - like(john, food). false

Шаг 3:

Откат назад: Xfree

? - like(mary, X).

Поиск начинается от маркера m1.1.

X = wine

Предыдущий маркер стирается и устанавливается новый – m1.2.

Шаг 4:

? - like(john, wine).

Yes

Устанавливается новый маркер – m2.1.

Шаг 5

X = wine

Примечание: Если нужно найти другие варианты ответов, то должен использоваться предикат fail, который выполняет откат назад и повторный поиск, начиная с маркеров m1.2 и m2.1 до тех пор, пока не будет просмотрена вся БФ для каждого из составных предикатов.

Рассмотренный пример программы использовал программирование с помощью фактов.

Пример 4.2

Рассмотрим пример программирования с помощью правил.

Пусть стоит задача поиска родственных отношений между людьми:

Запишем базу фактов, где будем использовать 3 типа предикатов:

Predicates

родитель(symbol, symbol)

потомок(symbol, symbol)

мужчина(symbol)

женщина(symbol)

% facts

женщина (Нам).

мужчина (Том).

мужчина (Боб).

женщина (Лиз).

мужчина(Пат).

женщина (Энн).

мужчина (Джинн).

родитель(нам, боб);

родитель(том, боб);

родитель(том, лиз);

родитель(боб, энн);

родитель(боб, пат) ;

родитель(пат, джинн);

? – родитель(X, энн), родитель(X, пат).

X=боб.

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

Исходя из дополнительной информации о поле родственников, можно определить новые отношения – “мать” и “сестра”:

Правило, задающее материнство:

мать(X,Y) :– женщина(X), родитель(X, Y).

Правило, определяющее термин «сестра»:

сестра (X,Y) :– родитель(Z, X), родитель (Z, Y),женщина(X).

? – сестра(X, пат).

X=энн.

Добавим предикат «предок» и зададим его рекурсивное определение. Будем говорить, что некто X и Z являются предком и потомком друг для друга, если между ними существует цепочка людей, связанных между собой отношениями «родитель».

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

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

? – предок(нам, энн)

Yes.

4.2 Сравнение термов на равенство.

Существуют 4 оператора сравнения термов, работающих по-разному:

  • is;

  • =:=;

  • =;

  • = =.

Входные предикаты

Вызов

Результат

1) X

2) 7+2

X is 7+2

X =:= 7+2

X = 7+2

X = = 7+2

X = 9

Ошибка

X = 7+2

Ошибка

1) 8+1

2) 7+2

8+1 is 7+2

8+1 =:= 7+2

8+1 = 7+2

8+1 = = 7+2

Ошибка

9 = 9

Ошибка

Ошибка