Навигация
Главная
Поиск
Форум
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
Создание отчето... 65062
Модуль Forms 64841
Пример работы с... 63251
ТЕХНОЛОГИИ ДОСТ... 61553
Имитационное мо... 57400
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

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

Обратное размещение элементов ЭВС на Delphi + Пояснительная записка
Меры близости на векторах в 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 22:39:14 · 4 Комментариев · 20422 Прочтений · Для печати

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


Комментарии
Евгений 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...
Шаблон для новост...

Случайные загрузки
JanReplace
Правила программи...
Исправление проц...
NetGraph [Исходни...
Blib [Исходник на...
База данных фильм...
Искусство програм...
TrayComp
PCXReader. Програ...
Трассировка прово...
Allsubmitter 4.7 ...
PrevInst
BDEPack
Apollovcl61
Error mod
База Allsubmitter...
C++ Builder: Книг...
AddPage [Исходник...
Delphi 7: Для про...
Bitmap [для кнопок]

Топ загрузок
Приложение Клие... 100466
Delphi 7 Enterp... 86628
Converter AMR<-... 20077
GPSS World Stud... 12647
Borland C++Buil... 11758
Borland Delphi ... 8556
Turbo Pascal fo... 7037
Visual Studio 2... 4998
Калькулятор [Ис... 4760
FreeSMS v1.3.1 3541
Случайные статьи
Создание нового пр...
Процедура GETMEM. ...
Задачи
Работа с серверами...
Если конкатенация ...
Пример создания по...
Когда начинать обс...
Изменение положени...
ТАБЛИЦЫ
ЭЛЕМЕНТЫ ПРОЦЕДУРЫ...
Регулярные выражен...
Импорт статических...
Добавление методов...
Windows Server 200...
Оценка точности оп...
Взаимодействие Тур...
Фильтрация таблиц ...
Идея регулярных вы...
Задача о 8 ладьях
Основные понятия п...
Что агентство IANA...
Форматированный вы...
Вечерние платья
Термины страничной...
HR. Старайтесь исп...
Статистика



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


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