You are on page 1of 25

Cursul3

LIMBAJUL PROLOG
operaii aritmetice i relaionale
determinismi nedeterminism n bazele decunotine
operatiidecitire/scriere
operaii
p cuiruri

decaractere

l dr ing Ioan BORLEA


.l.dr.ing.
BORLEA Facultatea de Electrotehnic i Electroenergetic Timioara

OPERAII ARITMETICE I RELAIONALE


OPERAIIARITMETICEIRELAIONALE
Expresiile aritmetice
Suntformatedinnumereivariabiledespriteprinoperatori
aritmetici:+ ,*,mod,div,/.
aritmetici:+,
mod div /
Expresiilearitmeticepotsfiesausnudelimitatedeparanteze.
Reguliledeevaluareaexpresiiloraritmeticerespectconveniilestandard
R
lil d l

iil it ti
t
iil t d d
referitoarelaevaluareaoperanziloriparantezelor.

Expresiirelaionale
Sepotcomparaexpresiiaritmetice caractere iruriirespectivsimboluri
Sepotcomparaexpresiiaritmetice,caractere,iruriirespectivsimboluri.
Operatoriirelaionalisunt:<,>,<=,>=,<>sau><,=.

Egalitatea i predicatul egal =


O clauz de forma:
N = N1 - 2

y indic
i di o relaie
l i ntre
t trei
t i obiecte
bi t adic
di N,
N N1 ii valoarea
l
2
2,

y sau o relaie ntre dou obiecte adic N i valoarea N1 - 2.

Dac N este o variabil liber atunci primete valoarea definit de obiectul


N1 2 adic operaia
p este similar cu atribuirea.
Daca N este o variabil legat atunci egalitatea este ca i o comparare a
celor dou (sau trei) obiecte, rezultatul fiind:
y
y

Yes dac N = N1 - 2 sau


No dac N <> N1 2; n operaia de comparare se ine cont de
d
domeniul
i l lla care aparine
i variabila
i bil respectiv.
ti

Exemplu1:Construiioprocedurcarescalculezenumrulde
elementealeuneiliste.
Predicatulestedeforma:nr ( lista , nr_elemente)
Reguliledeconstruciepornescdeladouobservaii:
y lungimeauneilistevideestezero;
daclistanueste id lungimeaestedatde
y daclistanuestevid,lungimeaestedatde:
1 (lungimeacapuluilistei)+
lungimeacoziilistei.
% programul n Prolog este descris mai jos
predicates
nr(lista, nr)
clauses
nr ( [ ], 0).
nr ( [ _ | Rest ],
] N) if
nr ( Rest, N1),
N=1+N1.
Exemplu de apelare: nr( [ a,b,c], R) dup rulare rezult R=3.

Exemplu2:Construiioprocedurcaresdetermineelementul
p
p
maximaluneiliste.
Considermunpredicatdeforma:
maxim(lista,elem_maxim).
(
)
Procedurarezultdinobservaiile:
y daclistaesteformatdintrunsingurelement,atuncimaximestechiar
elementulrespectiv;
y ncazcontrarmaximulseobineprincomparareacapuluilisteicumaximulcozii
listei.
predicates
maxim(lista, integer)
max(integer, integer, integer)

% lista i elementul maxim rezultat


% elementele listei care se compar i
% maximul dintre ele

clauses
maxim ( [X] , X).
maxim ( [X | Rest], Maxim) if
maxim (Rest, Max_Rest),
max ( X, Max_Rest, Maxim).
max ( A, B, A) if A>=B.
max ( A,
A B,
B B) if A<B.
A<B
goal
maxim ([7, 3, 9, 0], M). Dup rulare rezult M=9

EExemplu3:Construitioprocedurcaresdeterminec.m.m.d.c
l 3 C t iti
d
d t
i
d dintre2
di t 2
valorinumericeX iY
Considermunpredicatdeforma:cmmdc(x y,
Considermunpredicatdeforma:cmmdc(x,
y rezultat).
rezultat)
Sepleacdelaconsideraiile:
DacX=Y cmmdcesteoricaredintreceledou
DacX>Y cmmdcseobinedintreX iXY
DacX<Y cmmdcseobinedintreX iYX
clauses
cmmdc(X, X ,X).
cmmdc( X, Y, R) if X>Y, X1=X-Y, cmmdc( X1, Y, R).
cmmdc(( X, Y, R)) if X<Y, Y1=Y-X, cmmdc(( X, Y1, R).
)

