Контрольная на Прологе  - Prolog


АННОТАЦИЯ


Язык программирования Пролог базируется на ограниченном наборе механизмов, включающих в себя сопоставление образцов, древовидное представление структур данных и автоматический возврат. Этот небольшой набор образует удивительно мощный и гибкий программный аппарат. Пролог особенно хорошо приспособлен для решения задач, в которых фигурируют объекты (в частности, структуры) и отношения между ними. Например, в качестве легкого упражнения, можно попробовать выразить на Прологе пространственные отношения между объектами, изображенными на обложке книги. Пример такого отношения: верхний шар расположен дальше, чем левый шар. Нетрудно также сформулировать и более общее положение в виде следующего правила: если X ближе к наблюдателю, чем Y, a Y - ближе, чем Z, то объект X находится ближе, чем Z. Пользуясь правилами и фактами, пролог-система может проводить рассуждения относительно имеющихся пространственных отношений и, в частности, проверить, насколько они согласуются с вышеуказанным общим правилом. Все эти возможности придают Прологу черты мощного языка для решения задач искусственного интеллекта, а также любых задач, требующих нечислового программирования.

Само название Пролог есть сокращение, означающее программирование в терминах логики. Идея использовать логику в качестве языка программирования возникла впервые в начале 70-х годов. Первыми исследователями, разрабатывавшими эту идею, были Роберт Ковальский из Эдинбурга (теоретические аспекты), Маартен ван Эмден из Эдинбурга (экспериментальная демонстрационная система) и Ален Колмероэ из Марселя (реализация). Сегодняшней своей популярности Пролог во многом обязан эффективной реализации этого языка, полученной в Эдинбурге Дэвидом Уорреном в середине 70-х годов.

1. ЗАДАНИЕ


1) Выберите некоторую форму представления базы данных, в которой содержатся сведения об операциях с кредитными картами. Каждая запись должна содержать сведения об имени лица, тратящего деньги на карте, о типе операции и о сумме денег. Напишите процедуру, которая будет выдавать значение итоговой суммы для всех операций конкретного типа.

2) Создать пять окон разного цвета. Организовать переход маркера от окна к окну в зависимости от номера аргумента, определяющего цвет (1 – по убыванию значений, 2 – по возрастанию, 3 – выход).

 

2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

 

Первое задание выполнено на языке Пролог для выполнения в среде Turbo Prolog. Турбо-Пролог позволяет составлять четкие, хорошо структурированные программы и программные проекты. Используя принципы модульного программирования, он позволяет разбивать сложные программы на блоки (модули), которые можно писать, компилировать, отлаживать и хранить отдельно, а затем формировать из них единую программу.

Турбо-Пролог-программа должна иметь следующую структуру:

¦config "filename" /* подсоединение файла конфигурации */ ¦

¦project "filename" /* указание имени файла-проекта (.prj) ¦

¦ объектных модулей*/ ¦

¦include "filename" /* подсоединение файла до компиляции */ ¦

¦ ¦

¦code=nnn Размер кодовой матрицы в параграфах

¦

¦ (по умолчанию 1000) ¦

¦trail=nnn Размер следа в параграфах (по умолчанию 10). ¦

¦ 1 параграф = 16 байт. ¦

¦ При работе на машинах с относительно небольшой¦

¦ оперативной памятью необходимо уменьшать место для¦

¦ программного кода, тем самым оставляя больше места для¦

¦ стека. ¦

¦ ¦

¦CONSTANTS /* определение констант */ ¦

¦ const1 = definition ¦

¦ const2 = definition ¦

¦ ¦

¦[GLOBAL] DOMAINS /* объекты или термы */ ¦

¦ dom [,dom] = [reference] declaration1; declaration2 ¦

¦ listdom = dom*

/* списки */ ¦

¦ dom = <basisdom>

¦

¦ ¦

¦[GLOBAL] DATABASE [ - <databasename> ] /* (глобальные) базы ¦

¦ данных */¦

¦ [determ] pred1(....) ¦

¦ pred2(.....) ¦

¦ ¦

¦GLOBAL PREDICATES /* общие (глобальные) предикаты */ ¦

¦ [determ|nondeterm] pred1(.........)-(i,i,o,..)(i,o,i,..) ¦

