As of SWI-Prolog version 7, the system supports compound terms
that have no arguments. This implies that e.g.,
valid syntax. This extension aims at functions on dicts (see section
5.4) as well as the implementation of domain specific languages
(DSLs). To minimise the consequences, the classic predicates functor/3
and =../2 have not been
modified. The predicates compound_name_arity/3
have been added. These predicates operate only on compound terms and
behave consistently for compounds with zero arguments. Code that generalises
a term using the sequence below should generally be changed to use compound_name_arity/3.
..., functor(Specific, Name, Arity), functor(General, Name, Arity), ...,
..., Term0 =.. [Name|Args0], maplist(convert, Args0, Args), Term =.. [Name|Args], ...,
For predicates, goals and arithmetic functions (evaluable terms), <name> and <name>() are equivalent. Below are some examples that illustrate this behaviour.
go() :- format('Hello world~n'). ?- go(). Hello world ?- go. Hello world ?- Pi is pi(). Pi = 3.141592653589793. ?- Pi is pi. Pi = 3.141592653589793.
Note that the cannonical representation of predicate heads
and functions without arguments is an atom. Thus,
Body) returns the clauses for go/0,
clause(-Head, -Body, +Ref) unifies Head with
an atom if the clause specified by Ref is part of a predicate
with zero arguments.