The predicates in this section are meta-logical and perform operations that require reasoning about the current instantiation of terms or decomposing terms into their constituents. Such operations cannot be expressed using predicate definitions with a finite number of clauses.
var(
?X)
ISO,meta-logicalvar
is
short for variable). An uninstantiated variable is
one that has not been bound to anything, except possibly another
uninstantiated variable. Note that a compound term
with some components that are uninstantiated is not itself
considered to be uninstantiated. Thus the query
| ?- var(foo(X, Y)).
always fails, despite the fact that X and Y are
uninstantiated.
nonvar(
?X)
ISO,meta-logicalvar/1
.
ground(
?X)
meta-logicalground/1
a monotone
predicate.
atom(
?X)
ISO,meta-logicalfloat(
?X)
ISO,meta-logicalinteger(
?X)
ISO,meta-logicalnumber(
?X)
ISO,meta-logicalatomic(
?X)
ISO,meta-logicalsimple(
?X)
meta-logicalcompound(
?X)
ISO,meta-logicalcallable(
?X)
meta-logicalis_mutable(
?X)
meta-logicalfunctor(
+Term,
?Name,
?Arity)
ISO,meta-logicalfunctor(
?Term,
+Name,
+Arity)
ISO,meta-logicalarg(
+ArgNo,
+Term,
?Arg)
ISO,meta-logical =..
?List ISO =..
+List ISO| ?- product(0, n, n-1) =.. L. L = [product,0,n,n-1] | ?- n-1 =.. L. L = [-,n,1] | ?- product =.. L. L = [product]
If Term is uninstantiated, then List must be
instantiated either to a list of determinate length whose
head is an atom, or to a list of length 1 whose
head is a number. Note that this predicate is not strictly
necessary, since its functionality can be provided by arg/3
and
functor/3
, and using the latter two is usually more efficient.
name(
+Const,
?CharList)
obsolescentname(
?Const,
+CharList)
obsolescent| ?- name(product, L). L = [112,114,111,100,117,99,116] | ?- name(product, "product"). | ?- name(1976, L). L = [49,57,55,54] | ?- name('1976', L). L = [49,57,55,54] | ?- name((:-), L). L = [58,45]
If Const is uninstantiated, CharList must be instantiated to a code-list. If CharList can be interpreted as a number, Const is unified with that number; otherwise, with the atom whose name is CharList. E.g.:
| ?- name(X, [58,45]). X = :- | ?- name(X, ":-"). X = :- | ?- name(X, [49,50,51]). X = 123
Note that there are atoms for which
name(
Const,
CharList)
is true, but which will not be
constructed if name/2
is called with Const
uninstantiated. One such atom is the atom
'1976'
. It is recommended that new programs use
atom_codes/2
or number_codes/2
, as these predicates
do not have this inconsistency.
atom_codes(
+Const,
?CodeList)
ISOatom_codes(
?Const,
+CodeList)
ISOname(
Const,
CodeList)
, but Const is
constrained to be an atom.
number_codes(
+Const,
?CodeList)
ISOnumber_codes(
?Const,
+CodeList)
ISOname(
Const,
CodeList)
, but Const is
constrained to be a number.
atom_chars(
+Const,
?CharList)
ISO onlyatom_chars(
?Const,
+CharList)
ISO onlyatom_codes/2
, but CharList is a
char-list instead of a code-list.
atom_chars(
+Const,
?CodeList)
SICStus onlyatom_chars(
?Const,
+CodeList)
SICStus onlyatom_codes(
Const,
CharList)
.
number_chars(
+Const,
?CharList)
ISO onlynumber_chars(
?Const,
+CharList)
ISO onlynumber_codes/2
, but CharList is a
char-list instead of a code-list.
number_chars(
+Const,
?CodeList)
SICStus onlynumber_chars(
?Const,
+CodeList)
SICStus onlynumber_codes(
Const,
CharList)
.
char_code(
+Char,
?Code)
ISOchar_code(
?Char,
+Code)
ISOatom_length(
+Atom,
?Length)
ISOatom_concat(
+Atom1,
+Atom2,
?Atom12)
ISOatom_concat(
?Atom1,
?Atom2,
+Atom12)
ISO| ?- atom_concat(A, B, 'ab'). A = '', B = ab ? ; A = a, B = b ? ; A = ab, B = '' ? ; no
sub_atom(
+Atom,
?Before,
?Length,
?After,
?SubAtom)
ISO| ?- sub_atom(abrakadabra, Before, _, After, ab). After = 9, Before = 0 ? ; After = 2, Before = 7 ? ; no
copy_term(
?Term,
?CopyOfTerm)
ISO,meta-logicalcopy_term(X, Y) :- assert('copy of'(X)), retract('copy of'(Y)).
The implementation of copy_term/2
conserves space by not copying
ground subterms.