Książka ma mnie-więcej rację jeśli chodzi o atom.
Atom to po prostu ciąg znaków, pojedyńcza wartość
.
Wygrzebałem z nieoficjalnej dokumentacji Prologa:
An atom, in Prolog, means a single data item. It may be of one of three types:
* a string atom, like 'This is a string' or
* a symbol, like likes, john, and pizza, in likes(john, pizza). Atoms of this type must start with a lower case letter. They can include digits (after the initial lower-case letter) and the underscore character (_).
* strings of special characters, like <--->, ..., ===>. When using atoms of this type, some care is needed to avoid using strings of special characters with a predefined meaning, like the neck symbol :-, the cut symbol !, and various arithmetic and comparison operators.
The available special characters for constructing this class of atom are: +, -, *, /, <, >, =, :, ., &, _, and ~.
Numbers, in Prolog, are not considered to be atoms.
atom is also the name of a built-in predicate that tests whether its single argument is an atom.
?- atom(pizza).
true.
?- atom(likes(mary, pizza)).
false.
?- atom(<-->).
true.
?- atom(235).
false.
Z funktorami jest gorzej:
Funktor to atom na początku wyrażenia - cytując dokumentację wyrażenie likes(mary, pizza) definiuje funktor likes
- tekst z dokumentacji:
In Prolog, the word functor is used to refer to the atom at the start of a structure. For example, in likes(mary, pizza), likes is the functor. In a more complex structure, like
persondata(name(smith, john), date(28, feb, 1963))
the top-level functor is termed the principal functor - in this case persondata - There is also a built-in predicate called functor, used to extract the functor and arity of a structure.
There is also a built-in predicate functor with three arguments: functor(Term, Functor, Arity), which succeeds if Term is a term with functor Functor and arity Arity. Examples:
?- functor(likes(mary, pizza), Functor, Arity).
Functor = likes
Arity = 2
?- functor(likes(X, Y), Functor, Arity).
X = _G180
Y = _G181
Functor = likes
Arity = 2
?- functor(likes, Functor, Arity).
Functor = likes
Arity = 0
?- functor(X, likes, 2).
X = likes(_G232, _G233)
Jeśli chcesz samodzielnie poeksperymentować, polecam wbudowane predykaty functor
i atom
- przykład użycia:
% kod:
ma_kota(A) :- A = "Ala".
asdf(foo).
% wyniki zapytań
4 ?- functor(asdf, Functor, Arity).
Functor = asdf,
Arity = 0.
5 ?- functor(ma_kota, Functor, Arity).
Functor = ma_kota,
Arity = 0.
Źródło i do poczytania więcej jeśli chcesz - http://www.cse.unsw.edu.au/~billw/prologdict.html .
Tak naprawdę to napisanie czegokolwiek w prologu bez użycia funktorów (jak i atomów) jest niemożliwe, bo prolog mówi że ptak(X) i lubi(X, Y) to również funktory...