- •Содержание
- •Введение
- •Глава 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.8.3. Метод повтора, определенный пользователем.
Этот метод выполняет откат всегда в отличие от метода ОО, где откат выполняется только после искусственно созданного неуспешного результата. Используется при реализации доступа к данным в базе и файлам, организации выдачи на экран и формировании меню.
repeat:– repeat (повторяй себя) – это рекурсивное правило.
Предикат repeat будет вычисляться успешно при каждой новой попытке его вызвать после отката.
Пример:
domain
name=symbol
predicacates
write_mеs
repeat
do_echo
check(name) – проверить имя
gool
write_mеs, – получить сообщение и его напечатать
do-echo
clauses
repeat
repeat:– repeat.
Write_mеs:- nl, write (“введи слово для окончания”), nl.
do_echo:– repeat, readeln (Name) – операторы ввода строки с клавиатуры
write(Name), nl,
check(name), !.
check(stop):– nl, write (“конец”).
check(_):– fail.
7.9. Методы организации рекурсии
Рекурсия используется для формирования запросов в базе данных, для формирования обработки списков. Правило, содержащее само себя в качестве компонентов, называется правилом рекурсии и реализует повторное вычисление. При рекурсии происходит редукция задачи на все более уменьшенный вариант. Для того чтобы остановить рекурсию, метод должен приводить к такой задаче, которая решается непосредственно. Это достигается за счет утверждения граничных условий или условий выхода.
Пример: ввод и вывод символов.
domain
char_data = char (буквы)
predicates
write_сh – написать букву
read_ сh – читать букву
goal
write_сh, read_сh.
clauses
write_сh:– write (“давай символ”), nl, nl,
write (“окончание #”), nl, nl – вывод символов
read_ сh:– readchar (Char_data), – оператор, считывающий букву с клавиатуры
Char_data <> “#”,– условие вывода из рекурсии
write (Сhar_data),
read_ сhar.
В общем случае рекурсия может быть сложной. Рассмотрим метод обобщенного правила рекурсии (ОПР):
(имя правила рекурсии):–
(список предикатов), (1)
(предикат условия выхода), (2)
(список предикатов), (3)
(имя правила рекурсии), (4)
(список предикатов), (5)
Успех или неудача любого правила из первой группы на рекурсию не влияет. В случае неудачи правила (2) происходит остановка рекурсии. Успех правила (4) вызывает повторную рекурсию.
Пример: Программа печать чисел от 1 до 7
domain
number = integer (число)
predicates
write_nmb (number)
gool
write (“это числа“), nl, nl,
write_nmb (1), nl, nl,
write (“все сделано“).
clauses
write_nmb (8). – граничные условия
write_nmb (number):–
number < 8, – условия выхода (2)
write (“ “, number), nl,
Next_ number= number+1, (3)
write_nmb (Next_ number). (4)
При вызове рекурсии имя аргумента не важно, важна позиция аргументов.
Пример: Вычисление n!
Запишем граничное условие в виде fact (0, 1).Т.е., 0!=1 – граничное условие
n! = 1*2*3*… n
Т.е. предикат записывается в виде fact (N,Y) – номер и функция
f(N)=f(N-1)*N – рекурсивное правило
n!=n*(n-1)!
fact(n, V):-M=N-1, fact(M, U), V=U*N – формула для вычисления факториала.
Рассмотрим работу Пролога на примере вычисления fact (3, X). Она состоит из двух фаз: разбиения и решения.
Первое обращение.
fact (3, X) сравнивается с fact (0, 1). Имеем 3<>0 – неудача, и используем второе правило
fact (3, X) = fact (N, V). N=3, а Х связываем с V. Тогда M = 3–1=2 и имеем fact (2, U), а Х=U*3. Пролог пытается согласовать третье правило только в случае, если согласовано второе. Поэтому проверка третьего откладывается.
Второе обращение.
Чтобы согласовать fact (2, U), сопоставляем его с набором фактов: 2<>0, из второго правила следует сопоставление fact (2, U) c fact (N2, U2) при N2=2 и U2=U, М2=2-1, fact (M2, U2),U=U2*2 – откладывается.
Третье обращение.
Согласуем последнее fact (1, U2), опять 1<>0 и N3=1, а V3=U2. Теперь согласуем m3 = 1–1=0, fact (0, U3), U2=U3*1 – откладывается.
Для M3=0 fact (0, U3) согласуется с fact (0, 1) и, следовательно, U3=1. Редукция завершена, и граничное условие позволяет ее остановить.
Теперь Пролог возвращается к отложенным условиям, согласуя их последовательно. Согласование fact (1, U2) дает U2=U3*1, так как U3=1, то U2=1. Таким образом, fact (1, U2) согласуется при U2=1. Согласование fact (2,U) – так как U=U2*2 и так как U2=1, то U=2 и fact (2, U) согласуется при U=2. Согласование fact (3, X)-так как X=U*3 и U=2, то Х=6 и fact (3, X) согласуется при Х=6.
При работе с рекурсией промежуточные значения заносятся в СТЕК. Механизм возврата начинает работать только тогда, когда в СТЕК будет занесено 9 значений. Все элементы будут по очереди выталкиваться из СТЕКа, так как любые попытки найти другие решения будут неуспешными. Таким образом, при вычислении факториалов от больших чисел СТЕК может достигать очень большой длины. Поэтому для уменьшения величины СТЕКа используют так называемую хвостовую рекурсию – рекурсию, в которой последнее условие в последнем правиле является рекурсивным. Она ограничивает рост стека благодаря очистке стека после успешного сопоставления условия, содержащего рекурсию
Пример использования хвостовой рекурсии.
predicates
fact1 (integer, real)
fac (integer, integer, real, real)
clauses
fact1 (0, 1): -!
fact1 (X, Y):– fac (X, 1, 1, Y)
fac (X, X, Y, Y,):-!
fac (X, K, P, Y): - K1=K+1, P1=P*K1, fac (X, K1, P1, Y).
Правило fac (X, K1, P1, Y) является хвостовой рекурсией.
В Прологе отсутствуют «локальные переменные» для сохранения промежуточных результатов и возможность их применения в процессе вычисления. Поэтому для реализации итерационных алгоритмов, требующих сохранение промежуточных результатов, в процедуры добавляются аргументы, называемые накопителями. Накопитель является логической переменной, а не ячейкой памяти, в процессе итерации передается не адрес, а значение. Так как логическая переменная обладает свойством одноразовости записи, то измененное значение – новая логическая переменная – передается каждый раз. Логическая переменная F, представляющая решение, должна следовать по всему вычислению, чтобы получить значение при заключительном вызове fact.
Задания для самостоятельной работы.
1. Напечатайте числа от 53 до 62
2. Напечатайте числа от 7 до 1
3. Напишите программу, которая вычисляет сумму ряда вида
S(7) = 1+3+6+...15, т.е. S(N+1) = N+1+S(N), где S(1) = 1.
4. Напишите программу, вычисляющую сумму S(15) = 1+3+5+...+15
5. Вычислите ряд f(x,n) = 1+x+x2+x3+x4+ xn
6. Напишите программу, вычисляющую степень R=XN
7. Напишите программу, вычисляющую ряд Фибоначчи