Поиск…


Предопределенные операторы

Предопределенные операторы в соответствии с ISO / IEC 13211-1 и 13211-2:

приоритет Тип Оператор (ы) использование
1200 XFX :- -->
1200 FX :- ?- Директива, запрос
1100 XFY ;
1050 XFY ->
1000 XFY ','
900 FY \+
700 XFX = \\= Объединение терминов
700 XFX == \\== @< @=< @> @>= Сравнение сроков
700 XFX =..
700 XFX is =:= =\= < > =< >= Арифметическая оценка и сравнение
600 XFY : Квалификация модуля
500 yfx + - /\ \/
400 yfx * / div mod // rem << >>
200 XFX ** Поплавковая мощность
200 XFY ^ Переменная количественная оценка, целая мощность
200 FY + - \ Арифметическая идентичность, отрицание; побитовое дополнение

Многие системы предоставляют дальнейшие операторы в качестве расширения, специфичного для реализации:

приоритет Тип Оператор (ы) использование
1150 FX dynamic multifile discontiguous initialization Стандартные директивы
1150 FX mode public volatile block meta_predicate
900 FY spy nospy

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

В Prolog пользовательские операторы могут быть определены с помощью op/3 :

op(+Precedence, +Type, :Operator)

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

  • Приоритет - целое число от 0 до 1200, где 0 удаляет объявление.

  • Тип является одним из: xf , yf , xfx , xfy , yfx , fy или fx где f указывает положение функтора, а x и y указывают позиции аргументов. y обозначает термин с приоритетом, меньшим или равным приоритету функтора, тогда как x обозначает строго более низкий приоритет.

    • Префикс: fx , fy
    • xfx : xfx (не ассоциативный), xfy (правый ассоциативный), yfx (левый ассоциативный)
    • Postfix: xf , yf

Пример использования:

:- op(900, xf, is_true).

X_0 is_true :-
  X_0.

Пример запроса:

?- dif(X, a) is_true.
dif(X, a).

Срочный заказ

Два условия можно сравнить по стандартным заказам:

переменные @ <numbers @ <atom @ <строки @ <структуры @ <списки

Заметки:

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

  • Списки сначала сравниваются по длине, затем по каждому элементу.

Оператор заказа Преуспевает, если
X @ <Y X меньше Y в стандартном порядке
X @> Y X больше Y в стандартном порядке
X @ = <Y X меньше или равно Y в стандартном порядке
X @> = Y X больше или равно Y в стандартном порядке

Примеры запросов:

?- alpha @< beta.
true.

?- alpha(1) @< beta.
false.

?- alpha(X) @< alpha(1).
true.

?- alpha(X) @=< alpha(Y).
true.

?- alpha(X) @> alpha(Y).
false.

?- compound(z) @< compound(inner(a)).
true.

Равномерность

Оператор равенства Преуспевает, если
X = Y X можно объединить с Y
X \ = Y X не может быть объединен с Y
X == Y X и Y идентичны (т.е. они объединяются без каких-либо переменных привязок)
X \ == Y X и Y не идентичны
X =: = Y X и Y арифметически равны
X = \ = Y X и Y не являются арифметически равными


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow