- Поиск начинается от начала программы и до конца и целевое утверждение унифицируется с предложением.
Получим:
писатель (федя, «Доктор Нет»)
X=федя Y=Доктор Нет
- Тест GOAL ищет все решения. Таким образом
писатель (маша, «Моби Дик»)
X=маша, Y=Моби Дик
2 solution
2. goal
писатель (X, «Моби Дик»).
Шаги:
- Берётся целевое утверждение и производится унификация, то есть
писатель (федя, «Доктор Нет»)
соответствия нет
- Проверяется следующий шаг
писатель (маша, «Моби Дик»)
1 solution
3) goal
сериал (X).
Шаги:
- Prolog проверяет соответствие обращения к факту и заголовку правила.
- Затем происходит согласование подцелей в правиле.
писатель (_, Название)
писатель (федя, «Доктор Нет»)
книга («Доктор Нет», ТОМ)
книга («Доктор Нет», 250)
не выполняется
писатель (_, Название)
писатель (маша, «Моби Дик»)
книга («Моби Дик», ТОМ)
книга («Моби Дик», 310)
Анонимные переменные: используют для игнорирования ненужных значений (_).
Predicates
Родитель (symbol, symbol)
Clauses
Родитель(саша, маша).
Родитель (маша, паша).
Родитель (паша, саша).
Goal
Родитель (Родитель,_).
Ответ:
Родитель = саша
Родитель = маша
Родитель = маша
Анонимные переменные можно использовать в фактах
ест(_)
носит(_, ботинки)
Вопрос №19.
Поиск с возвратом заключается в следующем:
1. поиск начинается с утверждения и в случае необходимости выбора альтернативного пути Prolog ставит маркер у места ветвления. Эта точка называется точкой отката. Затем выбирает первую подцель и проверяет её.
2. если данная подцель не выполняется, то происходит возврат в точке отката и Prolog пробует проверить другую подцель.
Пример:
predicates
любит (symbol, symbol)
вкус (symbol, symbol)
еда (symbol)
clauses
любит (Вася, X):-
еда (X), вкус (X, деликатес).
вкус (омар, деликатес).
вкус (эстонские_шпроты, не_вкусно).
еда (эстонские_шпроты).
еда (омар).
goal
любит (Вася, Что).
Шаги:
- подцель любит (Вася, Что) соответствует заголовку правила и переменная Что унифицируется с переменной X.
любит (Вася, X)
- после сопоставления заголовка Prolog двигается по телу правила и обращается к первой подцели.
еда (X)
Далее производится унификация
еда (эстонские_шпроты)
Так как файлу еда существует ещё одно обращение, то Prolog ставит маркер возле еда(эстонские_шпроты)
- если соответствие успешно, то исследуется следующая подцель правила
вкус (X, деликатес)
вкус (эстонские_шпроты, деликатес)
- после возврата к маркеру Prolog освобождает все переменные, связанные после точки возврата.
еда (X)
еда (омар)
вкус (омар, деликатес)
Что=омар
1 solution
Вопрос №20.
Основные правила поиска с возвратом.
Пример:
Некоторые любят выпить, а некоторые – читать, так как они любознательные. А есть те, которые любят и выпить, и почитать.
domains
имя, что-то= symbol
predicates
любит (имя, что-то)
читает (имя)
любознательный (имя)
clauses
любит (вася, вино).
любит (петя, лыжи).
любит (петя, книги).
любит (петя, кино).
любит (Z, книги):-
читает (Z), любознательный (Z).
читает (вася).
любознательный (вася).
goal
любит (X, вино),
любит (X, книги).
Правило 1 Подцели должны быть согласованы по порядку сверху вниз.
Дерево подцелей:
Правило 2 Предикатные предложения проверяются в том порядке, в каком они появляются в программе сверху вниз.
Поиск согласования первой подцели Prolog пытается согласовать подцель справа. Далее поиск идёт по правилу (направо).
Z унифицируется с X, а X уже равно вася. И применяется правило 3.
Правило 3 Когда подцель соответствует заголовку правила далее должно быть согласовано тело этого правила. Таким образом тело правила образует новое множество подцелей для согласования.
Правило 4
Цель доказано, когда соответствующие факты найдены для каждой вершины дерева целей.
X=вася
1 solution
Вопрос №21.
Prolog предлагает два инструмента поиска:
1. предикат fail. Он предназначен для инициализации поиска с возвратом.
2. предикат cut – называется отсечение и предназначен для запрета возможности возврата. Cut обозначается !
Предикат fail всегда вызывает неуспешное завершение и следовательно инициализирует возврат (2*2=5 неуспешно).
Пример:
Есть родители и дети. Определить кто чей папа.
domains
имя=symbol
predicates
отец (имя, имя)
каждый
clauses
отец (коля, вася).
отец (петя, лена).
отец (петя, яша).
каждый:-
отец (X,Y),
write (X,”есть”,Y,”отец\n”),
fail.
goal
отец (X,Y).
Ответ: X=коля, Y=вася
...
3 solution
goal
каждый
Ответ: коля есть вася отец
петя есть лена отец
петя есть Яша отец
no solution
В этом случае: fail не может быть согласован, так как он всегда неуспешен. При поиске с возвратом fail обращается к последнему обращению, которое может привести к недетерминированному решению.
domains
имя=symbol
predicates
отец (имя, имя)
каждый
clauses
отец (коля, вася).
отец (петя, лена).
отец (петя, яша).
каждый:-
отец (X,Y),
write (X,”есть”,Y,”отец\n”),
fail.
goal
отец (X,Y).
Предикат WRITE yt может быть согласован, так как он не порождает новых решений. Поэтому fail выполняет откат (возврат) к первой подцели.
Ответ: коля есть вася отец
1 solution
Прерывание поиска с возвратом (!).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.