- •Предложения в языке Пролог.
- •Термы Пролога.
- •Процедурная семантика и декларативный смысл.
- •Списки. Базовые операции над списками.
- •Операция сопоставления.
- •Перебор в Прологе. Механизм прямой трассировки и механизм возврата.
- •Отсечение в прологе, виды отсечений.
- •Арифметические действия в прологе.
- •Операторная запись.
- •Типовые предикаты Пролога.
- •Работа с базами данных.
- •Пролог и искусственный интелект.
- •Экспертные системы.
- •Двоичные деревья, двоичные справочники.
- •Решение логических задач, головоломок.
- •Представления графов в Прологе.
- •Как Пролог-система отвечает на вопросы пользователя.
- •Понятие строго функционального языка.
- •Определение функции. Безымянная лямбда функция.
- •Списки, операции над списками.
- •Внутреннее представление списков.
- •Символ, значение символа, свойства символа.
- •Рекурсия в Прологе, рекурсия по значению и аргументу.
- •Виды рекурсий в Лиспе.
- •Функции более высокого порядка. Применяющие и отображающие функционалы.
- •Замыкания.
- •Лисп в искусственном интеллекте.
Работа с базами данных.
Пролог программа представляется реляционной БД, то есть как описание некоторого множества отношений. Описание отношений в ней присутствует в явном виде (факты) или в неявном виде (правила). Более того, встроенные предикаты дают возможность корректировать эту БД в процессе выполнения программы. Предикаты для работы с БД таковы: assert, asserta, assertz, assert_in, asserta_in, retract, retractall.
Предикат assert(<the fact>) – всегда успешен, а в качестве своего побочного эффекта добавляет факт к текущей базе данных. Предикат retract(<the fact>) – приводит к противоположному эффекту: удаляет сопоставимый c <the fact> факт из базы данных.
Следует отметить, что добавленный факт будет присутствовать в текущей БД до конца текущего сеанса работы. Однако он будет «не видимым» для пользователя, т. е. не будет отображаться в рабочем окне. Для того чтобы факт появился в рабочем окне, необходимо использовать предикат assert_in.
К этой же группе предикатов относятся родственные предикаты asserta и assertz (последний в SP отсутствует). Предикат asserta добавляет предложение в начало БД, а assertz – в конец (аналогия assert).
Следует отметить, что из рабочего окна удаляемый факт не исчезнет. Для его «видимого» исчезновения необходимо использовать предикат retract_in.
Для удаления всех вхождений данного факта в БД необходимо использовать предикат retractall(<the fact>).
Польза от таких предикатов очевидна, пользователь может динамически изменять БД в момент выполнения программы. Очевиден и тот факт, что неумелое, неграмотное их использование приведет к полному изменению исходной БД и как результат – непредсказуемые результаты. В отдельных случаях следует вовсе отказаться от использования предикатов этой группы.
Интерфейс с программой осуществляется посредством предиката read(Term) или read(Term,String), первый аргумент которого – вводимый терм, т. е. переводимое слово, а второй (если он имеется) – надпись на заголовке диалогового окна.
Пролог и искусственный интелект.
Экспертные системы.
Пример применения Пролога в области искусственного интеллекта - экспертная система.
Функции ЭС:
Диалог с пользователем, интерфейс
Выбор из базы знаний
Экспертными системами обычно называют программы, которые могут заменить эксперта в какой-то предметной области. Мы построим классификационную экспертную систему, которая будет пытаться угадать загаданное человеком животное. Если загаданное человеком животное окажется неизвестно нашей программе, у нее будет возможность пополнить свою базу знаний новой информацией.
пределим два предиката внутренней базы данных, которые позволят нам хранить информацию о животных.
Один из них предназначен для хранения характеристик животных и будет иметь два аргумента: первый — номер свойства, второй — его словесное описание.
Небольшой базовый набор свойств может выглядеть, например, так:
cond(1,"кормит детенышей молоком").
cond(2,"имеет перья").
cond(3,"плавает").
cond(4,"ест мясо").
cond(5,"имеет копыта").
cond(6,"летает").
cond(7,"откладывает яйца").
cond(8,"имеет шерсть").
cond(9,"имеет полосы").
cond(10,"имеет пятна").
cond(11,"имеет черно-белую окраску").
cond(12,"имеет длинную шею").
cond(13,"имеет длинные ноги").
cond(14,"имеет щупальца").
Второй предикат будет хранить описание животных. Первый его аргумент — название животного, второй — список, элементами которого являются номера свойств, присущих данному животному.
Выглядеть эта база знаний может примерно следующим образом:
rule("гепард",[1,4,8,10]).
rule("тигр",[1,4,8,9]).
rule("жираф",[1,5,8,10,12,13]).
rule("зебра",[1,5,8,9,11]).
rule("страус",[2,14]).
rule("пингвин",[2,3,11]).
rule("орел",[2,6]).
rule("кит",[1,3,11]).
cond_is(N,'1') /* если загаданное животное имеет свойство с номером N */
cond_is(N,'2') /* если загаданное животное не имеет свойства с номером N */
Процесс отгадывания задуманного животного будет проходить следующим образом.
animals:–
rule(X,L),
check(L),
nl,write("Я думаю это ",X),
nl,write("Я прав? (1 — да, 2 — нет)"),
read_true_char(C),C='1',!.
animals:–
nl,write("Я не знаю, что это за животное"),nl,
nl,write("Давайте добавим его в мою базу
знаний."),nl,
update.
update:–
nl,write("Введите название животного:"),
readln(S),
add_cond(L), /* указываем свойства животного */
assert(rule(S,L),knowledge),
/* добавляем информацию в базу
знаний*/
save("animals.ddb",knowledge).
