IA
Laborator 1
Scopul: Insusirea ideilor fundamentale despre inteligenta artificiala, insusirea ideilor
fundamentale despre programarea logica, deosebirea intre programarea logica si
programarea clasica.
1. Inteligenta artificiala
Inteligenta Artificiala poate fi definita ca simularea inteligentei umane procesata de
masini, in special, de sisteme de computere. Acest domeniu a fost, in general, caracterizat
de cercetari complexe in laboratoare si doar destul de recent a devenit parte a tehnologiei
in aplicatii comerciale.
In ultimii ani au avut loc numeroase discutii privind filozofia Inteligentei Artificiale si
rolul sau in dezvoltarea tehnologiilor. De-a lungul timpului, opinia publica a ridicat
unele intrebari legate de avansul tehnologic bazat pe Inteligenta Artificiala:
-in ce masura masinile inteligente vor face parte din viata oamenilor ?
-pot fi construite masini cu constiinta ?
-sunt oamenii capabili sa construiasca masini cu adevarat inteligente si daca da,
cum le vor controla ?
-cine va detine puterea, omul sau masina ?
-avem cu adevarat nevoie de masini inteligente ?
Termenul de Inteligenta Artificiala este intalnit azi in numeroase publicatii tehnice,
medicale, militare, stiintifice, de obicei, cand vine vorba de aplicatii ce realizeaza
performante de care numai omul era socotit capabil: recunoasterea si analiza vocii si a
imaginilor, traduceri dintr-o limba in alta, diferite jocuri de inteligenta (sah, bridge),
luarea unor decizii complexe fara interventia unui operator uman etc. Initial, obiectivele
Inteligentei Artificiale au fost foarte ambitioase: masina trebuia sa rezolve diferite
probleme, sa invete din propria experienta si din evenimentele exterioare sistemului sau,
sa efectueze rationamente, sa conceapa noi obiecte cu proprietati prestabilite.
Principalul scop al Inteligentei Artificiale este de a imita creierul uman in modul in care
acesta gandeste, raspunde si interactioneaza. In urma cercetarilor din ultimii ani,
calculatorul este capabil sa realizeze rationamente si sa descopere legaturi logice intre
fapte descrise corect prin propozitii. De asemenea, calculatorul este capabil sa invete din
propriile greseli si sa interactioneze cu un utilizator. Folosindu-se de aceste performante,
omul a creat computere si programe specifice care sa lucreze pentru el, sa rezolve ecuatii
complicate, sa proceseze baze de date cu sute de mii de inregistrari, sa-l ajute in
proiectarea si producerea unor echipamente tehnice avansate etc.
Cateva dintre domeniile in care este si va fi folosita Inteligenta Artificiala sunt:
• Sisteme expert. Un sistem expert este format dintr-un grup de programe si o
colectie de informatii specifice, cu ajutorul carora se poate purta un dialog om-
computer, in vederea rezolvarii problemelor. Informatiile primite de la calculator
sunt asemanatoare cu cele date de un expert uman in domeniul respectiv.
Sistemele expert multiplica inteligenta formalizata a unor specialisti punand-o la
dispozitia acelor persoane al caror acces la respectivii specialisti este imposibila.
• Retele neuronale. Sunt sisteme care simuleaza inteligenta prin reproducerea
tipurilor de conexiuni fizice care se gasesc in creierul biologic. Din cauza
limitarilor tehnologice, numarul acestor conexiuni este foarte mic, comparativ cu
cele cateva zeci de miliarde de conexiuni din creierul uman.
• Intelegerea limbajului [Link] programarea computerelor astfel incat
acestea sa inteleaga si sa interactioneze cu utilizatorii in limbajul natural al
acestora. La baza intelegerii limbajului natural se afla recunoasterea vocala care
transforma un dialog in text, folosind un dispozitiv special.
• Agentii. Sunt entitati computerizate care actioneaza in locul operatorilor umani,
adunand stiri de pe Internet, trimitand mesaje de e-mail sau filtrandu-le pe cele
primite. Desi lucreaza pe baza unor "cuvinte cheie" si se afla inca in cercetare,
agentii vor deveni foarte utili, ajutandu-si utilizatorul sa gaseasca, spre exemplu,
numai stirile sau articolele care il intereseaza, scutindu-l de ore intregi de navigare
inutila pe Internet.
• Roboti. Noile modele de roboti au in componenta computere programate sa
"auda", sa "vada" si sa reactioneze la diferiti stimuli externi. Exista deja roboti
care pasesc asemenea unei fiinte vii, disting o voce din mai multe, raspunzand
numai la comanda acesteia, se orienteaza in spatiu, recunoscand obiectele
inconjuratoare, aleg drumul cel mai scurt intre doua puncte si ocolesc obstacolele.
• Jocurile pe computer. Dezvoltarea jocurilor si a domeniului multimedia, in
general, este in plina expansiune, o afacere de sute de milioane de dolari. La ora
actuala, nu se mai poate concepe un joc fara a avea in structura elemente de
Inteligenta Artificiala. Implementata corect, aceasta garanteaza un produs bine
vandut, deci profit si satisfactie oferita jucatorilor. Este deja cunoscut ca
programele de sah pe computer pot invinge un oponent uman, cel mai elocvent
exemplu fiind cel din 1997, in care campionul Gary Kasparov a fost intrecut de un
super-computer, Deep Blue, creat de firma IBM. Obtinuta in sase partide, aceasta
victorie a insemnat trecerea liniei Inteligentei Artificiale dincolo de ce s-a realizat
pana in acel moment. Din studiile efectuate, a reiesit ca in creierul uman se afla
aproximativ 100 miliarde de neuroni, fiecare capabil de 1000 de operatii pe
secunda. In jur de 30 de miliarde de neuroni formeaza "materia cenusie", cea care
gandeste, restul de 70 de miliarde constituind "materia alba", cea care face
legatura intre neuronii din "materia cenusie". Deep Blue continea 480 de
procesoare create special pentru jocul de sah, fiecare dintre ele fiind capabil sa
gandeasca aproximativ 2 milioane de pozitii pe secunda.
Un computer actual poate realiza 10 la puterea 17 operatii pe secunda (o operatie in
timpul in care lumina ar strabate un atom de hidrogen). E clar ca viteza apartine masinii.
Ce atu are omul ? Cel mai important pare a fi elementul surpriza; omul este imprevizibil,
gandirea sa nu respecta intotdeauna un algoritm, asa cum il stie masina.
2. Programarea logica
Inceputurile logicii sunt strans legate de gandirea stiintifica. Logica furnizeaza un limbaj
precis pentru exprimarea explicita a obiectivelor cunostintelor si a ipotezelor. Logica
ofera bazele pentru deducerea consecintelor din premize, pentru studierea adevarului sau
falsitatii unor expresii cunoscand valoarea de adevar a altor expresii, pentru a stabili
consecintele afirmatiilor cuiva si pentru a verifica validitatea argumentelor cuiva.
Calculatoarele sunt relativ noi in istoria intelectualitatii noastre. Similar logicii, ele sunt
obiectul studiilor stiintifice si o unealta puternica pentru eforturile facute in directia
progresului stiintific. La fel ca logica, au nevoie de expresia precisa si explicita a
scopurilor si ipotezelor cuiva. Spre deosebire de logica, ce s-a dezvoltat cu puterea
gandirii umane ca singura consideratie externa, dezvoltarea calculatoarelor a fost
guvernata de la inceput de constrangeri tehnologice si ingineresti.
Majoritatea calculatoarelor utilizate sunt bazate pe conceptul timpuriu al lui von
Neumann si al colegilor lui, ce a aparut in anii 1940. Masina von Neumann este
caracterizata de un „spatiu” larg de celule de memorie si o unitate de procesare cu
anumite celule locale, numite registri. Unitatea de procesare poate incarca date din
memorie in registri, poate efectua operatii aritmetice sau logice asupra registrilor si poae
stoca valoarea registrilor inapoi in memorie. Un program pentru masina von Neumann
consta dintr-o secventa de instructiuni ce executa asemenea operatii si dintr-un set de
instructiuni de control ce pot influenta instructiunea ce urmeaza a fi executata, posibil in
functie de continutul anumitor registri.
Pe masura ce problemele construirii calculatoarelor erau intelese si rezolvate, problemele
datorate utilizarii lor cresteau. Concluzia a fost ca problemele nu se datorau incapacitatii
calculatorului de a executa instructiunile omului, ci mai degraba inabilitatii omului de a
instrui calculatorul. Astfel a inceput o cautare a limbajelor de programare convenabile
omului. Pornind de la limbajul inteles direct de calculator, limbajul masina, au fost
dezvoltate notiuni si formalisme mai bune. Desi sporind in abstractizare, dezvoltarea
limbajelor, de la limbajul de asamblare la Fortran, Algol, Pascal si Ada, a purtat semnul
masinii bazate pe arhitectura von Neumann.
Pentru o persoana inteligenta, dar neinitiata, care nu este familiarizata cu constrangerile
ingineresti care au condus la proiectarea ei, masina von Neumann pare a fi un dispozitiv
misterios, chiar bizar. Gandirea in termenii constrangerii setului de operatii nu este o
problema triviala.
Aceste aspecte caracteristice programarii calculatoarelor von Neumann au condus la o
anumita separare a sarcinilor: pe de-o parte erau cei care se gandeau cum sa rezolve
problema si proiectau metodele pentru solutia ei, de cealalta parte erau cei care scriau
codul, care realizau sarcina migaloasa de a traduce instructiunile proiectantilor in
instructiuni pe care calculatorul le poate interpreta.
Atat logica cat si programarea necesitau exprimarea cunostintelor si a metodelor intr-un
formalism unanim acceptat. Sarcina de a face explica cunostintele cuiva este delicata.
Formalizarea cunostintelor cuiva este, adesea, o activitate intelectula ce conduce la o
aprofundare a problemei in cauza. Insa rar se intampla ca formalizarea problemei si
folosirea metodelor de rezolvare bazate pe multimea de instructiuni von Newmann sa
conduca la aceste efecte benefice.
Desi logica a fost folosita ca unealta pentru proiectarea calculatoarelor, pentru
rationamente legate de calculatoare si pentru programarea lor inca de la inceputurile
calculatoareor, utilizarea logicii in sine ca limbaj de programare, numita programare
logica, este destul de recenta.
Programarea logica se departeaza radical de principiul limbajelor de programare
traditionale. Este bazata pe ideea ca in loc ca oamenii sa invete sa gandeasca in termenii
operarii unui calculator, ar trebui ca acesta sa execute instructiuni ce sunt usor de
formulat de catre om. Programarea logica nu formuleaza instructiunile explicite pentru
executarea operatiilor, ci mai degraba cunostintele despre problema si ipotezele suficiente
pentru a o rezolva sub forma unor axiome logice. Un astfel de set de axiome constituie o
alternativa la programarea conventionala. Programul poate fi executat prin furnizarea
unei probleme, formalizata ca o declaratie logica ce trebuie dovedita, numita expresia
scopului. Executia este o incercare de a rezova problema, adica de a demonstra scopul,
dandu-se ipotezele in programul logic.
Aceste idei pot fi cuprinse in urmatoarele doua ecuatii metaforice:
Program = multime de axiome
Executie = dovada constructiva a scopului din program
Limbajele de programare logica se mai numesc si limbaje declarative. Spre
deosebire de limbajele procedurale, la care fiecare pas procedural trebuia
specificat in detaliu, la limbajele declarative se specifica scopul problemei. Pe langa
faptul ca solutia poate fi furnizata fara specificarea pasilor necesari, programul poate
explica uneori cum a obtinut solutia.
Un limbaj de programare declarativ scuteste programatorul de a mai mentiona procedura
exacta pe care trebuie sa o execute calculatorul pentru a realiza o functie. Programatorii
folosesc limbajul pentru a descrie o multime de fapte si de relatii astfel incat utilizatorul
sa poata interoga apoi sistemul pentru a obtine un anumit rezultat.
Teoria matematica care sta la baza acestei paradigme este logica predicatelor de ordin
unu, care lucreaza cu entitati logice (nu cu numere). Logica predicatelor este o logica
simbolica al carei scop este de a reprezenta tipuri de rationamente. Atat timp cat
calculul predicatelor are reguli si formalitati matematice definite printr-o teorie, solutia la
o problema specifica este completa si efectiva.
Problemele care sunt indicate spre a fi rezolvate prin programare logica sunt din
domeniul demonstrarii de probleme si propagarii de cunostinte.
Un exemplu de limbaj de programare logica este Prolog.
3. Programarea logica vs. programarea clasica
Un program este alcatuit din doua elemente : logica si controlul . Prin termenul logica se
desemneaza toate notiunile care stabilesc CE face un program, in timp ce termenul
control semnifica toate notiunile sintactice care stabilesc CUM o face (de exemplu
algoritmul care rezolva o problema). Un program scris in PASCAL sau in alt limbaj de
programare traditional consta din instructiuni care descriu actiunile ce trebuie executate
pas cu pas de catre calculator pentru ca programul sa produca rezultatul dorit.
Un program in PROLOG este o baza de natura logica, in care programatorul defineste
obiecte si relatii intre aceste obiecte: relatii care exista direct intre obiecte si regulile
dupa care se pot deduce alte relatii sau proprietati ale acestora.
Obiectele sunt reprezentate in PROLOG prin nume simbolice. Relatiile existente intre
obiecte se definesc cu ajutorul clauzelor. Exista doua feluri de clauze: fapte si reguli.
Structura sintactica a unui fapt este urmatoarea:
nume(arg1, arg2, …, argn).
unde:
• nume este un nume de predicat, adica o succesiune de caractere (alfabetice, cifre
sau liniuta de subliniere) avand proprietatea ca primul caracter este o litera mica a
alfabetului
• arg1, arg2, …, argn se numesc argumentele predicatului, iar din punct de vedere
sintactic pot fi nume de obiecte sau nume de variabila (un nume de variabila este o
succesiune de caractere astfel incat primul caracter este o litera mare din alfabet).
O regula este o constructie sintactica de forma:
cn+1 :- c1, c2,…, cn.
unde entitatile c1, c2,…, cn, cn+1 sunt de forma nume(arg1, arg2, …, argk) , nume,
arg1,
arg2, …, argk avand aceeasi semnificatie ca in cazul unei fapte.
• cn+1 se numeste capul regulii
• c1, c2,…, cn formeaza corpul regulii
Clauza codifica urmatorul enunt:
“Daca c1 si c2 si … cn sunt adevarate, atunci cn+1 este adevarata.”
Sa luam drept exemplu un program care citeste doua numere reale si il afiseaza pe cel
mai mare dintre ele.
Program in PASCAL:
var x,y: real;
begin
write(‘numar1 = ‘); readln(x);
write(‘numar2 = ‘); readln(y);
if (x < y) then writeln(x)
else writeln(y);
end.
Program in PROLOG:
predicates
program
mai_mare(real,real,real)
clauses
program :- write("n1="), readreal(X), write("n2="), readreal(Y),
mai_mare(X,Y,Z), write(Z), nl.
mai_mare(X,X,X).
mai_mare(X,Y,Y):-X<Y.
mai_mare(X,Y,X):-Y<X.
goal
program
Surse :
1. Ionut GHIONEA: [Link]
2. Madalina Buneci : [Link]