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

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

        принять( Ответ) :-


                read( Ответ1),


                означает( Ответ1, Значение),  !,


                                                            % Ответ1 означает что-нибудь?


                Ответ = Значение;         % Да


                nl, write( 'Непонятно, попробуйте еще раз,      % Нет


                                                        пожалуйста'),   nl,


                принять( Ответ).           % Новая попытка

        означает( да, да).


        означает( д, да).


        означает( нет, нет).


        означает( н, нет).


        означает( почему, почему).


        означает( п, почему).

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

        принять( да), интерп_да( ...);


        принять( нет), интерп_нет( ...);


        . . .

Здесь, если пользователь ответит "нет", то программа попросит его повторить свой ответ. Поэтому более правильный способ такой:

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


        ( Ответ = да, интерп_да( ...);


          Ответ = нет, интерп_нет( ...);


          ... )

        Процедура

        ответпольз( Цель, Трасса, Ответ)

спрашивает пользователя об истинности утверждения Цель. Ответ - это результат запроса. Трасса используется для объяснения в случае, если пользователь спросит "почему".

Сначала процедура ответпольз должна проверить, является ли Цель информацией, которую можно запрашивать у пользователя. Это свойство объекта Цель задается отношением

        можно_спросить( Цель)

которое в дальнейшем будет усовершенствовано. Если спросить можно, то утверждение Цель выдается пользователю, который, в свою очередь, указывает истинно оно или ложно. Если пользователь спросит "почему", то ему выдается Трасса. Если утверждение Цель истинно, то пользователь укажет также значения содержащихся в нем переменных (если таковые имеются).

Все вышеизложенное можно запрограммировать (в качестве первой попытки) следующим образом:

        остветпольз( Цель, Трасса, Ответ) :-


                можно_спросить( Цель),            % Можно ли спрашивать


                спросить( Цель, Трасса, Ответ).


                            % Задать вопрос относительно утверждения Цель

        спросить( Цель, Трасса, Ответ) :-


                показать( Цель),


                            % Показать пользователю вопрос


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


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


                            % Обработать ответ

        обработать( почему, Цель, Трасса, Ответ) :-


                            % Задан вопрос "почему"


                показать_трассу( Трасса),


                            % Выдача ответа на вопрос "почему"


                спросить( Цель, Трасса, Ответ).


                            % Еще раз спросить

        обработать( да, Цель, Трасса, Ответ) :-


                            % Пользователь ответил, что Цель истинна


                Ответ = правда,


                запрос_перем( Цель);


                            % Вопрос о значении переменных


                спросить( Цель, Трасса, Ответ).


                            % Потребовать от пользователя новых решений

        обработать( нет, Цель, Трасса, ложь).


                            % Пользователь ответил, что Цель ложна

        показать( Цель) :-


                nl, write( 'Это правда:'),


                write( Цель), write( ?), nl.

Обращение к процедуре запрос_перем( Цель) нужно для того, чтобы попросить пользователя указать значение каждой из переменных, содержащихся в утверждении Цель:

        запрос_перем( Терм) :-


                var( Терм),  !,                  % Переменная ?


                nl, write( Терм), write( '='),


                read( Терм).                    % Считать значение переменной

        запрос_перем( Терм) :-


                Терм =.. [Функтор | Аргументы],


                                % Получить аргументы структуры


        запрос_арг( Аргументы).


                                % Запросить значения переменных в аргументах

        запрос_арг( [ ]).

        запрос_арг( [Терм | Термы]) :-


                запрос_перем( Терм),


                запрос_арг( Термы).

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

        можно_спросить( X ест Y).

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

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

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