Что именно означает двоеточие (:) в Swi-Prolog?

Я не мог найти явно, что (:) означает в пролог.
В интерактивном режиме вы можете увидеть следующие доказательства:

?- display(a:b).
:(a,b)
true.

?- display([a,b,c]).
.(a,.(b,.(c,[])))
true.

?- display(a:b:c:[]).
:(a,:(b,:(c,[])))
true.

?- a:b:REST = a:TAIL.
TAIL = b:REST.

С какой целью вводится (:)? Я не мог найти никаких подробностей для него в www. Кажется, что это дает другой синтаксический способ говорить о рекурсивных структурах как списках.

можно сказать, что он Правоассоциативный, каков его приоритетный номер?

:-op(??, xfy, :).

есть способ перечислить все такие неявные функторы?

listing(op). %of course this does not work

1 ответов


Это модуль квалификатор, вы можете увидеть его провозглашения с этого:

?- current_op(X,Y,:).
X = 600,
Y = xfy.

модули важное расширение к прологу, особенно необходимы для больших программ, но пропускают от стандарта ИСО. SWI-Prolog имеет (как обычно) прагматическую точку зрения на это и реализует полезный подход.

OT проверка операторов, вы можете найти этот фрагмент полезным:

oplist :-
    setof((A,C,B), current_op(A,B,C), L),
    maplist(writeln, L).