Exemplu - Facultatea de Electrotehnică şi Electroenergetică
Exemplu - Facultatea de Electrotehnică şi Electroenergetică
Exemplu - Facultatea de Electrotehnică şi Electroenergetică
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