Основы современных компьютерных технологий


Управление вычислениями - часть 4


goal


show

на экран будет выведено:

Группа-261 Студент-ПЕТРОВ П.Р. Оценка-5

Группа-262 Студент-ЖИГАРЕВ С.И. Оценка-3

Таким образом, сравнение 7="Программирование ", выполняет двоякую роль: с одной стороны, это фильтр, который не допускает выполнения предиката write(...) при неуспешном сравнении, а с другой - вызывает из-за неуспешного сравнения откат до ближайшей альтернативы. При этом если бы не было предиката fail, было бы получено только первое решение - fail обеспечивает перебор всех альтернатив. Предикат nl является стандартным, он выполняет переход на следующую строку при выводе информации на экран.

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

show:-kurs_22(gr(X,student(Y,Z,K))),

Z="Программирование",!,

write(Tpynna-",X," Студент-", Y ," Оценка-",К),

nl,

fail.

Тогда для внутреннего запроса:

goal


show

315

на экране будет выведена информация:

Группа-261 Студент-ПЕТРОВ П.Р. Оценка-5

В данном варианте после успешного сравнения Z="Программирование " предикат ! прекращает условия поиска после формирования условия "неуспех" предикатом fail.

Таким образом, использование в правиле предиката отсечения означает, что в дальнейшем не будет производиться перебор других аргументов предикатов, использованных в этом правиле до знака отсечения после формирования признака неуспеха любым из предикатов, стоящим в правиле правее предиката !. Но это не означает, что не будут перебираться альтернативные варианты по неуспеху для других предикатов, стоящих за !.

Преобразуем предикат show к виду:

show:-kurs_22(gr(X,student(Y, Z, K))),

Z="Программирование ", ! , К=3,

write(" Группа -", X ," Студент-", Y, " Оценка-",К),



Начало  Назад  Вперед