- •1 Общая характеристика дисциплины
- •1.1 Значение дисциплины ии
- •1.2 Понятие "искусственный интеллект"
- •1.3 Краткая история развития ии
- •1.4 Классификация систем ии
- •Представления знаний - центральная проблема ии.
- •Компьютерной лингвистики, решение которой обеспечивает процесс естественно- языкового общения с эвм и процесс автомтического перевода с иностранных языков.
- •Компьютерной логики, имеющей особо важное значение для развития экспертных систем, поскольку ее цель – моделирование человеческих рассуждений.
- •1.5 Основные направления развития ии
- •2Языки систем искусственного интеллекта
- •2.1 Общие сведения о языках сии
- •2.2 Язык лисп
- •2.2.1 Алфавит
- •2.2.2 Атомы и точечные пары
- •2.2.3 Списки
- •2.2.4 Арифметические функции языка лисп
- •2.2.5 Функции setq и quote
- •2.2.6 Функции car и cdr
- •2.2.7 Композиция функций саr и cdr.
- •2.2.8 Пустой список
- •2.2.9 Функция cons
- •2.2.10 Логические значения и предикаты
- •2.2.11 Предикаты атом и eq
- •2.2.12 Предикат null
- •2.2.13 Предикаты, классифицирующие атомы
- •2.2.14 Арифметические предикаты сравнения
- •2.2.15 Операции над строками битов
- •2.2.16 Функция cond
- •2.2.17 Определяющее выражение функции
- •2.2.18 Определяемые функции
- •2.2.19 Рекурсивные функции
- •2.2.20 Prog- механизм.
- •2.3 Обращение (инверсия) списков
- •2.4 Вычисление факториала числа
- •2.5 Вычисление длины списка
- •2.6 Вычисление длины списка и его подсписков
- •2.7 Соединение списков
- •2.8 Удаление элемента из списка
- •2.9 Функция, вычисляющая список общих элементов двух списков
- •2.10 Функция, объединяющая два списка и не включающая повторяющиеся элементы
- •2.11 Ассоциативные списки
- •2.12 Функции, изменяющие значения указателей
- •2.13 Функции read и print
- •2.14 Функция eval
- •3 Представление задач и поиск решений
- •3.1 Представление задач в пространстве состояний
- •3.2 Сведение задачи к подзадачам
- •3.3Представление задач в виде доказательства теорем
- •3.4 Поиск решения в пространстве состояний
- •3.5 Алгоритм поиска в ширину
- •3.6 Алгоритм поиска в глубину
- •3.7Алгоритм равных цен
- •3.8 Алгоритмы эвристического (упорядочного) поиска
- •3.9 Поиск решения задачи, при сведении задачи к подзадачам
- •3.10 Представление знаний
- •3.10.1 Продукционные системы
- •3.10.2Семантические сети
- •3.10.3 Представление знаний фреймами
- •3.11 Сопоставление с образцом
- •3.11.1 Функции Mapcad, Apply и Funcall
- •3.11.2 Свойства Атомов
- •3.11.3 Функция сопоставления с образцом
- •3.11.4 Присваивание значений при сопоставлении с образцом
- •3.11.5 Функции Explope, Compress, AtomCar, AtomCdr
- •3.11.6 Задание ограничений при сопоставлении с образцом
- •3.12 Программная реализация лисп - машин
- •3.12.1 Структура памяти лисп - машины
- •3.12.2 Диалекты языка лисп
- •3.12.3 Аппаратная реализация языка лисп
- •4 Математические основы логического вывода
- •4.1 Решение задач с помощью доказательства теорем
- •4.2 Тождественные преобразования при доказательстве теорем
- •4.3 Принцип резолюции
- •4.4Примеры применения принципа резолюции
- •4.5 Система управления роботом strips.
- •5Решение задач искусственного интеллекта на языке пролог
- •5.1 Применение метода доказательства теорем в системе пролог
- •5.2 Особенности программирования на пролоГе
- •5.4 Арифметические предикаты
- •5.5 Предикаты управления возвратом
- •5.6 Программа вычисления квадратного корня
- •5.7 Вычисление n!
- •5.8 Область действия предиката отсечения
- •5.9 Отрицание на пролоГе
- •5.10 Определение структур управления
- •5.11 Организация циклов в языке пролог
- •5.11.1 Цикл repeat-fail
- •5.11.2 Сопоставление цикла с возвратом и рекурсии
- •5.12 Операторная запись.
- •5.13 Ввод-вывод в системе пролог
- •5.13.1 Предикаты ввода-вывода символов
- •5.13.2 Предикаты ввода-вывода термов
- •5.13.3 Примеры применения предикатов ввода-вывода
- •5.14 Предикат name
- •5.15 Предикаты проверки типов термов
- •5.16 Создание и декомпозиция термов
- •5.17 Предикаты работы с базой данных .
- •5.18 Бинарные деревья
- •5.18.1 Построение бинарного дерева
- •5.18.2 Преобразование списка в упорядоченное дерево
- •5.18.3 Преобразование дерева в список
- •5.18.4 Удаление элемента из дерева
- •5.18.5 Поиск в глубину
- •5.18.6 Поиск в ширину
- •5.19 Поиск решений в игровых программах.
- •5.20 Обратное усечение дерева.
2.2.20 Prog- механизм.
Тот, кто знаком с алгоритмическими языками, ощущает некоторое неудобство при программировании на языке ЛИСП, вызванное отсутствием столь привычных средств записи программ, как оператор присваивания, оператор перехода, метки, описания переменных. При отсутствии опыта может получиться, что писать программы на ЛИСПе вообще невозможно. Конечно, это не так, но подобный стиль программирования вызывает некоторые трудности как практического, так и психологического характера. Поэтому в язык включен аппарат программирования, представляющий все упомянутые возможности. Общий вид выражения, приводящего этот аппарат в действие таков:
(PROG (U1 U2 ... Un) S1 S2 ...Sm),
где U1,U2,...,Un- переменные, которые в обычном программировании соответствовали бы локальным переменным. Список играет роль описания переменных, т.е. указывает, какими новыми переменными мы хотим пользоваться в данном обращении к PROG. Если нет локальных переменных, то этот список является пустым и записывается в виде (). Тогда все переменные введенные в PROG механизме сохраняют свои значения;
S1,S2,...,Sm- s-выражения, которые называются операторами. Если s-выражение- атом, то атом понимается как метка. В качестве s-выражения могут использоваться функции, описанные ранее. Кроме этого дополнительно только в рамках PROG - механизма могут использоваться следующие функции.
(RETURN e)- возврат из PROG. Результат-значение выражения - e.
(GO l)- переход на метку, где l- атом, встречающийся среди операторов S1,S2,...,Sm.
Среди S1,S2,...,Sm может быть (COND (P1 t1)(P2 t2)...) - условный оператор, отличающийся от условного выражения только тем, что ti- операторы, в т.ч. GO,RETURN,SETQ,COND и т.д.
Выполнение PROG состоит в том, что всем программным переменным U1,...,Un присваивается начальное значение NIL и затем начинают выполняться операторы S1,...,Sm. Этот порядок может быть изменен с помощью оператора перехода.
Обращения к функции PROG применяются чаще всего в составе определяющего выражения в качестве его тела, причем функции, использующие такое описание, выполняются иногда быстрее. В качестве примера определим функцию MEMB, используя PROG-механизм:
(DEFUN MEMB_PROG(X Y)
(PROG ()
A: (COND
((NULL Y) (RETURN NIL))
((EQ X (CAR Y))(RETURN T))
)
(SETQ Y (CDR Y))
(GO A)
)
)
В muLisp имеется специальная функция для организации итерационных циклов:
(LOOP
задача 1
. . .
задача n )
при выполнении n-ой задачи управление опять передается 1-й задаче, до тех пор, пока из условных задач одна не станет истинной.
(DEFUN MEMB_LOOP (X Y)
(LOOP
((NULL Y) NIL)
((EQ X (CAR Y)))
(SETQ Y (CDR Y))
)
)
2.3 Обращение (инверсия) списков
Чтобы лучше познакомиться с основными приемами программирования в ЛИСПе, составим несколько вариантов программы для решения следующей задачи. Требуется переставить элементы списка в обратном порядке, причем, если элемент сам является списком, то с ним проделывается та же операция на всех уровнях.
Пусть имеется список (A B (C (D E)) F). Необходимо записать его в обратном порядке, включая инверсию всех внутренних списков, т.е. получить результат (F((E D) C) B A).
Чтобы это выполнить, введем переменные X и Y:
X - будет обозначать еще не обработанную часть списка
Y- уже обработанную часть списка с переставленными элементами (промежуточный результат).
Тогда на некотором этапе выполнения программы возможна ситуация:
X=((C (D E)) F)
Y=(B A)
В начале работы список Y пуст, а список Х соответствует исходному. Когда Х окажется пустым, в Y будет находиться требуемый результат.
Если же Х не пуст, то следует выделить из него первый элемент, перевернуть его, если он не атом, и вставить его в начало списка Y.
Такую функцию описать нетрудно. Проблема заключается в том, откуда взять переменную Y, ведь по смыслу задачи, функция ее решающая, должна быть функцией одной переменной. Для этого вводят вспомогательную функцию с нужным количеством переменных.
По условию, надо определить функцию REV, которая будет обращать список. Определим вспомогательную функцию REV1, над аргументами X и Y, которая будет выполняться выше описанные действия (рис. ).
REV 1
+ -
NULL
V X?
Y + -
ATOM
Y=Y+(REV (CAR X)) X=(CDR X)
Y=Y+(CAR X) X=(CDR X)
X
Рис.2.1 Структурная схема алгоритма обращения списка
Текст программы:
(DEFUN REV1 (X Y)
(COND
((NULL X) Y)
((ATOM (CAR X))(REV1 (CDR X)(CONS (CAR X) Y)))
(T (REV1 (CDR X)(CONS (REV (CAR X)) Y)))
))
Теперь определим функцию REV.
(DEFUN REV (X)
(REV1 X NIL))
Решим аналогичную задачу по-другому, используя механизм PROG.
(DEFUN REV (X)
(PROG (U Y)
A (COND ((NULL X)(RETURN Y)))
(SETQ U (CAR X))
(SETQ X (CDR X))
(COND ((NULL (ATOM U))(SETQ U (REV U))))
(SETQ Y (CONS U Y))
(GO A)
))
Переменная У свое начальное значение NIL получает автоматически (см. PROG).
В этом примере обращение на внешнем уровне выполняется с помощью перехода на метку, а обращение на внутреннем уровне выполняется с помощью рекурсивного обращения.
Рассмотрим в учебных целях еще один возможный способ определения функции REV.
(DEFUN REV (X)
(COND ((ATOM X) X)
( T (PROG (U)
A (COND ((NULL X)(RETURN U)))
(SETQ U (CONS (REV (CAR X)) U))
(SETQ X (CDR X))
(GO A)
)
)
)
)
Последний вариант имеет самую короткую запись, но в нем слишком много времени тратится на проверку того, что очередной элемент списка атом и его не нужно инвертировать.
Далее с целью закрепления навыков написания рекурсивных функций рассмотрим типовые функции обработки списков.