Documente Academic
Documente Profesional
Documente Cultură
5.3. Exemple
1. ConstruiŃi o procedură care să calculeze numărul de elemente ale unei
liste. Predicatul este de forma: nr(lista,nr_elemente). Regulile de construcŃie
pornesc de la două observaŃii :
- lungimea unei liste vide este 0
-dacă lista nu este vidă, lungimea este dată de 1 (lungimea capului listei)
+ lungimea cozii listei. Procedura prezintă aspectul:
clauses
nr([ ], 0).
nr([ _ | Rest ],N) if
nr(Rest, N1),
N=1+N1.
32
InteligenŃă Artificială. Tehnici.
Goals:
?-maxim ([7,3,9,0], M)
M=9
Comentarii
Regula maxim divizează lista în elemente componente, reŃinându-le în stiva.
Când lista se reduce la un singur element ,începe rezolvarea apelurilor
recursive, moment in care regula max funcŃionează ca un filtru intre 2
elemente reŃinându-se de fiecare dată pe cel mai mare găsit.
33
InteligenŃă Artificială. Tehnici.
Exercitii
(1) ExerciŃii:specificaŃi dacă intrebările:
?- nr(L,4)
?- nr([a,b,c],3)
sunt corecte sau nu.
(2) Procedura max definite anterior acceptă sau nu modul de lucru declarativ ?
Se acceptă o întrebare de forma ?- maxim(L,9)
(3) Sunt acceptate de către procedura cmmd definita anterior întrebări de forma:
-cmmdc(15,20,5)
-cmmdc (X,20,5)
-cmmdc (15,Y,5)
34
InteligenŃă Artificială. Tehnici.
6.1. Problematica.
Pentru a ilustra conceptul de clauză deterministă ,respectiv
nedeterministă , considerăm exemplul definit de ştergere a unui element dintr-o
listă .SecvenŃa de clauze pentru un predicat de forma:
sterg(element, lista, rezultat) este
sterg( _ , [ ] , [ ] ).
sterg (X, [ X | R ], R).
sterg(X, [ Y | R1] , [ Y | R2 ]) if
sterg(X ,R1, R2).
Pentru o intrebare de forma:
?-sterg(2,[1,2,3,2,4],R) apare următoare structura de explorare a bazei de
cunoştinŃe de catre maşina de inferenŃă:
35
InteligenŃă Artificială. Tehnici.
36
InteligenŃă Artificială. Tehnici.
în care sunt permise toate soluŃiile posibile. Cu alte cuvinte spaŃiul soluŃiilor este
format din soluŃia definită de B1, … Bm şi variantele oferite de Bm+1, … Bn.
Elementul de tăiere îşi extinde acŃiunea şi pentru clauzele Horn de acelaşi
nume care urmează după acelea în care este prezent.
Sa consideram următoarea situaŃie:
H if P,Q,R,!,S,T,U.
H if U,V . % -> această regulă nu se mai execută
A if B,H,C. %->nu ne mai putem întoarce pentru B
A
Reguli de amplasare
Amplasarea lui ! depinde de contextul întrebării puse.Se recomandă utilizarea
următoarelor 2 metode:
37
InteligenŃă Artificială. Tehnici.
max(X,Y,X) if X>=Y.
max(X,Y,Y) if X<Y.
sau
max(X,Y,X) if X>=Y, !.
max( _ ,Y,Y).
aduna(elem, L,Rezult)
38
InteligenŃă Artificială. Tehnici.
% imparte(lista, lista>0,lista<=0)
imparte( [ ], [ ], [ ] ) .
imparte( [ESTE | R ] , [ESTE |L1], L2) if
ESTE>=0, !, imparte(R,L1 ,L2) .
imparte([ESTE,R],L1,[ESTE|L2]) if
imparte(R,L1,L2).
39
InteligenŃă Artificială. Tehnici.
clasa (X,luptator) if
bate_pe(X, _) ,
bate_pe( _ ,X) , !.
clasa(X,cistigator) if
bate_pe(X, _), !.
clasa (X, sportiv) if
bate_pe( _,X).
îi_place(tom,X) if
X=pisica ,!,fail. %(spune ca proprietatea este falsă)
îi_place(tom,X) if
animal(X).
ObservaŃie : prezenta lui fail în prima regulă face ca aceasta să devină falsă , iar
! din fata lui fail stopează căutarea pe următoarea regulă îi_place.
40
InteligenŃă Artificială. Tehnici.
not( P) if
P, !, fail;
true.
îi_place(tom,X) if
animal(X), not(pisica(X)).
diferit(X,Y) if
not(X=Y).
clasa(X,luptator) if
bate_pe(X, _ ),
bate_pe( _, X).
clasa(X,cistigator) if
41
InteligenŃă Artificială. Tehnici.
bate_pe(X, _ ), !.
clasa(X,sportiv) if
bate_pe( _,X).
Exercitii
1) Fiind data secventa: A :- B,C.
A :- not(B),D.
se cere construirea unei secvente care sa se comporte identic, in care negatia sa
dispara prin inlocuirea cu elementul de taiere !.Explicati succint
(1) de ce cele doua secvente au aceiasi comportare.
(2)care este efectul elementului de taiere in caz general
2) Considerind procedura: p(1). p(2) if !. p(3).
Care sunt raspunsurile la întrebările:
(a) ?- p(X).
(b) ?- p(X),p(Y).
(c) ?- p(X),!,p(Y).
42
Inteligenţă Artificială. Tehnici.
7.1. Scrierea.
Predicatul de scriere prezintă sintaxa:
write(arg1,.....,argn)
În care argumentele pot fi constante sau variabile ce aparţin unor domenii
standard sau nu. Dacă argumentul este un şir de caractere atunci acesta
reprezintă mesaj care se tipareşte pe ecran. În interiorul şirului sunt acceptate
următoarele caractere de control:
\n, salt peste n linii
\t, tab
43
Inteligenţă Artificială. Tehnici.
\b. spaţiu
De exemplu
write(" \t lista1= ",L1,"\n \t Lista2 ", L2) are ca efect o tipărire de forma:
lista1=[ ]
lista2 =[1,2]
În general predicatul write apare în proceduri recursive, aspect care implică
stoparea operaţiei de căutare a soluţiilor, astfel încât rezultatele parţiale să nu fie
tipărite.
7.2. Citirea
- este realizată de următoarele predicate:
readint(X) -- citire variabilă de tip intreg.
readreal(X) -- citire variabile din domeniul real
Operaţia de citire se termină în momentul apăsării tastei ENTER. Rezultatul este
un success, dacă numărul citit este un întreg sau real respectiv un eşec dacă
valoarea citită conţine caractere care nu aparţin numerelor întregi sau reale.
readln(X) -- citirea variabilelor din domeniul simbol sau
string
readchar(X) -- citirea caracterelor
Ultimul predicat este întotdeauna un succes. Primul este un eşec dacă şirul citit
nu este delimitat de " .
44
Inteligenţă Artificială. Tehnici.
domains
lista=integer *
predicates
citeşte(lista)
clauses
citeşte([ESTE |Rest]) if write("Element=");
readint(ESTE),
citeşte(Rest).
goal:
citeste(L),
write(L).
2. Construiti o procedura care să reia repetat operaţia de citire a unei liste. Dupa
fiecare listă construită prin dialog, se va specifica dacă operaţia continua sau nu.
Reluarea construirii listei va fi efectuată de predicatul repeta, sub forma:
domains
lista=integer*
predicartes
repeat citeste(lista)
goal
repeta.
clauses
repeta if
citeste(L),
write("lista= ",L),
write("\n Continuati? (d/n)"),
readchar(R), R='d', repeta.
% citeste este definit anterior .
45
Inteligenţă Artificială. Tehnici.
46
Inteligenţă Artificială. Tehnici.
repeta if
citeste_date ,!, % Dacă procedura citeste_date şi
executa ,!, % executa, sunt recursive , amplasarea
scrie, !, % elementului ! (cut) este obligatorie.
continuare , repeta.
Goal
Interfata de intrare / iesire cu utilizatorul,
repeta.
domains
I = integer*
predicates
scrie (l)
scrie_rind(l,integer)
clauses
scrie (L) if nl, scrie_rind(L,0).
scrie_rind([ ],-). % ------------>oprirea procesului recursiv
scrie_rind(L,3) if nl, scrie_rind(L,0).
scrie_rind ([ESTE|Rest],N) if
write(" ",ESTE),
N1=N+L,
scrie_rind(Rest,N1).
Observaţii:
a)Predicatul ne asigură trecerea la începutul unei linii noi.
b)Pentru procedura scrisă se contorizează numărul de elemente care se
scriu, după care regula scrie_rind(L,3) asigură trecerea la următorul rând.
47
Inteligenţă Artificială. Tehnici.
domains
nume,prenume=symbol
persoana =p(nume,prenume,integer)
lista=persoana *
predicates
citesc(lista)
citeste(pers)
clauses
citesc([Obiect|R]) if
citeste(Obiect),
citesc(R).
citesc([ ]).
citeste(p(N,P,V)) if
nl,
write("Nume="),readln(N),
write("Prenume="),readln(P),
write("Virsta="),readint(V),nl.
Observaţii :
Operaţia presupune definirea unui predicat de citire separat, la nivelul de
obiect compus. Acest predicat este utilizat pentru citirea fiecărui element al listei
ce se construieşte. Întreruperea operaţiei de construire se face introducând un
caracter care să forţeze readint să fie fals. Pentru structura de date in discutie se
va obţine o listă de forma :
[p(Ion,V,17),p(Vlad,C,20)...]
5) Scrierea cu format
Este asigurată de predicatul
writef (format, arg1, arg2, ...)
unde:
format reprezinta un şir de caractere în care apar descriptori de forma:
48
Inteligenţă Artificială. Tehnici.
49
InteligenŃă Artificială. Tehnici.
50
InteligenŃă Artificială. Tehnici.
2)
domains
nume=symbol
predicates
mai_rapid(nume,nume)
database
aleargă_repede(nume)
aleargă_încet(nume)
clauses
aleargă_repede(ana).
aleargă_repede(radu).
aleargă_încet(doru).
mai_rapid(X,Y) :- alearga_repede(X), alearga_incet(Y).
Goals : assert(aleargă_repede(ion))
Yes
Goals : aleargă_repede(X)
X=ana X=radu X=ion 3 solutions
Goals : save("axiome.dba")
Yes
Goals:consult("axiome.dba") {se încarcă baza de date}
51
InteligenŃă Artificială. Tehnici.
Observatii:
1) Intr-o baza de date nu pot fi asertate decât axiome. Există totuşi dialecte
de Prolog care permit şi asertarea regulilor.
2) La un moment dat pot exista 2 sau mai multe baze de date active. Pentru
a face deosebirea între acestea setul de predicate prezintă extensiile:
assertz(clausa,nume_baza_date)
asserta(clausa,nume_baza_date)
retract(clausa,nume_baza_date)
retractall(clausa,nume_baza_date)
save(nume_dos,nume_baza_date)
consult(nume_dos,nume_baza_date)
52
InteligenŃă Artificială. Tehnici.
domains
obiect=string atribut=string atribute=atribut*
database
este_un(obiect,obiect,atribute) tip_de(obiect,obiect,atribute)
fals(atribut)
predicates
run(obiect) intreaba(atribute)
clauses
run(Art):- este_un(X, Art, Lista ),
întreabă( Lista ),
tip_de(Răspuns,X,Lista2),
întreabă(Lista2),
write(Art, " de care aveŃi nevoie este ", Raspuns), nl, !.
run( _ ) :- write( "Nu există informaŃie suficientă" ).
întreabă( [ ] ).
întreabă( [A|R] ) :- not(fals(A)),
write("Vă ajută la",A),
write(" da sau nu?
readchar(C), nl, C='d',
întreabă(R).
întreabă( [A|_ ] ) :- assertz(fals(A)), fail.
Goal:run(unealtă)
Vă ajută la comunicare? d
Vă ajută la comunicarea cu oamenii? n
{În baza de date se assertează clausa fals("comunicarea cu oamenii") }
Vă ajută la comunicarea cu calculatorul? d
Unealta de care aveŃi nevoie este Pascal
ObservaŃie:
1) În acest mod, procedura poate reŃine o informaŃie în timpul dialogului
(faptul ca comunicaŃia cu oamenii este falsă) ceea ce face ca la o nouă reluare a
execuŃiei această întrebare să nu se mai pună.
53
InteligenŃă Artificială. Tehnici.
Clase de obiecte
Clasa 1 …………………………..Clasa n
Da
Subclase
Nu
………………….
Obiect 1 2……………m
Pentru raspuns:
Da pentru toate atributele unui nod acesta este validat
Nu pentru un singur răspuns de acest tip se invalideaza nodul
54
InteligenŃă Artificială. Tehnici.
findall(SoluŃie,Întrebare, Listă_soluŃii)
.
findall( C, tip_literă( C, consoană ), L ),
.
procedura de prelucrare a listei L,
Exercitii
1) Care sunt raspunsurile la întrebările:
? assert(p(a)),assertz(p(b)),asserta(p(c))
? p(X)
55