logo
TurboProlog / Документация / TOM_1

Новые драйверы 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. Эта оболочка базируется на

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

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