- •Содержание
- •Введение
- •Глава 1. Основные понятия
- •1.1. Понятие об искусственном интеллекте
- •1.1.1. Точка зрения Петрунина.
- •1.1.2. Интеллектуальные алгоритмы.
- •1.2. Основные направления исследования в области ии
- •1.3. Данные и знания. Основные модели представления знаний
- •Глава 2. Логические модели представления знаний
- •2.1. Логика высказываний
- •2.1.1. Булева алгебра.
- •2.1.2. Понятие о логическом следствии.
- •2.1.3. Метод резолюции в лв.
- •Имеет место теорема о полноте резолютивного вывода. Множество клозов противоречиво тогда и только тогда, когда из него методом резолюции можно вывести пустой клоз.
- •2.2. Логика предикатов первого порядка
- •2.2.1. Основные определения.
- •2.2.2. Метод резолюции в лппп.
- •2.2.3. Стратегии проведения резолюции.
- •2.2.4. Упорядоченный линейный вывод в лппп.
- •2.2.5.Применение поиска в пространстве состояний при реализации автоматизированного логического вывода.
- •2.2.6. Логический вывод на хорновских дизъюнктах.
- •Понятие экспертной системы и применение логического вывода при построении экспертных систем.
- •2.2.9. Запросы класса b.
- •2.2.10. Запросы класса c.
- •2.3. Понятие о нечетком выводе
- •2.4. Неклассические логики
- •2.4.1. Логики высших порядков.
- •2.4.2. Модальные логики.
- •2.4.3. Многозначные логики.
- •Глава 3. Продукционные модели представления знаний
- •3.1. Основные понятия
- •3.2. Стратегии управления
- •3.2.1. Поиск с возвратом.
- •3.2.2. Поиск в пространстве состояний.
- •3.3. Понятие о коммутативных системах продукций
- •3.4. Понятие о нечетком выводе на продукциях
- •3.5. Сравнение продукционных и логических моделей
- •Глава 4. Реляционные языки представления знаний
- •4.1. Основные элементы естественных языков
- •4.2. Дескрипторные модели
- •4.2.1. Понятие об ипс.
- •4.2.2. Линейная модель работы ипс.
- •4.2.3. Понятие о многоуровневом поиске.
- •4.2.4. Основные характеристики ипс.
- •4.4. Синтагматические цепи
- •4.4.1. Понятие синтагматических цепей.
- •4.4.2. Фреймы.
- •4.5. Сетевые модели представления знаний
- •4.5.1. Понятие семантической сети.
- •4.5.2. Структура интеллектуальной системы доступа к данным на основе семантической сети.
- •4.5.3. Задача поиска кратчайшего обхода образца в семантической сети.
- •4.5.4. Понятие о логическом выводе на семантических сетях.
- •Глава 5. Нейронные сети
- •5.1. Параллели из биологии
- •5.2. Базовая искусственная модель
- •5.3. Применение нейронных сетей
- •5.4. Обучение сети
- •Глава 6. Организация диалога с эвм на естественном языке
- •6.1. Элементы теории формальных языков
- •6.2. Обратная польская запись
- •6.3. Недостатки применения аппарата формальных грамматик
- •6.4. Элементы семиотики
- •6.5. Модель непосредственных составляющих
- •6.6. Многозначность в естественных языках
- •6.7. Расширенные сети переходов
- •6.8. Глубинные (семантические) падежи
- •Глава 7. Логическое программирование на языке пролог
- •7.1. Основные понятия в языке Пролог
- •7.2. Пакет Turbo Prolog
- •7.3. Структура программы
- •7.4. Поиск решений
- •7.5. Механизм отката
- •7.6. Операторы. Декларативный и процедурный смысл программы
- •7.7. Повторение и рекурсия
- •7.8. Повторение и откат
- •7.8.1. Метод отката после неудачи (опн).
- •7.8.2. Метод отсечения и отката (оо).
- •7.8.3. Метод повтора, определенный пользователем.
- •7.9. Методы организации рекурсии
- •7.10. Отладка программы и обнаружение ошибок
- •7.11. Графика в Turbo Prolog’е
- •7.11.1 Создание меню.
- •7.11.2. Создание графического режима.
- •7.11.3. Черепашья графика
- •7.12. Списки и их использование
- •7.12.1. Использование списка.
- •7.12.2. Поиск элементов в списке.
- •7.12.3. Создание нового списка путем слияния двух списков
- •7.12.3. Разделение на два списка.
- •7.13. Сортировки
- •7.13.1. Наивная сортировка.
- •7.13.2. Сортировка включением.
- •7.13.3. Метод «пузырька».
- •7.13.4. Быстрая сортировка.
- •7.14. Компоновка данных из базы в список
- •7.15. Работа с символами и строками
- •7.16. Специальные строки
- •7.17. Работа с файлами
- •7.18. Создание динамических баз данных
- •7.19. Библиотеки Turbo Prolog’а
- •7.19. Модульное программирование
- •7.20. Решение задачи о волке, козе и капусте
- •Глава 8. Введение в язык лисп
- •8.1. Основные особенности языка Лисп
- •8.2. Понятия языка Лисп
- •8.2.1 Атомы и списки.
- •8.2.2 . Внутреннее представление списка.
- •8.2.3 .Написание программы на Лиспе.
- •8.2.4. Определение функций.
- •8.2.5. Рекурсия и итерация.
- •В) maplist. Эта функция действует подобно mapcar, но действия осуществляет не над элементами списка, а над последовательными cdr этого списка.
- •8.2.6 . Функции интерпретации выражения.
- •8.2.7. Макросредства.
- •8.2.8. Функции ввода-вывода.
- •Список используемых источников
- •Перечень используемых сокращений
7.12.1. Использование списка.
Для использования списка нужно описать предикат списка. Предикатам списка обычно присваивают имена, которые характеризуют либо тип элемента, либо сами данные. Введение списка отражается в трех разделах. Домен списка должен быть определен в разделе domains, работающий со списком предикат должен быть в разделе predicates, сам список задается либо в фактах, либо в цели.
Отличительной особенностью списка является наличие знака * после имени домена элементов. Используем операцию разделения списка на голову и хвост для вывода на печать всех элементов списка.
Пример.
domains
number_list=integer
predicates
print_list(numbes_list) – предикат печатает список
clauses
print_list([ ]).
print_list([H|T]):-write(H), nl, print_list([T]).
goal
number_list=[1, 2, 3, 4, 5], print_list(number_list)
Или просто:
Print_list([1, 2, 3, 4, 5, 6, 7])
7.12.2. Поиск элементов в списке.
Введем предикат «Принадлежит» (member)
-
Принадлежит (X, L):– L=[H|T], Х=H
или короче:
Принадлежит(X, [Y|_]):–X=Y
В первом случае X является элементом списка L, если X совпадает с головой списка L. Во втором случае X принадлежит списку, если он содержится в хвосте списка:
-
Принадлежит (X, L):–L= [Y|T], принадлежит (Х, Т)
При рекурсивном вызове предиката в конце концов реализуется один из двух случаев: либо мы найдем голову в каком-нибудь укороченном списке, либо исчерпаем все элементы и придем к пустому списку и остановимся, т.е. имеется два граничных случая.
-
Пролог рассматривает рекурсивное обращение предиката «Принадлежит» как попытку найти соответствие для некоторой новой его копии, что предотвращает путаницу переменных.
Имеется три различных варианта использования предиката «Принадлежит»:
А) memder (X, [a, b, c]) – искать, является ли Х элементом a, b, c.
В) memder (b, X) – искать списки, в которых находятся элементы b.
С) memder (a, [a, b, c]) – проверить истину.
7.12.3. Создание нового списка путем слияния двух списков
Для создания нового списка путем слияния двух списков используется предикат add.
присоединить (A, B, C), C – результат, А, В – исходные списки.
Исходный список В присоединяется списком в конец списка А; и таким образом образуется список С.
1) Граничное условие-присоединение пустого списка к списку дает сам список
Присоединить ([ ], L, L)
2) Рекурсивное условие: присоединение списка В к концу списка А выполняется так: список В присоединяется к хвосту списка А, а затем спереди добавляется голова списка А.
Присоединить([X|L1], L2, [X, L3]):– присоединить(L1, L2, L3).
Опишем процесс создания объединенного.
-
Первый элемент первого списка (Х) всегда будет и первым элементом третьего списка.
-
Хвост третьего аргумента (L3) всегда будет представлять результат присоединения второго аргумента (L2) к хвосту первого списка (L1).
-
Для присоединения одного списка к другому используем предикат присоединить.
-
Так как при каждом обращении к правилу удаляется голова списка, являющегося первым аргументом, то постепенно этот список будет исчерпан и станет пустым, так что произойдет выход на граничное условие.
Пример.
Присоединить([1, 2, 3], [4, 5], [ ]).
Сравнивает его с первым правилом – неудача.
Сравнивает его со вторым правилом
Х=1
Присоединить ([1|2, 3], [4, 5], [ ]):– присоединить ([2, 3], [4, 5], [ ])
X=2
Присоединить([2|3], [4, 5], [ ]):–присоединить([3], [4, 5], [ ])
головы списка помещаются в стек
Х=3
Присоединить([3| [ ]], [4, 5], [ ]):–присоединить([ ], [4, 5], [ ]
он сравнивается с первым предикатом
Присоединить([ ], [4, 5], [ ]):-присоединить([ ], [4, 5], [4, 5]).
Правило 1 удовлетворено и Turbo Prolog начинает сворачивать рекурсивные вызовы второго правила. Извлекаемые при этом из стека элементы помещаются в качестве головы к первому и третьему списку. Элементы извлекаются в обратном порядке, и значение извлеченного из стека элемента присваивается переменной N одновременно в [N|L1] и [N|L3]. Шаги данного процесса можно представить следующим образом:
присоединить ([ ], [4, 5], [4, 5]),
присоединить([3], [4, 5], [3, 4, 5]),
присоединить([2, 3], [4, 5], [2, 3, 4, 5]),
присоединить([1, 2, 3], [4, 5], [1, 2, 3, 4, 5]).
Присвоение идет рекурсивно до тех пор, пока стек не будет полностью исчерпан.
В английской транскрипции
Append([ ], Q, Q).
Append([X|Xs], Ys, {X|Zs]):–append(Xs, Ys, Zs).
В зависимости от вопроса будут совершаться разные операции, например:
-
Append([a, b, c], [d, e], Xs) приведет к списку Xs=[a, b, c, d, e].
-
Append(Xs, [c, d], [a, b, c, d]) дает разность Xs=[a, b].
-
Предикат member может быть выражен через предикат append в виде: Member(X, Ys):–append(As, [X|Xs], Ys). X является элементом списка Ys, если Ys может быть расщеплен на два списка, причем X является головой второго списка.