Навигация
Главная
Поиск
Форум
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
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Invision Power ... 65291
Организация зап... 63945
Модуль Forms 60856
Создание отчето... 60724
ТЕХНОЛОГИИ ДОСТ... 57045
Создание потоко... 56394
Пример работы с... 54284
Имитационное мо... 52493
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

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

Игра Sokoban на Delphi + Блок схемы
Диплом RSA, ЭЦП, сертификаты, шифрование на C#
Моделирование процесса обеспечивающего надежность функционирования АСУ Т...

Реклама



Подписывайся на 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 21:39:14 · 4 Комментариев · 19720 Прочтений · Для печати

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


Комментарии
Евгений December 08 2009 08:27:42
Блин такая тупость эти языки программирования - не завидую программёрам, особенно этот пролог древний как гов... мамонта... Уже третий день пытаюсь написать прогу для Генеалогического древа... чуш...smiley
Kest December 08 2009 12:39:51
Я думаю многие намучились с прологом в институте
Trick December 14 2009 22:05:02
ага, в точку - в понедельник экзамен, а на этой неделе нужно сделать прогу: Создайте предикат, находящий в исходной строке слово, в котором наибольшее количество русских гласных букв...Ы
Дмитрий December 27 2011 23: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...
Шаблон для новост...

Случайные загрузки
Аватары в комме...
PHP 5
BDEPack
JanReplace
C# Учебный курс
С# для профессион...
StartMark
Error mod
Autorunner
Разработка клиент...
Моделирование дви...
EditNew
Векторный редакто...
Разработка клиент...
Delphi7 Для профе...
Исправление проц...
Microsoft SQL Ser...
HTMLredaktor
INSTANT BOOSTER v...
Abc_component

Топ загрузок
Приложение Клие... 100376
Delphi 7 Enterp... 83096
Converter AMR<-... 20046
Borland C++Buil... 11180
GPSS World Stud... 10915
Borland Delphi ... 8128
Turbo Pascal fo... 6973
Visual Studio 2... 4963
Калькулятор [Ис... 4360
FreeSMS v1.3.1 3510
Случайные статьи
Программирование: ...
Границы ячейки
QuickTime
Указатель Self , р...
• Двоичный поиск.
Восходящий граммат...
Спец. команды
Вариант решения за...
1.2. Вопросы
Обычные и постоянн...
Узел контейнера set
ПОСТРОЕНИЕ ЭКСПЕРТ...
Безызбыточное коди...
Карта CLEAR
Закрытие документа...
Настройки SERVERA
Стандарт POSIX
Форматированный ввод
Экспертные системы...
Запись и чтение об...
анонимной учетной ...
Использование экра...
Как зарабоатывать ...
Использование указ...
• Внешний SQL-сервер
Статистика



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


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