13.04.2013 Views

limbajul prolog - Facultatea de Electrotehnică şi Electroenergetică

limbajul prolog - Facultatea de Electrotehnică şi Electroenergetică

limbajul prolog - Facultatea de Electrotehnică şi Electroenergetică

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Cursul 3<br />

LIMBAJUL PROLOG<br />

• operații aritmetice <strong>şi</strong>relaționale<br />

• <strong>de</strong>terminism <strong>şi</strong> ne<strong>de</strong>terminism în bazele <strong>de</strong> cunoştințe<br />

• operatii <strong>de</strong> citire / scriere<br />

• operații p ț cu <strong>şi</strong>ruri ş <strong>de</strong> caractere<br />

ȘȘ.l.dr.ing. ldring Ioan BORLEA BORLEA– <strong>Facultatea</strong> <strong>de</strong> <strong>Electrotehnică</strong> <strong>şi</strong> <strong>Electroenergetică</strong> Timişoara


OPERAȚII ARITMETICE ŞI RELAȚIONALE<br />

Expresiile aritmetice<br />

Sunt formate din numere <strong>şi</strong> variabile <strong>de</strong>spărțite prin operatori<br />

aritmetici: + , ‐ , * , mod , div , / .<br />

Expresiile aritmetice pot să fie sau să nu <strong>de</strong>limitate <strong>de</strong> paranteze.<br />

RRegulile lil <strong>de</strong> d evaluare l a expresiilor iil aritmetice it ti respectă tă convențiile țiil standard t d d<br />

referitoare la evaluarea operanzilor <strong>şi</strong> parantezelor.<br />

Expresii relaționale<br />

Se pot compara expresii aritmetice aritmetice, caractere caractere, <strong>şi</strong>ruri <strong>şi</strong> respectiv simboluri simboluri.<br />

Operatorii relaționali sunt: < , > , = , sau >< , = .


O clauză <strong>de</strong> forma:<br />

Egalitatea g <strong>şi</strong> ş ppredicatul egal g „=” „<br />

N = N1 - 2<br />

• indică o relaţie ţ între trei obiecte adică N, N1 ş<strong>şi</strong><br />

valoarea 2,<br />

• sau o relaţie între două obiecte adică N <strong>şi</strong> valoarea N1 - 2.<br />

• Dacă N este o variabilă liberă atunci primeşte valoarea <strong>de</strong>finită <strong>de</strong> obiectul<br />

N1 – 2 adică operaţia este similară cu atribuirea.<br />

• Daca N este o variabilă legată atunci egalitatea este ca <strong>şi</strong> o comparare a<br />

celor două (sau trei) obiecte, rezultatul fiind<br />

• Yes dacă N=N1 N = N1 - 2sau 2 sau<br />

• No dacă N N1 – 2; în operaţia <strong>de</strong> comparare se ţine cont <strong>de</strong><br />

domeniul la care aparţine p ţ variabila respectivă. p


EExemplu l 1: 1 CConstruiți t ițio procedură d ă care să ă calculeze l l numărul ă l d<strong>de</strong><br />

elemente ale unei liste.<br />

Predicatul este <strong>de</strong> forma: nr ( lista , nr nr_elemente) elemente)<br />

Regulile <strong>de</strong> construcție pornesc <strong>de</strong> la două observații:<br />

lungimea unei liste vi<strong>de</strong> este 0;<br />

dacă lista nu este vidă, lungimea este dată <strong>de</strong><br />

‐ 1 (lungimea capului listei) +<br />

‐ lungimea cozii listei listei.<br />

predicates<br />

nr(lista, ( , nr) )<br />

clauses<br />

nr ( [ ], 0).<br />

nr ( [ _ | Rest ], N) if<br />

nr ( Rest, N1),<br />

N=1+N1.<br />

Exemplu <strong>de</strong> apelare: nr( [ a,b,c], R) rezultă R=3.


Exemplu p 2: Construiți ț o pprocedură<br />

care să <strong>de</strong>termine elementul<br />

maxim al unei liste.<br />

Consi<strong>de</strong>răm un predicat <strong>de</strong> forma:<br />

maxim(lista, ( elem_maxim). )<br />

Procedura rezultă din observațiile:<br />

dacă lista este formată dintr‐un singur element, atunci maxim este chiar<br />

elementul respectiv;<br />

în caz contrar maximul se obține prin compararea capului listei cu maximul cozii<br />

listei.<br />

predicates<br />

maxim(lista, integer) % lista <strong>şi</strong> elementul maxim rezultat<br />

