использовать свойство Пролога выполнять поиск
Один из них - использовать свойство Пролога выполнять поиск альтернативного решения при неудачной попытке применения текущего. В этом случае Пролог выполняет откат до ближайшей альтернативы, восстанавливает первоначальные условия поиска и процесс начинается заново с найденной новой альтернативы. Для организации таких вычислений в языке есть специальный предикат fail, который всегда завершается неуспехом и вызывает откат до ближайшей альтернативы.
Для цели перебора всех альтернативных фактов в примере и вывода их на экран в состав программы введем нульместный предикат show и правило вида: show:-kurs_22(X),write(X),fail. Для этого в раздел
predicates добавим строку show, в разделе
clauses поместим строку show:- kurs_22(X),write(X),fail.
Зададим также внутреннюю цель вида:
goal
show.
В этом случае на экран будут выведены все 7 альтернативных решений - после нахождения первого переменная X будет означена константой первого факта, полученное значение переменной X сопоставляется аргументу предиката write(X), который выведет его на экран, после чего выполняется предикат fail, который завершается неуспехом и
314
Пролог выполнит откат до ближайшего недетерминированного предиката (т.е. имеющего несколько вариантов правил), а это в нашем случае предикат kurs_22(X), будет выбран второй факт, выполнено сопоставление и т.д. до тех пор, пока не будут перебраны все альтернативы.
Предписать Прологу выполнять откат можно не только с помощью предиката fail -любой неуспешно завершенный предикат вызывает откат до ближайшей альтернативы (стоящего от него левее в теле правила). Продемонстрируем это на нашем примере. Пусть необходимо получить и вывести на экран информацию о студентах, пересдавших экзамен по дисциплине "Программирование".
Изменим предикат show:
show:-kurs_22(gr(X,student(Y,Z, K))),
Z="Программирование",
write( " Гpyппa-" . X, " Студент-", Y, " Оценка-", K),
nl,
fail.
Тогда для внутреннего запроса:
Содержание Назад Вперед