Exemplu:goalcmmdc(15,20,R)rezultatulesteR=5.
Suntacceptatedectreprocedurntrebrideforma:
cmmdc (15, 20, 5) - declarativ
cmmdc (X, 20, 5) sau cmmdc (15, Y, 5) - procedural

DETERMINISMINEDETERMINISM
N BAZELE DE CUNOTINE
NBAZELEDECUNOTINE
Moduldeaciunealelementuluidetiere!
Elementuldetiere(cut !)areroluldeapreveniiaciuneamecanismuluidecutarea
soluiilor(backtracking)narboredesoluiilorprinimpiedicareaparcurgeriianumitor
ramuri.
ramuri
Considermoreguldeforma:
Hif B1,B2,...,Bm,!,Bm+1,...,Bn.
, , ,
, ,
, ,
PrinmecanismuldecutarenintervalulpremizelorB1...Bmsepresupunecsagsito
soluie.
Inmomentulatingeriielementuluidetiere(!)soluiaparialgsitestengheat,
operaiafiindechivalentcutergereapointerilordepeclauzeleB1...Bmdejaparcurse.
CutareacontinupentrupremizeleBm+1,...,Bnncaresuntpermisetoatesoluiile
CutareacontinupentrupremizeleBm+1
Bnncaresuntpermisetoatesoluiile
posibile.CualtecuvintespaiulsoluiiloresteformatdinsoluiadefinitdeB1,...,Bmi
varianteleoferitedeBm+1,...Bn.
Elementuldetiereiextindeaciuneasipentruclauzelecuacelainume(H)careurmeaz
Elementuldetiereie
tindeaciuneasipentruclau elecuacelainume(H)careurmea
dupaceeancareesteprezent.

l teoretic:
Exemplu
HifP,Q,R,!,S,T,U. %Regulacareconine!.
HifU,V. %Aceastaregulnusemaiexecutdac
pentruprecedentasagsitcelpuinosoluie.
AifB
H C %N
i
t t

t Bd
t H
AifB,H,C.
%NusemaipoatentoarcepentruBdacpentruH
sagsitosoluie.

REGULIDEAMPLASAREALUI!
1.Elementuldetiereseamplaseazpeaxiomacareimplementeazntrebareapus
adic:
sterge(X,[X|R],R)if!.
22.SeutilizeazopiuneaCHECK_DETERM(verificareadeterminismului),carese
SeutilizeazopiuneaCHECK DETERM(verificareadeterminismului) carese
amplaseaznfaaprogramuluisubforma:check_determ

ConstruirearegulilorIFTHENELSE
Elementuldetiere(!)poatefiutilizatnPrologpentruconstruireaunorregulide
tipulif then else subforma:

a)Construitioprocedura:max(x y maxim)
a)Construitioprocedura:max(x,y,maxim).
nlimbajnaturalavem
ifX>=YthenMAX=XelseMAX=Y.
ifX>=YthenMAX=XelseMAX=Y
Regulapoatefiscris:
max
a ((X,Y,X)ifX>=Y.
, , )
.
max (X,Y,Y)ifX<Y.
sauunaltmoddescriere:
max (X, Y, X)ifX>=Y,!.
max (_, Y, Y).

%adicXestemaximesteadevrat
%
ad c este a
este adev at
%dacprimaclauzestefalsatunci
Y estemaxim
%Xestemaximi!(numaicutaaltsoluie)
%dacnusandeplinitprimaclauz
atunciY estemaximautomat

b)ConstruitioprocedurcaresasigureadunareaunuielementXlaolistLnumai
dacXnuesteprezentnL;nacestcazXdevinecapullistei.
aduna(Elem,Lista,Rezultat)
nlimbajnaturalregulasescrie:
ifElemapartineLista
thenRezultat = Lista
elseRezultat=[Elem|Lista]
Secvenadepriogramsescrie:
aduna(X,L,L)ifapartine(X, L),!.
aduna(X,L,[X| L] ).
Exemple:
aduna(2,[1,3],R)rezultatulesteR=[2,1,3]
aduna
d
( [1,X,4],R)
(3,
[ X ] R) rezultatulesteX=3iR=[1,3,4]
lt t l t X iR [ ]