max(integer, integer, integer) % elementele listei care se compară <strong>şi</strong><br />

clauses<br />

maxim ( [X] , X).<br />

maxim ( [X | Rest], Maxim) if<br />

maxim (Rest, Max_Rest),<br />

max ( X, Max_Rest, Maxim).<br />

max ( A, B, A) if A>=B.<br />

max ( AA, BB, B) if A


EExemplu l 3: 3 CConstruiti t itio procedură d ă care să ă dt <strong>de</strong>termine i c.m.m.d.c d di dintre t 2<br />

valori numerice X <strong>şi</strong> Y<br />

Consi<strong>de</strong>răm un predicat <strong>de</strong> forma: cmmdc(x cmmdc(x, yy, rezultat) rezultat).<br />

Se pleacă <strong>de</strong> la consi<strong>de</strong>rațiile:<br />

‐ Dacă X=Y cmmdc este oricare dintre cele două<br />

‐ Dacă X>Y cmmdc se obține dintre X <strong>şi</strong> X‐Y<br />

‐ Dacă XY, , X1=X‐Y, , cmmdc( ( X1, , Y, , R). )<br />

cmmdc( X, Y, R) if X


DETERMINISM ŞI NEDETERMINISM<br />

ÎN BAZELE DE CUNOŞTINȚE<br />

Modul <strong>de</strong> acțiune al elementului <strong>de</strong> tăiere ” ! ”<br />

Elementul <strong>de</strong> tăiere (cut ‐ !) are rolul <strong>de</strong> a prevenii acțiunea mecanismului <strong>de</strong> căutare a<br />

soluțiilor (backtracking) în arbore <strong>de</strong> soluțiilor prin impiedicarea parcurgerii anumitor<br />

ramuri ramuri.<br />

Consi<strong>de</strong>răm o regulă <strong>de</strong> forma :<br />

H if B1, , B2, , ... , Bm, , ! , Bm+1, , ... ,<br />

Bn.<br />

Prin mecanismul <strong>de</strong> căutare în intervalul premizelor B1 ... Bm se presupune că s‐a găsit o<br />

soluție.<br />

In momentul atingerii elementului <strong>de</strong> tăiere (!) soluția parțială găsită este „înghețată”,<br />

operația fiind echivalentă cu ştergerea pointerilor <strong>de</strong> pe clauzele B1...Bm <strong>de</strong>ja parcurse.<br />

Căutarea continuă pentru premizele Bm+1 Bm+1, ... , Bn în care sunt permise toate soluțiile<br />

posibile. Cu alte cuvinte spațiul soluțiilor este format din soluția <strong>de</strong>finită <strong>de</strong> B1, ... , Bm <strong>şi</strong><br />

variantele oferite <strong>de</strong> Bm+1, ... Bn.<br />

Elementul <strong>de</strong> tăiere î<strong>şi</strong> e tin<strong>de</strong> acțiunea si pentru clau ele cu acela<strong>şi</strong> nume (H) care urmea ă<br />

Elementul <strong>de</strong> tăiere î<strong>şi</strong> extin<strong>de</strong> acțiunea si pentru clauzele cu acela<strong>şi</strong> nume (H) care urmează<br />

după aceea în care este prezent.


Exemplu teoretic:<br />

H if P, Q, R, !, S, T, U. % Regula care conține !.<br />

H if U, V . % Aceasta regulă nu se mai execută dacă<br />

pentru prece<strong>de</strong>nta s‐a găsit cel puțin o soluție.<br />

A if B B, H, H C. C % Nu Nu se mai poate întoarce pentru B dacă pentru H H<br />

s‐a găsit o soluție.<br />

REGULI DE AMPLASARE A LUI „!”<br />

1. Elementul <strong>de</strong> tăiere se amplasează pe axioma care implementează întrebarea<br />

pusă adică:<br />

sterge(X, [X| R], R) if ! .<br />

2. Se utilizează opțiunea CHECK_DETERM (verificarea <strong>de</strong>terminismului), care se<br />

amplasează în fața programului sub forma:<br />

check_<strong>de</strong>term


Construirea regulilor IF THEN ELSE<br />

Elementul <strong>de</strong> tăiere (!) poate fi utilizat în Prolog pentru construirea unor reguli <strong>de</strong><br />

tipul if then else sub forma:<br />

a) ) Construiti o procedura: p max (x, (,y, y, maxim). )<br />

În limbaj natural avem<br />

