Правила программирования в системе Prolog.
В разделе константы объявляются используемые в программе константы.
В разделе домены объявляются местные типы данных для переменных, используемых в качестве аргументов предикатов.
В Prolog’е объявление типа данных доменом с конкретным местным предикатом осуществляется в разделе предикаты. Домен описывает множество значений, которые может принимать переменная предиката в ходе выполнения программы.
Домены подразделяются на простые и структурированные, стандартные и нестандартные. К стандартным доменам относятся:
symbol – длина не более 250 символов, имеет две формы записи: последовательность букв, цифр, знаков подчёркивания, начинающиеся со строчной буквы; и последовательность символов, заключённая в двоичные кавычки.
string – строка символов: любая последовательность символов, заключённая в двойные кавычки.
char – отдельный символ, заключенный в апострофы.
integer – целое число в диапазоне от –32768 до 32767.
real – действительное число, допускается обычная и экспоненциальная форма записи, значение экспоненты должно быть от е-307 до е308.
Объявление новых доменов с использованием стандартных имеет вид:
<Имя>=<Имя стандартного домена>,
Примеры объявлений:
domains
a = integer
fas = symbol
ret, das = real
Такие объявления новых доменов улучшают читабельность программы и обеспечивают контроль типов значений переменных – смешивать в ходе выполнения программы переменные разных типов (доменов) нельзя.
Кроме стандартных видов доменов, Turbo Prolog допускает использование структуры домена, состоящей из нескольких простых или сложных объектов. Объявление структуры имеет следующий вид:
<структура> = <имя структуры> (<D1> <D2>…<Dn>)
Здесь <имя структуры> называется функтором, а домены <D1>,<D2>,…, <Dn> – это либо простые домены, либо имена ранее объявленных доменов, либо, в свою очередь, структуры. Структуры позволяют сортировать объекты по категориям. Ссылки на доменную структуру осуществляются по имени функтора.
В одном объявлении можно описать несколько альтернативных вариантов структуры, разделяя варианты точкой с запятой или служебным словом or.
Примеры объявления структур:
domains
d1, d2, d3 = symbol
fr = fruits (d1,d2,d3); pot (d1)
Один и тот же предикат может иметь различное число аргументов, такие предикаты объявляются для каждого варианта отдельно. В программе допускается использовать не более 300 предикатов, число аргументов у предиката не должно превышать 50.
Примеры объявления предикатов:
predicates
add (integer, integer, integer)
ek (fk)
ek (d1, d2)
В разделе database описываются предикаты динамической базы данных. Перечисленные здесь предикаты, после подстановки в них вместо переменных констант (т.е. превращение их в факты), могут быть перемещены и, если потребуется, удалены во время выполнения программы в динамическую базу данных. делается это с помощью стандартных (встроенных в систему) предикатов assert, asserta.
В разделе clauses описываются утверждения, каждое из которых является правилом или фактом. В конце каждого утверждения ставится точка.
Факт состоит из имени предиката и заключённого в скобки списка аргументов - констант. Правило состоит из заголовка – предиката, объявленного в разделе predicates, за которым следует сперва двоеточие с дефисом (:-), а потом список вызовов предикатов (пользовательских и/или стандартных), разделенных запятыми или точками с запятой. Вместо двоеточия с дефисом можно использовать ключевое слово if, вместо запятой – ключевое слово and, вместо точки с запятой – ключевое слово or.
Правила и факты, имеющие в качестве заголовка один и тот же предикат, должны быть сгруппированы в рамках одного блока, т.е. следовать в программе друг за другом. Предикаты во время исполнения Prolog-программы могут находиться в двух состояниях: конкретизированном или свободнном (неконкретизированном). Переменная является свободной, если ей не присвоено значение, в противном случае переменная является конкретизированной.
В теле правила кроме объявленных в программе предикатов, могут использоваться стандартные предикаты и операции сравнения. Стандартные предикаты выполняют разнообразные функции по вводу-выводу, работе с файлами, выполнению функций DOS, обработке строк, поддержке графического режима, обеспечение интерфейса с другими системами программирования. Описание основных стандартных предикатов Turbo Prolog рассматривается ниже.
В правилах можно использовать следующие основные операции сравнения:
- < меньше
- > больше
- <= меньше или равно
- >= больше или равно
- = равно
- <>, >< не равно
Для сравнивания между собой выражений и переменных.
Операция = (равно) устанавливает соответствие между выражениями правой и левой частей предиката Х=У. Предикат этот записан в привычной инфиксной форме.
В процессе согласования переменных используются следующие соглашения:
1. Если Х – свободная переменная, а У – конкретизированная, то при записи Х=У переменная Х станет конкретизированной и получит значение, равное У.
2. Целые числа и строки всегда равны самим себе.
3. Две структуры равны, если они имеют одинаковые функторы, одинаковое число параметров, и все соответствующие параметры равны между собой.
4. Если имеется запись вида Х=У и обе переменные свободны, то они становятся сцепленными и при конкретизации одной из них, вторая автоматически будет означена тем же значением.
Раздел goal содержит запрос в программе, называемый внутренним. Для внутреннего запроса Prolog осуществляет поиск только первого подходящего решения. При этом система не сообщает о результатах найденного решения (успешное или нет). Полученные при сопоставлении значения переменных, входящих в предикаты запроса, так же не отображаются на экране. Эти действия должен запрограммировать программист с использованием стандартных предикатов для вывода данных.
Раздел описания целей (goal) в компилируемой программе может отсутствовать, тогда в диалоговом окне после запуска программы на выполнение можно ввести внешний запрос. При использовании внешнего запроса, Turbo Prolog отыскивает все варианты решений и в этом же окне выводятся значения переменных предикатов запроса и сообщение об успешном или неуспешном решении.
Примеры:
1). Иванов – студент математического факультета.
Студент (“Иванов”, математический факультет).
2). Земля имеет форму шара.
Имеет (“Земля”, форма_шар).
х = “Земля”
?Имеет (“Земля”, у)
у = форма_шар.