Читаем Prolog полностью

Сказать на Прологе, что что-то не есть истина, можно при помощи специальной цели fail (неуспех), которая всегда терпит неудачу, заставляя потерпеть неудачу и ту цель, которая является ее родителем. Вышеуказанная формулировка, переведенная на Пролог с использованием fail, выглядит так:

        любит( мэри, X) :-


                змея( X),  !,  fail.

        любит( Мэри, X) :-


                животное ( X).

Здесь первое правило позаботится о змеях: если Х - змея, то отсечение предотвратит перебор (исключая таким образом второе правило из рассмотрения), а fail вызовет неуспех. Эти два предложения можно более компактно записать в виде одного:

        любит( мэри, X) :-


                змея( X),  !,  fail;


                животное ( X).

Ту же идею можно использовать для определения отношения

        различны( X, Y)

которое выполняется, если Х и Y не совпадают. При этом, однако, мы должны быть точными, потому что "различны" можно понимать по-разному:

Х и Y не совпадают буквально;

Х и Y не сопоставимы;

значения арифметических выражений Х и Y не равны.

Давайте считать в данном случае, что Х и Y различны, если они не сопоставимы. Вот способ выразить это на Прологе:

        Если Х и Y сопоставимы, то


              цель различны( X, Y) терпит неуспех


              иначе цель различны( X, Y) успешна.

Мы снова используем сочетание отсечения и fail:

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

        различны( X, Y).

То же самое можно записать и в виде одного предложения:

        различны( X, Y) :-


             Х = Y,  !,   fail;


             true.

Здесь true - цель, которая всегда успешна.

Эти примеры показывают, что полезно иметь унарный предикат "not" (не), такой, что

        nоt( Цель)

истинна, если Цель не истинна. Определим теперь отношение not следующим образом:

        Если Цель успешна, то not( Цель) неуспешна,


        иначе not( Цель) успешна.

Это определение может быть записано на Прологе так:

        not( Р) :-


             P,  !,   fail;


             true.

Начиная с этого момента мы будем предполагать, что  not  - это встроенная прологовская процедура, которая ведет себя так, как это только что было определено. Будем также предполагать, что оператор not определен как префиксный, так что цель

        not( змея( X) )

можно записывать и как

        not змея( X)

Многие версии Пролога поддерживают такую запись. Если же приходится иметь дело с версией, в которой нет встроенного оператора not, его всегда можно определить самим.

Следует заметить, что not, как он здесь определен с использованием неуспеха, не полностью соответствует отрицанию в математической логике. Эта разница может породить неожиданности в поведении программы, если оператором not пользоваться небрежно. Этот вопрос будет рассмотрен в данной главе позже.

Тем не менее not - полезное средство, и его часто можно с выгодой применять вместо отсечения. Наши два примера можно переписать с not:

        любит( мэри, X) :-


               животное ( X),


               not змея( X).

        различны( X, Y) :-


               not( Х = Y).

Это, конечно, выглядит лучше, нежели наши прежние формулировки. Вид предложений стал более естественным, и программу стало легче читать.

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

        класс( X, боец) :-


              победил( X, _ ),


              победил( _, X).

        класс( X, победитель) :-


              победил( X, _ ),


              not победил( _, X).

        класс( X, спортсмен) :-


              not победил( X, _ ).

В качестве еще одного примера использования not рассмотрим еще раз программу 1 для решения задачи о восьми ферзях из предыдущей главы (рис. 4.7). Мы определили там отношение небьет между некоторым ферзем и остальными ферзями. Это отношение можно определить также и как отрицание отношения "бьет". На рис. 5.3 приводится соответствующим образом измененная программа.

Упражнения

5. 4.    Даны два списка Кандидаты и Исключенные, напишите последовательность целей (используя принадлежит и not), которая, при помощи перебора, найдет все элементы списка Кандидаты, не входящие в список Исключенные.

Посмотреть ответ

5.5.    Определите отношение, выполняющее вычитание множеств:

        решение( [ ]).

        решение( [X/Y | Остальные] ) :-


                решение( Остальные),


                принадлежит( Y, [1, 2, 3, 4, 5, 6, 7, 8] ),


                not бьет( X/Y, Остальные).

        бьет( X/Y, Остальные) :-


                принадлежит( X1/Y1, Остальные),


                ( Y1 = Y;


                        Y1 is Y + X1 - X;


                        Y1 is Y - X1 + X ).

        принадлежит( А, [А | L] ).

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT