Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 63848
Организация зап... 60409
Invision Power ... 59982
Приложение «Про... 59797
Оператор выбора... 58782
Модуль Forms 58142
Подключение Mic... 57776
Создание отчето... 57572
ТЕХНОЛОГИИ ДОСТ... 53871
Программируемая... 51990
Пример работы с... 50027
Имитационное мо... 49305
21 ошибка прогр... 44186
Реклама
Сейчас на сайте
Гостей: 14
На сайте нет зарегистрированных пользователей

Пользователей: 13,049
новичок: Madison
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Изменения контуров и сортировка в двумерном массиве чисел на Turbo Pasca...
Моделирование работы класса персональных компьютеров на GPSS + Отчет + Б...
Моделирование литейного цеха на GPSS + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании

Структура программы в Турбо Прологе
Программа на языке Турбо Пролог состоит из нескольких
разделов, каждый из которых имеет свое назначение. Всего в
ТП существует семь разделов, из которых только один (при
работе в Турбо-оболочке) или два (при создании автономной
программы) является обязательными. Наиболее часто
используются следующие разделы:
- раздел определения типов данных domains (необходим в
том случае, если в программе используются нестандартные
типы данных);
- раздел определения предикатов predicates
(необходим в том случае, если в программе используются
предикаты, определяемые пользователем);
- основной раздел clauses, содержащий факты и правила;
- раздел goal, в котором определяется цель (обязателен
в том случае, если предполагается автономное использование
Пролог-программы).
Кроме того существуют следующие разделы: database,
позволяющий использовать в Проллог-программах базы данных;
global domains и global predicates - применяемые при
построении многофайловых Пролог-программ.
Каждый раздел начинается с ключевого слова - названия
раздела. На последовательность разделов накладывается
единственное ограничение: разделы-описания объектов и
отношений должны располагаться в программе до их
использования.
Раздел clauses

Раздел clauses (предложения) является основным
разделом и представляет собой собственно программу на языке
Пролог. Раздел состоит из предложений, описанных в п.2.1.
Раздел domains

Раздел domains (мат. - область определения) содержит
описание новых типов данных, определяемых пользователем.
С целью повышения наглядности программы (см. описание
раздела predicates), рекомендуется переименовывать
стандартные наименования типов данных на наименования,
несущие смысловую нагрузку. Например:
domains
family, name = symbol
year = integer.



Здесь объявлены объекты трех типов: фамилии (family),
имена (name) и год (year). Первые два из них совпадают со
стандартным типом symbol, а последний - с целочисленным
типом данных.
Как видно из примера, каждая строка раздела domains
содержит описание одного типа объектов. В начале строки
указываются вводимые пользователем наименования типа,
перечисляемые через запятую, а в конце строки определяется
стандартный тип ТП, определяемый знаком равенства.
Кроме того, в разделе domains могут быть определены
перечисляемый и структурированные типы объектов. Перечисляемые
типы описываются при помощи строки, содержащей наименование
типа и (через знак равенства) значения объектов,
перечисляемые через точку с запятой. Например:
wday = monday, tuesday, wednesday, thurday, friday
side = north, west, south, east.



Структурированные объекты описываются при помощи
функтора ( наименования структуры) и типов его аргументов,
заключенных в скобки:
box = box ( inteder, inteder, inteder, inteder)
person = person ( fam, name, agesex).



В первом случае для описания аргументов использован
стандартный тип данных ТП, во втором - нестандартные.
Поэтому строке person в разделе domain должны
предшествовать описания используемых типов, например:
fam, name = symbol
age = integer
sex = man, woman.



Раздел predicates.

Раздел predicates ( предикаты) содержит описание
всех нестандартных предикатов, используемых в программе.
Каждая строка этого раздела должна содержать описание
одного предиката. Предикаты определяются своими именами и
аргументами. Имена предикатов должны начинаться со строчной
буквы, а аргументы должны соответствовать стандартным, или
определенным в разделе domains типам данных, и должны быть
заключены в скобки. Элементы раздела predicates
не являются предложениями, поэтому точка после поределения
предиката не нужна. Например:
predicates
person (family, name, year)
age (family, year).



В первом описанном предикате person первый аргумент
определяет фамилию, второй - имя человека, а третий - год
его рождения. Аргументы второго предиката age
(возраст) соответствуют фамилии и возрасту в годах
человека. Следует отметить, что подобное описание
предикатов при помощи нестандартных типов данных Family,
name, year гораздо нагляднее, чем их описание с
использованием стандартных типов данных:
person ( symbol, symbol, integer)
age ( symbol, integer).



Раздел goal.

Paздел goal является обязательным при написании
автономных Пролог-программ. При работе из оболочки ТП этот
раздел необязателен, т.к. оболочка ТП сама сгенерирует
запрос цели. При этом на экране появится окно диалога, в
котором будет находиться строка запроса цели с ключевым
словом "Goal". Пользователю необходимо только
сформулировать цель в виде одного ( или нескольких)
предикатов, определенных в программе, например:
Goal: age ( "Иванов", X)
Goal: person ( "Иванов", "Петр", 1972, man).



В первом случае Пролог-система сообщит возраст объекта
"Иванов" ( например, Х = 20) , а во втором случае ( т.к.
все аргументы конкретизированы, т.е. заранее определены) -
проверит истинность указанного предиката и сообщит
результат этой проверки (" Yes" или "No" ).
При написании автономной программы пользователь сам
должен позаботиться об отображении получаемого результата.
Для этого в цель, описываемую в разделе goal должны
быть включены предикаты вывода ( например, стандартные
предикаты ТП write или writef):
goal age ("Иванов", X), write ("Возраст",X," лет").



