Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория новая.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
129 Кб
Скачать
☆
  1. Работа с базами данных.

Пролог программа представляется реляционной БД, то есть как описание некоторого множества отношений. Описание отношений в ней присутствует в явном виде (факты) или в неявном виде (правила). Более того, встроенные предикаты дают возможность корректировать эту БД в процессе выполнения программы. Предикаты для работы с БД таковы: 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), первый аргумент которого – вводимый терм, т. е. переводимое слово, а второй (если он имеется) – надпись на заголовке диалогового окна.

  1. Пролог и искусственный интелект.

  2. Экспертные системы.

Пример применения Пролога в области искусственного интеллекта - экспертная система.

Функции ЭС:

  1. Диалог с пользователем, интерфейс

  2. Выбор из базы знаний

Экспертными системами обычно называют программы, которые могут заменить эксперта в какой-то предметной области. Мы построим классификационную экспертную систему, которая будет пытаться угадать загаданное человеком животное. Если загаданное человеком животное окажется неизвестно нашей программе, у нее будет возможность пополнить свою базу знаний новой информацией.

пределим два предиката внутренней базы данных, которые позволят нам хранить информацию о животных.

Один из них предназначен для хранения характеристик животных и будет иметь два аргумента: первый — номер свойства, второй — его словесное описание.

Небольшой базовый набор свойств может выглядеть, например, так:

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).