
- •1 Основные понятия
- •1.1 Происхождение и понимание термина «искусственный интеллект»
- •1.2 Подходы к пониманию проблемы
- •Тест Тьюринга и интуитивный подход
- •Символьный подход
- •Логический подход
- •Агентно-ориентированный подход
- •Гибридный подход
- •1.3 Модели и методы исследований Символьное моделирование мыслительных процессов
- •Работа с естественными языками
- •Представление и использование знаний
- •Машинное обучение
- •Биологическое моделирование искусственного интеллекта
- •Робототехника
- •Машинное творчество
- •Другие области исследований
- •Современный искусственный интеллект
- •Некоторые из самых известных ии-систем:
- •1.4. Классификация интеллектуальных систем
- •1.5 Методы поиска решений
- •Генетические алгоритмы
- •2. Представление знаний в системах искусственного интеллекта
- •2.1 Представление знаний
- •Формальная (Аристотелева) логика и логика высказываний
- •Как упростить логическую формулу?
- •Как решать логические задачи?
- •Решение логических задач средствами алгебры логики
- •Решение логических задач табличным способом
- •Решение логических задач с помощью рассуждений
- •Логика предикатов
- •3 Логическое программирование на прологе
- •Объекты данных
- •Представление списков
- •Некоторые операции над списками
- •Ограничение перебора
- •Пример Пролог программы
- •4 Логика предикатов второго порядка
- •5. Нечеткая логика
- •Нечеткие множества
- •Основные характеристики нечетких множеств
- •Методы построения функций принадлежности нечетких множеств
- •Операции над нечеткими множествами
- •Наглядное представление операций над нечеткими множествами
- •Свойства операций и
- •Нечеткая и лингвистическая переменные
- •Нечеткие высказывания и нечеткие модели систем
- •Нечеткая база знаний
- •6 Байесовы сети
- •6.1. Простейший логический вывод
- •6.2. Распространение вероятностей в эс
- •6.3. Последовательное распространение вероятностей
- •6.4. Экспертные системы, использующие субъективные вероятности
- •6.5 Байесовские сети доверия как средство разработки эс
- •6.5.1. Основные понятия и определения
- •6.5.2. Пример построения простейшей байесовской сети доверия
- •6.5.3. Процесс рассуждения (вывода) в байесовских сетях доверия
- •6.5.4. Байесовские сети доверия как одно из направлений современных экспертных систем
- •6.6 Сети доверия с условными гауссовскими переменными
- •6.6.1. Непрерывные случайные величины
- •6.6.2. Непрерывные гауссовские переменные
- •6.6.3. Числовые характеристики случайных величин
- •6.6.4. Совместное использование дискретных и непрерывных переменных в байесовских сетях доверия
- •6.6.5. Логический вывод в байесовских сетях доверия с непрерывными и дискретными состояниями
- •6.7 Экспертные системы на основе теории Демстера-Шеффера
- •6.7.1. Предпосылки возникновения новой теории.
- •6.7.2. Основы теории Демстера-Шеффера
- •6.7.3. Меры доверия и правдоподобия в тдш
- •6.7.4. Отличие тдш от теории вероятностей
- •6.7.5. Связь между тдш и классической теорией вероятностей
- •6.7.6. Комбинация функций доверия
- •7 Решатели проблем, основанных на знаниях
- •7.1 Семантические сети
- •7.2 Фреймы
- •7.3 Нейронные сети
- •7.4 Экспертные системы
- •Модель экспертных систем
- •7 Распознание образов Контурный анализ
- •Код Фримена
- •Современные программные и инструментальные средства создания искусственного интеллекта
Некоторые операции над списками
Списки можно применять для представления множеств, хотя и существует некоторое различие между этими понятиями: порядок элементов множества не существенен, в то время как для списка этот порядок имеет значение; кроме того, один н тот же объект может встретиться в списке несколько раз. Однако наиболее часто используемые операции над списками аналогичны операциям над множествами. Среди них
проверка, является ли некоторый объект элементом списка, что соответствует проверке объекта на принадлежность множеству;
конкатенация (сцепление) двух списков, что соответствует объединению множеств;
добавление нового объекта в список или удаление некоторого объекта из него.
Принадлежность к списку Мы представим отношение принадлежности как принадлежит( X, L), где Х - объект, а L - список. Цель принадлежит( X, L) истинна, если элемент Х встречается в L. Например, верно что принадлежит( b, [а, b, с] ) и, наоборот, не верно, что, принадлежит b, [а, [b, с] ] ) но принадлежит [b, с], [а, [b, с]] ) истинно. Составление программы для отношения принадлежности может быть основано на следующих соображениях: Х есть голова L, либо Х принадлежит хвосту L.
Это можно записать в виде двух предложений, первое из которых есть простой факт, а второе - правило:
принадлежит( X, [X | Хвост ] ).
принадлежит ( X, [Голова | Хвост ] ) :- принадлежит( X, Хвост).
Сцепление ( конкатенация). Для сцепления списков мы определим отношение конк( L1, L2, L3). Здесь L1 и L2 - два списка, a L3 - список, получаемый при их сцеплении. Например, конк( [а, b], [c, d], [a, b, c, d] ) истинно, а конк( [а, b], [c, d], [a, b, a, c, d] ) ложно. Определение отношения конк, как и раньше, содержит два случая в зависимости от вида первого аргумента L1:
1) Если первый аргумент пуст, тогда второй и третий аргументы представляют собой один и тот же список (назовем его L), что выражается в виде следующего прологовского факта: конк( [ ], L, L ).
2)Если первый аргумент отношения конк не пуст, то он имеет голову и хвост в выглядит так: [X | L1]
На прологе это можно записать следующим образом:
конк( [X | L1, L2, [X | L3]):- конк( L1, L2, L3).
Составленную программу можно теперь использовать для сцепления заданных списков, например:
?- конк( [a, b, с], [1, 2, 3], L ).
L = [a, b, c, 1, 2, 3]
?- конк( [а, [b, с], d], [а, [ ], b], L ).
L = [a, [b, c], d, а, [ ], b]
Хотя программа для конк выглядит довольно просто, она обладает большой гибкостью и ее можно использовать многими другими способами. Например, ее можно применять как бы в обратном направлении для разбиения заданного списка на две части:
?- конк( L1, L2, [а, b, с] ).
L1 = [ ] L2 = [а, b, c];
L1 = [а] L2 = [b, с];
L1 = [а, b] L2 = [c];
L1 = [а, b, с] L2 = [ ];
no (нет)
Список [а, b, с] разбивается на два списка четырьмя способами, и все они были обнаружены нашей программой при помощи механизма автоматического перебора.
Нашу программу можно также применить для поиска в списке комбинации элементов, отвечающей некоторому условию, задаваемому в виде шаблона или образца. Например, можно найти все месяцы, предшествующие данному, и все месяцы, следующие за ним, сформулировав такую цель:
?- конк( До, [май | После ], [янв, фев, март, апр, май, июнь, июль, авг, сент, окт, ноябрь, дек]).
До = [янв, фев, март, апр]
После = [июнь, июль, авг, сент, окт, ноябрь, дек].
Далее мы сможем найти месяц, непосредственно предшествующий маю, и месяц, непосредственно следующий за ним, задав вопрос:
?- конк( _, [Месяц1, май, Месяц2 | _ ], [янв, февр, март, апр, май, июнь, июль, авг, сент, окт, ноябрь, дек]).
Месяц1 = апр
Месяц2 = июнь
Мы уже запрограммировали отношение принадлежности. Однако, используя конк, можно было бы определить это отношение следующим эквивалентным способом:
принадлежит1( X, L) :- конк( L1, [X | L2], L).
В этом предложении сказано: "X принадлежит L, если список L можно разбить на два списка таким образом, чтобы элемент Х являлся головой второго из них. Разумеется,принадлежит1 определяет то же самое отношение, что и принадлежит. Мы использовали другое имя только для того, чтобы различать таким образом две разные реализации этого отношения, Заметим, что, используя анонимную переменную, можно записать вышеприведенное предложение так:
принадлежит1( X, L) :- конк( _, [X | _ ], L).
Добавление элемента Наиболее простой способ добавить элемент в список - это вставить его в самое начало так, чтобы он стал его новой головой. Если Х - это новый элемент, а список, в который Х добавляется - L, тогда результирующий список - это просто [X | L]
Таким образом, для того, чтобы добавить новый элемент в начало списка, не надо использовать никакой процедуры. Тем не менее, если мы хотим определить такую процедуру в явном виде, то ее можно представить в форме такого факта:
добавить( X, L, [X | L] ).
Удаление элемента Удаление элемента Х из списка L можно запрограммировать в виде отношения удалить( X, L, L1) где L1 совпадает со списком L, у которого удален элемент X. Отношение удалить можно определить аналогично отношению принадлежности. Имеем снова два случая:
1) Если Х является головой списка, тогда результатом удаления будет хвост этого списка.
2) Если Х находится в хвосте списка, тогда его нужно удалить оттуда.
удалить( X, [X | Хвост], Хвост).
удалить( X, [Y | Хвост], [ Y | Хвост1] ) :- удалить( X, Хвост, Хвост1).
как и принадлежит, отношение удалить по природе своей недетерминировано. Если в списке встречается несколько вхождений элемента X, то удалить сможет исключить их все при помощи возвратов. Конечно, вычисление по каждой альтернативе будет удалять лишь одно вхождение X, оставляя остальные в неприкосновенности. Например:
?- удалить( а, [а, b, а, а], L].
L = [b, а, а]; L = [а, b, а]; L = [а, b, а];
nо (нет)
При попытке исключить элемент, не содержащийся в списке, отношение удалить потерпит неудачу.
Отношение удалить можно использовать в обратном направлении для того, чтобы добавлять элементы в список, вставляя их в произвольные места. Например, если мы хотим во все возможные места списка [1, 2, 3] вставить атом а, то мы можем это сделать, задав вопрос: "Каким должен быть список L, чтобы после удаления из него элемента а получился список [1, 2, 3]?"
?- удалить( а, L, [1, 2, 3] ).
L = [а, 1, 2, 3]; L = [1, а, 2, 3]; L = [1, 2, а, 3]; L = [1, 2, 3, а];
nо (нет)
Вообще операция по внесению Х в произвольное место некоторого списка Список, дающее в результате БольшийСписок, может быть определена предложением:
внести( X, Список, БольшийСписок) :- удалить( X, БольшийСписок, Список).
В принадлежит1 мы изящно реализовали отношение принадлежности через конк. Для проверки на принадлежность можно также использовать и удалить. Идея простая: некоторый Х принадлежит списку Список, если Х можно из него удалить:
принадлежит2( X, Список) :- удалить( X, Список, _ ).
3. 2. 5. Подсписок
Рассмотрим теперь отношение подсписок. Это отношение имеет два аргумента - список L и список S, такой, что S содержится в L в качестве подсписка. Так отношение
подсписок( [c, d, e], [a, b, c, d, e, f] )
имеет место, а отношение
подсписок( [c, e], [a, b, c, d, e, f] )
нет. Пролог-программа для отношения подсписок может основываться на той же идее, что и принадлежит1, только на этот раз отношение более общо (см. рис. 3.4).
Рис. 3. 4. Отношения принадлежит и подсписок.
Его можно сформулировать так:
S является подсписком L, если
(1) L можно разбить на два списка L1 и L2 и
(2) L2 можно разбить на два списка S и L3.
Как мы видели раньше, отношение конк можно использовать для разбиения списков. Поэтому вышеприведенную формулировку можно выразить на Прологе так:
подсписок( S, L) :- конк( L1, L2, L), конк( S, L3, L2).
Ясно, что процедуру подсписок можно гибко использовать различными способами. Хотя она предназначалась для проверки, является ли какой-либо список подсписком другого, ее можно использовать, например, для нахождения всех подсписков данного списка:
?- подсписок( S, [а, b, с] ).
S = [ ]; S = [a]; S = [а, b]; S = [а, b, с]; S = [b];