При этом на экране монитора в окне диалога появится
сообщение: "Возраст 20 лет".
Списки являются простейшей и наиболее распространенной
формой структурной организации данных в Прологе. Список
представляет собой последовательность произвольного числа
однотипных элементов. В качестве элементов списка могут
выступать любые объекты Пролога, в том числе и сами списки.
Единственным ограничением является требование того, чтобы
все элементы имели один и тот же тип. В ТП списки
ограничиваются квадратными скобками, например:
[оne, two, three ] ,
["May"," Yune"," Yuly"] ,
[ "Москва", "Рязань", "Солотча"].



Особое место в операциях над списками занимает пустой
список, который изображается при помощи двух скобок: "[]".
Список не является стандартным типом объектов ТП, а
представляет собой сложную, структурированную организацию
данных, поэтому перед его использованием в программе в
разделе domains обязательно необходимо объявить новый тип
данных. Для объявления списочного типа используется символ
"*" , который ставится после указателя типа элементов
списка, например:
domains
int_list = integer *
symb_list = symbol *
ssymb_list = symb_list *.



Первая строка раздела domains определяет новый тип
объектов int_list, представляющих собой список целых чисел,
вторая строка определяет тип symb_list, представляющий
собой список символьных выражений. Третья строка раздела
устанавливает тип ssymb_list объектов-списков, элементами
которых являются структурированные объекты типа списков
символьных выражений (список списков ). Для использования
новых типов данных в качестве аргументов в Пролог-программе,
необходимо в разделе predicates объявить их для соответству-
ющих предикатов. Например:
predicates
marks (symbol, int_list)
ancestors ( symbol, symb_list).



Для обработки списочных структур чаще всего
используются рекурсивные правила. Например, для определения
принадлежности элемента списку используется следующее
правило:
belong ( X, [X|_]).
belong ( X, [_|T]): - belong (X,T).



Предварительно в разделе predicates должен быть объявлен
предикат, например:
belong (integer, int_list),



при этом тип элементов списка второго аргумента должен
совпадать с типом первого аргумента.
В качестве примеров обработки списков приведем ряд
правил для определения предикатов, аргументами которых
являются списки:
1. Объединение списков L2 и L3 в один список L1:
conc([], L,L).
conc([X|L1], L2, [X|L3]) :- conc(L1,L2,L3).



2. Удаление элемента Х из списка L:
del(X,[X|T], T).
del(X, [Y|T], [Y|T1]) :- del(X,T,T1).



Третий аргумент предиката del - результирующий список.
3. Подсписок S списка L :
sublist (S,L):-
conc(_, L1, L), conc(S, _, L1).



4. Определение длины списка:
listlen([], 0).
listlen([_|T],N) :- listlen(T,N1), N = N1+1.



5. Вывод списка на экран по элементам:
typelist([]).
typelist([H|T]) :- write(H), nl, typelist(T).



6. Определение суммы элементов списка чисел L:
listsum([], 0).
listsum([H|T], Sum) :- listsum(T,S), Sum = H + S.



7. Oпределение наибольшего числа M в списке чисел L :
maxelm([M],M).
maxelm([X,Y|T], M) :-
maxelm([Y|T],E), max (X,E,M).



В последнем правиле используется нестандартный предикат
max, определяющий в качестве третьего аргумента наибольшее
из двух чисел, заданнных первыми двумя аргументами. Предикат
max определяется при помощи следующего правила:
max (X,Y,X):- X >= Y.
max (X,Y,Y):- X < Y.


Опубликовал Kest April 02 2009 22:45:35 · 3 Комментариев · 17021 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нюська April 23 2010 16:34:21
Спасибо большое. Вы мне очень помогли smiley
irdis December 09 2010 02:43:41
Kest
так писать нельзя
max (X,Y,X):- X >= Y.
max (X,Y,Y):- X < Y.
--------
max(X,Y,X):-X>=Y,!.
max(X,Y,Y).
Настя May 19 2011 18:35:54
почему здесь не разобрали предикат последнего значения в списке и проверку отсортированности(
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Алгоритм трассиро...
EMSQuickImport
EditButton
AntiRus
iComm v.6.1 - выв...
Email
База данных фильм...
Сложный калькулятор
AlnComponents
FreeSMS v1.3.1
PHP 5 на примерах
Киллер окон
Библия хакера 2. ...
PHP в примерах
Открытие Cd-ROM'a...
ZipForge
Работа с матрицами
Простой пример ка...
FilesInfo
Assembler. Учебни...

Топ загрузок
Приложение Клие... 100338
Delphi 7 Enterp... 80513
Converter AMR<-... 20029
Borland C++Buil... 10870
GPSS World Stud... 9952
Borland Delphi ... 7898
Turbo Pascal fo... 6925
Visual Studio 2... 4931
Калькулятор [Ис... 4177
FreeSMS v1.3.1 3492
Случайные статьи
Метаданные и форма...
Развертывание гото...
Чтение и запись ин...
EveryDaysSlot
Выбор ключевых сло...
Взаимосвязь станда...
Представление дере...
Заливка ячейки
может быть установ...
Второе разрешает/з...
Высокий трафик не ...
записями в Active ...
Как включить отобр...
Type mismatch
Схема кодирования,...
Размеры объектов к...
Новый корпус для ЭЛТ
11.1. Простые про...
Права пользователя...
Английская гласная...
Web-навигация
Одинцово ремонт хо...
Сделать прозрачный...
повлиять на развер...
C++ и мобильность
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?