Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Clauses






father(leonard, katherine).% Leonard отец katherine

father(carl, jason). % carl отец jason

father(carl, marilyn). % carl отец marilyn

everybody: -

father(X, Y),

write(X, " is ", Y, " 's father\n"),

fail.

Goal

father(X, Y).

 

Test Goal найдет все решения цели father (X, Y) и отобразит значения всех переменных следующим образом:

X=leonard, Y=katherine

X=carl, Y=jason

X=carl, Y=marilyn

3 Solutions

Если скомпилировать программу и запустите ее (клавишей < F9> или командой меню Project | Run), то Visual Prolog найдет только первое подходящее решение для father (X, Y). После того как целевое утверждение, определенное в разделе goal, выполнено впервые, ничто не говорит Прологу о необходимости продолжения поиска с возвратом. Поэтому обращение к father приведет только к одному решению. Как же найти все возможные решения? Предикат everybody в данной программе использует fail для поддержки поиска с возвратом.

Задача предиката everybody — найти все решения для father и выдать полный ответ.

Поставить целью everybody чтобы выполнить поиск с возвратом через тело правила

everybody: -

father(X, Y),

write(X, " is ", Y, " 's father\n"),

fail.

При этой цели получим ответ:

leonard is katherine's father

carl is jason's father

carl is marilyn's father

Т.е. fail организует возврат до момента невозможности нахождения другой цели.

fail не может быть согласован (он всегда неуспешен), поэтому Visual Prolog вынужден повторять поиск с возвратом. При поиске с возвратом он возвращается к последнему обращению, которое может произвести множественные решения. Такое обращение называют недетерминированным. Недетерминированное обращение является противоположностью детерминированному обращению, которое может произвести только одно решение.

Обратим внимание, что помещать подцель после fail в теле правила бесполезно. Предикат fail все время завершается неудачно, нет возможности для достижения подцели, расположенной после fail.

Такая запись является способом сообщить Visual Prolog о том, что вас удовлетворит первое решение, найденное им для подцелей а и b. Имея возможность найти множественные решения при обращении к с путем поиска с возвратом, Пролог при этом не может произвести откат (поиск с возвратом) через отсечение и найти альтернативное решение для обращений а и b. Он также не может возвратиться к другому предложению, определяющему предикат ri.

 

Предотвращение поиска с возвратом к предыдущей подцели в правиле

 

В качестве конкретного примера рассмотрим:






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.