if X>=Y then MAX=X else MAX=Y.<br />

Regula poate fi scrisă:<br />

max (X, Y, X) if X>=Y. % adică X este maxim este a<strong>de</strong>vărat<br />

max (X, Y, Y) if X=Y , ! . % X este maxim <strong>şi</strong> ! (nu mai căuta altă soluție)<br />

max ( _ ,Y,Y). % dacă nu s‐a în<strong>de</strong>plinit prima clauză<br />

atunci atunci YY este maxim automat


) Construiti o procedură care să asigure adunarea unui element X la o listă L numai<br />

dacă X nu este prezent în L; în acest caz X <strong>de</strong>vine capul listei.<br />

aduna(Elem, Lista, Rezultat)<br />

În limbaj natural regula se scrie:<br />

if Elem apartine Lista<br />

then Rezultat = Lista<br />

else Rezultat = [Elem | Lista]<br />

Secvența <strong>de</strong> priogram se scrie:<br />

aduna(X , L, L) if apartine (X, L), ! .<br />

aduna(X, L, [X | L]).<br />

Exemple:<br />

aduna (2, [1, 3], R) rezultatul este R=[2, 1, 3]<br />

aduna d ( (3 , [ [1, X ,4] ] ,R) R) rezultatul lt t l este t X X=3 <strong>şi</strong> i R R=[1, [ 3, 4]<br />

]


C) Construiți o procedură care să permită clasificarea concurenților dintr‐un turneu<br />

<strong>de</strong> tenis în 3 categorii <strong>de</strong>finite astfel:<br />

‐ categoria câştigător dacă jucătorul i‐a bătut pe toți cei cu care a jucat;<br />

‐ categoria luptător dacă jucătorul a câştigat <strong>şi</strong> a pierdut jocuri;<br />

‐ categoria i sportiv i ddacă ă jjucătorul ă l a pierdut i d toate meciurile. i il<br />

if X bate pe cineva and X este batut <strong>de</strong> altcineva<br />

then X este luptator p<br />

else if X bate pe cineva<br />

then X este cistigator<br />

else if X primeste bataie <strong>de</strong> la toti<br />

then X este sportiv.<br />

predicates<br />

clasa (nume_sportiv, categoria)<br />

clauses<br />

clasa (X, luptator) if<br />

b bate_pe(X, (X _), ) bate_pe( b ( _ , X) X), ! !.<br />

clasa (X, cistigator) if bate_pe(X, _), !.<br />

clasa (X, sportiv) if bate_pe( _, X).


Implementarea negației in Prolog<br />

1. Se utilizează predicatele pre<strong>de</strong>finite: cut (!) , fail sau true.<br />

2 2. Se utilizează predicatul not not.<br />

Exemplul:<br />

Fie următoarea afirmație: Lui Tom îi plac animalele cu excepția pisicilor.<br />

ii_place (proprietar, animal)<br />

animal(nume ( _ animal) )<br />

afirmația anterioara se scrie în <strong>prolog</strong> astfel:<br />

ii_place(tom, p X) if X=pisica p , !, fail. % spune p ca pproprietatea p este falsă<br />

ii_place(tom, X) if animal(X). % lui Tom îi place orice animal diferit<br />

<strong>de</strong> pisică<br />

Secventa mai poate fi scrisă compactat <strong>şi</strong> sub forma:<br />

ii_place(tom, X) if<br />

X=pisica, ii ! , fail fil ;<br />

animal=X .


Cap. 7 OPERATII DE CITIRE / SCRIERE (I/O)<br />

Scrierea<br />

Predicatul <strong>de</strong> scriere prezintă sintaxa:<br />

write(arg1, ... ,argn)<br />

în care argumentele pot fi constante sau variabile legate ce aparțin unor<br />

domenii standard sau <strong>de</strong>finite <strong>de</strong> programator.<br />

În interiorul <strong>şi</strong>rului <strong>de</strong> caractere care pot fi afisate pe ecran ecran, sunt acceptate<br />

următoarele caractere <strong>de</strong> control:<br />

\n –scrie pe linie nouă, \t – tabulator,<br />

\r –enter, \nnn –scrie caracterul cu codul ASCII nnn.<br />

Exemplu: write ("\t Lista1 = ", L1, "\ n \ t Lista2 = ", L2)<br />

Lista1 = [ ] Lista2 = [1, 2]


Citirea<br />

Citirea dateleor <strong>de</strong> la tastatură este realizată <strong>de</strong> următoarele predicate:<br />

