13.04.2013 Views

Exemplu - Facultatea de Electrotehnică şi Electroenergetică

Exemplu - Facultatea de Electrotehnică şi Electroenergetică

Exemplu - 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.

Universitatea “Politehnica” din Timişoara<br />

<strong>Facultatea</strong> <strong>de</strong> <strong>Electrotehnică</strong> <strong>şi</strong> Electroenergtică<br />

Departamentul <strong>de</strong> <strong>Electroenergetică</strong><br />

PROLOG<br />

și<br />

Elemente lemente <strong>de</strong> inteligenţă artificială<br />

Curs 5<br />

• OPERATII DE CITIRE / SCRIERE (I/O)<br />

• OPERAŢII Ţ CU ŞIRURI Ş DE CARACTERE<br />

Curs Anul 3 <strong>Electroenergetică</strong><br />

Titular disciplină: Ş.l.dr.ing. Ioan BORLEA


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

(I/O)<br />

Scrierea<br />

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

write(arg1, it ( 1 ... ,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,<br />

sunt acceptate<br />

următoarele u ătoaeecaactee<strong>de</strong>co caractere <strong>de</strong> control: to<br />

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

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

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

rezultă Lista1 = [ [] ]<br />

Lista2 = [1, 22]


Scrierea cu format:<br />

writef(formatstring, argument)<br />

în care formatstring poate conține codurile:<br />

Cod semnificatie


Citirea<br />

Citirea este realizată <strong>de</strong> următoarele predicate p ppre<strong>de</strong>finite:<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 sau string;<br />

readchar(X) - citirea caracterelor<br />

caracterelor.<br />

readterm(domain, X) – citirea variabilelor cu domeniul precizat<br />

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

momentul apăsării tastei enter după introducerea numărului dorit;<br />

tastarea enter fără vreun carater numeric conduce la eșec (fail). (fail)<br />

redachar - este întot<strong>de</strong>auna un succes (citește doar un caracter);


Exemple<br />

1. Construți o procedură care să citească <strong>de</strong> la tastaură numere întregi și<br />

să construiască o listă cu acestea.<br />

domains<br />

lista=integer g *<br />

predicates<br />

citeste(lista)<br />

domains<br />

lista=integer g *<br />

predicates<br />

citeste(lista, lista)<br />

clauses<br />

clauses<br />

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

citeste(L1, L2) if<br />

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

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

it ("El t ")<br />

readint(E),<br />

readint(E), E0,<br />

citeste(Rest).<br />

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

citeste( it t ( [ ] ) ). {% {%citirea iti se ttermină i ă<br />

citeste(L1nou, it t (L1 L2) L2).<br />

cu elementul vid}<br />

goal<br />

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

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

goal<br />

citeste( [ ] , L), write(L).


22. Construiţi o procedură care să asigure scrierea unei liste cu elemente<br />

numere întregi pe rânduri succesive, fiecare rând având 3 elemente.<br />

domains<br />

lista = integer*<br />

predicates<br />

scrie(lista)<br />

scrie_rind(lista, i i d(li t iinteger) t )<br />

clauses<br />

scrie (L) if<br />

write(„ \ n ”),<br />

scrie_rind(L, 0).<br />

scrie_rind ( [ ], _ ). % oprirea procesului<br />

recursiv<br />

scrie_rind (L, 3) if<br />

write(„\n”),<br />

scrie scrie_rind(L, rind(L 0) 0).<br />

scrie_rind ([E|Rest], N) if<br />

write(" write( "E) ,E),<br />

N1=N+1,<br />

scrie_rind(Rest, N1).


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

elemente sunt obiecte compuse <strong>de</strong> forma:<br />

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( [ ] ).


Cap. 8 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 />

<strong>Exemplu</strong>: p<br />

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

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

1 solution<br />

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

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

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

E<strong>Exemplu</strong>: l<br />

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

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

1 solution l ti<br />

Prezintă acelea<strong>şi</strong> moduri <strong>de</strong> lucru ca si frontchar.


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

componente: t<br />

a) la nivel <strong>de</strong> caracter si<br />

b) la nivel <strong>de</strong> element <strong>de</strong> <strong>şi</strong>r.<br />

