Глава 8. Встроенные предикаты и операторы
Встроенными предикатами языка являются goal(), alarm(E),
"(Set) и element(Value,l1,... ,lk), определяемые в тексте программы,
а также предопределённые предикаты:
'=='(V1,... ,Vk)------------унифицировать термы;
':='(V1,... ,Vk)------------разрушающее присваивание;
true[(...)]-----------------истина;
fail------------------------ложь (неудача).
Кроме того, в языке определены встроенные управляющие операторы,
использование которых может нарушить полноту программы относительно
её декларативной семантики:
copy(V1,... ,Vk)--------------актуализация производных значений;
'!'---------------------------отсечение;
break[(E)]--------------------вызов исключительной ситуации;
spypoint(...)-----------------обращение к отладчику.
Встроенный оператор отсечения устраняет все неисследованные
пути (точки выбора), которые встретились с момента начала исполнения предиката,
в соответствие которому было поставлено предложение, содержащее оператор.
Результаты исполнения оператора «обращение к отладчику»
должны быть определены в конкретной реализации языка.
В программе не допускается определение предикатов, имена
которых совпадают с именами предопределённых предикатов и встроенных управляющих
операторов. Не разрешается использование таких имён в качестве предикатных символов
в акторных и дальних вызовах.
Неверное число аргументов в предопределённых предикатах
и встроенных управляющих операторах является синтаксической ошибкой.
Пример.
Использование оператора отсечения.
Рассмотрим поведение фрагмента программы
goal:-
write("<1>").
subgoal_a:-,
write("<7>").
goal:-
write("<8>").
subgoal_a:-
write("<2>"),
subgoal_b:-
—отсечение
write("<4>"),
fail. subgoal_a:-
write("<6>").
subgoal_b:-
write("<3>").
subgoal_b:-
write("<5>").
Если убрать оператор отсечения, программа напечатает:
<1> <2> <3> <4> <5> <6> <7>
При наличии оператора отсечения будет напечатано:
<1> <2> <3> <4> <8>
Содержание