Sisteme Expert

Debugging

Adesea dorim, atunci cand programul nu merge tocmai cum trebuie sa vedem cum sunt instantiate variabilele in interogarile interne din cadrul regulilor. Pentru a evita afisarile de control (folosirea write-urilor pentru diverse variabile ca sa vedem cum se schimba valorile) putem folosi mecanismul de debugging oferit de prolog. Acesta se porneste cu predicatul trace. Din acest moment orice interogare va incepe sa se realizeze pas de pas (afisandu-se etapele intermediare). Pentru a trece de la un pas la altul se apasa pe enter.
Consideram exemplul cu suma de la un exercitiu anterior, la care am adaugat si o conditie de validitate a termenului instantiat, si anume ca acesta sa fie numar.

suma(0, 0).
suma(N, S):-number(N), N1 is N-1, suma(N1,S1), S is S1 + N.

Dupa consultarea programului, afisam clauzele cu predicatul listing, iar apoi pornim debuging-ul si incercam o interogare. | ?- listing.
suma(0, 0).
suma(A, B) :-
        number(A),
        C is A-1,
        suma(C, D),
        B is D+A.

yes
| ?- trace.
% The debugger will first creep -- showing everything (trace)
yes
% trace
| ?- suma(3,S).
        1      1 Call: suma(3,_351) ?
        2      2 Call: number(3) ?
        2      2 Exit: number(3) ?
        3      2 Call: _797 is 3-1 ?
        3      2 Exit: 2 is 3-1 ?
        4      2 Call: suma(2,_807) ?
        5      3 Call: number(2) ?
        5      3 Exit: number(2) ?
        6      3 Call: _3308 is 2-1 ?
        6      3 Exit: 1 is 2-1 ?
        7      3 Call: suma(1,_3318) ? a
% Execution aborted
| ?-

Liniile care incep cu Call se refera la o interogare interna. Termenii de forma _numar, cum e de exemplu _351 sunt neinstantiati. Prima linie se refera chiar la interogarea suma(3,S), Call: suma(3,_351), unde _351 se refera de fapt la S.
Pe urmatorul rand este un nou call, Call: number(3), este o interogare interna, a primului predicat aflat in clauza lui suma. Pe a 3-a linie se indica faptul ca s-a iesit cu succes (cu valoarea true), Exit: number(3)(daca s-ar fi terminat cu esec, atunci ar fi aparut mesajul Fail).
Urmatorul call, Call: _797 is 3-1 se termina cu succes dar si instantiaza _797 cu valoarea 2: Exit: 2 is 3-1.
Observati ca la final s-a dat comanda a, pentru a se renunta la executie.

Vom vedea pentru acelasi cod si un exemplu de esec al unei interogari. Deoarece mai devreme s-a dat abort, s-a iesit si din modul de debugging. Asa ca va trebui sa il repornim. | ?- trace.
% The debugger will first creep -- showing everything (trace)
yes
% trace
| ?-
| ?- suma(abc,S).
        1      1 Call: suma(abc,_351) ?
        2      2 Call: number(abc) ?
        2      2 Fail: number(abc) ?
        1      1 Fail: suma(abc,_351) ?
no
% trace
| ?-
In exemplul de mai sus, se observa ca dupa ce se face Call: number(abc) acesta se termina cu esec, Fail: number(abc) deoarece abc nu este numar, aceasta ducand si la terminarea cu fail a predicatului suma: Fail: suma(abc,_351).

Gasiti o lista completa cu comenzile acceptate in timpul debugging-ului in documentatia pentru sicstus prolog.

Trace-ul nu se opreste automat dupa ce se termina o interogare, el ramane activat si pentru interogarile ulterioare. Pentru a opri trace-ul fie se tasteaza a in timpul afisarii detaliilor interogarii (cum s-a vazut mai sus), fie se opreste cu ajutorul predicatului notrace. | ?- notrace.
1 1 Call: notrace ?
% The debugger is switched off
yes
| ?-
Deoarece debuggerul initial era pornit, el incepe si executia lui notrace tot in modul debugging, astfel se explica acel Call: notrace, dar dupa terminarea acestui apel trace-ul este oprit (observati ca nici macar nu mai da un mesaj de exit).

Deblocarea consolei

In cazul in care interogarea unui predicat blocheaza consola si dorim sa-l intrerupem, folosim Ctrl+C, iar la aparitia mesajului Prolog interruption (h for help)? tastam a (de la abort). (Daca doriti sa vedeti si celelalte optiuni, tastati h, si, cum scrie si in mesaj, va va da toate comenzile posibile).

Tipuri de erori ce pot fi indicate de consola

O lista cu toate tipurile de erori ce pot fi intalnite in Sicstus Prolog gasiti in documentatia oficiala (observati ca pe pagina respectiva aveti la inceput un cuprins de linkuri catre fiecare tip de eroare).

Mai jos sunt enumerate tipurile de erori cu care e posibil sa va intalniti cel mai frecvent in teme.

Warning-uri des intalnite