Навигация
Главная
Поиск
Форум
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
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63305
Модуль Forms 63206
ТЕХНОЛОГИИ ДОСТ... 59878
Пример работы с... 58776
Имитационное мо... 55332
Реклама
Сейчас на сайте
Гостей: 14
На сайте нет зарегистрированных пользователей

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

Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...
Информационная система - продуктовый магазин на Turbo Pascal (База данны...
Компьютерный магазин на Turbo Pascal (База данных) + Пояснительная записка

Реклама



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

ПОДПИСЫВАЙСЯ на канал о программировании
Предложения, факты и правила в Турбо Прологе
Турбо Пролог (ТП) накладывает некоторые ограничения на
имена объектов и предикатов, используемых в программах.
Стандартные имена ТП должны состоять не более, чем из 250
символов, среди которых допускаются буквы латинского
алфавита (A,...,Z; a,...,z), цифры (1,...,9,0) и знак
подчеркивания. Имена атомов и предикатов в ТП должны
начинаться со строчной буквы, а имена объектов_переменных -
с прописной.
Для атомов в ТП допустимы нестандартные имена, которые
заключаются в двойные кавычки и могут содержать любые
символы. Это позволяет использовать при именовании
объектов-атомов прописные буквы (например, "Pentium",
"Moscow", "Peter"), символы национальных алфавитов
(например, кириллицу - "Рязань", "компьютер") и
разделительные пробелы (например, "Intel 80486",
"Manchester United", "Рязанская радиотехническая
академия").
Среди объектов-переменных выделяется анонимная
переменная, обозначаемая одним символом подчеркивания.
Подобная переменная не требует выделения памяти под
хранение ее значения и после выполнения текущей операции
это значение теряется.
Язык ТП допускает шесть стандартных типов объектов
(данных), приведенных в табл.1. На базе этих стандартных
типов пользователь может конструировать свои собственные
типы данных (см. раздел domains в п.2.2). Символьные данные
типов symbol и string отличаются способом хранения. При
объявление типа данных symbol ТП-система выполняет
построение в оперативной памяти ПЭВМ таблицы симовлов, что
обеспечивает наиболее быстрый поиск информации. При
использовании данных типа string построение подобной
таблицы не выполняется.

В программах на ТП допускается использование
комментариев, которые могут располагаться в произвольном
месте. В ТП существуют два вида комментариев: многострочные
и однострочные. Многострочный комментарий начинается с
последовательности символов "/*" и заканчивается символами
"*/". Однострочный комментарий начинается с символа "%",
который может располагаться в любом месте строки.
Информация, расположенная после этого символа до конца
строки, воспринимается как комментарий.
Основная часть программы на ТП (раздел clauses - см.
п.2.2) состоит из предложений. Каждое предложение может
включать в себя один или несколько предикатов, соединенных
логическими операциями, и должно заканчиваться точкой.
Предложение может располагаться на нескольких строках.
Различают безусловные и условные предложения.
Безусловное предложение называется фактом и состоит из
единственного предиката, определяющего наличие указанного
отношения между конкретными объектами-атомами, заданными в
качестве аргументов предиката. Предложение-факт не зависит
от каких-либо условий и является всегда истинными.
Условное предложение, называемое правилом, описывает
отношение, возникающее при наличии определенных условий.
Правило представляет собой сложное предложение, которое
состоит из заголовка и тела правила. В заголовке
описывается предикат, для которого сформулировано правило,
а тело правила описывает условия, при которых отношение,
определяемое предикатом, существует (т.е. предикат
истинен). Заголовок и тело правила соединяется при помощи
ключевого слова if (если) или пары символов ":-". Тело
правила может включать несколько предикатов, которые
соединяются между собой при помощи логических операций or
(и) и and (или). Ключевые слова or и and могут быть
заменены символами ";" и "," соответственно. Сложные
правила (например, рекурсивные) могут состоять из
нескольких предложений.
Например, предложение-факт like (tom, footbal)
свидетельствует о том, что между объектами tom и footbal
существует отношение like. Если перевести данный предикат
из эдинбургского синтаксиса в обычную (инфиксную) форму
записи для бинарных отношений, то получается предложение:
tom like footbal.
Если затем перевести его на русский язык, то получим
следующее утверждение (факт):
Тому нравится футбол.
Аналогичным образом можно интерпретировать факты
model(car, volvo, 1992), situation_in("Рязань", "Россия"),
или parent(tom, peter), man (tom).
Наиболее распространены в литературе по Прологу
примеры правил, связанных с определением родственных
отношений. Например, имея факты об отношениях родитель
(parent) и о поле объектов (man, lady), можно легко
записать правило определения отца:
father (X,Y) if parent (X,Y) and (X)
Или в сокращенном виде:
father (X,Y):- parent (X,Y), man (X).
Формально данная запись читается следующим образом:
отношение father между объектами X и Y существует в том
случае, если между этими же объектами существует отношение
parent, и для объекта X существует унарное отношение man.
Иными словами: X является отцом Y, если X - родитель Y и
мужчина.
Аналогично можно определить и другие родственные
отношения, например:
mother (X,Y):- parent (X,Y), lady (X).
brother (X,Y):- parent (Z,X), parent (Z,Y), man (X),X<>Y.
sister (X,Y):- parent (Z,X), parent (Z,Y), lady (X),X<>Y.



Если определены отношения брат (brother) и сестра (sister),
то ниже в тексте программы данные предикаты можно
использовать при определении новых правил, например, для
отношений тетя (aunt) и дядя (uncle):
aunt (X,Y):- sister (X,Z), parent (Z,Y).
uncle (X,Y):- brother (X,Z), pfrent (Z,Y).



Обратите внимание на то, что при определении правил в
качестве аргументов всех предикатов используются
абстрактные объекты - переменные, начинающиеся с большой
буквы. Таким образом обеспечивается применимость правил ко
всем объектам данного типа (в примере - ко всем именам
родственников).
Для построения более сложных отношений используются
рекурсивные правила. Рекурсивное правило отличается от
обычного тем, что в его теле исgользуется предикат,
определенный в заголовке правила. Рекурсивные правила
используются для организации итерационных процессов.
Примером рекурсивного правила может служить отношение
ancestor (предок) для примера с деревом родственных
отношений (определение предка в любом колене):
ancestor (X,Y):- parent (X,Z).
ancestor (X,Z):- parent (X,Y), ancestor (Y,Z).



Данное правило состоит из двух предложений, первое из
которых определяет ближайшего предка - родителя (начало
итерационного процесса), а второе - рекурсивное правило
"предок предка" (тело итерационного процесса). Данный
пример можно рассматривать в более общем плане - как
графовую модель (объекты - вершина, предикаты - дуги).
Тогда предикат ancestor может быть использован при
построении путей в графе, для проверки достижимости вершин
и т.п.
В общем виде подобное отношение можно представить в
форме обобщенного правила рекурсии:
[pr_name()[:-<значение>].]
pr_name():-[,]
,
[,]
pr_name(),
[].



Обобщенное правило рекурсии для предиката pr_name со
списком аргументов должно обязательно содержать в
своем теле ссылку на себя (pr_name()) и предикат,
определяющий условие выхода fin_pr. Остальные предикаты (по-
следовательности предикатов pr1, pr2 и pr3) не влияют на вы-
полнение рекурсии и не являются обязательными. Граничные
значения могут устанавливаться отдельным предложением (первое
предложение правила), как это было в случае с предикатом
ancestor.
В качестве другого примера рекурсивного правила
рассмотрим предикат, выполняющий ввод символов с клавиатуры
и отображение их на экран до тех пор, пока не появится
символ '#':
read_symbol :- readchar(C), % pr1 - принять символ
C<>'#', % fin_pr - условие завершения
write(C), % pr2 - отобразить символ
read_symbol. % рекурсивный вызов
% pr3 - отсутствует



Опубликовал Kest April 02 2009 22:39:14 · 4 Комментариев · 20222 Прочтений · Для печати

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


Комментарии
Евгений December 08 2009 08:27:42
Блин такая тупость эти языки программирования - не завидую программёрам, особенно этот пролог древний как гов... мамонта... Уже третий день пытаюсь написать прогу для Генеалогического древа... чуш...smiley
Kest December 08 2009 12:39:51
Я думаю многие намучились с прологом в институте
Trick December 14 2009 22:05:02
ага, в точку - в понедельник экзамен, а на этой неделе нужно сделать прогу: Создайте предикат, находящий в исходной строке слово, в котором наибольшее количество русских гласных букв...Ы
Дмитрий December 28 2011 00:46:03
В строке описи дяди и тети, описка. в последнем предложении, следует вместо pfrent( Z, Y ). надо писать parent( Z, Y).
Добавить комментарий
Имя:



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

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

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

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

Пароль



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

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

Случайные загрузки
Rss Parser
Алгоритмы шифрова...
JanComp
CoolHints2k
Стелтинг Стивен, ...
Мод "проверочный ...
База Allsubmitter...
Паскаль и Дельфи....
Delphi. Учимся на...
Факториал [Исходн...
3D Октаэдр
Панель поиска
Библия хакера 2 К...
SynEdit
Delphi. Разработк...
Х. М. Дейтел, П. ...
Task Shedule
API (Применение A...
Графика в проекта...
WAP версия сайта

Топ загрузок
Приложение Клие... 100426
Delphi 7 Enterp... 85347
Converter AMR<-... 20063
GPSS World Stud... 12260
Borland C++Buil... 11464
Borland Delphi ... 8429
Turbo Pascal fo... 7016
Visual Studio 2... 4985
Калькулятор [Ис... 4687
FreeSMS v1.3.1 3531
Случайные статьи
Типичные размеры в...
Почему протокол OS...
Использование XHTM...
TopGen 3 (накрутчик)
Дополнительные нас...
Широкие возможност...
Завершение с Windows
Как донести до кли...
Мой отец вбил это ...
Графическая система
Раздел описания ме...
Раскрутка сайта с ...
SMM менеджер: прод...
Табл. 15-6.
Коллекция диалогов
Краткие выводы по ...
Задачи, решаемые н...
Элементы управлени...
1.3. ЧЕГО НЕТ В ЭТ...
Динамическая компо...
11. Компьютеры мог...
Типы блокировок в ...
Вычисление произве...
Символы для формат...
Демонтаж конденсатора
Статистика



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


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