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

Сообщения bgi об ошибках

6000 BGI-графическая система не загружена

6001 Графическое физическое устройство не обнаружено

6002 Файл драйвера устройства не найден

6003 Неверный файл драйвера устройства

6004 Недостаточно памяти для загрузки драйвера

6005 Выход за границы памяти при сканирующем заполнении

6006 Выход за границы памяти при лавинном заполнении

6007 файл со шрифтом не найден

6008 Недостаточно памяти для загрузки шрифта

6009 Неверный графический режим для выбранного драйвера

6010 Графическая ошибка

6011 Графическая ошибка ввода/вывода

6012 Неверный файл шрифта

6013 Неверный номер шрифта

6014 Неверный номер устройства

Новые драйверы bgi

Графическая система BGI содержится в различных продуктах фирмы

Borland и вы можете ожидать появление новых драйверов и шрифтов. Они бу-

дут распространяться только как .BGI и .CHR файлы. Программа BGIOBJ.EXE

может преобразовать эти файлы в .OBJ файлы. Следовательно, при помощи

программы TLIB.EXE, описанной в приложении к Справочному Руководству по

Турбо Прологу, вы можете пополнить свою BGI-библиотеку (BGI.LIB), добав-

ляя новые драйверы и шрифтовые обЪектные модули.

"Черепашья" графика в версии 2.0

Предикаты "черепашьей" графики - графической системы из Турбо Проло-

га версии 1.x поддерживаются и в версии 2.0 для более полной совместимос-

ти, хотя предикаты "черепашьей" графики не совместимы с BGI. В этом раз-

деле кратко описываются все эти старые графические предикаты.

graphics/3

graphics переводит систему в режим Turtle Graphics.

graphics(Mode,Palette,Background) /*(i,i,i)*/

(integer,integer,integer)

dot/3

dot устанавливает цвет одного пиксела с координатами Row и Column

(виртуальная система координат размером 3200 на 3200 в пределах окна).

dot(Row,Column,Color) /*(i,i,i)*/

(integer,integer,integer)

line/5

line рисует на экране прямую линию между (Row1,Col1) и (Row2,Col2)

указанным цветом (виртуальная система координат размером 3200 на 3200 в

пределах окна).

line(Row1,Col1,Row2,Col2,Color) /*(i,i,i,i,i)*/

(integer,integer,integer,integer,integer)

forward/1

forward передвигает карандаш вперед на расстояние Step.

forward(Step) /*(i)*/

(integer)

back/1

back передвигает карандаш назад на расстояние Step.

back(Step) /*(i)*/

(integer)

left/1

left изменяет направление движения карандаша на Angle градусов про-

тив часовой стрелки.

left(Angle) /*(i)*/

(integer)

right/1

right изменяет направление движения карандаша на Angle градусов по

часовой стрелке.

right(Angle) /*(i)*/

(integer)

pencolor/1

pencolor устанавливает цвет карандаша равным Color или возвращает

текущий цвет.

pencolor(Color) /*(i)(o)*/

(integer)

penup/0

penup деактивизирует карандаш, используемый для рисования в предика-

тах forward и back.

pendown/0

pendown активизирует карандаш, используемый для рисования в предика-

тах forward и back.

penpos/3

penpos устанавливает положение карандаша и начальный угол или возв-

ращает текущие положение карандаша и значение угла.

penpos(Row,Col,Angle) /*(i,i,i)(o,o,o)*/

(integer,integer,integer)

ГЛАВА 18. ПРИМЕРЫ ПРОГРАММ

В этой главе будет представлен ряд программ, предназначенных для

стимулирования ваших собственных идей и для углубления знаний, полученных

в предыдущих главах. Практически все примеры позволяют реализовать ваши

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

пользуя данные примеры в качестве основы. Полные и подробные сведения о

системе Турбо Пролог приведены в Руководстве программиста.

Построение небольшой экспертной системы.

В этом первом примере мы воспользуемся Турбо Прологом для построения

маленькой экспертной системы, которая будет угадывать одно из семи живот-

ных, задуманное пользователем-разработчиком (если такое существует). Сис-

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

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

том, использование базы данных и порядок эффективного применения not.

В качестве примера мы можем привести типичный диалог экспертной сис-

темы с пользователем (для большего понимания дан перевод):

Goal: run.

Оно имеет шерсть?

да

Оно ест мясо?

да

Оно желтовато-коричневой масти?

да

Оно имеет темные пятна?

да

Ваше животное должо быть гепард!

Способность Турбо Пролога проверять факты и правила обеспечивает ва-

шей программе свойства, присущие экспертной системе. Первым шагом при

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

для выполнения рассуждений, пример таких знаний приведен в программе

СH18EX01.PRO.