readint(X) ‐ citirea variabilelor <strong>de</strong> tip întreg;<br />

readreal(X) ‐ citirea variabilelor din domeniul real.<br />

readln(X) ( ) ‐ citirea variabilelor din domeniul symbol y sau string; g<br />

readchar(X) ‐ citirea caracterelor.<br />

readint , readreal și readln ‐ operația <strong>de</strong> citire se termină în momentul<br />

readint , readreal și readln operația <strong>de</strong> citire se termină în momentul<br />

apăsării tastei enter<br />

redachar ‐ este întot<strong>de</strong>auna un succes;


Exemple p pentru p citire<br />

1. Citirea termenilor unei liste <strong>de</strong> intregi:<br />

domains<br />

lista=integer *<br />

predicates<br />

citeste(lista)<br />

clauses<br />

citeste([E |Rest]) if<br />

write("Element="),<br />

write( Element ),<br />

readint(E),<br />

citeste(Rest).<br />

citeste( ( [ ] ] ). ) { {citirea se termină<br />

cu elementul vid}<br />

goal<br />

citeste(L), write(L).<br />

domains<br />

lista=integer *<br />

predicates<br />

citeste(lista, lista)<br />

clauses<br />

citeste(L1, L2) if<br />

write("Element="),<br />

readint(E), E0,<br />

L1nou=[E| L1],<br />

citeste(L1nou, L2).<br />

citeste(L, ( L). ) { {citirea se termină cu 0} }<br />

goal<br />

citeste( i ([ [ ] , L) L), write(L).<br />

i (L)


22. Specificați setul <strong>de</strong> clauze care să asigure citirea unei liste a căror elemente<br />

sunt obiecte compuse <strong>de</strong> forma: persoana = p(nume, prenume, vârstă)<br />

domains<br />

nume, prenume = symbol<br />

persoana = p( nume, prenume, integer)<br />

lista = persoana *<br />

predicates<br />

citesc(lista)<br />

citeste(persoana)<br />

clauses<br />

citeste( p( N, P, V)) if<br />

nl,<br />

write("Nume="),readln( N ),<br />

write("Prenume="), readln( P ),<br />

write("Virsta="), readint( V ),<br />

nl.<br />

citesc( ( [E|R]) ) if<br />

citeste( E ),<br />

citesc( R ).<br />

citesc( [ ] ).


OPERAȚII CU ŞIRURI DE CARACTERE<br />

Operatii <strong>de</strong> divizare / compunere a unui <strong>şi</strong>r<br />

A. La nivelul unui caracter:<br />

frontchar(Sir, Elem, Rest_sir)<br />

Exemplu:<br />

frontchar( "Radu Dan Ion", E, R) % varianta (i,o,o):<br />

EE= 'R' R , R = "adu adu Dan Ion" Ion<br />

1 solution<br />

Varianta (o (o,i,i) i i) recompune <strong>şi</strong>rul, <strong>şi</strong>rul alte moduri <strong>de</strong> lucru: (i (i,o,i), o i) (iio) (i,i,o), (iii) (i,i,i).<br />

B. La nivelul unui element al <strong>şi</strong>rului:<br />

fronttoken(Sir, Elem, Rest Rest_sir) sir)<br />

Exemplu:<br />

fronttoken( ( "12 Dan Ion", , E, , R) ) % varianta (i,o,o) (, , )<br />

E="12", R ="Dan Ion"<br />

1 solution


Construiți o procedură care să <strong>de</strong>sfacă un <strong>şi</strong>r în elemente componente<br />

a) la nivel <strong>de</strong> caracter si b) la nivel <strong>de</strong> element <strong>de</strong> <strong>şi</strong>r<br />

ddomains i<br />

lista= char*<br />

predicates<br />

<strong>de</strong>sfac(string, lista)<br />

domains<br />

elem= string<br />

lista= lista elem* elem<br />

predicates<br />

<strong>de</strong>sfac(string, lista)<br />

clauses<br />

clauses<br />

<strong>de</strong>sfac("", []).<br />

<strong>de</strong>sfac( ( S, , [ [E| | Lista]) ]) if<br />

<strong>de</strong>sfac(S, [C| Lista]) if<br />

fronttoken( S, E, Rest),<br />

frontchar(S, C, Rest_s),<br />

<strong>de</strong>sfac( Rest, Lista), !.<br />

<strong>de</strong>sfac(Rest <strong>de</strong>sfac(Rest_s, s Lista), Lista) !. ! d<strong>de</strong>sfac( f ( _, [ ]) ]).


