Создание внутренней базы знаний экспертных систем на ПРОЛОГЕ.


Это простой пример того, как с помощью внутренней базы данных на писать классификационную экспертную систему. Важным преимуществом использования базы данных в этом примере является то, что вы можете добавлять знания (и удалять их) во время работы программы. 
/* Program Lab_6_1.PRO */
domains
thing = string
conds = cond*
cond = string

database
is_a(thing,thing,conds)
type_of(thing,thing,conds)
false(cond)

predicates
run(thing)
ask(conds)

clauses
run(Item):-
is_a(X, Item, List),
ask(List),
type_of(Ans, X, List2),
ask(List2),
write(«The «, Item,» you need is a/an «,
Ans), nl.
run(_):-
write(«This program does not have enough «),
write(«data to draw any conclusions.»),
nl.
ask([]).
ask([H|T]):-
not(false(H)),
write(«Does this thing help you to «),
write(H,» (enter y/n)»),
readchar(Ans), nl, Ans=’y’,
ask(T).
ask([H|_]):-
assertz(false(H)), fail.
Goal run(tool).

Следующие факты могли быть занесены с помощью предикатов asserta, или assertz, или считаны из файла с помощью предиката consult. Однако, в этом примере они расположены в секции clauses.
is_a(language, tool, [«communicate»]).
is_a(hammer, tool, [«build a house», «fix a fender», «crack a nute»]).
is_a(sewing_machine, tool, [«make clothing», «repair sails»]).
is_a(plow, tool, [«prepare fields», «farm»]).
type_of(english, lahguage, [«communicate with people»]).
type_of(prolog,lahguage, [«communicate with a computer»]).

Отвечайте на каждый вопрос так, как будто вы хотите найти некоторое средство общения с компьютером.
Теперь введите в раздел goal:
retract(type_of(prolog, language, [«communicate with a computer»])),
asserta(type_of(«turbo prolog», language, [«communicate with personal computer»])),
asserta(type_of(prolog, language, [«communicate with a mainframe computer»])),
run(tool).

Эта цель удалит факт
type_of(prolog, language, [«communicate with a computer»])
из внутренней базы данных и добавляет два новых факта в программу
type_of(prolog, language, [«communicate with a mainframe computer»]).
type_of(«turbo prolog», language, [«communicate with personal computer»]).

Теперь снова отвечайте на каждый вопрос так, как будто вы хотите найти некоторый язык общения с персональным компьютером.
С помощью вызова предиката save с именем файла с качестве его аргумента можно сохранить всю базу данных в текстовом файле. Например, после вызова save(«mydata.dba») файл MYDATA.DBA будет аналогичен секции clauses обычной программы Пролога, и каждый факт будет содержаться строке. С помощью предиката consult можно считать этот файл в память:
consult(«mydata.dba»)

2. Можно манипулировать фактами описываемыми предикатами базы данных (фактами, описанными в секции database вашей программы) как будто они являются термами.
При объявлении базы данных Пролог создает внутри область определения, соответствующую описанию базы данным. Для примера рассмотрим объявление:
database -dba1 /* dba1 — домен для предикатов */
person(name, telno)
city(cno, cname)

Получив такие объявления, система Пролога создаст соответствующую облать (домен) dba1: domains
dba1 = person(name, telno); city(cno, cname)

Этот домен dba1 может быть использован также как любой другой пре допределенный домен. Например, для создания предиката my_consult, аналогичного стандартному предикату consult, Можно использовать стандартный предикат readterm (который описан в главе 12).
Программа Lab_6_2.PRO один из практических путей использования внутренней базы данных. Этот пример использует средство управления дисплеем.
Формат текущего экрана дисплея может хранится в фактах field и textfield, которые определены в базе данных screen. Несколько имен экранов могут храниться в базе screens. Во время работы предикат shiftscreen может скопировать один из нескольких хранящихся экранов в базу screen, предварительно уничтожив все текущие данные в этой базе и вызвав предикат screen для получения информации для формируе мого экрана, а затем вставляя новые формы экрана в базу screen.

/* программа Lab_6_2.PRO */
domains
screen_name = symbol
field_name = symbol
row, col, len = integer
type = int(); str(); real()

database — screen
field(field_name, type, row, col, len)
textfield(row, col, len, string)

database — screens
screen(screen_name, screen)

predicates
shiftscreen(screen_name)

clauses
shiftscreen(Screen):-
retractall(_, screen),
screen(Screen, ScreenFact),
assert(ScreenFact),
fail.
shiftscreen(_).

/* Схема экрана для записи person */
screen(person,field(«fname»,str,6,16,36)).
screen(person,field(«lname»,str,8,15,37)).
screen(person,field(«street»,str,10,12,40)).
screen(person,field(«zipcode»,str,12,14,7)).
screen(person,field(«cityname»,str,12,33,19)).
screen(person,field(«code»,str,15,17,35)).
screen(person,textfield(15,4,12,»Person Code:»)).
screen(person,textfield(12,22,10,»City Name:»)).
screen(person,textfield(12,4,8,»Zip code:»)).
screen(person,textfield(10,4,7,»Street:»)).
screen(person,textfield(6,4,11,»First Name:»)).
screen(person,textfield(8,4,10,»Last Name:»)).

/* Схема экрана для записи city */
screen(city,field(«zipcode»,str,8,16,7)).

Резюме:
1. Внутренняя база Пролога состоит из фактов вашей программы, сгруппированных в секции database. Предикаты, определяемые пользователем и используемые в этих группах фактов, можно объявлять с помощью ключевого слова database.
2. Секциям database можно давать имена (с помощью которых создается соответствующий внутренний домен). По умолчанию доменом для неименованной секции database будет домен bdasedom. В программе может присутствовать несколько секций database, но каждая из них при этом должна иметь уникальное имя. Заданный предикат базы данных можно описать только в одной секции database.
3. С помощью стандартных предикатов asserta, assertz, и consult можно добавлять факты к внутренней базе данных во время работы программы. Можно также с помощью предикатов retract и retractall удалять эти факты во время работы программы.
4. Предикат save сохраняет факты из секции database в файле (в определенном формате). С помощью редактора можно создавать или редактировать такой файл фактов, а затем можно вносить факты из файла в программу с помощью предиката consult.
5. Можно обращаться к предикатам базы данных в программе таким же образом, как и ко всем другим предикатам.
6. При использовании внутренних доменов, сгенерированных для секции database, можно работать с фактами, как с термами.

Загрузка...