Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Примеры

1. Это простой пример того, как с помощью внутренней базы данных на-

писать классификационную экспертную систему. Важным преимуществом

использования базы данных в этом примере является то, что вы можете

добавлять знания (и удалять их) во время работы программы.

/* Program CHO9EX01.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.

Следующие факты могли быть занесены с помощью предикатов 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: введите:

run(tool).

Отвечайте на каждый вопрос так, как будто вы хотите найти некоторое

средство общения с компьютером.

Теперь введите в ответ нз следующее на приглашение

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

Эта цель удалит факт

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

Программа CH09EX02.PRO один из практических путей использования ва-

шей внутренней базы данных. Этот пример использует средство управле-

ния дисплеем (аналогичное реализованному в продукте Турбо Пролог

Тулбокс), которое располагает текст в заданном месте экрана.

Формат текущего экрана дисплея может хранится в фактах field и

textfield, которые определены в базе данных screen. Несколько имен

экранов могут храниться в базе screens. Во время работы предикат

shiftscreen может скопировать один из нескольких хранящихся экранов

в базу screen, предварительно уничтожив все текущие данные в этой

базе и вызвав предикат screen для получения информации для формируе-

мого экрана, а затем вставляя новые формы экрана в базу screen.

/* программа CH09EX02.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, можно работать с фактами, как с термами.

Соседние файлы в папке Документация