Специальные встроенные предикаты

Возможности окружения

Различные ограничения

Синтаксис

Синтаксис микро-Пролога существенно отличается от синтаксиса, рассматриваемого в данной книге, однако освоить его можно довольно быстро. Основная идея заключается в том, что существует всего один вид терма – список. Если мы хотим построить терм с функтором f и четырьмя аргументами, то для этого используется список из пяти элементов, куда f входит в качестве головы, а остальные элементы соответствуют четырем аргументам в порядке их следования. Таким образом то, что в базовом синтаксисе было бы записано в виде:

f(a,g(2,3),c)

на микро-Прологе должно быть записано как:

(f a (g 2 3) с)

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

Утверждения представляются как списки термов, где первый терм – это заголовок утверждения, а остальные термы – цели, которые, будучи взятыми в конъюнкции, образуют тело утверждения. Рассмотрим более сложное утверждение:

((alter (zl|z2) (x|y)) (change zl x) (alter z2 у)

Это – второе утверждение для предиката alter (преобразовать) из разд. 3.4. Заметим, что вертикальная черта имеет здесь то же значение, что и в базовом синтаксисе.

Микро-Пролог может обрабатывать числа с плавающей точкой с точностью до восьми значащих цифр и с порядком (по основанию 10) в диапазоне от -127 до 127. Имена атомов (называемые в микро-Прологе «константами») могут содержать до 60 литер, а терм не может содержать более 64 переменных. Эти ограничения на практике не вызывают трудностей.

Микро-Пролог предоставляет множество средств, помогающих при разработке программ за терминалом. Предикаты LOADи SAVEпозволяют, соответственно, читать и записывать программы в файлы на диске. Мощный строчный редактор и структурный редактор позволяют вносить изменения в тексты программ, не выходя из Пролог-системы. Выполнение микро-Пролог-программы может быть прервано путем ввода комбинации «CONTROL С».

Имена и назначение встроенных предикатов сильно отличаются от рассмотренных в данной книге. Ниже приводится краткое описание некоторых из предусмотренных средств.

Тип терма можно проверить с помощью предикатов NUM, CON, VAR,которые согласуются с базой данных, соответственно, в случае чисел, констант (атомов) и переменных. Кроме того, предикат SYSпроверяет, является ли константа именем встроенного предиката, предикат 1NTобеспечивает проверку на целое число.

Для работы с базой данных используются предикаты: ADDCL(аналогичен assert), CL(аналогичен clause)и DELCL(аналогичен retract)В этих предикатах можно задавать дополнительный целочисленный аргумент N с тем, чтобы можно было обрабатывать N-e утверждение процедуры.

Поскольку единственным видом терма в микро-Прологе является список, то предикат вида ' =..' здесь не нужен. Предикат STRINGпозволяет программисту создавать новые атомы и осуществлять доступ к внутренней структуре имени атома аналогично тому, как это делается с помощью предиката name.

Составные цели в микро-Прологе можно конструировать с помощью встроенных предикатов OR, NOTи IF.Предикат FAILвызывает немедленную неудачу в согласовании цели. Предусмотрено также и «отсечение», которое обозначается с помощью литеры '/'.

Арифметические действия реализуются посредством нескольких предикатов, вместо одного is. Арифметические предикаты максимально «обратимы», поэтому, например, цель

(SUM х у г)

вызывает сопоставление z с суммой х и у, если х и у конкретизированы. С другой стороны, если сначала конкретизированы у и r, а х – нет, то х будет конкретизирован разностью z-у.

Операции с файлами в микро-Прологе аналогичны тем, что имеются в базовом Прологе, с той лишь оговоркой, что здесь нет понятия текущего потока ввода или текущего потока вывода. Вместо этого вывод в файл и ввод из файла осуществляются, соответственно, через предикаты WRITE и READ с указанием каждый раз имени файла. Предусмотрены специальные предикаты, обеспечивающие удобства при вводе-выводе через терминал пользователя.

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