У вас вопросы?
У нас ответы:) SamZan.net

Prolog

Работа добавлена на сайт samzan.net: 2015-07-10

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 5.4.2025

Prolog. Реализация на ПЭВМ

1. Интегрировання Среда языка Turbo Prolog.

2. Структура программы

. Стандартные типы доменов

. Прототипы предиката

. Утверждения и цели

. Арифметические выражения.

. Встроенные прдикаты языка

1. Интегрированная среда языка Turbo Prolog. 

Функционирование Т.Р. требует наличие следующих стандартных каталогов:

корневой Prolog, в котором должны находится следующие файлы:

prolog.exe

prolog.ovl для создания exe файла

prolog.r тексты сообщения об ошибках

prolog.hlp файл помощи

prolog.sys конфигурация среды

prolog.lib библиотеки

prolog.obj вспомагательный файл для создания пользов-их exe файлов

подкаталог PRO для пользовательских исходных файлов (расширение .pro)

подкаталог OBJ для пользовательских обьктных и prg файлов

подкаталог EXE для хранения пользовательских exe файлов

подкаталог DOS для команд ОС в том случае, если предполагается их  использование из пользовательских программ. (min command.com)

2 Структура программы на TURBO PROLOG

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

2 описание прототипов пользовательских предикатов

3 “утверждения” включает описание фактов в виде предикатов и правил, т.е. декларативных и процедурных знаний

4 содержит цель решения задач, при его отсутствии система запрашивает цель решения задачи в окне диалога и в этом-же окне получаем ответ, при его присутствии в нем помещаем пользовательский интерфейс.

Место для печатания

-35--36--37-

readint (<целое>)

(integer) : (0) - читает целое число, чтение заканчивается нажатием <Enter>

readreal (<вещественное>)

(real) : (0) - вещ.

readchar(<знак>)

(char) : (0) - читает единичный символ

readln (<строка>) (string) : (0) - читает строку символов

inkey (<знак>) (char) : (0) - заканчивается истиной, если после предыдущей операции была нажата клавиша, возвращается её код. Если не была нажата, то предикат оканчивается неудачей

nl - код двух клавиш - переход на новую строку

write (x1, x2, ...)

 (переменные и константы) : (i, i, ...) - выдает на текущее устройство записи констант и содержание переменных

writef (<формат>, x, x, ...)

(string, <переменные и константы>) : (i, i, ...)

Структура формата:

“ % - m.pw “, где % - признак форматного вывода

если задан “-”, то знаки должны выравниваться по левому краю, если не задан - по правому

m - длина поля вывода

p - кол-во цифр после точки

w - тип числа, вместо w записывается f, если выводится число в десятичном виде, e - в экспотенциальной форме, q - в самом коротком формате.

Предикаты работы с символьными данными.

str_lon (<строка>, <длина>)

(string, integer) : (i, i) (i, 0)

если задано (i, i), проверяется длина строки, если (i, 0) - возвращается длина строки

Преобразование типов

Все предикатные преобразования действуют в обе стороны. Случай (i, i) проверяет истинность для всех типов, кроме real. Преобразование между типами string, symbol и real, integer пр-ся (?) автоматически.

char_int (<знак>, <целое>)

(сhar, integer) : (i, 0) (0, i) (i, i)

str_char (<знак как строка>, <знак>)

(string, сhar) : (i, 0) (0, i) (i, i)

str_int (<строка>, <вещ.>)

(string, real) : (i, 0) (0, i)

и т. д.

Работа с командами операционной системы

Необходимым условием для работы с предикатами этой группы есть наличие подкаталога DOS, в котором бы был записан минимум command.com

system (<команда OS>)

(string) : (i) - передает команду OS

date (<год>, <месяц>, <день>)

(integer, integer, integer) : (i, i, i) (0, 0, 0) - устанавливает, если (i, i, i), или возвращает, если (0, 0, 0) системную дату

time ... - то же

dir (<маршрут>, <спецификатор файла>, <имя файла>)

(string, string, string) : (i, i, 0) - выдаются на экран специфицированные файлы из каталога по маршруту. Возможно выбрать из каталога имя одного файла с помощью стрелок управления курсором, при нажатии <Enter> имя этого файла присваивается третьему аргументу предиката

Специальные предикаты языка Turbo Prolog

bouncl (<переменная>) - “истина, если переменная является конкретизированной

free (<переменная>) - “истина, если переменная не является конкретизированной

fail - всегда ложн. вызывает возврат для проверки базы в правилах

! - (cat) - предикат отсечения, ограничивает возврат

exit - останавливает выполнение пользовательской программы и передает управление меню Turbo Prolog

trace - общее включение режима отладки. Указывается в начале исходной программы

trace (<статус>)

(symbol) : (i) (0) - устанавливает, если i, или возвращает, если 0, текущий режим отладки. В качестве статуса можно использовать on/off. Использование этого предиката предполагает наличие trace в начале программы

diagnostics - позволяет выдать анализ программы в процессе компиляции. Анализ включает имена используемых предикатов. Для каждого имени определяется, являются ли аргументы конкретного предиката фактами или указывается конкретность предиката.

nowarnings - отключает предупреждения в процессе компиляции

project “имя файла” - данная программа является частью проекта

include “имя файла” - в компиляцию включается файл с указанным именем

Управление ходом выполнения программ на языке ТР.

1. Рекурсия.

В механизм обработки программ на языке ТР заложена рекурсия, то есть вычисление значения функции с помощью той же функции, но с измененными параметрами. Рекурсия в ТР реализуется в 2 этапа:

) исходная задача разбивается на более мелкие частные задачи и формируются частные решения и на основе которых затем будет получено общее решение задачи.

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

) сборка решения, начиная от самого (?) последнего к самому общему. Для использования рекурсии в программах необходимо использовать следующий формат правила рекурсии:

