Lucrarea nr. 8

Cuprins:

  1. Predicate pentru testarea tipului
  2. Crearea si descompunerea termenilor. Tinte variabile

1. Predicate pentru testarea tipului



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]


2. Crearea si descompunerea termenilor. Tinte variabile




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