C)Construiioprocedurcarespermitclasificareaconcurenilordintrunturneu
de tenis n 3 categorii definite astfel:
detenisn3categoriidefiniteastfel:
categoriactigtor dacjuctoruliabtutpetoiceicucareajucat;
categorialupttor dacjuctorulactigatiapierdutjocuri;
categoriasportiv
i
i dacjuctorulapierduttoatemeciurile.
d j
l i d
i il
ifXbatepecinevaandXestebatutdealtcineva
thenXesteluptator
p
elseifXbatepecineva
thenXestecistigator
elseifXprimestebataiedelatoti
thenXestesportiv.
predicates
clasa(nume_sportiv,categoria)
clauses
clasa(X,luptator)if
b
bate_pe(X,_),bate_pe(_,
(X ) b
( X),!.
X) !
clasa (X, cistigator)if bate_pe(X,_),!.
clasa(X,sportiv)if bate_pe(_, X).

ImplementareanegaieiinProlog
1.Seutilizeazpredicatelepredefinite:cut (!),fail sautrue.
2 Seutilizeazpredicatulnot
2.Seutilizeazpredicatulnot.
Exemplul 1: Fie urmtoarea afirmaie: Lui Tom i plac animalele cu excepia pisicilor.
ii_place (proprietar, animal)
animal(nume_animal)
afirmaia anterioara se scrie n prolog astfel:
ii_place(tom, X) if X=pisica , !, fail. % spune ca proprietatea este fals
ii_place(tom,
X)) if animal(X).
% lui Tom i p
place orice animal diferit
_p
(
( )
de pisic
Secventa mai poate fi scris compactat i sub forma:
ii_place(tom, X) if
X=pisica, ! , fail ;
animal=X .

Cap.7OPERATIIDECITIRE/SCRIERE(I/O)
Scrierea
Predicatuldescriereprezintsintaxa:
write(arg1,...,argn)
ncareargumentelepotficonstantesauvariabilelegate ceaparinunor
domeniistandardsaudefinitedeprogramator.
ninterioruliruluidecaracterecarepotfiafisatepeecran,suntacceptate
ninterioruliruluidecaracterecarepotfiafisatepeecran
suntacceptate
urmtoarelecaracteredecontrol:
\n scriepelinienou, \t tabulator,
\r enter,
\nnn scriecaracterulcucodulnnn.
Exemplu:write("\tLista1=",L1,"\ n \ tLista2=",L2)
Lista1=[]Lista2=[1,2]

Citirea
Citireaesterealizatdeurmtoarelepredicate:
readint(X) citireavariabilelordetipntreg;
readreal(X) citireavariabilelordindomeniulreal.
readln(X)
( ) citireavariabilelordindomeniulsymbolsaustring;
y
g
readchar(X) citireacaracterelor.
readintsireadreal operaiadecitireseterminnmomentulapsrii
tasteienter
readln ncheiecitirealaapsareatasteienter.
redachar estentotdeaunaunsucces;

E
Exempludecitire
l d iti
domains
lista=integer*

domains
lista=integer *

predicates
citeste(lista)

predicates
citeste(lista, lista)

clauses
citeste([E| Rest])if
write("Element="),
readint(E),
( ),
citeste(Rest).
citeste( [ ] ).{citireasetermin
cuelementul vid}
goal
citeste(L),write(L).

clauses
citeste(L1, L2) if
write("Element="),
readint(E),
( ), E<>0,,
L1nou=[E| L1],
citeste(L1nou, L2).
citeste(L, L). {citirea se termin cu 0}
goal
citeste( [ ] , L), write(L).

Specificaisetuldeclauzecaresasigurecitireauneilisteacrorelementesunt
obiecte compuse de forma:
obiectecompusedeforma:
persoana=p(nume,prenume,vrst)
domains
nume,prenume=symbol
persoana=p( nume,prenume,integer)
lista=persoana
lista=persoana*
predicates
citesc(lista)
citeste(persoana)
clauses
citeste( p( N, P, V))if
nl,
write("Nume="), readln( N ),
write("Prenume="), readln( P ),
write("Virsta="), readint( V ),
nl.

citesc( [ E | R ] ) if
citeste( E ),
citesc( R ).
citesc( [ ] ).

OPERAIICUIRURIDECARACTERE
Operatii de divizare / compunere a unui ir

A.Lanivelulunuicaracter:
frontchar(Sir,Elem,Rest_sir)
Exemplu:
frontchar( "RaduDanIon",E,R) %varianta(i,o,o):
E 'R'
E=
R ,R
R = "aduDanIon"
aduDanIon
1solution
Varianta(o i i)recompuneirul altemoduridelucru:(i o i) (i i o) (i i i)
Varianta(o,i,i)recompuneirul,altemoduridelucru:(i,o,i),(i,i,o),(i,i,i).
B.Lanivelulunuielement alirului:
fronttoken(Sir,Elem,Rest sir)
fronttoken(Sir,Elem,Rest_sir)
Exemplu:
, , ) %varianta(i,o,o)
(, , )
fronttoken(( "12DanIon",E,R)
E="12",R = "DanIon"
1solution

Construiioprocedurcaresdesfacunirnelementecomponente
a)laniveldecaracter sib)laniveldeelementdeir
domains
d
i
lista=char*
predicates
desfac(string,lista)
clauses
desfac("",[ ]).
desfac(S,[C|Lista])if
frontchar(S,C,Rest_s),
desfac(Rest_s,Lista),!.
desfac(Rest s Lista) !

