3. 10. Операции Расширяемость синтаксиса языка Пролог

Внешняя форма синтаксиса языка Пролог расширяема в том смысле, что предикат или структуру с одним или двумя аргументами можно объявить операцией. Это достигается путем обращения к встроенному предикату "ор/3".

Предикат или структуру с двумя аргументами можно объявить инфиксной операцией. Обозначение инфиксной операции записывается между ее аргументами, а скобки при этом не нужны. Предикат или структуру с одним аргументом можно объявить либо префиксной, либо постфиксной операцией.

Ряд операций в языке Пролог определен изначально. Примером встроенного предиката, являющегося операцией, может служить предикат "is". Структуры "+", "—" и т. д. также являются операциями.

ор (Старшинство, Тип, Имя)

Имя (третий аргумент предиката "ор") должно быть атомом. Обращение к "ор" равнозначно объявлению этого имени названием операции. «Старшинство» — это число, используемое для того, чтобы избежать неоднозначностей в выражениях, в состав которых входит более одной операции. Конкретный диапазон допустимых значений старшинства операций будет зависеть от версии языка Пролог. К примеру, если операция "*" обладает более высоким старшинством, чем операция "+", то будут эквивалентными такие выражения:

X+ Y* Z

Х+ (Y* Z)

+ (X,* (Y, Z))

Для изменения порядка выполнения операций, определяемого их старшинством, всегда можно воспользоваться скобками.

Тип может принимать одно из следующих значений:

инфиксные операции xfx xfy yfx

префиксные операции fx fy

постфиксные операции xf yf

Инфиксная операция "+", обладающая левой ассоциативностью

Операция "+" обладает такими свойствами, как если бы она была объявлена следующим образом:

|? -op (500, yfx,+).

да

Тип yfx означает, что операция "+" обладает свойством левой ассоциативности. Так, выражение

A+ B+ C+ D, т. е.+ (+ (+ (A, B), C), D)

можно представить в виде дерева, "растущего" вниз и влево рис. 3. 1).

Инфиксная операция ",", обладающая правой ассоциативностью

Операция "," обладает такими свойствами, как если бы она была введена при помощи объявления:

|? -ор (1000, xfy,,).

да

Тип xfy означает, что операция "," обладает свойством правой ассоциативности. Выражение

A, B, C, D т. е., (А,, (В,, (С, D)))

можно представить в виде дерева, "растущего" вправо (рис. 3. 2).

Инфиксная операция, не обладающая свойством ассоциативности

Тип xfx означает, что операция не обладает ни левой, ни правой ассоциативностью. Примером операции этого типа может служить операция "mod". Поэтому выражение, в котором одно подвыражение с операцией "mod" выступает в качестве аргумента другого, например,

|? - Х is 120 mod 50 mod 5.

является недопустимым. Такое выражение вызовет выдачу диагностического сообщения о синтаксической ошибке.

Объявление операций

Если Вы составляете процедуру с одним или двумя аргументами, которой будете часто пользоваться, то можно объявить имя процедуры как операцию. Наиболее важный критерий, которым следует руководствоваться при принятии такого решения, - это читабельность программы. Применение одних операций будет способствовать улучшению читабельности программы, в то время как употребление ряда других операций, смысл которых не столь очевиден, может привести к тому, что в программе никто, включая самого автора, не сможет разобраться.

В следующей команде "знает" объявляется как инфиксный предикат:

|? -ор (750, xfx, знает).

да

Теперь факты "знает" можно представлять в текущей программе в инфиксной форме:

джейк знает бетти.

сюзан знает мери.

Запросы к этой базе данных можно также записывать в инфиксной форме:

|? -Х знает мери.

Х = сюзан

Условная конструкция "— >"

Еще одним примером операции служит предикат "->", определение которого приводится ниже. Этот предикат употребляется некоторыми программистами как условная конструкция, позволяющая расширить возможности стандартного соединителя "или", обозначаемого символом;. Первым аргументом предиката "—>" является подцель А, а вторым аргументом — выражение с соединителем "или", т. е. В; С. Если подцель А окажется истинной, то далее будет обрабатываться подцель В, а подцель С будет проигнорирована. Если же подцель А потерпит неудачу, то будет выполняться подцель С, а подцель В игнорируется.

|? - ор (1101, xfy, ->).

да

% читается: если А, то В, иначе С.

(А-> В; С): -А,!, В.

(А -> В; С): - С.

служащий (джейн).

служащий (салли).

начальник (салли).

|?— служащий (X),

) начальник (X) -> write (' не приглашать');

write С пригласить ')),

write (Х), n1,

fail.

пригласить джейн

не приглашать салли

нет

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие