Примеры использования Пролога для решения интеллектуальных задач

Экспертные системы и управление стратегией вывода

Экспертная система — это программа, созданная для выполнения тех видов деятельности, которые доступны только человеку (проектирование, планирование, диагностика, перевод и т. п.).

Программы ЭС обычно работают таким способом, который воспринимается как «интеллектуальный», т. е. они имитируют образ действия человека-эксперта.

Эти программы специфичны, так как обычно используют механизм автоматического рассуждения (вывода) и так называемые слабые методы, такие как поиск или эвристика, которые существенно отличаются от точных и хорошо аргументированных алгоритмов и не похожи на математические процедуры большинства традиционных разработок.

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

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

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

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

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

Реа.тзация с обратной цепочкой рассуждений. Определим предикаты, которые будут использованы для системы:

database

xpositiv (string, string) xnegativ (string, string)

predicates

do_expert

do_rezault

ask (string, string) identify (symbol) it_is (symbol) positiv (string, string) negativ (string, string) remembe (string, string) clear_db

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

В рассматриваемом случае для этого используются предикаты identify и it_is. Предикат identify содержит в качестве параметра название идентифицируемого животного и определяет правило, на основании которого можно определить животное по заданному набору свойств. Предикат it_is позволяет конкретизировать свойства, используемые в identify, на более низком уровне: idntify ("жираф") if it_is ("травоядное"), positiv ("имеет", "длинную шею"), positiv ("имеет", "длинные ноги"), positiv ("имеет" "темные пятна"), !.

identify ("орел") if it_is ("птица"),

positiv ("умеет", "летать"), positiv ("используется", "как национальный символ"),!, identify ("тигр") if it_is ("млекопитающее"), positiv ("имеет", "коричневый окрас"), positiv ("имеет", "черные полосы"). identify ("сардина") if it_is ("рыба"),

positiv ("имеет", "маленький размер"), positiv ("используется", "в консерве"), !.

it_is ("птица") if not (it_is ("млекопитающее")), positiv ("имеет", "крылья"), positiv ("имеет", "клюв"), !.

it_is ("млекопитающее") if positiv ("имеет",

"шерсть"), !.

it_is ("рыба") if positiv ("умеет", "плавать"), positiv ("живет", "в воде"), !.

В данной системе большая часть действий выполняется предикатами positiv и negativ. Они используются для проверки конкретных атрибутов животных, которые могут быть обнаружены в процессе диалога и записаны в БД. Предикаты xpositiv и xnegativ служат для хранения образцов положительных и отрицательных ответов, накопленных к данному моменту в динамической БД, фактически они хранят текущую цепочку вывода:

positiv (х, у) if xpositiv (х, у),!.

positiv (х, у) if not (negativ (х, у)),!, ask (х, у),

negativ (х, у) if xnegativ (х, у) , !.

Действия выглядят так: сначала отыскивается положительный ответ

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

ask (х, у) if write ("Вопрос:-", "х", "у," "?"), readln (Rez), remembe (х, у, Rez)

Предикат remembe добавляет в БД предикаты xpositiv и xnegativ в соответствии с ответом на запрос ask. Следует отметить, что отвечать на вопрос следует «да» или «нет», другие варианты ответа анализироваться не будут.

remembe (х, у, "да" ) if asserta (xpositiv (х, у)). remembe (х, у, "нет") if asserta (xnegativ (х, у)),

fail.

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

do_expert if makewindow (1, 7, 7, "Экспертная система",

1,16, 22,58), do_resault,

write ("Нажмите любую клавишу"), readchar (_), exit.

do_resault if identify (x), !, nl, write ("Это

животное", x), nl, clear_db.

do_resault if nl, write ("Животного нет в базе"), clear_db.

Предикат clear_db, очищающий БД по окончании проверки, в данном контексте не имеет особого смысла, так как повторного запуска программы не предусматривается и сразу выходят в DOS. Но если требуется провести повторную проверку, не выходя из программы, необходима небольшая модификация этого предиката. Его определение выглядит так:

clear_db if retract (xpositiv, _, _)), fail. clear_db if retract (xnegativ, _ ,_)), fail, или

