При использовании предиката call(X) предполагается, что Х конкретизирован термом, который может быть интерпретирован как целевое утверждение. Целевое утверждение call(X) считается согласованным, если попытка доказать согласованность Х завершается успехом. Целевое утверждение call(X) не согласуется с базой знаний, если попытка доказать согласованность Х заканчивается неудачей. Этот предикат необходим в том случае, когда по смыслу решаемой задачи целевые утверждения могут принимать различные значения или создаваться в процессе вывода новых фактов и правил. В том и другом случаях такие целевые утверждения представлены в программе переменными и могут быть согласованы с базой знаний только с помощью предиката call(X), аргументом которого может быть переменная, принимающая значение целевого утверждения. Использование предиката call рассматривается в следующем примере.
Пример 3. Рассмотрим применение предиката consult. Разумеется, предикат consult предусмотрен среди встроенных предикатов большинства Пролог-систем, однако интересно посмотреть, как он может быть определен на Прологе.
consult(FL):-seeing(INPUT),see(FL),repeat,read(TERM),
'обработать'(TERM),seen,see(INPUT),!.
'обработать'(TERM):- 'маркер_конца_файла'(TERM),!.
'обработать'((?-Q)):- !,call(Q),!,fail.
'обработать'(UTV):- assertz(UTV),fail.
Это определение отличается рядом интересных особенностей. Во-первых, цель seeing(INPUT) и ее партнер see(INPUT) призваны гарантировать, что текущий файл ввода не будет "забыт" после применения предиката consult. Предикат 'маркер_конца_файла' должен быть истинным только в том случае, когда его аргумент конкретизирован термом, используемым для представления конца файла. Одно из возможных определений:
'маркер_конца_файла'('конец_файла').
Предикат 'обработать' доказуем только тогда, когда его аргументом является маркер конца файла. Иначе после соответствующего действия имитируется неудача доказательства и инициируется механизм возврата, который возвращает программу к предикату repeat. Отметим важность "отсечения" в конце определения предиката consult. Оно фиксирует выбор, сделанный предикатом repeat. И последнее замечание. Если терм, считанный из файла, представляет собой вопрос (2-е утверждение), то делается попытка немедленно согласовать соответствующую цель с помощью предиката call.
Пример 4. В качестве примера использования предиката retract приведено определение полезного предиката 'убери_все'(Х), все утверждения, заголовки которых совпадают с Х, удаляются из БЗ:
'убери_все'(Х):- retract(X), fail.
'убери_все'(Х):- retract((X:-Y)), fail.
'убери_все'(_).
|