Comenzi <strong>şi</strong> operații <strong>de</strong> <strong>de</strong>terminare a tipului <strong>de</strong> domeniu<br />

char_int(char, integer) ‐ converteşte un caracter în valoarea ASCII (i,o) sau invers (o, i),<br />

sau verifica egalitatea dintre codul caracterului si întreg (i, i)<br />

str_char(string, char) ‐ converteşte un caracter într‐un <strong>şi</strong>r (o, i), sau un <strong>şi</strong>r cu un singur<br />

caracter într‐un caracter (i, o)<br />

str str_int(string, int(string, integer) ‐ converteşte un <strong>şi</strong>r numeric într‐un într un întreg (i, o) sau invers (o, i) sau<br />

verifică corespon<strong>de</strong>nta dintre cele două<br />

str_real(string, real) ‐ similar cu str_int, pentru numere reale<br />

isname(string) ‐ verifică dacă variabila este un nume (începe cu o litera <strong>şi</strong><br />

continua cu cifre sau litere)<br />

Operatii auxiliare<br />

str_len(string, integer) - <strong>de</strong>termină lungimea <strong>şi</strong>rului (i, o) sau o verifică (i, i)<br />

frontstr(integer, string, string, string) - împarte primul <strong>şi</strong>r în două, primul având lungimea<br />

dată <strong>de</strong> întreg; poate fi folosit numai ca (i, i, o, o).<br />

concat(string, string, string) - concatenează primele două <strong>şi</strong>ruri în al treilea;<br />

numai (i, i, o).


Construiți o procedură care să <strong>de</strong>termine tipurile <strong>de</strong> elemente din care<br />

este t alcătuit l ăt itun <strong>şi</strong>r: i alcătuit("12 l ăt it("12 a beta", bt"R) R)<br />

R=[nr(12), car('a'), nume("beta")]<br />

domains<br />

element = nr(integer); car(char); nume(string)<br />

lista = element*<br />

predicates<br />

alcatuit(string, lista) % <strong>de</strong>sface sirul in elementele componente<br />

este(string este(string, element) % <strong>de</strong>terminarea tipului<br />

clauses<br />

este(E, ( , nr(N)) ( )) if str_ int(E,N). ( , )<br />

este(E, car(C)) if str_char(E,C).<br />

este(E, nume(E)) if isname(E).<br />

alcatuit(Sir, [Tip | L ]) if<br />

fronttoken(Sir, E, Restsir),<br />

este(E, Tip), alcatuit(Restsir, L), !.<br />

alcatuit(_,[]).


Exemplu: Construiți o procedura care să permită o analiză gramaticală simplă pentru propoziții simple <strong>de</strong><br />

forma: "Tom Tom is a cat cat" .<br />

Pentru a <strong>de</strong>tecta <strong>şi</strong> stabili predicatele se porneşte <strong>de</strong> la analiza gramaticală a propozițiilor <strong>de</strong> forma:<br />

analizeaza ( "Tom is a cat", R)<br />

R= structura(substantiv("Tom"), expe_verb("is", expr_substantivala("a", "cat")))<br />

analizeaza (“ is a cat”), R)<br />

R = structura(predicat( structura(predicat("is") is ), expr expr_substantivala( substantivala("a" a , "cat")) cat ))<br />

analizeaza ( "a cat", R)<br />

R = structura(articol("a"), substantiv("cat"))


Analizor gramatical<br />

domains<br />

subst, pred, art = string<br />

e_subst = s(subst); e_subst (art, subst)<br />

e_verb b = p(pred); ( d) e_verb b (pred, ( d e_subst) b )<br />

propozitie = structura (e_subst, e_verb)<br />

predicates pedcates<br />

analizeaza(string, propozitie)<br />

este_e_subst(string, string, e_subst)<br />

este_e_verb(string, e_verb)<br />

a(art) ( t)<br />

s(subst)<br />

p(pred)<br />

clauses<br />

analizeaza(Sir, structura(S_exp, V_exp)) :‐<br />

este_e_subst(Sir, Rest, S_exp),<br />

este_e_verb(Rest, t b(R t V V_exp). )<br />

a("the"). a("a").<br />

s("Tom"). ( ) s("Bill"). ( ) s("dog"). ( g ) s("cat"). ( )<br />

p("is"). p("has").<br />

este_e_subst(Sir, Rest, e_subst(Art, Subst)):‐<br />

fronttoken(Sir, o tto e (S , Art,Rest1), t, est ),<br />

