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

                write( Ответ).

Рис. 14. 12.  Оболочка экспертной системы:


Отображение окончательного результата и


объяснение типа "как".

        ?-  эксперт.

        Пожалуйста, спрашивайте:    % Приглашение пользователю

        X это животное и голиаф это Х.    % Вопрос пользователя

        Это правда:  голиаф имеет шерсть?

        . . .


14. 5. 6.    Одно замечание по поводу программы-оболочки

В некоторых местах нашей программы-оболочки обнаруживается недостаток той "декларативной ясности", которая так характерна для программ, написанных на Прологе. Причина состоит в том, что нам пришлось предусмотреть в этой программе довольно жесткое управление процессом функционирования оболочки. Ведь, согласно нашему замыслу, экспертная система должна была не только находить ответы на вопросы, но и делать это некоторым разумным с точки зрения пользователя способом. В связи с этим нам пришлось реализовать вполне определенное поведение системы в процессе решения задач, а не просто некоторое отношение ввода-вывода. В результате получилась программа более процедурного характера, чем обычно. Все это может послужить примером ситуации, когда, не имея возможности рассчитывать на собственные процедурные механизмы Пролога, мы вынуждены взять на себя детальное описание процедурного поведения системы.


14. 5. 7.    Цели с отрицанием

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

% Процедура-драйвер верхнего уровня

        эксперт :-


                принять_вопрос( Вопрос),


                                            % Ввести вопрос пользователя


                ( ответ_да( Вопрос);


                                            % Попытка найти положительный ответ


                ответ_нет( Вопрос) ).


            % Если нет положительного ответа, то найти отрицательный

        ответ_да( Вопрос) :-


                                            % Искать положительный ответ на Вопрос


                статус( отрицательный),


                                            % Пока еще нет положительного ответа


                рассмотреть( Вопрос, [ ], Ответ),             % Трасса пуста


                положительный( Ответ),            % Искать положительный ответ


                статус( положительный),


                                                           % Найден положительный ответ


                выдать( Ответ), nl,


                write( 'Нужны еще решения?' ),


                принять( Ответ1),          % Прочесть ответ пользователя


                Ответ1 = нет.


                                % В противном случае возврат к "рассмотреть"

        ответ_нет( Вопрос):-


                                % Искать отрицательный ответ на Вопрос


                retract( пока_нет_положительного_решения),  !,


                                                           % Не было положительного решения?


                рассмотреть( Вопрос, [ ], Ответ),


                отрицательный( Ответ),


                выдать( Ответ), nl,


                write( 'Нужны еще решения?' ),


                принять( Ответ1),


                Ответ1 = нет.


                                % В противном случае - возврат к "рассмотреть"


        статус( отрицательный) :-


                assert( пока_нет_положительного_решения).

        статус( положительный) :-


                retract( пока_нет_положительного_решения),  !;  true.

        принять_вопрос( Вопрос) :-


                nl, write( 'Пожалуйста, спрашивайте:'), nl,


                read( Вопрос).

Рис. 14. 13.  Оболочка экспертной системы: драйвер. Обращение


к оболочке из Пролога при помощи процедуры эксперт.


        рассмотреть( не Цель, Трасса, Ответ) :-  !,


                рассмотреть( Цель, Трасса, Ответ1),


                обратить( Ответ1, Ответ).


                                % Получить обратное истинностное значение

        обратить( Цель это правда было Найдено,


                          ( не Цель) это ложь было Найдено).

        обратить( Цель это ложь было Найдено,


                          ( не Цель) это правда было Найдено).

Если Цель конкретизирована, то все в порядке, если же нет, то возникают трудности. Рассмотрим, например, такой диалог:

        ?-  эксперт.

        Пожалуйста, спрашивайте:


        не ( X ест мясо).

        Есть (еще) решения для   :  Животное


        да.


        Животное = тигр.

В этот момент система даст ответ:

        не ( тигр ест мясо) это ложь

Такой ответ нас не может удовлетворить. Источник затруднения следует искать в том, какой смысл мы вкладываем в вопросы типа

        не ( X ест мясо)

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

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

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