Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пролог.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
498.52 Кб
Скачать

3.1.2. Первая формулировка задачи поиска в пространстве состояний 51 ад

Простые факты иллюстрируют возможность моделирования системы, находящейся на каждом шаге в некотором состоянии, из которого она может перейти по одному из правил перехода в следующее состояние. Этот процесс недетерминированный, поскольку система может перейти не в одно состояние.  В качестве примера рассмотрим классическую задачу поиска пути в пространстве состояний . Это задача о перевозке через реку волка, козы и капусты.  Формулировка задачи.  Крестьянин должен перевезти в лодке через реку волка, козу и капусту. Вместе с человеком в лодке может поместиться или волк, или коза, или капуста, причем человеку приходится охранять козу от волка и капусту от козы.  Такая задача описывается пространством состояний. Пространство состояний - это граф, вершины которого соответствуют ситуациям, встречающимся в задаче, а решение задачи сводится к поиску пути в этом графе между заданной начальной ситуацией (стартовой вершиной) и некоторой конечной ситуацией, называемой целевой вершиной.  Для определенности рассмотрим ситуацию остающихся каждый раз на одном берегу реки. Рассмотрим общую схему вывода. Ради краткости нотации примем следующие обозначения констант: f – крестьянин, w – волк, g – коза, c – капуста. move( f, w, g, c ) :- move(w, c ).            % Крестьянин уплыл вместе с козой move( w, c ) :- move( f, w, c ).  % Крестьянин вернулся один move( f, w, c ) :- move( c ).                   % Крестьянин уплыл с волком move( f, w, c ) :- move( w ).                  % или уплыл вместе с капустой move( c ) :- move( f, g, c ).                    % Крестьянин вернулся обратно вместе с козой move( w ) :- move( f, g, w ).                  % Крестьянин вернулся обратно вместе с козой move( f, g, c ) :- move( g ).                   % Коза осталась одна move( f, g, w )  :- move( g ). move( g ) :- move( f, g ).                        % Крестьянин вернулся за козой move( f, g ) :- move( ).                           % Никого не осталось move( ).                                                % Останов Для придания программе вид рабочей требуется каждое правило дополнить оператором вывода текущего состояния, т.е. текста, который у нас пока что заключен в комментарий. Например, первое правило будет выглядеть так: move( f, w, g, c ) :- move(w, c ), write(“Фермер уплыл вместе с козой”), nl. Отметим, что рабочий предикат move следует определить несколько раз на различном количестве аргументов. В Прологе такой синтаксис вполне допустим: Predicates move( string, string, string, string ) move( string, string, string ) move( string, string ) move( string ) move В качестве цели для запуска процесса вывода укажем начальное состояние: Goal move( f, w, g, c ). Эта задача имеет не единственное решение, а именно, два. Можно найти их все, если воспользоваться приемом возврата к поиску других решений (включить бэктрекинг).

3.1.3. Реализация на Прологе простой вопросно-ответной системы

Наша цель – написать программу, способную делать рассуждения. Эта программа в какой-то степени будет приближением к экспертной системе. Существует две основных стратегии рассуждений: прямые и обратные. Рассмотрим два примера.

Рис. Прямая и обратная цепочки рассуждений

