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

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

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Программа на языке Пролог состоит из следующих разделов:
DOMAINS определения доменов (классов объектов);
DATABASE (необязательный) предикаты базы данных;
PREDICATES остальные предикаты;
GOAL (необязательный) внутренняя цель;
CLAUSES правила.
Домены подразделяются на простые и структурированные, стандартные и нестандартные. К стандартным доменам относятся:
symbol символьная константа (длина не более 250 символов
string строка символов: любая последовательность символов, заключенная в двойные кавычки.
char отдельный символ, заключенный между двумя апострофами.
integer целое число в диапазоне от 32768 до +32767.
real действительное число, допускается обычная и экспоненциальная формы записи. Значение экспоненты должно быть в диапазоне от Е-307 до Е+308. Примеры: ‑34.567, 0.654, 9.76Е+3.
file файловая переменная, ее значение определяется по правилам именования файлов и устройств в MS DOS. При выполнении операций с файлом ее необходимо связать с конкретным файлом или устройством.
Список это упорядоченный набор объектов элементов списка, следующих друг за другом. Элементы списка в языке Турбо-Пролог должны принадлежать одному и тому же доменному типу. Объектами списка могут быть целые числа, действительные числа, символы, символьные строки, структуры.
Совокупность элементов списка заключается в квадратные скобки, а друг от друга они отделяются запятыми. Примерами списков являются:
[10, 24, 1, 8, 385, 0, 8]
Список может содержать произвольное число элементов (ограничением является объем доступной оперативной памяти). Список, не содержащий элементов, называется пустым списком и обозначается [].
Для использования списков в Пролог-программе необходимо следующее.
1. В разделе domains описать домен списка. Домен списка задается в формате:
<ИМЯ ДОМЕНА> = <ДОМЕН ЭЛЕМЕНТА>*
Стандартные предикаты ввода-вывода
геаdсhаг(СимволПеременной)(сhаг):(вых)
х должна принадлежать литерному домену
геаdint(ПеременнаяЦел)(integer):(вых)
домен для переменной х
должен иметь целый тип и к моменту вызова должна быть свободна
геаdln(ПеременнаяСтр)(string):(вых)
домен для переменной х должен иметь строковый или символьный тип. До вызова предиката переменная должна быть свободна
геаdгеа1(ПеременнаяВещ)(геа1):(вых)
домен для переменной должен иметь тип real, к моменту вызова предиката х должна быть свободной
write(e1,e2,e3...eN):( вх, вх, вх... вх)
Выводит значения констант или переменных в текущее окно или на текущее устройство вывода. Write может быть связан с произвольным ненулевым числом аргументов ei. Аргументы не могут быть свободными переменными.
writef(ФорматСтр, Apг1,Apг2,…,ApгN):(вх,вх....вх)
Выполняет форматированный вывод. Аргументы Аргi могут быть константами или переменными. Форматы задаются в виде строки. Формат спецификаций формы %m.pf.
Формат спецификаций состоит из следующих частей: дефис означает, что поля выравниваются слева (если дефиса нет справа); m десятичное число, описывающее минимальный размер поля; р описывает размер дробной части вещественного числа или максимальное количество напечатанных в строке символов. Поле f описывает следующие форматы:
f формат вещественного числа в фиксированной десятичной системе счисления (такой, как 123.4 или 0.004321);
е формат вещественного числа в экспоненциальной форме представления;
g формат вещественного числа в коротком формате (используется по умолчанию);
d формат целых десятичных чисел;
u формат целых чисел как десятичное число без знака;
х формат символов или целых чисел как шестнадцатеричное число;
с целых чисел как символа (по ASCII коду);
s формат как строка (символов и строк).
Повтор и рекурсия
Очень часто в программах необходимо выполнить одну и ту же задачу несколько раз. В программах на Прологе повторяющиеся операции обычно выполняются при помощи правил, которые используют откат и рекурсию.
Используются следующие методы повторения:
Простая рекурсия
Правило, содержащее само себя в качестве компоненты, называется правилом рекурсии. Правила рекурсии так же как правила повтора реализуют повторное выполнение задач. Они весьма эффективны, например, при формировании запросов к базе данных, а также при обработке таких доменных структур, как списки.
Пример правила рекурсии:
write_srting :- /* выдать строку */
write(«Человек - это звучит гордо!»),
nl,
write_string.
Это правило состоит из трех компонент. Первые две выдают строку «Человек - это звучит гордо!» и переводят курсор на начало следующей строки экрана. Третья - это само правило. Так как оно содержит само себя, то чтобы быть успешным, правило write_string должно удовлетворять само себе. Это приводит снова к вызову операции выдачи на экран строки и смещение курсора на начало новой строки экрана. Процесс продолжается бесконечно и в результате строки выдается на экран бесконечное число раз.
Метод обобщенного правила рекурсии (ОПР)
Обобщенное правило рекурсии содержит в теле правила само себя. Рекурсия будет конечной, если в правило включено условие выхода, гарантирующее окончание его работы. Тело правила состоит из утверждений и правил, определяющих задачи, которые должны быть выполнены.
Общий вид правила рекурсии:
<имя правила рекурсии> : <список предикатов>, (1)
<предикат условия выхода>, (2)
<список предикатов>, (3)
<имя правила рекурсии>, (4)
<список предикатов>. (5)
Хотя структура этого правила сложнее чем структура простого правила рекурсии, однако в обеих случаях действуют одни и те же принципы.
Данное правило рекурсии имеет пять компонент
Первая - это группа предикатов. Успех или неудача любого из них на рекурсиию не влияет.
Следующая компонента - предикат условия выхода. Успех или неудача этого предиката либо позволяет продолжить рекурсию, либо вызывает ее остановку.
Третья компонента - список других предикатов. Аналогично, успех или неудача этих предикатов на рекурсию не оказывает влияния.
Четвертая группа - само рекурсивное правило. Успех этого правила вызывает рекурсию.
Пятая группа - список предикатов, успех или неудача которых не влияет на рекурсию. Пятая группа также получает значения (если они имеются), помещенные в стек во время выполнения рекурсии.
Правило рекурсии должно содержать условие выхода. В противном случае рекурсия бесконечна и правило бесполезно.
Сортировка списков
В этом методе элементы в списке переставляются, и проверяется отсортирован этот список или нет:
Это записывается:
sortn(L1, L2) :- permutation(L1, L2), sorted(L2), !.
Перестановки определим через append
permutation(L, [H|T]) :- append(V, [H|U], L),
append(V, U, W),
permutation(W, T).
permutation([], []).
Проверка того, что элементы списка расположены в возрастающем порядке выражается через два предложения. Факт означает, что список из одного элемента всегда упорядочен. Правило утверждает, что список упорядочен ,если первые два элемента расположены по порядку и остаток ,начинающийся со второго элемента тоже упорядочен:
sorted([L]).
sorted([X,Y|T]) :- order(X,Y), sorted([Y|T]).
order(X, Y) :- X =< Y.
Обработка строк
Строка - это набор символов (слова и предложения). Термин «символ» включает буквы русского (английского) алфавита, цифры, такие символы как +, @ и $, а так же управляющие символы, соответствующие некоторым клавишам, таким как Enter и Esc.
Длина строки измеряется полным числом символов в строке.
Пролог имеет встроенный предикат str_len, который используется для нахождения длины строки.
Пролог имеет встроенный предикат concat, который выполняет соединение (конкатенацию) двух строк.
Составные объекты
owner(«Mary», «Garfield»). /* У Мери есть Гарфильд */
Первый объект Mary имеет простую структуру. Он представляет сам себя. То же можно сказать и про объект Garfield.
Любой объект, представляющий сам себя, называется простым объектом. Аналогично, структура, состоящая из простых объектов, называется простой структурой.
Утверждение owner отражает тот факт, что Mary обладает Garfield, который может быть либо именем домашнего животного Mary, либо названием книги
/* У Мери есть любимец - Гарфильд */
owner(“Mary”,pet(“Garfield”)).
/* У Мери есть книга - «Гарфильд» */
owner(«Mary»,book(«Garfield»)).
Объект, представляющий другой объект или совокупность объектов, называется составным объектом. Записанные же таким образом предикаты owner называются составными структурами, поскольку они скомпонованы из составных объектов.
likes(“Tom”,fruits(apples,orange,banana)).
Терм fruits в этом утверждении называется функтором. Функтор является первым термом составного объекта. Функтор составного объекта есть на самом деле предикат, хотя он и вставлен внутрь другого предиката. Главным функтором здесь является предикат likes.
Стандартные предикаты для динамических БД
Предикат asserta заносит новый факт в базу данных, располагающуюся в оперативной памяти компьютера (резидентная БД). Новый факт помещается перед всеми уже внесенными утверждениями данного предиката. Этот предикат имеет такой синтаксис
Предикат assertz так же, как и asserta, заносит новые утверждения в базу данных. Однако он помещает новое утверждение за всеми уже имеющимися в базе утверждениями того же предиката. Синтаксис предиката тот же.
Предикат retract удаляет утверждение из динамической БД
Предикаты для работы с БД в целом
Для записи динамической БД в файл на диск и для загрузки содержимого файла в динамическую БД применяются стандартные предикаты save и consult.
Предикат save сохраняет находящуюся в оперативной памяти базу данных в текстовом файле. Синтаксис этого предиката
Произвольный текстовый файл, содержащий факты, совпадающие по синтаксису с предикатами описанной в программе БД, может быть считан в память (загружен) при помощи предиката consult
Управляющие структуры в лиспе
Под формой понимается такое символьное выражение, значение которого может быть найдено интерпретатором.
1. Самоопределённые формы. Эти формы, подобно константам, являются объектами, представляющими лишь самих себя. Это такие формы, как числа и специальные константы true, false и nil, а также знаки и строки.
2. Символы, которые используются в качестве переменных.
3. Формы в виде списочной структуры, которыми являются:
-Вызовы функций и лямбда-вызовы.
-Специальные формы, в которые входят setq, ' и многие описанные в этой главе формы, предназначенные для управления вычислением и контекстом.
-Макровызовы (будут рассмотрены позже).
Наиболее важные с точки зрения программирования синтаксические формы можно на основе их использования разделить на следующие группы:
Работа с контекстом:
- ' или блокировка вычисления;
- вызов функции и лямбда-вызов;
- предложение let.
Форма исполнения:
- пошаговая progn;
- параллельная parallel;
- независимая fork.
Разветвление вычислений:
- условные предложения cond, if.
Итерации:
- циклические предложения for, for*, while, do-while.
Разветвление вычислений: условное предложение COND
Предложение cond является основным средством разветвления вычислений. Это синтаксическая форма, позволяющая управлять вычислениями на основе определяемых предикатами условий. Структура условного предложения такова:
(nil cond
(p1 a1)
(p2 a2)
…
(pn an))
Предикатами pi и результирующими выражениями ai могут быть произвольные формы. Значение предложения cond определяется следующим образом:
В простом случае можно воспользоваться вполне естественной и содержащей мало скобок формой if.
(nil if условие то-форма иначе-форма)
≡
(nil cond
(условие то-форма)
(true иначе-форма))
>(nil if (nil atom true) 'атом 'список)
атом