/*Program СH18EX01.PRO - Процессор вывода для маленькой

экспертной системы*/

predicates

animal_is(symbol)

it_is(symbol)

positive(symbol, symbol)

negative(symbol, symbol)

clauses

animal_is(cheetah) :-

it_is(mammal),

it_is(carnivore),

positive(has, tawny_color),

positive(has, dark_spots).

animal_is(tiger) :-

it_is(mammal),

it_is(carnivore),

positive(has, tawny_color),

positive(has, black_stripes).

animal_is(giraffe) :-

it_is(ungulate),

positive(has, long_neck),

positive(has, long_legs),

positive(has, dark_spots).

animal_is(zebra) :-

it_is(ungulate),

positive(has,black_stripes).

animal_is(ostrich) :-

it_is(bird),

negative(does, fly),

positive(has, long_neck),

positive(has, long_legs),

positive(has, black_and_white_color).

animal_is(penguin) :-

it_is(bird),

negative(does, fly),

positive(does, swim),

positive(has, black_and_white_color).

animal_is(albatross) :-

it_is(bird),

positive(does, fly_well).

it_is(mammal) :- positive(has, hair).

it_is(mammal) :- positive(does, give_milk).

it_is(bird) :- positive(has, feathers).

it_is(bird) :- positive(does, fly), positive(does,lay_eggs).

it_is(carnivore) :-

positive(does, eat_meat).

it_is(carnivore) :-

positive(has, pointed_teeth),

positive(has, claws),

positive(has, forward_eyes).

it_is(ungulate) :-

it_is(mammal), positive(has, hooves).

it_is(ungulate) :-

it_is(mammal), positive(does, chew_cud).

Каждое животное описывается рядом признаков, которыми оно обладает

(или нет). Ответы на вопросы пользователя описываются через positive(X,Y)

и negative(X,Y). Следовательно система может задать, например, такой воп-

рос

У него есть шерсть ?

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

его в базе данных так, чтобы система могла их использовать в своих рас-

суждениях.

Для простоты в этом примере программы были включены только положи-

тельные и отрицательные ответы. Для их использования в базу данных вклю-

чены два предиката:

database

xpositive(symbol,symbol)

xnegative(symbol,symbol)

Факт, что животное не имеете шерсти будет записан так:

xnegative(has,hair).

Правила positive и negative используются для контроля ответов поль-

зователя и задания новых вопросов.

positive(X, Y) :-

xpositive(X, Y), !.

positive(X, Y) :-

not(xnegative(X, Y)),

ask(X, Y, yes).

negative(X, Y) :-

xnegative(X, Y), !.

negative(X, Y) :-

not(xpositive(X, Y)),

ask(X, Y, no).

Заметьте, что второе правило как для positive, так и для negative

гарантирует, что противоречие не возникнет при задании вопроса пользова-

телю.

Предикат ask служит для задавания вопросов и запоминает ответы. Если

ответ начинается с буквы "д", то предполагается да ("yes"), а если "н" -

то нет ("no").

/* Задание вопросов и анализ ответов */

ask(X, Y, yes) :- !, write(X, " it ", Y, '\n'),

readln(Reply),

frontchar(Reply, 'y', _),

remember(X, Y, yes).

ask(X, Y, no) :- !, write(X, " it ", Y, '\n'),

readln(Reply),

frontchar(Reply, 'n', _),

remember(X, Y, no).

remember(X, Y, yes) :- assertz(xpositive(X,Y)).

remember(X, Y, no) :- assertz(xnegative(X,Y)).

/* Уничтожение всех старых фактов */

clear_facts :- write("\n\nНажмите пробел для выхода\n"),

retractall(_, dbasedom), readchar(_).

Это заключительная деталь о которой необходимо позаботиться. Между

запусками программы все факты, которые были добавлены в базу данных необ-

ходимо удалить, или же использовать для добавления новых фактов о других

животных, которых вы знаете. Это легко выполняется с помощью предиката

tractall, который встроен на низком уровне в подцель run, подразумеваемую

в предикате clear_facts.

run :-

animal_is(X), !,

write("\nВаше животное должно быть ", X),

nl, nl, clear_facts.

run :-

write("\nВаше животное не возможно"),

write("определить.\n\n"),

clear_facts.

Для практики введите в компьютер приведенные выше процессор вывода и

базу знаний. Прибавьте к ним ряд объявлений, для дополнения программы, и

затем проверьте какой будет получен результат. Полный текст программы с

экспертной системой по животным находится в файле CH18EX01.PRO.

Пример оболочки экспертных систем (GENI.PRO), также разработанной на

Турбо Прологе, находится в каталоге PROGRAMS. Эта оболочка базируется на

технике, которая представлена в данном примере, вместе с дополнительными

возможностями, которые позволяют вам динамически изменять правила.

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