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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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!