<имя правила рекурсии с аргументами или без них> if

<список предикатов> (1)

<предикат условия выхода из рекурсии> (2)

<список предикатов> (3)

<имя правила рекурсии с аргументами или без них > (4)

<список предикатов> (5)

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

Пример.

Определение n-го терма последовательности 1, 1, 2, 6, 24, ...

N 0 1 2 3 4 ...

0 терм=1  3 терм=2*3

терм=1*1  4 терм=6*4

терм=1*2  5 терм=24*5

Для обозначения того факта, что n-й член последовательности равен V, вводится предикат следующего вида: posl (N, V)

Фрагмент программы:

domains

N, V = integer

predicates

posl = (N, V)

clauses

posl (0, 1)

posl (N, V) if

1) N>0

2) M=N-1

3) posl (M, U)

4) V=U*N

goal

posl (3, x)

Решение задачи производится в 2 этапа:

I этап.

. Производится попытка удовлетворить запрос пользователя, используя первое утверждение в разделе clauses (posl (3,x) сопоставляется с posl (0, 1)). Так как 0 не сопоставляется с 3, то попытка завершается неудачей. После этого posl (3, x) сопоставляется с заголовком 2-го утверждения posl (N, V). Отсюда N получает значение 3, а V связывается с х и система переходит к доказательству подцели в теле правила:

) N>0 согласуется при N=3

) M=N-3 согласуется при N=3 и M=2

) posl (2, U) приводит ко второму рекурсивному обращению и так как это обращение не согласовано с первым, то последнее утверждение (V=U*N) откладывается.

. Согласование posl (2, U) с posl (0, 1) приводит к неудаче. Происходит сопоставление с заголовком 2-го утверждения, что заканчивается удачей, при этом N=2 и V=U . происходит доказательство по цели этого утверждения:

) согласуется при N=2

2) согласуется при N=2 и М=1

) posl (1, U) приводит к повторному рекурсивному обращению

) откладывается

. Согласование posl (1, U) с posl (0, 1) приводит к неудаче. Сопоставление с заголовком 2-го утверждения заканчивается неудачей, при N=1 и V=U . Происходит доказательство по цели этого утверждения:

) согласуется при N=1

2) согласуется при N=1 и М=0

) posl (0, N) приводит к повторному рекурсивному обращению.

Полученное целевое утверждение сопоставляется с первым целевым утверждением posl (0, 1), при этом U получает заначение 1.

На этом этап разбиения заканчивается.

II. Этап сборки решения.

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

1) U=U*1 , так как U=1 то U=1

2) U1=U2*2   U1=2

) X=U1*3   X=6

2. Возврат и отсечение.

В процессе реализации запроса интерпретатору языка необходимо анализировать множество фактов и правил, к-рые извлекаются в процессе нескольких просмотров соответственных баз фактов. При этом в процессе одного просмотра формируется частичное решение. Процесс в PROLOGе выполняется автоматически путем пометки или заполнения тех модулей, к-рые анализировались перед текущей целью, с тем, чтобы исключить полученное частное решение из дальнейнего рассмотрения. Этот механизм в PROLOGе наз-ся возвратом и реализуется через использование стандартного предиката fail, к-рый всегда имеет значение “ложь”. Этот предикат заставляет интерпретатор проанализировать ещё раз базу фактов, чтобы выполнить более целевое утверждение для других значений переменных. Он позволяет получить в базе все возможные решения.

ПРИМЕР:

domains

p,T=symbo L

predicat s

like (P,T)

poleg (T)

dauses

like (“Иванов”,” пиво”).

 like (“Иванов”,” сок”).

 poleg(“cok”)...

otv if

like (P,T) and

poleg (T),nl,

write (P),

fail.

goal

otv.

Для управления процессом выполнения программ в PROLOG имеется встроенный предикей cut, кот. кодируется в turbo-PROLOG как !. Основное назначение —остановка процесса возврата, т.е. приостановка выработки дальнейших решений.

Этот процесс в Прологе наз. ОТСЕЧЕНИЕМ. Чаще всего предикей cut используется совместно с fail.

ПРИМЕР

.

.

.

goal

like (P,T)

 T= “кефир”,

nl,

write ( “любитель кефира найден”)

!.

fail

Отсечение используется для устранения бесконечных циклов (см. пред. пример):

clauses

posl (0,1) if !

posl(N,V) if

 M=N-1

posl (M,U)

 V=U*N

Отсечение также используется для устр. взаимоисключающих утверждений.

ПРИМЕР

ball (M,’A”) if M> so,!

ball(M, “B”) if M< so an M>60,!.

Список литературы

Для подготовки данной работы были использованы материалы с сайта http://www.parny.by.ru/




1. на тему- ldquo;Социологическое исследование экологического состояния окружающей среды
2. Тема 25. Инновационный менеджмент Инновационный менеджмент сравнительно новое понятие для научной общест
3. Контрольна функція фінансів
4. Дом молодёжи Колпинец Н
5.  Общая химия Учебное пособие для студентов УрГСХА заочного обучения Е
6. Дневник практики на подстанции скорой помощи
7. Тема 6. Управление доступом в ИВС
8. ТЕМА 2- rdquo;АРТИЛЛЕРИЙСКИЕ ОПТИЧЕСКИЕ ПРИБОРЫrdquo;
9. 10 Red the numbers- 0 ' zero 6 six 1 ' one 7 seven 2 ' two 8 eight 3 ' three 9 nine 4 ' four 10 ten 5
10. санитарные последствия чрезвычайной ситуации это комплексная характеристика ЧС определяющая содержание