Контрольная на Прологе  - 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).


ВЫВОДЫ


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

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

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

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

Математическая модель, лежащая в основе Пролога, довольно сложна, и по  мощности системы формирования запросов к базе с этим языком не сравнится ни одна из коммерческих СУБД.

Фактически Пролог является не процедурным, а декларативным языком. Человек лишь описывает структуру задачи, а внутренний "мотор" Пролога сам ищет решение. Более того, здесь вообще не существует понятия последовательности команд, все это скрыто в математической модели языка.

Хотя, конечно, присутствует небольшой список "линейных" операторов типа

repeat, но он ограничен возможностями использования лишь для конкретных случаев.

Математическая модель Пролога основана на теории исчисления предикатов, в частности, на процедурной интерпретации Хорновых дизъюнктов (содержащих не более одного заключения) Роберта Ковальского из Эдинбурга.

Ее в алгоритмическом, машинно-ориентированном виде, выразил коллега  Ковальского Маартен ван Эмден. Надо сказать, что работы этих ученых из-за  большой сложности их практической реализации на компьютерах (по тем  временам) подвергались большой критике со стороны американских  специалистов по искусственному интеллекту.

Алан Колмероэ, автор языка Пролог, начал работы над полноценной  компьютерной реализацией трудов Ковальского с 1972 года во французском  университете Марсель-Экс. Он составил алгоритм формального способа интерпретации процесса логического вывода и разработал систему автоматического доказательства теорем, которая была написана на Фортране.

 

Добавить комментарий


Защитный код
Обновить