¦ [ language c|pascal|fortran ] [имя языка] ¦

¦ pred2(........) ¦

¦ ¦

¦PREDICATES

/* предикаты */ ¦

¦ [determ|nondeterm] p1(.........) ¦

¦ p2(........) ¦

¦ ¦

+----------------------------------- продолжение на след.стр.---+

________________________________________

Page 21

- 21 -

+----------------------------------- продолжение ---------------+

¦ ¦

¦CLAUSES /* определения предикатов */ ¦

¦ p(....):-p1(...), p2(.....), ... . ¦

¦ p(....):-p1(...), p2(.....), ... . ¦

¦ ¦

¦GOAL /* вызов предиката - цели */ ¦

Основные разделы Турбо-Пролог-программы:

DOMAINS - раздел, в котором описываются объекты – компоненты структуры или терма.

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

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

CLAUSES - раздел, в котором раскрываются описания предикатов, т.е. предикаты определяются с помощью фактов или правил.

GOAL - раздел, где содержится вызов на согласование с базой данных предикатов-целей (или целевых утверждений).

Внутренняя БД хранится в текстовом файле, она может быть целиком считана в оперативную память и быстро обработана. Для объявления формата внутренней БД используется специальный раздел Пролог-программы, выделяемый ключевым словом:

database [- <имя>].

consult(DosFileName,InternalDatabaseName)

(string,InternalDatabaseName) - (i,i)

Загрузка в ОЗУ из файла DosFileName внутренней базы данных с именем InternalDatabaseName, объявленной как DATABASE - InternalDatabaseName.

consult(DosFileName) (string) - (i)

Загрузка в ОЗУ из файла DosFileName внутренней базы данных, объявленной без имени.

save(DosFileName,InternalDatabaseName)

(string,DatabaseName) - (i,i)

Сохранение внутренней базы данных, объявленной с именем InternalDatabaseName, в файле DosFileName.

save(DosFileName) (string) - (i)

Сохранение внутренней базы данных, объявленной без имени, в файле DosFileName.

assert(Term) (InternalDatabaseDomain) - (i)

Добавление терма (факта) Term во внутреннюю базу данных.

asserta(Term) (InternalDatabaseDomain) - (i)

Добавление факта Term в начало базы данных.

assertz(Term) (InternalDatabaseDomain) - (i)

Добавление факта Term в конец базы данных.

nondeterm retract(Term) (InternalDatabaseDomain) - (_)

Удаление из базы данных, объявленной без имени, первого факта, который отождествляется с заданным термом Term.

nondeterm retract(Term,InternalDbaseName)

(InternalDatabaseDomain,DatabaseName) - (_,i)

Удаление из базы данных, объявленной с именем DatabaseName, первого факта, который отождествляется с заданным термом Term.

retractall(_,InternalDbaseName) (_,DatabaseName) - (_,i)

Удаление всех термов во внутренней базе данных с указанным именем InternalDbaseName.

retractall(Term) (InternalDatabaseDomain) - (_)

Удаление всех термов вида Term во внутренней базе данных без имени. Выполняется как retract-fail комбинация; без аргументов. Всегда истенен.

Второе задание выполнено с помощью процедур внешней библиотеки gx, которая подключается к среде SWI Prolog. В частности, используются следующие процедуры: gx_clear, gx_setbkcolor, gx_setbrush, gx_create, и т. д.

SWI-Prolog является реализацией языка программирования Prolog. SWI-Prolog — это мощная среда разработки с набором графических инструментов ХРСЕ, распространяемая на условиях лицензии GNU GPL. Его развитие началось в 1987 г., и сегодня он широко используется в исследованиях, образовании, а также в коммерческих приложениях.

SWI Prolog довольно популярная система, в основном благодаря удобной среде и переносимой библиотеке для создания графического интерфейса. SWI-Prolog почти как все реализации в основном следует знаменитому Edinburgh Prolog, но содержит частично реализованные особенности ISO Prolog.

SWI-Prolog содержит быстрый компилятор, профилировщик, набор библиотек и удобный интерфейс для подключения Си-модулей. Он реализован для ряда UNIX-платформ таких как HP, IBM Linux, для NeXT, OS/2, Sun и Sparc.

 

