Использование предикатов fail, not, cut (неуспех, отрицание и отсечение).


Предикат cut (или ! ) – отсечение – его основное назначение в ограничении пространства поиска при вычислении за счет динамического сокращения дерева поиска. Отсечение можно использовать для отбрасывания бесплодных путей вычислений, которые не могут привести к решению. 
Отсечения могут быть также использованы умышленно или по недосмотру для исключения путей вычислений, которые могут содержать решения. Таким образом можно реализовать слабую форму отрицания.
? Отсечение отбрасывает все расположенные после него предложения (правила). Если цель р унифицирована с предложением, содержащим отсечение, и отсечение выполнено, то эта цель не может быть использована для построения решений с помощью предложений, расположенных ниже данного.
? Отсечение отбрасывает все альтернативные решения конъюнкций целей, расположенных в предложении левее отсечения, т.е. конъюнкция целей, стоящих перед отсечением, приводит не более к чем одному решению.
? С другой стороны, отсечение не влияет на цели, расположенные правее его. В случае возврата они могут порождать более одного решения. Но если эта конъюнкция не выполнится, то поиск переходит к последнему выбору, сделанному перед выбором предложения, содержащего отсечение.
Пример 1: Вычислить
Вариант 1. Вариант 2.
Программа Lab2_1.pro Программа Lab2_2.pro
domains domains
argument =real argument =real
result =real result =real
predicates predicates
func(argument, result) func(argument, result)
clauses clauses
func(X,0):- X<3,!. func(X,0):- X<3,!.
func(X,2):- X>=3,X<6,!. func(X,2):- X<6,!.
func(X,4):- X>=6. func(X,4).
goal goal func(-2,X). func(-2,X).

С помощью отсечения можно описать взаимоисключающие правила, поэтому есть возможность запрограммировать утверждение «Если Р, то Q, иначе R»

Внимание !!!: Влияние положения отсечения на смысл утверждения:

1) p:-a, b. p если (а и b) или с.
p:-c.

2) p:- a,!,b. p если (a и b ) или (не a и с)
p:-c.

3) p:-c. p если с или (a и b)
p:- a,!,b.
Cказать на Прологе, что что-то не есть истина, можно при помощи специальной цели fail (неуспех), которая всегда терпит неудачу, заставляя потерпеть неудачу и ту цель, которая стоит в заголовке правила (цель-родитель). Учитывая встроенный механизм поиска с возвратом, fail заставляет систему не прекращать поиск, а искать все возможные решения.
Аналогично, специальная цель true (успех), всегда успешна, истинна.

Пример 2: Программа Lab2_3.pro
predicates
age (symbol,integer) % возраст кандидата в призывники
man (symbol) % пол кандидата в призывники
army(symbol) % призывник
clauses
age(petr,18).
age(dima,17).
age(nik,18).

man(petr).
man(dima).
man(nik).

army(X):- man(X), age (X,Y), Y>=18.
goal
army(X).

При задании цели «Кто может быть призван в армию?» ( army(X) ), система ответит:
X=petr
X=nik

Пример 3: Программа Lab2_4.pro

DOMAINS

name, addr = string

PREDICATES
person(name,addr)
print_all()

CLAUSES
person(tom,city1).
person(jim,city2).
person(ann,city3).
person(lize,city1).
person(tata,city4).
person(kat,city5).

print_all():-
person(Name,Addr),
write(«\nName=»,Name,», Address=»,Addr),
fail.
goal
print_all.
(Каков будет результат выполнения программы?)

Предикат not можно определить следующим образом: если Цель успешна, то not(Цель) неуспешна, иначе not(Цель)успешна.
Необходимо учесть, что not, определенный с помощью неуспеха, не полностью соответствует отрицанию not в математической логике. Эта разница может породить неожиданности в поведении программы, если предикатом not пользоваться небрежно.

Not также возможно использовать в качестве отсечения. Например,

Зина любит все6х животных, за исключением змей.

любит(зина, Х):- любит(зина, Х):-
змея(Х),!, fail. животное(Х),
любит(зина, Х):- not(змея(Х)).
животное(Х).

Или рассмотрим отношение различны(X,Y), которое выполняется когда X и Y не совпадают в смысле: X и Y не совпадают буквально; арифметически X ? Y; X и Y несопоставимы.
Если X и Y сопоставимы, то цель различны(X,Y) терпит неуспех, иначе цель различны(X,Y) успешна.

Используя ! и fail, получаем: Используя not, получаем:

различны(X,Х):-!, fail. различны(X,Y):-not(X=Y).
различны(X,Y).

Загрузка...