You are on page 1of 16

1.

Limbajul Prolog
Limbajul Prolog (PROgrammation en LOGique) a fost elaborat la Universitatea din Marsilia n jurul anului 19 !" #a instrument $entru $rogramarea %i re&olvarea $roblemelor #e im$li#au re$re&ent'ri simboli#e de obie#te %i rela(ii dintre a#estea) Prolog are un #*m$ de a$li#a(ii foarte larg+ ba&e de date rela(ionale" inteligen(' artifi#ial'" logi#' matemati#'" demonstrarea de teoreme" sisteme e,$ert" re&olvarea de $robleme abstra#te sau e#ua(ii simboli#e" et#) -,ist' standardul ./OProlog) 0u e,ist' standard $entru $rogramare orientat' obie#t 1n Prolog" e,ist' doar e,tensii+ 2rin#Prolog" /3.4Prolog) #ara#ter des#ri$tiv+ un $rogram Prolog este o #ole#(ie de defini(ii #e des#riu rela(ii sau fun#(ii de #al#ulat 5 re$re&ent'ri simboli#e de obie#te 6i rela7ii 1ntre obie#te) /olu(ia $roblemelor nu se mai vede #a o e,e#u(ie $as #u $as a unei se#ven(e de instru#(iuni) $rogram 5 #ole#7ie de de#lara7ii logi#e" fie#are fiind o #lau&' 8orn (p" p q " p1 p 9 ))) p n q ) :om studia im$lementarea 2urbo Prolog) Ra(iunea $entru alegerea a#estui limbaj este dida#ti#'+ formalismele Prolog sunt mai sim$lu de n(eles) 2ran&i(ia la ./OProlog este foarte sim$l') G0UProlog" /3.4Prolog" Parlog Structura de control folosit' de inter$retorul Prolog /e ba&ea&' $e de#lara7ii logi#e numite clauze o fapt 5 #eea #e se #unoa6te a fi adev'rat o regul 4 #e se $oate dedu#e din fa$te date (indi#' o #on#lu&ie #are se 6tie #' e adev'rat' atun#i #;nd alte #on#lu&ii sau fa$te sunt adev'rate) Concluzie #e trebuie demonstrat' 4 GO<L o /e a$li#' ra7ionamentul 1na$oi $entru a demonstra #on#lu&ia o Programul este #itit de sus 1n jos" de la drea$ta la st;nga" #'utarea este 1n ad;n#ime (depth-first) 6i se reali&ea&' folosind backtracking.
p q se trans#rie 1n Prolog folosind #lau&a q +4 p. ( q if p.) p1 p 9 ))) p n q se trans#rie 1n Prolog folosind #lau&a q + 4 p1 " p 9 ")))" p n ) se trans#rie 1n Prolog folosind ="= se trans#rie 1n Prolog folosind =>= sau o #lau&' se$arat')

Exemple
Logic
x p ( x) q ( x) r ( x) x w( x) s( x) p ( x)

Prolog
r ( X ) + 4 p ( X )" q ( X )) p ( X ) + 4 w( X )) p ( X ) + 4s( X )) s( X ) + 4t ( X )) q ( X ) + 4t ( X )) t (a ))

x t ( x) s( x) q ( x)
t (a )

Concluzie r (a )

Logic
x s( x) p( x) q( x)

Prolog
????

2. Sec iunile de baz ale unui program !urboProlog

?dire#tive@ ?domains defini7ie domeniu )))) @ ?database de#lara7ie $redi#at C @ ?#onstants defini7ie #onstant' C) @ $redi#ates de#lara7ie $redi#at C ?goal intrebare) @ #lauses #lau&a C

e,+ in#lude A$)$roB sau tra#e 4 defini7ii domenii

4 ba&a de date intern'

e,+ &eroD!

4 goal intern

4 #lau&e #are defines# $redi#atele

". Elemente de baza ale limbajului !urboProlog


1. !ermen 1. #onstanta atom o se#ven7' de litere" #ifre" F o 1n#e$e #u liter mic num'r (1ntreg" real) 6ir de #ara#tere+ Ate,tB #ara#ter+ G#H" GInH" GItH" et# /.MJOLD<2OM K /.R4L-4M<R<M2-R2. variabila se#ven7' de litere" #ifre" F 1n#e$e #u liter mare variabila anonim' este re$re&entat' de #ara#terul underline (F)) 2. Comentariu N <#esta este un #omentariu OP <#esta este un #omentariu PO ". #omeniu 1. standard+ M8<R" .02-G-R" R-<L" /2R.0G" /QMJOL" R.L-" LJ</-LOM 2. utili&ator atom?" atom@ D d e,+ varsta" anDinteger atom?" atom@ D dP 4 list' de elemente de a#eea6i natur' e,+ elDinteger listDelP
d $oate fi domeniu standard sau definit anterior de utili&ator

$. Predicat a)) standard (e,+ fail) b)) utili&ator de#lara7ie nume ?(domeniu ?" domeniu)))))@

