Глава 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>



Содержание