- •Содержание
- •Введение
- •Глава 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.13.4. Быстрая сортировка.
-
При быстрой сортировке разделяют список, состоящий из головы Н и хвоста Т на два списка L и M такие, чтобы все элементы из L были меньше или равны H, а все элементы из M больше, чем H. Порядок следования элементов в L и M такой же, как в исходном списке [H|T]. После разбиения применяют быструю сортировку к каждому из списков и присоединяют M к L.
Цель: разбить(H, T, L, M) – разделяет список [H|T] на L и M.
разбить(H, [A|X], [A|Y], Z): – A=<H, разбить(H, X, Y, Z).
разбить(H, [A|X], Y, [A, Z]): – A>H, разбить(H, X, Y, Z).
Граничное условие: разбить( _, [ ], [ ], [ ]).
Граничный случай: бисорт([ ], [ ]).
Рекурсивные условия: бисорт([H|T], S): – разбить(H, T, A, B), бисорт(A, A1), бисорт (В, В1), присоединить(A1, [H|B1], S).
7.14. Компоновка данных из базы в список
Для сбора данных из базы и компоновки в список используют встроенный предикат findall (найти все):
findall (имя_переменной, предикат_выражения, имя_списка)
Пример. Допустим, имеется список футболистов клуба «Томь» и их рост. Найти средний рост команды.
Запрос: Findall(Points, football(_,Points), Points_list). Он просматривает всю базу и переносит значения Points в список Point_List. Для подсчета среднего значения используется предикат:
Sum_list ([ ], 0, 0) – граничное условие.
Sum_list ([Н|Т], Sum, Number1):– Sum_list (Т, Sum1, Number1),
Sum = Н+ Sum1, Number = Number1+1.
Средний рост определяем по предикату: Averang = Sum/Number.
7.15. Работа с символами и строками
Над строками обычно выполняются следующие операции:
1) объединение двух строк в новую строку (+) – конкатенация,
2) расщепление строки для создания двух новых строк, каждая из которых содержит некоторые из исходных символов,
3) поиск символа или подстроки внутри данной строки.
В компьютере символы могут быть представлены двумя способами.
1. Кодами в виде одиночного символа ‘\N’, где N – число-код соответствующего символа в 10-ричном или 16-ричном представлениях:
S=”\65”
S=”\41”
2. Как строка символов “\N\M\O\”:
S=”abc”- строка
S=”\65\66\67”
S=”\16”
Коды могут быть использованы для получения на экране псевдографических символов/
Строки могут быть присвоены переменным и выведены на печать:
Printstring: – S1=«это пример», S2=«печать».
write(S1), write(S2), nl – печать строки
Пример в виде программы.
domains S1, S2=string predicates datastring(S1, S2) printstring Goal printstring clauses datastring(S1, S2):- S1=”это пример”, S2=”печать”. printstring:- datastring(S1, S2), write(S1), nl, write(S2). |
|
Фиксированные строковые константы S1, S2 объявляются в разделе доменов. Можно размещать строки в одном правиле, а вызывать и обрабатывать их в других правилах. Правило datastring содержит строки. Для того чтобы передать строки из него в правило printstring первое должно быть включено во второе с явным указанием символов s1, s2 в списке объектов вызываемого правила. Необходимость такого включения определяется отсутствием понятия локальной переменной в Прологе для удержания промежуточных результатов и их применения в процессе вычисления.
Областью определения переменных является правило. В другом правиле эти переменные не видны и недопустимы. Поэтому мы соединяем в одно правило. Для работы со строковыми объектами в Турбо Прологе введены предписанные предикаты.
-
Определение длины строки (количество символов строки): strlen (значение строки, длина строки). Способ действия данного предиката зависит от того, что означено в аргументах. Если длина строки не означена, то она вычисляется, иначе производится сравнение.
Strlen (“abba”, X)
X – неизвестная, результат работы Х=4
Х=3, strlen(“abba”, X), результат неуспех, ложь
-
Конкатенация (сложение строк).
Встроенный предикат concat (X, Y, Z) – объединяет (помещает) X, Y в Z, входные и выходные строки могут быть представлены переменными.
Х = “паро”
Y = “ход”
Тогда Z=”пароход”
-
Получение подстрок.
Подстрокой называется строка, являющаяся копией некоторой части исходной строки.
Встроенный предикат Frontstr(N, исходная строка, строка1, строка2) копирует N первых символов из исходной строки в строку 1, остальные символы в строку 2.
-
Преобразование данных к разным типам.
Для преобразования имеются следующие предикаты:
-
преобразование строки в символ str_char,
-
преобразование строки в число str_int,
-
преобразование строки в действительное число str_real,
-
преобразование символа в код символа char_int,
-
большие буквы переделывает в маленькие Upper_lower.
Эти операторы применяют, когда тип объектов встроенного предиката отличается от типа объектов предиката, определенного пользователем.
Пример. writef – печать форматная.
writef («текущее устройство есть %», drive_str). Этот оператор вызовет отказ системы, если символьная переменная drive_str будет означена символом «а». Чтобы система не выдала ошибки, нужно писать: str_char (drive_str, drive), writef(«текущее устройство есть %», drive).
При присвоении значений одного типа переменной другого типа тоже используется преобразование, причем предикаты имеют два направления преобразования в зависимости от означенности переменных.
Например, при преобразовании upper_lower(S1, S2) при S1= ”STAR” переменной S2 присваивается значение “star” только в том случае, если она на данный момент не означена (не имеет значение).
Если S2 = ”star”, а S1 не означена, то совершается переход в прописные (большие) буквы.
Пользователь может сам разработать предикаты преобразований:
Real_int, int_ real – удобны для математических расчетов R – real, N – int,
conv_ real _ int (R,N): – R=N,
conv_ int_ real (R,N): – N = R – обратное преобразование,
conv _strsymbol(S, Sb): – S = Sb, где S – строка, Sb – символ.
Это преобразование удобно для обработки данных и записи в памяти.
-
Создание символьных предикатов означает присоединение символа к началу строки. Для совершения этой операции введен предикат
frontchar (строка, символ, остаток строки).
Объекту строка присваивается значение конкатенации символа и остатка строки.
Пример: frontchar (“spring”, C, “pring”) – результат: С=’s’.
-
Преобразование строки в список символов, т.е. из строки можно получить список. Для преобразования строки используется frontchar. Метод преобразования заключается в циклическом использовании frontchar для вырезания первого символа и размещении его в список. Правило преобразования записывается в виде:
convert (“”, [ ]) – граничное условие,
convert (str, [H|T]): – frontchar(str,H, str1),
convert(str1, T).
Пример программы.
domains
char_lis=char*
str=string
predicates
convert(str,char_list)
print_list(char_list)
do_convert_and_print
goal
do_convert_and_print.
clauses
convert(“”, [ ]).
convert(Str, [H|T]): – frontchar(Str, H, Str1),convert(Str1, T).
print_list([]).
print_list([H|T]):– write(H, ” “),print_list(T).
do_convert_and_list:- nl, nl, write(“STARS AND”), nl, nl, convert(“Stars AM”, List),
print_list(List), nl, nl, write(“All done”), nl.