numele simboli# al rela7iei %. Clauza fa$t o rela7ie 1ntre obie#te o predicat ?(obiect ?" obiect)))))@ regula o $ermite dedu#ere de fa$te din alte fa$te Exemplu+ fie $redi#atele tata(S" Q) re$re&entand relatia AQ este tatal lui SB mama(S" Q) re$re&entand relatia AQ este mama lui SB E

si urmatoarele fa$te #ores$un&atoare #elor doua $redi#ate + mama(a"b)) mama(e"b)) tata(#"d)) tata(a"d)) Se cere+ folosind definitiile anterioare sa se defineas#a $redi#atele $arinte(S" Q) re$re&entand relatia AQ este $arintele lui SB frate(S" Q) re$re&entand relatia AQ este fratele lui SB Clauze &n Prolog $arinte(S"Q) +4tata(S"Q)) $arinte(S"Q) +4mama(S"Q)) frate(S"Q) +4$arinte(S"U)"$arinte(Q"U)"SVWQ) '. (ntrebare (goal) o e de forma predicat1 ?(obiect ?" obiect)))))@" predicat2 ?(obiect ?" obiect)))))@))))

Rolosind definitiile anterioare" formulam urmatoarele intrebari+ goal+ $arinte(a"b) Qes goal+ $arinte(a"S) SDd SDb 9 solutions goal+ frate(a"F) Qes

goal+ frate(a"S) SD# SDe 9 solutions

o 1n 2urboProlog 1ntrebarea $oate a$'rea 1n 9 lo#uri 1n $rogram" 1n se#7iunea goal (goal intern) 1n &ona de dialog" la $rom$terul goal (goal extern)

$. )*atc+ing,. Cum -.i prime/c 0alori 0ariabilele?


Prolog nu are instru#(iuni de atribuire) :ariabilele n Prolog %i $rimes# valorile $rin potri0ire #u #onstante din fa$te sau reguli) P*n' #*nd o variabil' $rime%te o valoare" ea este liber (free)> #*nd variabila $rime%te o valoare" ea este legat (bound)) Lar ea st' legat' at*ta tim$ #*t este ne#esar $entru a ob(ine o solu(ie a $roblemei) <$oi" Prolog o de&leag'" fa#e ba#Xtra#Xing %i #aut' solu(ii alternative)

1b/er0a2ie) -ste im$ortant de re(inut #' nu se $ot sto#a informa(ii $rin atribuire de valori unor variabile) :ariabilele sunt folosite #a $arte a unui $ro#es de $otrivire" nu #a un ti$ de sto#are de informa(ii)

Ce e/te o potri0ire?
.at' #*teva reguli #e vor e,$li#a termenul Z$otrivireZ+ 1) /tru#turi identi#e se $otrives# una #u alta $(a" b) se $otriveste #u $(a" b) 9) Le obi#ei o $otrivire im$li#' variabile libere) La#' S e liber'" $(a" S) se $otriveste #u $ (a" b) S este legat la b) E) La#' S este legat" se #om$ort' #a o #onstant') Mu S legat la b" $(a" S) se $otriveste #u $(a"b) $(a" S) 0U se $otriveste #u $(a" #) T) Lou' variabile libere se $otrives# una #u alta) $(a" S) se $otriveste #u $(a" Q) 1b/er0a2ie. Me#anismul $rin #are Prolog n#ear#' s' G$otriveas#'H $artea din ntrebare $e #are doreste s' o re&olve #u un anumit $redi#at se numeste unificare)