domains
elem= string
lista= elem*
predicates
desfac(string, lista)
clauses
desfac( S, [E| Lista]) if
S E
fronttoken( S,
E, Rest)
Rest),
desfac( Rest, Lista), !.
desfac( _, [ ]).

Comenzi i operaii de determinare a tipului de domeniu


Comenziioperaiidedeterminareatipuluidedomeniu
char_int(char,integer) converteteuncaracternvaloareaASCII(i,o)sauinvers(o, i),
sauverificaegalitateadintrecodulcaracteruluisintreg(i, i)
str_char(string,char) converteteuncaracterntrunir(o, i),sauunircuunsingur
caracterntruncaracter(i, o)
str_int(string,integer)
str
int(string,integer) converteteunirnumericntr
converteteunirnumericntrunntreg(i,
unntreg(i, o)sauinvers(o, i)sau
verific corespondentadintreceledou
str_real(string,real) similarcustr_int,pentrunumerereale
isname(string)
verificdacvariabilaesteunnume(ncepecuoliterai
continuacucifresaulitere)

Operatii auxiliare
str_len(string, integer)

- determin lungimea irului (i, o) sau o verific (i, i)

frontstr(integer, string, string, string) - mparte primul ir n dou, primul avnd lungimea
dat de ntreg; poate fi folosit numai ca (i, i, o, o).
concat(string, string, string)

- concateneaz primele dou iruri n al treilea;


numai (i, i, o).

Construiioprocedurcaresdeterminetipuriledeelementedincare
estealctuitunir:
t l t it
i
alctuit("12abeta",R)
l t it("12
b t " R)
R=[nr(12),car('a'),nume("beta")]
domains
element=nr(integer);car(char);nume(string)
lista=element*
predicates
alcatuit(string,lista)
%desfacesirulinelementelecomponente
este(string element)% determinareatipului
este(string,element)%
clauses
este(E,nr(N))ifstr
( , ( ))
_int(E,N).
( , )
este(E,car(C))ifstr_char(E,C).
este(E,nume(E))ifisname(E).
alcatuit(Sir,[Tip | L ])if
fronttoken(Sir,E,Restsir),
este(E,Tip),alcatuit(Restsir,L),!.
alcatuit( _ , [ ] ).

Exemplu:Construiioproceduracarespermitoanalizgramaticalsimplpentrupropoziiisimplede
forma: "Tom
forma:
Tomisacat
is a cat".
Pentruadetectaistabilipredicatelesepornetedelaanalizagramaticalapropoziiilordeforma:
analizeaza ( "Tomisacat",R )
R =structura(substantiv("Tom"),expe_verb("is",expr_substantivala("a","cat")))
analizeaza ( isacat),R )
R = structura(predicat("is")
R=structura(predicat(
is ),expr_substantivala(
expr substantivala("a"
a ,"cat"))
cat ))
analizeaza ( "acat",R)
R=structura(articol("a"),substantiv("cat"))

Analizorgramatical
domains
subst,pred,art=string
e_subst=s(subst);e_subst(art,subst)
e_verb=p(pred);e_verb(pred,e_subst)
b ( d)
b( d
b )
propozitie=structura(e_subst,e_verb)
predicates
p
ed cates
analizeaza(string,propozitie)
este_e_subst(string,string,e_subst)
este_e_verb(string,e_verb)
a(art)
( t)
s(subst)
p(pred)
clauses
analizeaza(Sir,structura(S_exp,V_exp)):
este_e_subst(Sir,Rest,S_exp),
este_e_verb(Rest,V_exp).
t
b(R t V
)
a("the").a("a").
(
) (
) ( g) (
)
s("Tom").s("Bill").s("dog").s("cat").
p("is").p("has").

este_e_subst(Sir, Rest, e_subst(Art, Subst)):fronttoken(Sir Art,Rest1),


fronttoken(Sir,
Art Rest1)
a(Art),
fronttoken(Rest1, Subst, Rest),
s(Subst).
este_e_subst(Str, Rest, s(Subst)):fronttoken(Str, Subst, Rest),
s(Subst).
este_e_verb(Str, e_verb(Pred, S_exp)):fronttoken(Str, Pred, Rest1),
p(Pred),
este_e_subst(Rest1,"",S_exp).
este_e_verb(Str, p(Pred)):fronttoken(Str, Pred, ""),
p(Pred)
p(Pred).

Exemplu:Construiioprocedurcareasiguremprireansilabeaunuicuvnt.
Reguli dedespartire:
a)laosecvendetipulvocal consoan vocal,mprireasefacedupprimavocal:
(prolog>prolog)
(regula>regula)
b) l
b)laosecvendetipulvocal
d i l
l consoan
consoan
vocal,mprireasefacentrecele
l i
f

