Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Spec_Mov_3k_4k_Lect.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.46 Mб
Скачать

Предикаты not и fail

Системный предикат fail всегда ложный и инициирует поиск новых решений.

Системный предикат not(Цель) – является предикатом 2-го порядка и всегда истинный в том случае, если Цель ложна.

Программную внутреннюю реализацию предиката not можно представить следующим образом:

not(X):- X, !, fail.

not(_).

Комбинация «отсечение-fail» позволяет прервать вычисление программы на ранней стадии выполнения и/или используется для реализации предикатов специального выда.

Пример

predicates

ne(int, int)

ne(real, real)

ne(symbol, symbol)

clauses

ne(X, X):- !, fail.

ne(X, Y).

Другой вариант определения предиката ne следующий:

ne(X, Y):- not(X = Y).

Пример

«Мэри любит животных, но не змей». Свойства объектов обычно представляют в инженерии знаний одноместными предикатами. Естественно, что в программа, представленная далее должна быть дополнена множеством фактов, для отображения свойств животных:

clauses

loves(mary, X):- snake(X), !, fail.

loves(mary, X):- animal(X).

или

clauses

loves(mary, X):- animal(X), not(snake(X)).

«Циклы» управляемые отказом

С помощью предиката fail в Прологе имеется возможность организовать цикл аналогичный repeat-циклу в обычных процедурных языках программирования. Для этого необходимо:

  • разместить в программе определение предиката repeat следующего вида:

clauses

repeat.

repeat:- repeat.

  • применить следующий прием использования предиката repeat:

в теле правила, содержащего цель repeat, должно располагаться отсечение, гарантирующее завершение выполнения цикла, а сам цикл должен инициироваться применением предиката fail.

Данный метод программирования уместен в том случае, если используются внелогические предикаты, обеспечивающие возможность изменения состояния программы как на уровне динамической БД, так и на уровне внешней среды (работа с файлами, монитором и клавиатурой и т.п.).

Пример

Перепишем определение предиката obr и zadacha в примере, связанном с обработкой файла, когда из файла формируется новый файл за счет выбрасывания строк, начинающихся с символа ‘A’.

zadacha:- repeat, readln(Str), frontchar(Str, C, _), obr(Str, C), !.

obr(Str, C):- eof(inp),C<>’A’, !, write(Str), nl, closefile(inp), closefile(out).

obr(_, _):- eof(inp), closefile(inp), closefile(out), !.

obr(Str, C):- C<>’A’, !, write(Str), nl, fail.

obr(_, _):- fail..

В данном примере отсечение, гарантирующее завершение цикла и отменяющее точку возврата для repeat, расположено за предикатом obr в определении правила с заголовком zadacha.

Вопросы для самоконтроля

  • Как представлены списки в Турбо-Пролог программах?

  • Что из себя представляет запись следующего вида [a, rectang, cos, sec]?

  • Что из себя представляют записи следующего вида [X | T], [a,b | Z]?

  • Как в Турбо-Пролог программе записывается предикат отсечения, его назначение, как он работает?

  • Что из себя представляют «зеленые» отсечения?

  • Что из себя представляют «красные» отсечения?

  • Назначение предикатов not и fail?

  • Приведите определение предиката repeat!

  • Как в пролог-программе выглядят «циклы управляемые отказом», какие системные предикаты лежат в основе таких «циклов»?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]