%. *odele de flux
[n Prolog" leg'rile de variabile se fa# n dou' moduri+ la intrarea n #lau&' sau la ie%irea din #lau&') Lire#(ia n #are se leag' o valoare se nume%te Gmodel de fluxH) M*nd o variabil' este dat' la intrarea ntr4o #lau&'" a#easta este un $arametru de intrare (i)" iar #*nd o variabil' este dat' la ie%irea dintr4o #lau&'" a#easta este un $arametru de ie%ire (o)) O anumit' #lau&' $oate s' aib' mai multe modele de flu,) Le e,em$lu #lau&a fa#torial (n"f) $oate avea urm'toarele modele de flu,+ (i"i) 4 verifi#' da#' n\ D f> (i"o) 4 atribuie f +D n\> (o"i) 4 g'se%te a#el n $entru #are n\ D f) 1b/er0a2ie) Pro$rietatea unui $redi#at de a fun#(iona #u mai multe modele de flu, de$inde de abilitatea $rogramatorului de a $rograma $redi#atul n mod #ores$un&'tor)

'. Predicate cu aritate multipl


<ritatea unui $redi#at este num'rul de argumente $e #are le a##e$t') Putem avea dou' $redi#ate #u a#ela%i nume dar #u arit'(i diferite) .ntr4o astfel de situa(ie" $redi#atele #u a#ela%i nume tebuie s' se gru$e&e m$reun' at*t n se#(iunea $redi#ates #*t %i n se#(iunea #lauses)

Predi#atele #u a#ela%i nume dar #u arit'(i diferite sunt tratate #a $redi#ate #om$let diferite) .at' un e,em$lu+ domains $ersoana D s^mbol $redi#ates $arinte($ersoana) $arinte($ersoana" $ersoana) #lauses $arinte($ersoana) +4 $arinte($ersoana" F)) $arinte(a" b)) $arinte(#" d))

3. Sintaxa regulilor
Regulile sunt folosite n Prolog #*nd un fa$t de$inde de su##esul (veridi#itatea) altor fa$te sau su##esiuni de fa$te) O regul' Prolog are trei $'rti+ #a$ul" #or$ul %i simbolul if (+4) #are le se$ar' $e $rimele dou') .at' sinta,a generi#' a unei reguli 2urbo Prolog+ #a$ul regulii +4 subgoal" subgoal" )))" subgoal) Rie#are subgoal este un a$el la un alt $redi#at Prolog) M*nd $rogramul fa#e a#est a$el" 2urbo Prolog testea&' $redi#atul a$elat s' vad' da#' $oate fi adevarat) Odat' #e subgoal4ul #urent a fost satisf'#ut (a fost g'sit adev'rat)" se revine %i $ro#esul #ontinu' #u urm'torul subgoal) La#' $ro#esul a ajuns #u su##es la $un#t" regula a reu%it) Pentru a utili&a #u su##es o regul'" Prolog trebuie s' satisfa#' toate subgoal4urile ei" #re*nd o mul(ime #onsistent' de leg'ri de variabile) La#' un subgoal e%uea&' (este g'sit fals)" $ro#esul revine la subgoal4ul anterior %i #aut' alte leg'ri de variabile" %i a$oi #ontinu') <#est me#anism se nume%te backtracking)

4. Expre/ii aritmetice
-,$resiile aritmeti#e #onstau din operanzi (numere %i variabile)" operatori (K" 4" P" O" div %i mod) %i paranteze) :aloarea unei e,$resii $oate fi #al#ulat' da#' toate variabilele sunt LE56!E la momentul evalu'rii) Mal#ulele se fa# ntr4o anumit' ordine determinat' de $rioritatea o$eratorilor aritmeti#i+ o$eratorii #u #ea mai mare $rioritate sunt evaluati $rimii)

7unc2ii predefinite S mod Q S div Q abs(S) sqrt(S) round(S) trun#(S) ntoar#e restul m$'r(irii lui S la Q ntoar#e #*tul m$'r(irii lui S la Q ntoar#e valoarea absolut' a lui S ntoar#e r'd'#ina $'trat' a lui S ntoar#e valoarea rotunjit' a lui S ntoar#e valoarea trun#_iat' a lui S

8. Compara2ii
2urbo Prolog $oate #om$ara e,$resii aritmeti#e" #ara#tere" string4uri %i simboluri) [n 2urbo Prolog se folose%te nota(ia infi,ata" #eea #e nseamn' #' o$eratorii sunt $lasa(i ntre o$eran&i (de e,em$lu" S V T)) .at' n #ontinuare o$eratorii rela(ionali $ermi%i n 2urbo Prolog+ V VD W VD D VW mai mi# mai mi# sau egal mai mare mai mare sau egal egal diferit (neegal)

Egalitate .i predicatul egal 9:;


[n 2urbo Prolog $ro$o&i(ii $re#um 0 D M 4 9 indi#' fie o rela(ie ntre trei obie#te (0" M" 9) fie o rela(ie ntre dou' obie#te (0 %i valoarea M 4 9)) La#' 0 este variabil' liber'" $ro$o&i(ia este satisf'#ut' leg*nd $e 0 de re&ultatul evalu'rii e,$resiei M 4 9) <#easta #ores$unde unei instru#(iuni de atribuire din limbajele de $rogramare) La#' 0 este o variabil' legat'" atun#i $ro$o&i(ia este satisf'#ut' da#' rela(ia de egalitate are lo#) [n ambele situa(ii variabila * trebuie s' fie LE56!6) Re(ine(i de#i #' o $ro$o&i(ie de forma 0 D 0 5 1 va e%ua ntotdeauna)

1<.

Predicatul =findall) 9determinarea tuturor /olutiilor;

Prolog ofer' o modalitate de a g'si toate solu(iile unui $redi#at n a#ela%i tim$+ $redi#atul findall" #are #ole#tea&' ntr4o list' toate solu(iile g'site) findall(arg1" arg9" argE) <#esta are urm'toarele argumente+

$rimul argument s$e#ifi#' argumentul din $redi#atul #onsiderat #are trebuie #ole#tat n list'> al doilea argument s$e#ifi#' $redi#atul de re&olvat> al treilea argument s$e#ifi#' lista n #are se vor #ole#ta solu(iile)

11.

Predicatul )not,

/inta,a $redi#atului not este urm'toarea+ not(subgoal(<rg1" )))" <rg0)) Predi#atul not reu%e%te atun#i #*nd subgoal4ul #are este argument al lui not nu $oate fi dovedit adev'rat) La#' subgoal4ul este a$elat #u variabile libere" 2urbo Prolog va emite mesaj de eroare+ :ariabilele L.J-R- 0U sunt autori&ate n not) /' remar#'m #' not este singurul $redi#at Prolog #are are #a argument un $redi#at Prolog) Le e,em$lu" fie se#ven(a+ $la#e(ilie" Mineva) +4 $la#e(mariana" Mineva)" not(ur'ste(ilie" Mineva))) <#est enun( este e#_ivalent #u+ lui .lie i $la#e de #ineva da#' %i Marianei i $la#e" %i da#a .lie nu l ur'%te) Le observat #'" la intrare" Mineva este variabil' liber'" dar la ie%irea din $rimul subgoal" Mineva este variabil' legat') <stfel" la intrarea n not" Mineva este legat" %i totul va fun#(iona bine) La#' se inversea&' ordinea #lau&elor" re&ultatul nu va mai fi #ore#t" deoare#e la intrarea n not Mineva va fi variabil' liber') Rolosirea variabilei anonime (F) n not n lo#ul lui Mineva tot nu va re&olva $roblema)

12. 1biecte /imple .i obiecte compu/e


1biecte /imple
Un obie#t sim$lu este fie o variabil'" fie o #onstant') O #onstant' este fie un #ara#ter" fie un num'r" fie un atom (simbol sau string)) :ariabilele Prolog sunt lo#ale" nu globale) <di#'" da#' dou' #lau&e #on(in fie#are #*te o variabil' numit' S" #ele dou' variabile sunt distin#te %i" de obi#ei" nu au efe#t una asu$ra #eleilalte)

1biecte compu/e /i functori

1biectele compu/e ne $ermit s' trat'm mai multe informa(ii #a $e un singur element" ntr4un astfel de mod n#*t s'4l $utem utili&a %i $e bu#'(i) Rie" de e,em$lu" data de 2 februarie 1998) Monst' din trei informa(ii" &iua" luna %i anul" dar e util s' o trat'm #a un singur obie#t #u o stru#tur' arbores#ent'+ L<2< O a I 9 februarie 199` <#est lu#ru se $oate fa#e s#riind obie#tul #om$us astfel+ data(9" AfebruarieB" 199`) <#easta seam'n' #u un fa$t Prolog" dar nu este de#*t un obie#t (o dat') $e #are l $utem manevra la fel #a $e un simbol sau num'r) Lin $un#t de vedere sinta#ti#" n#e$e #u un nume (sau functor" n a#est #a& #uv*ntul data) urmat de trei argumente) >ot. Run#torul n Prolog nu este a#ela%i lu#ru #u fun#(ia din alte limbaje de $rogramare) -ste doar un nume #are identifi#' un ti$ de date #om$use %i #are (ine argumentele laolalt') <rgumentele unei date #om$use $ot fi #_iar ele #om$use) .at' un e,em$lu+ na%tere($ersoana(A.oanB" APo$es#uB)" data(9" AfebruarieB" 191`))

?nificarea obiectelor compu/e


Un obie#t #om$us se $oate unifi#a fie #u o variabila sim$l'" fie #u un obie#t #om$us #are se $otrive%te #u el) Le e,em$lu" data(9" AfebruarieB" 199`) se $otrive%te #u variabila liber' S %i are #a re&ultat legarea lui S de data())))) Le asemenea" obie#tul #om$us de mai sus se $otrive%te %i #u data(Ui" Lu" <n) %i are #a re&ultat legarea variabilei Ui de valoarea 9" a variabilei Lu de valoarea AfebruarieB %i a variabilei <n de valoarea 199`)

#omenii cu alternati0e
.at' #um se s#riu in 2urboProlog de#lara(iile de domeniu #u alternative ($oate fi asemuit #u un ti$ enumerare)) domeniu D alternativa1(dom" dom" )))" dom)> alternativa9(dom" dom" )))" dom)> )))

<i#i" alternativa1" alternativa9" ))) sunt fun#tori" iar (dom" dom" )))" dom) re$re&int' o list' de nume de domenii #are sunt fie de#larate n alt' $arte" fie sunt domenii standard) 1b/er0a2ii) <lternativele sunt se$arate $rin #ara#terul $un#t4virgula (>)) Rie#are alternativ' #onst' dintr4un fun#tor %i o list' de domenii $entru argumentele fun#torului) La#' fun#torul nu are argumente" se $oate s#rie fie alternativa0" fie alternativa0()

6rgumente de tipuri multiple


2urbo Prolog nu $ermite o de#larare de domenii multi$le de genul domains varsta D integer> real> string Pentru a $utea o$era #u astfel de domenii" va trebui s' utili&'m fun#torii" #a n urm'torul e,em$lu+ domains varsta D i(integer)> r(real)> s(string)

1".

Predicatul @ 9cut; A )tietura,

2urbo Prolog #on(ine $redi#atul #ut (\) folosit $entru a $reveni ba#Xtra#Xing4ul) M*nd se $ro#esea&' $redi#atul \" a$elul reu%e%te imediat %i se tre#e la subgoalul urm'tor) O dat' #e s4a tre#ut $este o t'ietur'" nu este $osibil' revenirea la subgoal4urile $lasate naintea ei %i nu este $osibil ba#Xtra#Xing4ul la alte reguli #e defines# $redi#atul n e,e#u(ie) -,ist' dou' utili&'ri im$ortante ale t'ieturii+ 1) M*nd %tim dinainte #' anumite $osibilit'(i nu vor du#e la solu(ii" este o $ierdere de tim$ s' l's'm sistemul s' lu#re&e) [n a#est #a&" t'ietura se nume%te tietur 0erde) 9) M*nd logi#a $rogramului #ere o t'ietur'" $entru $revenirea lu'rii n #onsidera(ie a subgoal4 urilor alternative" $entru a evita ob(inerea de solu(ii eronate) [n a#est #a&" t'ietura se nume%te tietur ro.ie) Pre0enirea backtrackingBului la un /ubgoal anterior [n a#est #a& t'ietura se utili&ea&' astfel+ r1 +4 a" b" \" #)

<#easta este o modalitate de a s$une #' suntem multumi(i #u $rimele solu(ii des#o$erite #u subgoal4urile a %i b) Le%i 2urbo Prolog ar $utea g'si mai multe solu(ii $rin a$elul la #" nu este autori&at s' revin' la a %i b) Le4asemenea" nu este autori&at s' revina la alt' #lau&' #are define%te $redi#atul r1) Pre0enirea backtrackingBului la urmtoarea clauz

1!

2'ietura $oate fi utili&at' $entru a4i s$une sistemului 2urbo Prolog #' a ales #ore#t #lau&a $entru un $redi#at $arti#ular) Le e,em$lu" fie #odul urm'tor+ r(1) +4 \" a" b" #) r(9) +4 \" d) r(E) +4 \" e) r(F) +4 brite(=<i#i intr' resul a$elurilor=)) Rolosirea t'ieturii fa#e $redi#atul r determinist) <i#i" 2urbo Prolog a$elea&' $redi#atul r #u un argument ntreg) /' $resu$unem #' a$elul este r(1)) 2urbo Prolog #aut' o $otrivire a a$elului) O g'se%te la $rima #lau&') Ra$tul #' imediat du$' intrarea n #lau&' urmea&' o t'ietur'" m$iedi#' 2urbo Prolog s' mai #aute %i alte $otriviri ale a$elului r(1) #u alte #lau&e) 1b/er0a2ie. <#est ti$ de stru#tur' este e#_ivalent #u o instru#(iune de ti$ case unde #ondi(ia de test a fost in#lus' n #a$ul #lau&ei) La fel de bine s4ar fi $utut s$une %i r(S) +4 S D 1" \" a" b" #) r(S) +4 S D 9" \" d) r(S) +4 S D E" \" e) r(F) +4 brite(=<i#i intra restul a$elurilor=)) >ot) Le#i" urm'toarele se#ven(e sunt e#_ivalente+

#ase S of v1+ #or$1> v9+ #or$9> ))) else #or$Felse)

$redi#at(S) +4 S D v1" \" #or$1) $redi#at(S) +4 S D v9" \" #or$9) ))) $redi#at(S) +4 #or$Felse)

Le asemenea" urm'toarele se#ven(e sunt e#_ivalente+ if #ond1 t_en #or$1 else if #ond9 t_en #or$9 ))) else #or$Felse) $redi#at()))) +4 #ond1" \" #or$1) $redi#at()))) +4 #ond9" \" #or$9) ))) $redi#at()))) +4 #or$Felse)

1$.

Predicatul )fail,

:aloarea lui fail este e%e#) Prin a#easta el n#urajea&' ba#Xtra#Xing4ul) -fe#tul lui este a#ela%i #u al unui $redi#at im$osibil" de genul 9 D E) Rie urm'torul e,em$lu+ domains $arametru D s^mbol 11

$redi#ates $redi#at($arametru" $arametru) toate toate1 #lauses $redi#at(a" b)) $redi#at(#" d)) $redi#at(e" f)) toate +4 $redi#at(S" Q)" brite(S" A %i B" Q" AInB)" fail) toate1 +4 $redi#at(S" Q)" brite(S" A %i B" Q" AInB)) Reamintim #' 2urbo Prolog va r's$unde la un goal intern #u $rima solu(ie" iar la un goal e,tern #u toate solu(iile) Lar" $redi#atele toate %i toate1 sunt f'r' $arametri" %i #a atare sistemul va trebui s' r's$und' da#' e,ist' vre4un S %i Q astfel n#*t a#este $redi#ate s' aib' lo#) R's$unsul la un goal intern toate1) va fi a %i b Qes iar r's$unsul la un goal intern toate) va fi a %i b # %i d e %i f 0o Ra$tul #' a$elul $redi#atului toate se termin' #u fail (#are e%uea&' ntotdeauna) oblig' 2urbo Prolog s' n#ea$' ba#Xtra#Xing $rin #or$ul regulii toate) Prolog va reveni $*n' la ultimul a$el #are $oate oferi mai multe solu(ii) Un astfel de a$el se nume%te a$el nedeterminist) Predi#atul Crite nu $oate da alte solu(ii" de#i revine la a$elul lui predicat) 1b/er0a2ie) <#el >o de la sf*r%itul solu(iilor semnifi#' fa$tul #' $redi#atul toate nu a fost satisf'#ut) Pre&ent'm in tabelul de mai jos solutiile ra$ortate de toate" toate1" si predicat la goal intern" res$e#tiv e,tern) Goal intern a %i b 19 Goal e,tern a %i b

toate

toate1

# %i d e %i f 0o a %i b Qes

$redi#at

a %i b Qes

# %i d e %i f 0o a %i b # %i d e %i f Qes a %i b # %i d e %i f Qes

1b/er0a2ie) Lu$a fail nu are rost s' $une(i ni#i un $redi#at" deoare#e Prolog nu va ajunge s'4l e,e#ute ni#iodat') >ot. /e#ven(ele urm'toare sunt e#_ivalente+ #*t tim$ condiie e,e#ut' corp $redi#at +4 condiie" corp" fail)