l
douconsoane (turbo>turbo)
c)excepiileseexclud
domains/*structuradetipsirdecaractere aunuicuvnt*/
litera=char
cuvant litera*%siruldecaractereestedesprtitnliterelecomponente
cuvant=litera
%siruldecaractereestedesprtitnliterelecomponente
predicates
repeta /*asigur repetarea*/
vocala(litera)
/*distingereantrevocalconsoan*/
consoana(litera)
sir_cuvant(string,cuvant) /*transformareaunuiirnlistadecaractereiinvers*/
divide(cuvant cuvant cuvant cuvant) //*impartireansilabe*/
divide(cuvant,cuvant,cuvant,cuvant)
impartireansilabe /
/*divide(caractereprelucrate,restdeprelucrat,silaba1,silaba2)*/
clauses
vocala('a').vocala('e').vocala('i').
vocala('o').vocala('u').vocala('y').
consoana(C)ifnot(vocala(C)),C>= 'a',C<= 'z'.

clauses
sir_cuvant("", [ ] ).
sir_cuvant(S,[C|
_
( , [ | Lista]):
])
frontchar(S,C,Rest_sir),
sir_cuvant(Rest_sir,Lista).
divide(Inceput,[L1,
di
ide(Inceput [L1 L2,
L2 L3| Rest],Silaba1,[
Rest] Silaba1 [ L2,
L2 L3| Rest]):
Rest])
vocala(L1),consoana(L2),vocala(L3),
conc(Inceput,[L1],Silaba1).
(
p [ L2, L3,
3 L4|
4| Rest],Silaba1,[L3,L4|
]
[ 3 4| Rest])if
])
divide(Inceput,[L1,
vocala(L1),consoana(L2),consoana(L3),vocala(L4),
conc(Inceput,[L1,L2],Silaba1).
divide(Inceput,[Litera| Rest],Sil1,Sil2) if
conc(Inceput [Litera] Prelucrat)
conc(Inceput,[Litera],Prelucrat),
divide(Prelucrat,Rest,Sil1,Sil2), !.
divide( _,[ ],[ ],[ ]).
repeta.
repeta: repeta.
goal/*citetecuvinteiledespartensilabe*/
repeta, write("cuvant="),readln(C),
sir_cuvant(C,Lista_car),
divide( [ ] ,Lista_car,S1,S2),
sir_cuvant(Sil1,S1),sir_cuvant(Sil2,S2),
write(Sil1,"",Sil2),nl,fail.

U
Urmeaz
cursull 4 !

You might also like