Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по СИИ.doc
Скачиваний:
9
Добавлен:
14.11.2019
Размер:
314.88 Кб
Скачать

Правила программирования в системе Prolog.

В разделе константы объявляются используемые в программе константы.

В разделе домены объявляются местные типы данных для переменных, используемых в качестве аргументов предикатов.

В Prolog(е) объявление типа данных доменом с конкретным местным предикатом осуществляется в разделе предикаты. Домен описывает множество значений, которые может принимать переменная предиката в ходе выполнения программы.

Домены подразделяются на простые и структурированные, стандартные и нестандартные. К стандартным доменам относятся:

symbol - длина не более 250 символов, имеет две формы записи: последовательность букв, цифр, знаков подчёркивания, начинающиеся со строчной буквы; и последовательность символов, заключенная в двоичные кавычки.

string - строка символов: любая последовательность символов, заключенная в двойные кавычки.

char - отдельный символ, заключенный в апострофы.

integer - целое число в диапазоне от -32768 до 32767.

feat - действительное число, допускается обычная и экспоненциальная форма записи, значение экспоненты должно быть от е-307 до е308.

Объявление новых доменов с использованием стандартных имеет вид: <Имя>=<Имя стандартного домена>.

Примеры объявлений:

Domains

а = integer

fas = symbol

ret, das = real

Такие объявления новых доменов улучшают читабельность программы и обеспечивают контроль типов значений переменных - смешивать в ходе выполнения программы переменные разных типов (доменов) нельзя.

Кроме стандартных видов доменов, Turbo Prolog допускает использование структуры домена, состоящей из нескольких простых или сложных объектов. Объявление структуры имеет следующий вид:

<структура> = <имя структуры> (<D1>, <D2>.., <Dn>)

Здесь <имя структуры> называется функтором, а домены <D1>,<D2>,.,., <Dn> - это либо простые домены, либо имена ранее объявленных доменов, либо, в свою очередь, структуры. Структуры позволяют сортировать объекты по категориям. Ссылки на доменную структуру осуществляются по имени функтора.

В одном объявлении можно описать несколько альтернативных вариантов структуры, разделяя варианты точкой с запятой или служебным словом or,

Примеры объявления структур:

domains

dl,d2,d3 = symbol

fr = fruits (d1,d2,d3); pot (d1)

Один и тот же предикат может иметь различное число аргументов, такие предикаты объявляются для каждого варианта отдельно. В программе допускается использовать не более 300 предикатов, число аргументов у предиката не должно превышать 50.

Примеры объявления предикатов:

predicates

add (integer, integer, integer)

lk(fr)

lk(d1, d2)

В разделе database описываются предикаты динамической базы данных. Перечисленные здесь предикаты, после подстановки в них вместо переменных констант (т.е. превращение их в факты), могут быть перемешены и, если потребуется, удалены во время выполнения программы в динамическую базу данных, делается это с помощью стандартных (встроенных в систему) предикатов assert, asserta.

В разделе clauses описываются утверждения, каждое из которых является правилом или фактом. В конце каждого утверждения ставится точка.

Факт состоит из имени предиката и заключённого в скобки списка аргументов - констант. Правило состоит из заголовка - предиката, объявленного в разделе predicates, за которым следует сперва двоеточие с дефисом (:-), а потом список вызовов предикатов (пользовательских и/или стандартных), разделенных запятыми или точками с запятой. Вместо двоеточия с дефисом можно использовать ключевое слово if, вместо запятой - ключевое слово and, вместо точки с запятой - ключевое слово or.

Правила и факты, имеющие в качестве заголовка один и тот же предикат, должны быть сгруппированы в рамках одного блока, т.е. следовать в программе друг за другом. Предикаты во время исполнении Prolog-программы могут находиться в двух состояниях: конкретизированном или свободном (неконкретизированном). Переменная является свободной, если ей не присвоено значение, в противном случае переменная является конкретизированной.

В теле правила кроме объявленных в программе предикатов, могут использоваться стандартные предикаты и операции сравнения. Стандартные предикаты выполняют разнообразные функции по вводу-выводу, работе с файлами, выполнению функций DOS, обработке строк, поддержке графического режима, обеспечение интерфейса с другими системами программирования. Описание основных стандартных предикатов Turbo Prolog рассматривается ниже.

В правилах можно использовать следующие основные операции сравнения:

- < меньше

- > больше

- <= меньше или равно

- >= больше или равно

- = равно

- >< не равно <>или

Для сравнивания между собой выражений и переменных.

Операция = (равно) устанавливает соответствие между выражениями правой и левой частей предиката Х=У. Предикат этот записан в привычной инфиксной форме.

В процессе согласования переменных используются следующие соглашения:

1. Если X - свободная переменная, а У - конкретизированная, то при записи Х=У, переменная X станет конкретизированной и получит значение, равное У.

2. Целые числа и строки всегда равны самим себе.

3. Две структуры равны, если они имеют одинаковые функторы, одинаковое число параметров, и все соответствующие параметры равны между собой.

4. Если имеется запись вида Х= У и обе переменные свободны, то они становятся сцепленными и при конкретизации одной из них, вторая автоматически будет означена тем же значением.

Раздел goal содержит запрос в программе, называемый внутренним Для внутреннего запроса Prolog осуществляет поиск только первого подходящего решения. При этом система не сообщает о результатах найденного решения (успешное или нет). Полученные при сопоставлении значения переменных, входящих в предикаты запроса, так же не отображаются на экране. Эти действия должен запрограммировать программист с использованием стандартных предикатов для вывода данных.

Раздел описания целей (goal) в компилируемой программе может отсутствовать, тогда в диалоговом окне после запуска программы на выполнение можно ввести внешний запрос. При использовании внешнего запроса Turbo Prolog отыскивает все варианты решений и в этом же окне выводятся значения переменных предикатов запроса и сообщение об успешном или неуспешном решении.

Примеры:

1). Иванов - студент математического факультета.

Студент ("Иванов", математический_факультет).

2), Земля имеет форму шара.

Имеет("Земля", форма_шар).

Х - "Земля"

?Имеет ("Земля", у).

у = форма_шар.