Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пролог.doc
Скачиваний:
16
Добавлен:
10.11.2018
Размер:
1.44 Mб
Скачать

7.5. Механизм отката

Если текущая попытка вычислить цель была неудачной, то для нахождения дополнительных фактов и правил, необходимых при вычислении цели, используется механизм отката.

Этот механизм похож на поиск дома, находящегося через дорогу от входа в парк на улице с перекрестками.

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

Пример:

likes(mary, pears). – база данных

likes(mary, popcorn). – Мери любит кукурузные хлопья

likes(mary, аpples). – мери любит яблоки

likes(beth, X):– likes(mary, Х), fruit(X), Color(X, red).

Бет любит нечто – если Мери любит это нечто, если это нечто – фрукт, и если цвет этого нечто – красный

likes(beth, X):– likes(mary, Х), Х=popcorn.

Любит Бет то же что и Мэри, и если это кукурузные хлопья

fruit(pears ). – персики-фрукт

fruit(аpples). – яблоки-фрукт

color(pears, yellow). – цвет персиков желтый

color(oranges, orange). – апельсин оранжевый

color(аpples, red). – цвет яблок красный

color(аpples, yellow). – цвет яблок желтый

Цель: что любит Бет?

Likes(beth, X) Х=аpples, Х=popcorn

Совпадет, тогда проверяем следующую цель likes (mary, Х)

Х=pears (персик)

fruit(pears)

color(pears, red) – нарушение и т.д.

7.6. Операторы. Декларативный и процедурный смысл программы

Существуют 2 простых оператора.

1. write(«текст», А) – всегда работает, печатает текст, т.е. то, что находится в скобках;

2. writef(шаблон, список переменных) – форматированный вывод.

Допустим, необходимо написать программу, которая ищет синонимы слова. Введем предикат synonym(word, syn). Тогда программа будет иметь вид:

domains

word, syn=symbol

predicates

synonym (word, syn)

goal

synonym (brave, X), write (“Synonym for ‘brave’ is “), nl, write (“’”, X, ”’.”), nl.

сlauses

synonym(brave, daring).

synonym(brave, cowardless).

Внутренняя цель является составной и состоит из 5 подцелей. Synonym(brave, X) – найти утверждение, использующее предикат synonym, такое, что первый объект в нем bravo, и связать переменную Х с его вторым объектом. Второй подцелью является печать строки символов, третья подцель – встроенный предикат nl сдвигает курсор на начало новой строки. Список аргументов write может быть смешанный, как в четвертой подцели, которая печатает найденный синоним. В запросе может быть несколько переменных, например, synonym(P, Q). Ответ будет P=bravo, Q=daring и т.д.

Для реализации арифметических операций в Турбо Прологе имеются встроенные предикаты операций:

+, -, *./, mod, div (деление нацело, получение остатка),

определены все тригонометрические функции:

Cos(x), sin(x), tg(x), и ряд других функций.

Пример.

preducates

аdd(integer, integer) – сложение 2 целых чисел,

fadd(real, real) – сложение действительных числа.

Пример.

predicates

add(integer, integer)

fadd(real, real)

goal

write(“Result is”), nl, nl, add (44, 23), fadd (1.23, 3.56).

clauses

add(X, Y):– Z=X+Y, write(“Sum=”, Z), nl.

fadd(P, Q):– R=P+Q, write(“Fsum=”, R), nl.

Помимо принадлежности одному и тому же домену некоторые объекты могут иметь еще некоторое число общих атрибутов.

До сих пор мы рассматривали программу на Прологе, как систему вывода на клозах Хорна, т.е. как систему доказательств фактов на основе других фактов и правил. Действительно, в этом состоит так называемый декларативный (дескриптивный) смысл программы. В тоже время ряд предикатов, приведенных выше, более напоминают команды процедурного языка нежели логические выражения. Действительно, эти предикаты всегда истинны, но подразумевают определенные инструкции, которые компьютер должен выполнить. Таким образом, с учетом правил работы каждая программа на Прологе предполагает некоторую последовательность действий, т.е. алгоритм, который реализован в программе. В этом состоит процедурный смысл программы.