1%.

1ptimizarea prin recur/i0itate de coad 9tail recur/ion;

Re#ursivitatea are o mare $roblem'+ #onsum' mult' memorie) La#' o $ro#edur' se re$et' de 1!! ori" 1!! de stadii diferite ale e,e#u(iei $ro#edurii (#adre de stiv') sunt memorate) Memoria unui #om$uter .JM PM $ermite #*teva mii de astfel de #adre) 2otu%i" e,ist' un #a& s$e#ial #*nd o $ro#edur' se a$elea&' $e ea far' s' genere&e #adru de stiv') La#' $ro#edura a$elatoare a$elea&' o $ro#edur' #a ultim $as al sau (du$' a#est a$el urmea&' $un#tul)) M*nd $ro#edura a$elat' se termin'" $ro#edura a$elatoare nu mai are alt#eva de f'#ut) <#easta nseamn' #' $ro#edura a$elatoare nu are sens s'4%i memore&e stadiul e,e#u(iei" deoare#e nu mai are nevoie de a#esta)

7unc2ionarea recur/i0it2ii de coad .at' dou' reguli de$re #um s' fa#e(i o re#ursivitate de #oad'+ 1) <$elul re#ursiv este ultimul subgoal din #lau&a res$e#tiv') 9) 0u e,ist' $un#te de ba#Xtra#Xing mai sus n a#ea #lau&' (adi#'" subgoal4urile de mai sus sunt deterministe))

