Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Предикат not.

Следующая программа демонстрирует, как вы можете ипользовать преди-

кат not для того, чтобы выявить успевающего студента: студента, у которо-

го средний балл(GPA) не менее 3,5, и у которого в настоящее время не про-

должается испытательный срок.

/* Program CH05EX10.PRO */

domains

name = symbol

gpa = real

predicates

honor_student(name)

student(name, gpa)

probation(name)

clauses

honor_student(Name):-

student(Name, GPA),

GPA>=3.5,

not(probation(Name)).

student("Betty Blue", 3.5).

student("David Smith", 2.0).

student("John Johnson", 3.7).

probation("Betty Blue").

probation("David Smith").

При использовании not необходимо иметь в виду один момент: предикат

not будет безуспешным, если не может быть доказана истинность данной под-

цели. Это приводит к предотвращению связывания внутри not несвязанных пе-

ременных. При вызове изнутри not подцели со свободными переменными, Турбо

Пролог возвратит сообщение об ошибке: Free variables not allowed in NOT.

Это происходит вследствие того, что для связывания Прологом свободных пе-

ременных в подцели, эта подцель должна унифицироваться с каким-либо дру-

гим предложением и эта подцель должна выполняться. Правильным способом

управления несвязанными переменными внутри not-подцели является использо-

вание анонимных переменных.

Вот несколько примеров корректных и некорректных предложений.

likes(bill, Anyone):- /* Anyone - свободная переменная*/

likes(sue, Anyone),

not(hates(bill, Anyone)).

В этом примере Anyone связывается посредством likes(sue, Anyone) до

того, как Турбо Пролог делает вывод о том, что hates(bill, Anyone) не яв-

ляется истиной. Данное предложение работает как положено.

Если вы измените его таким образом, что обращение к not будет выпол-

няться первым, то получите ошибку "Free variable not allowed in NOT".

likes(bill, Anyone):- /* Это не будет работать правильно */

not(hates(bill, Anyone)),

likes(sue, Anyone).

Даже если вы исправите это, заменив в not(hates(bill, Anyone))

Anyone на анонимную переменную, и предложение, таким образом, не будет

возвращать ошибку, все равно это будет давать неправильный результат.

likes(bill, Anyone):- /* Это не будет работать правильно */

not(hates(bill, _)),

likes(sue, Anyone).

Это предложение утверждает, что Биллу нравится кто угодно, если не-

известно ничего о том, кого Билл ненавидит, и если этот "кто-то" нравится

Сью. Подлинное предложение утверждало, что Биллу нравится тот, кто нра-

вится Сью, и при этом Билл не испытывает к этому человеку ненависти.

Пример

Каждый раз дважды подумайте перед тем, как использовать предикат

not. Неверное использование приведет к сообщению об ошибке или к ошибкам

в логике вашей программы. Следующая программа является примером правиль-

ного использования предиката not.

/* Program CH05EX11.PRO */

predicates

likes_shopping(symbol)

has_credit_card(symbol, symbol)

bottomed_out(symbol, symbol)

clauses

likes_shopping(Who) :-

has_credit_card(Who, Card),

not (bottomed_out(Who, Card) ),

write(Who, " can shop with the ",Card, " credit card.\n").

has_credit_card(chris, visa).

has_credit_card(chris, diners).

has_credit_card(joe, shell).

has_credit_card(sam, mastercard).

has_credit_card(sam, citibank).

bottomed_out(chris, diners).

bottomed_out(sam, mastercard).

bottomed_out(chris, visa).

По подсказке Goal: задайте:

likes_shopping(Who).

Соседние файлы в папке Документация