Прямая цепочка рассуждений: если условие E1 верно, то переход к Е2,  если E2 верно, то переход к Е3 и т.д. до Н, т.е. все отношения Е1, Е2, … должны быть истинны. Рассуждения начинаем с Е1 и система делает суждение об истинности1 Н. Если эта цепочка неверна, начинаются рассуждения от Е4. Прямые рассуждения всегда идут от данных (известных фактов), на каждом шаге вывода применяются все допустимые (с истинными посылками) правила, которые порождают новые факты, до тех пор пока не будет порожден факт-цель.   При обратной цепочке рассуждений система сначала рассматривает суждение Н. Оглядываясь назад, она выясняет, что для установления истинности Ней надо знать Е3, а чтобы знать Е3, ей требуется знать Е2, а чтобы знать Е2, надо знать Е1. Поэтому система запрашивает данные о Е1, Е2, затем Е3 и после этого делает вывод об истинности Н. Обратные рассуждения идут от цели.  Теперь вспомним, какая стратегия применяется в Прологе. Конструкция вида ЕСЛИ а ТО b в синтаксисе Пролога выглядит: b :- a. То есть логический вывод идет от цели, а это обратная цепочка рассуждений. Таким образом, обратные рассуждения в Прологе могут быть реализованы достаточно прямолинейно. Подходящей задачей, при решении которой можно использовать обратную цепочку рассуждений, может быть задача, вытекающая из следующей ситуации: к директору некоторой фирмы пришел человек, желающий устроится на работу. Директор располагает сведениями о его квалификации, о потребностях фирмы в специалистах и ему нужно решить, какую должность в фирме может занять посетитель. Поскольку в задаче надо выбрать один из нескольких возможных вариантов (должностей), для ее решения можно воспользоваться обратной цепочкой рассуждений Система рассуждений директора может быть примерно следующая: 64 Левин ЕСЛИ у посетителя нет диплома ТО посетителю отказать в приеме на работу. ЕСЛИ посетитель имеет диплом   И  он сделал важное открытие  ТО предложить посетителю должность научного сотрудника. ЕСЛИ средний балл за время учебы >=3.5  ТО предложить посетителю должность инженера-конструктора. ЕСЛИ средний балл <3.5  И  посетитель работал по специальности >2 лет  ТО предложить посетителю должность инженера по эксплуатации ЕСЛИ средний балл <3.5 лет   И  стаж работы <2 лет  ТО посетителю отказать. Мы видим, что рассуждения – это логические структуры вида: ЕСЛИ а1 ТО b ЕСЛИ а2 И  а3 ТО с, где а1а2а3bс – строковые константы, представляющие фрагменты рассуждений. Такие структуры вида «ЕСЛИ … ТО» называются продукциями, а вся система рассуждений носит название «правила продукций». Продукции в Прологе можно описать разными способами, например, тройкой «объект, атрибут, значение». В нашем случае для реализации цепочек рассуждений достаточно предикатов двух видов: it_is и this. Чтобы выяснить истинность, например,b, надо выяснить истинность а1: it_is(b):- this(a1). Для того чтобы выяснить истинность с, надо последовательно выяснить истинность а2 и а3: it_is(c):- this(a2), this(a3). Таким образом, приведенные выше рассуждения можем переписать в виде правил: it_is(“отказать в приеме на работу”):- not(this(“есть диплом”)). it_is(“должность научного сотрудника”):- this(“есть диплом”),   this(“сделал важное открытие”). it_is(“должность инженера-конструктора”):- this(“средний балл за время учебы >=3.5”).  it_is(“должность инженера по эксплуатации”):- this(“средний балл <3.5”),  this(“работал по специальности >2 лет”).  it_is(“отказать в приеме на работу”):- this(“средний балл <3.5 лет”),   this(”стаж работы <2 лет”).  Осталось добавить механизм, который будет вести диалог. Чтобы выяснить истинность отдельных высказываний для конкретной ситуации, очевидно проще всего спросить об этом. Эту работу выполнит несложное правило: this( S ) :-  write( S, ”?” ), readchar( Ans ), Ans = ’y’.  Правило выводит на экран текстовую строку, в конце которой будет дописан знак вопроса, и будет ждать ответ. Очевидно, пользователь введет символ ‘y’ или ‘n’. Если введенный символ ‘y’,  предикат this закончится истинно (сработает проверкаAns=’y’), а если ‘n’ – ложно. Допишем цель: Goal it_is( X ),  write(“Наша рекомендация – “, X). Программа начнет работу  выяснения истинности первого правила. Будет задан вопрос о наличии диплома.  Пользователь введет ответ и в зависимости от этого предикат this(“есть диплом”) закончится истинно или ложно. Поскольку  первое правило содержит отрицание, ответ ‘n’ означает, что it_is(“отказать в приеме на работу”) истинно и работа программы на этом завершится. Если же ответ оказался ‘y’, первое правило буде отвергнуто, начнется проверка следующего правила и т.д. Заметим, что если у директора есть подобная программа, которая содержит формализованные знания эксперта (а директор в данном случае выступает в роли эксперта), то ему в следующие разы не надо будет отвлекаться на встречу с кандидатами, эту работу он может перепоручить служащему по кадрам. Продукционные системы моделируют прямые рассуждения. Они обеспечивают модель представления человеческого опыта в форме правил и позволяют разрабатывать алгоритмы поиска по образцу – центральный момент основанных на правилах экспертных систем. Задача о перевозке через реку волка, козы и капусты  предыдущего раздела как раз представляла пример прямых подстановок. Каждый раз срабатывало то правило, образец которого распознавался в левой части предиката. Мы видели, что для реализации прямых рассуждений в системе, которую встроен механизм обратного вывода, следует соответствующим образом переформулировать «базу знаний». Упражнения на простые факты и правила Задача переливания 185 Ад

Кордемский Б.А. Математическая смекалка. М.: «Наука», 1965