1E

.at' un e,em$lu+ $redi#ates ti$(real) goal ti$(1)) #lauses ti$(0) +4 brite(0)" nl" 0ou D 0 K 1" ti$(0ou)) <#east' $ro#edur' folose%te re#ursivitatea de #oad') 0u #onsum' memorie" %i nu se o$re%te ni#iodat') -ventual" din #au&a rotunjirilor" de la un moment va da re&ultate in#ore#te" dar nu se va o$ri)

Exemple gre.ite de recur/i0itate de coad .at' #ateva reguli des$re #um s' 0U fa#e(i o re#ursivitate de #oad'+

1) La#' a$elul re#ursiv nu este ultimul $as" $ro#edura nu folose%te re#ursivitatea de #oad')

-,em$lu+ ti$ (0) +4 brite(0)" nl" 0ou D 0 K 1" ti$ (0ou)" nl)

9) Un alt mod de a $ierde re#ursivitatea de #oad' este de a l'sa o alternativ' nen#er#at' la momentul a$elului re#ursiv)

-,em$lu+ ti$(0) +4 brite(0)" nl" 0ou D 0 K 1" ti$(0ou)) ti$(0) +4 1T

0 V !" brite(=0 este negativ)=)) <i#i" $rima #lau&' se a$elea&' nainte #a a doua s' fie n#er#at') Lu$' un anumit num'r de $a%i intr' n #ri&' de memorie)