3. ЛИСТИНГИ ПРОГРАММ

Листинг программы № 1


database - credit_cards /* имя базы данных */

operation(string,string,integer)            /* операция(имя, тип_операции, сумм) */

determ sum(integer) /* сумма */

predicates                                           /* определение предикатов */

sum_itog(integer) /* итоговая сумма */

clauses /* заполнение БД */

operation("Ivanov","credit",-1000).

operation("Petrov","debit",2500).

operation("Sidorov","credit",-3000).

operation("Ivanov","debit",2100).

operation("Ivanov","debit",155).

sum(0).

sum_itog(Summa):- /* процедура вычисления итоговой суммы */

write("Vvedite imya: "), /* ввод имени */

readln(Name),

operation(Name,B,Chislo), /* поиск операций нужного человека */

retract(sum(S)),S1=S+Chislo,assert(sum(S1)),

fail;

sum(Summa).

Goal /* вывод итоговой суммы */

sum_itog(Summa),write("Itogovaya summa sostavila ", Summa),nl.


Листинг программы № 2


gxInit(1):-

load_foreign_library(gx),             /* загрузка внешней библиотеки */

gx_create(320,240),                   /* создание окна 320 на 240 пикселов */

gx_setbrush(16000000),               /* определение цвета кисти */

gx_setbkcolor(16000000),             /* определение цвета фона */

gx_clear,

gx_setwindowtitle('Рабочая область 5'),   /* установка заголовка окна */

sleep(3),                                 /* задержка в секундах */

gx_create(320,240),

gx_setbrush(5000000),

gx_setbkcolor(5000000),

gx_clear,

gx_setwindowtitle('Рабочая область 4'),

sleep(3),

gx_create(320,240),

gx_setbrush(1000000),

gx_setbkcolor(1000000),

gx_clear,

gx_setwindowtitle('Рабочая область 3'),

sleep(3),

gx_create(320,240),

gx_setbrush(1000),

gx_setbkcolor(1000),

gx_clear,

gx_setwindowtitle('Рабочая область 2'),

sleep(3),

gx_create(320,240),

gx_setbrush(0),

gx_setbkcolor(0),

gx_clear,

gx_setwindowtitle('Рабочая область 1').

gxInit(2):-

load_foreign_library(gx),

gx_create(320,240),

gx_setbrush(0),

gx_setbkcolor(0),

gx_clear,

gx_setwindowtitle('Рабочая область 1'),

sleep(3),

gx_create(320,240),

gx_setbrush(1000),

gx_setbkcolor(1000),

gx_clear,

gx_setwindowtitle('Рабочая область 2'),

sleep(3),

gx_create(320,240),

gx_setbrush(1000000),

gx_setbkcolor(1000000),

gx_clear,

gx_setwindowtitle('Рабочая область 3'),

sleep(3),

gx_create(320,240),

gx_setbrush(5000000),

gx_setbkcolor(5000000),

gx_clear,

gx_setwindowtitle('Рабочая область 4'),

sleep(3),

gx_create(320,240),

gx_setbrush(16000000),

gx_setbkcolor(16000000),

gx_clear,

gx_setwindowtitle('Рабочая область 5').

xInit(3):-

close(0).


ВЫВОДЫ


Таким образом, поставленные в данной работе задачи были выполнены. В отличие от подавляющего большинства других языков Пролог обычно рассматривается в одном контексте с понятием "логическое программирование". Сторонники этого направления считают, что человек должен не задавать компьютеру последовательность команд на некоем  ориентированном на компьютер языке, а описывать саму задачу в совершенно абстрактных логических терминах, не оперирующих определениями "байт" или  "указатель", то есть своего рода создавать модель анализируемой проблемы и пытаться получить положительные или отрицательные результаты этого  анализа.

У многих людей, знакомых с логическим программированием, обычно возникают ассоциации с японским проектом компьютеров пятого поколения, все программное обеспечение которых создавалось на базе Пролога.

Некоторые эксперты считают, что этот проект фактически провалился, и причиной этому послужили некоторые присущие Прологу функциональные ограничения.

Строго говоря, Пролог не является языком программирования в чистом виде. С  одной стороны, это