% <strong>de</strong>scompunerea la nivel <strong>de</strong> caracter % <strong>de</strong>scompunerea la nivel <strong>de</strong> șir<br />

domains<br />

lista= char*<br />

predicates<br />

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

clauses<br />

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

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

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

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

domains<br />

elem= string<br />

lista= elem*<br />

predicates<br />

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

clauses<br />

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

fronttoken( SS, EE, Rest) Rest),<br />

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

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


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

char char_int(char, int(char integer) - con converteşte erteşte un n caracter în valoarea aloarea ASCII (i (i,o) o)<br />

sau invers (o, i), sau verifica egalitatea dintre<br />

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<br />

<strong>şi</strong>r cu un singur caracter într-un caracter (i, o)<br />

str_int(string, integer) - converteşte un <strong>şi</strong>r numeric într-un întreg (i, o)<br />

sau invers (o, i) sau verifică corespon<strong>de</strong>nta<br />

dintre cele două<br />

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

isname(string) - verifică dacă variabila este un nume (începe<br />

cu o litera <strong>şi</strong> continua cu cifre sau litere)


Operatii auxiliare cu șiruri <strong>de</strong> caractere<br />

str_len(string, integer)<br />

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

frontstr(integer, string, string, string)<br />

concat(string, string, string)<br />

- îîmparte t primul i l <strong>şi</strong>r i îîn două, d ă primul i l având â d llungimea i<br />

dată <strong>de</strong> întreg;<br />

poate p fi folosit numai ca (i, (, i, , o, , o). )<br />

- concatenează primele două <strong>şi</strong>ruri în al treilea;<br />

numai (i, i, o).


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

care este alcătuit un <strong>şi</strong>r. <strong>şi</strong>r De exemplu:<br />

alcătuit("12 a beta", R) va rezulta 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, 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(_,[]).


E<strong>Exemplu</strong>: l CConstruiţi t iţi o procedura d care să ă permită ită o analiză li ă gramaticală ti lă simplă i lă<br />

pentru propoziţii simple <strong>de</strong> forma: "Tom is a cat".<br />

Pentru a <strong>de</strong>tecta <strong>şi</strong> stabili predicatele, se porneşte <strong>de</strong> la analiza gramaticală a<br />

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("is"), expr_substantivala("a", "cat"))<br />

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

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


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 t)<br />

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

predicates<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)) :este_e_subst(Sir,<br />

Rest, S_exp),<br />

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

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

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

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

Analizor gramatical<br />

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

fronttoken(Sir, Art,Rest1), Art Rest1)<br />

a(Art),<br />

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

s(Subst).<br />

este_e_subst(Str, Rest, s(Subst)):fronttoken(Str,<br />

Subst, Rest),<br />

s(Subst).<br />

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

Pred, Rest1),<br />

p(Pred),<br />

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

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

Pred, ""),<br />

p(Pred) p(Pred).


<strong>Exemplu</strong>: 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) )l la o secvenţă ţă <strong>de</strong> d ti tipul l vocală lă-consoană ă -vocală, lă îîmpărţirea ă ţi se fface ddupă ă<br />

prima vocală: (prolog-> pro-log),<br />

(regula-> re-gu-la);<br />

b) la o secvenţă <strong>de</strong> tipul vocală - consoană - consoană - vocală vocală, împărţirea se<br />

face între cele 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 % continuare<br />

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

sir_ cuvant(S, ( , [C| [ | Lista]):- ])<br />

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

sir_cuvant(Rest_sir, Lista).<br />

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

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

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

divi<strong>de</strong>(Inceput, ( p [ [L1, L2, L3, L4| | Rest], ] Silaba1, [L3,L4| [ | 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.


Cursul Cursul viitor viitor urmează:<br />

urmează:<br />

TEHNICI DE CONSTRUIRE A INTERFEŢELOR GRAFICE<br />

UTILIZATOR<br />

OPERAȚII CU FIŞIERE

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

Saved successfully!

Ooh no, something went wrong!