E) <lternativa nen#er#at' nu trebuie nea$arat s' fie o #lau&a se$arat' a $ro#edurii re#ursive) Poate s' fie o alternativ' a unei #lau&e a$elate din interiorul $ro#edurii re#ursive) -,em$lu+ ti$ (0) +4 brite(0)" nl" 0ou D 0 K 1" verif(0ou)" ti$(0ou)) verif(U) +4 U WD !) verif(U) +4 U V !) La#' 0 este $o&itiv" $rima #lau&' a $redi#atului 0erif a reu%it" dar a doua nu a fost n#er#at') Le#i" tip trebuie s'4%i $astre&e o #o$ie a #adrului de stiv')

?tilizarea tieturii pentru p/trarea recur/i0it2ii de coad < doua %i a treia situa(ie de mai sus $ot fi nl'turate da#' se utili&ea&' t'ietura" #_iar da#' e,ist' alternative nen#er#ate) -,em$lu la situa(ia a doua+ ti$ (0) +4 0WD !" \" brite(0)" nl" 0ou D 0 K 1" ti$(0ou)) ti$(0) +4 0 V !" brite(=0 este negativ)=)) -,em$lu la situa(ia a treia+ ti$(0) +4 brite(0)" nl" 0ou D 0 K 1" verif(0ou)" \" 1Y

ti$(0ou)) verif(U) +4 U WD !) verif(U) +4 U V !)

1]