a(Art),<br />

fronttoken(Rest1, Subst, Rest),<br />

s(Subst).<br />

este_e_subst(Str, t b t(St RRest, t s(Subst)):‐ (S b t))<br />

fronttoken(Str, Subst, Rest),<br />

s(Subst).<br />

este_e_verb(Str, e_verb(Pred, S_exp)):‐<br />

fronttoken(Str, Pred, Rest1),<br />

p(Pred),<br />

este_e_subst(Rest1,"",S_exp).<br />

t b t(R t "" S )<br />

este_e_verb(Str, p(Pred)):‐<br />

fronttoken(Str, Pred, ""),<br />

p(Pred). p( )


Exemplu: Construiți o procedură care asigure împărțirea în silabe a unui cuvânt.<br />

Reguli <strong>de</strong> <strong>de</strong>spartire:<br />

a) la o secvență <strong>de</strong> tipul vocală ‐ consoană ‐ vocală, împărțirea se face după prima vocală:<br />

(<strong>prolog</strong>‐> pro‐log)<br />

(regula‐> re‐gula)<br />

b) lla o secvență ă d<strong>de</strong> tipul i lvocală lă ‐ consoană ă ‐ consoană ă ‐ vocală, lă împărțirea î ă i se face f între î cele l<br />

două consoane (turbo ‐> tur‐bo)<br />

c) excepțiile se exclud<br />

domains /* structura <strong>de</strong> tip sir <strong>de</strong> caractere a unui cuvânt */<br />

litera = char<br />

cuvant = litera litera* % sirul <strong>de</strong> caractere este <strong>de</strong>spărtit în literele componente<br />

predicates<br />

repeta /* asigură repetarea */<br />

vocala(litera) /* distingerea între vocală‐consoană */<br />

consoana(litera)<br />

sir_cuvant(string, cuvant) /* transformarea unui <strong>şi</strong>r în lista <strong>de</strong> caractere <strong>şi</strong> invers */<br />

divi<strong>de</strong>(cuvant divi<strong>de</strong>(cuvant, cuvant cuvant, cuvant, cuvant cuvant) /* / impartirea în silabe */ /<br />

/* divi<strong>de</strong>(caractere prelucrate, rest <strong>de</strong> prelucrat, silaba 1, silaba 2)*/<br />

clauses<br />

vocala('a'). vocala('e'). vocala('i').<br />

vocala('o'). vocala('u'). vocala('y').<br />

consoana(C) if not(vocala(C)), C>= 'a', C


clauses<br />

sir_cuvant("", [ ] ).<br />

sir_cuvant(S, _ ( ,[ [C| | Lista]):‐ ])<br />

frontchar(S, C, Rest_sir),<br />

sir_cuvant(Rest_sir, Lista).<br />

di divi<strong>de</strong>(Inceput, i<strong>de</strong>(Inceput [L1 [L1, L2 L2, L3| Rest] Rest], Silaba1, Silaba1 [ L2 L2, L3| Rest]) :‐<br />

vocala(L1), consoana(L2), vocala(L3),<br />

conc(Inceput, [L1], Silaba1).<br />

divi<strong>de</strong>(Inceput, ( p [ [L1, L2, L3,L4| 3 4| Rest], ] Silaba1, [ [L3,L4| 3 4| Rest]) ]) if<br />

vocala(L1), consoana(L2), consoana(L3), vocala(L4),<br />

conc(Inceput, [L1, L2], Silaba1).<br />

divi<strong>de</strong>(Inceput, [Litera| Rest], Sil1, Sil2) if<br />

conc(Inceput conc(Inceput, [Litera], [Litera] Prelucrat) Prelucrat),<br />

divi<strong>de</strong>(Prelucrat, Rest, Sil1, Sil2), !.<br />

divi<strong>de</strong>( _, [ ], [], []).<br />

repeta.<br />

repeta:‐ repeta.<br />

goal /* citeşte cuvinte <strong>şi</strong> le <strong>de</strong>sparte în silabe */<br />

goal /* citeşte cuvinte <strong>şi</strong> le <strong>de</strong>sparte în silabe */<br />

repeta, write("cuvant = "), readln(C),<br />

sir_cuvant(C, Lista_car),<br />

divi<strong>de</strong>( [ ] , Lista_car, S1, S2),<br />

sir_cuvant(Sil1, S1), sir_cuvant(Sil2, S2),<br />

write(Sil1, "‐", Sil2), nl, fail.


UUrmează ă cursul l4! 4 !

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!