4РsTUUРTU╘Tp╫╫U╓ў╒╨pЎPїРRW ЕqRЄРW╫pW╫UPV╥РPё╥RёTpє╥ЁW╨V╨W╨Vwё~ЧЕGRV╨UWqє╘qu╤PwРQW
S╓WS╓╫pёvWqVRЎїЦVuРVWSR╓W╫pёpWTqvер предиката с недетерминированными
предложениями,
т.е. с предложениями, на основе которых можно получать много-
численные решения, пользуясь механизмом возврата. Во многих
реализациях Пролога по отношению к недетерминированным пред-
ложениям необходимо принимать специальные меры, которые обус-
лавливаются сопутствующими требованиями, накладываемыми на
ресурсы памяти во время выполнения. Однако в Турбо Прологе
для недетерминированных предложений делаются внутренние про-
верки и такие предложения обрабатываются особым образом, что
позволяет понизить нагрузку, накладываемую на программиста.
Тем не менее, для отладки и для некоторых других целей
программисту по-прежнему иногда бывает необходима поддержка
системы, и по этой причине ему предоставляется директива ком-
пилятора (проверка_детерминизма). Если
такая директива помещается в самое начало программы, то при
встрече любого недетерминированного предложения в процессе
выполнения цели на экран будет выдаваться предупреждение. На-
жатие клавиши говорит о том, что предупреждение должно
игнорироваться, а нажатие любой другой клавиши вызывает ава-
рийное завершение обработки цели.
Недетерминированные предложения можно сделать детермини-
рованными, вставляя в них отмены. Так, например, предикат
(проверка_члена) с предложениями
verify_member(X,[X|_]):-!.
verify_member(X,[_|Y]):-verify_member(X,[X|Y]).
является детерминированным вариантом предиката member. Единс-
твенное отличие этих двух предикатов проявляется в снятии,
которая прекращает возврат в первом предложении.
Предикатом можно воспользоваться, чтобы
проверить, является ли элемент членом данного списка, но им
нельзя пользоваться в такой цели, как
verify_member(X,[1,2,3,4,5]).
пытаясь связать переменную Х с членами списка [1,2,3,4,5].
Действительно, цель будет удовлетворена, когда переменная Х
окажется связанной с константой 1, и никакого возврата не
произойдет.
Упражнение
Допустим, что средний налогоплательщик в США - это граж-
данин США, женатый человек с двумя детьми, который зарабаты-
вает не менее 500 и не более 2000 долларов в месяц. Определи-
те на Турбо Прологе предикат (особый_нало-
гоплательщик) такой, что цель
special_taxpayer(fred).
будет удовлетворена, только если fred(Фред) не соответствует
условиям, накладываемым на среднего налогоплательщика. Вос-
пользуйтесь отменой, чтобы обеспечить отсутствие необязатель-
ных возвратов.
Упражнение
Игроки, состоящие в клубе по игре в сквош*, разбиты на
три лиги, причем игроки могут состязаться только с членами их
собственной лиги или с членами низших лиг (если такие сущест-
вуют). Напишите программу на Турбо Прологе, которая выводит
на экран все матчи, возможные между игроками клуба, причем
рещения выдаются в таком виде:
tom vesus bill Том против Билла
marjory versus annette Марджори против Аннет
Воспользуйтесь отменой и добейтесь, чтобы такие решения, как,
например
tom vesus bill Том против Билла
bill vesus tom Билл против Тома
не появлялись на экране одновременно.