clear_db if retract (_), fail.

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

Из схемы видно, что независимо от выбранного маршрута поиска потребуется не более четырех проверок (а иногда достаточно и трех). Основное правило можно построить так:

animal if find_animal, have_found ( x) ,

write ("Задуманное животное x), nl, !.

Отсутствует возможность отрицательного ответа: find_animal if testl (x) , test2 (x, y) , test3 (x, y, z), test4 ( x, y, z, -), !.

find animal.

Правила test (с первого по четвертый) должны охватить все, что может выясниться, соответственно, при первой, второй, третьей и четвертой проверках.

Структура аргументов этих правил определена так, чтобы последующий шаг учитывал результаты всех предыдущих.

Правила проверки предполагают перечисление всех возможностей. Различные комбинации аргументов в задействованном правиле отражают всю историю вывода до указанного места.

Например, testl может успешно завершаться одним из двух способов:

testl (m) — животное млекопитающее; testl (п) — животное не млекопитающее.

Для правила test2 существуют четыре вероятные комбинации: test2 (m, с) — млекопитающее и плотоядное; test2 (m, n) — млекопитающее и не плотоядное; test2 (n, w) — не млекопитающее и плавает; test2 (n, п)—не млекопитающее и не плавает.

Для test3 больше всего возможностей — восемь: test3 (m, с, s) — млекопитающее, плотоядное, полосатое;

test3 (m, с, п) — млекопитающее, плотоядное, без полос;

test3 (m, n, 1) —млекопитающее, не плотоядное, живет на суше; test3 (m, n, n) — млекопитающее, не плотоядное, живет не на суше;

test3 (n, w, t) — не млекопитающее, плавает, щупальца;

test3 (n, w, п) — не млекопитающее, плавает, нет щупальц;

test3 (n, n, f) — не млекопитающее, не плавает, летает;

Рис. 7.3

test3 (п, п, п) — не млекопитающее, не плавает, не летает.

Для test4 — четыре варианта:

test4 (m, n, 1, s) —млекопитающее, не плавает, живет на суше, имеет полосы;

test4 (m, n, 1, п) —млекопитающее, не плавает, живет на суше, без полос;

test4 (n, w, n, f) — не млекопитающее, плавает, без щупалец, имеет крылья;

test4 (n, w, п, п) — не млекопитающее, плавает, без щупалец, нет крыльев.

Текст программы, описывающий эти правила, будет выглядеть так:

testl (m) if it_is ("млекопитающее"),!.

testl (n).

test2 (m, c) if it_is ("плотоядное"),!.

test2 (m, n).

test2 (n, w) if it_is ("плавает"). test2 (n, n).

test3 (m, c, s) if positiv ("имеет", "полосы"),

asserta (have_found ("тигр")),!. test3 (m, c, n) if asserta (have_found (гепард)),! .

test3 (m, n, 1) if not (positiv ("живет", "на суше")),! . test3 (m, n, n) if asserta (have_found ("кит")), ! .

test3 (n, n, f) if positiv ("умеет", "летать"),

asserta (have_found ("орел")),!. test3 (n, n, n,) if asserta (have_found ("страус")),!. test3 (n, w, t) if positiv ("имеет", "щупальца"),

asserta (have_foun ("осьминог")),!. test4 (m, n, 1, s) if positiv ("имеет", "полосы"),

asserta (have_found ("зебра")),!. test4 (m, n, 1, n) if asserta (have_found ("жираф")).

test4 (n, w, n, f) if positiv ("имеет", "крылья"),

asserta (have_found ("пингвин")),!. test4 (n, w, n, n) if asserta (have_found ("сардина")).

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ   След >