Cuprins:
Termenii Prolog pot fi de mai multe tipuri. In unele cazuri este imposibil sa se determine tipul unei variabile numai cu ajutorul potrivirilor. Din acest motiv exista cateva predicate care testeaza tipul unui obiect Prolog:
var(Arg)
reuseste daca Arg este o variabila
nelegata
nonvar(Arg)
opusul lui var
atomic(Arg)
reuseste daca Arg este un atom sau
un numar
compound(Arg)
reuseste daca Arg este o structura
(inclusiv lista, dar nu si lista vida)
atom(Arg)
reuseste daca Arg este un atom
number(Arg)
reuseste daca Arg este un numar
integer(Arg)
reuseste daca Arg este un numar
intreg
float(Arg)
reuseste daca Arg este un numar
real (dar nu intreg)
Problema:
Sa
se defineasca un predicat, care sa rezolve probleme de tipul:
DONALD +
GERALD
------
ROBERT
Sugestie:
sa se defineasca un predicat auxiliar
digitsum(D1, D2, Cin, Dout, Cout, DigitsAvailableBefore, DigitsAvailableAfter)
in sensul:
?- digitsum(A,B,0,C,Cout,[0,3,7,8],R).
A=3, B=7, C=0, Cout=1, R= [8]
Crearea si decompunerea termenilor Prolog se bazeaza pe trei predicate: '=..', functor si arg.
Primul din acestea este un operator infix:
Term =.. List
Modul de functionare poate fi ilustrat prin doua exemple:
?- f(a, b) =.. L.
L = [f, a, b]
Yes
?- T =.. [f,a,b].
T = f(a, b)
Yes
Predicatul functor(Term,Functor,Arity) reuseste daca Term poate fi unificat cu un termen (structura), functorul acestuia este Functor si aritatea Arity.
?- functor(f(a,b),F,A).
F = f
A = 2
Yes
Predicatul arg(N,Term,Arg) reuseste daca Arg poate fi unficat cu argumentul de pe pozitia N din termenul Term.
?- arg(1,f(a,b),X).
X = a
Yes
Tinte variabile se pot construi cu ajutorul metapredicatelor call
si once. La apelul predicatului call(Goal), variabila Goal
este convertita intr-o tinta care este apelata in continuare. Predicatul
once(Goal)
este similar cu call, dar cauta numai prima solutie.
Problema:
Sa se redefineasca predicatul ground, care reuseste daca argumentul
nu contine nici o componenta nelegata.
?- ground(a(X)).
No