180 likes | 308 Views
Inteligenţă Artificială. Curs 2 : Lisp – primele no ţiuni. Bibliografie despre Common Lisp. Totul despre Lisp: http://www.apl.jhu.edu/~hall/lisp.html Guy L. Steele Jr. & Richard P. Gabriel: The Evolution of Lisp
E N D
Inteligenţă Artificială Curs 2: Lisp – primele noţiuni
Bibliografie despre Common Lisp • Totul despre Lisp: http://www.apl.jhu.edu/~hall/lisp.html • Guy L. Steele Jr.& Richard P. Gabriel: The Evolution of Lisp • Common Lisp – the Language, second edition: http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/ • Despre macro-uri http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html • Downloads: http://www.franz.com/downloads/#acl • History of Lisp, by John McCarthyhttp://www-formal.stanford.edu/jmc/history/lisp/lisp.html • Paul Graham: On Lisp (bibliotecă)
Biblioteca de Informatică • Programare in inteligenta artificiala. Lisp si Prolog, Horia Pop • Programare in Lisp, Stefan Trausan-Matu, 2004 • Lisp, Lore and Logic, W. Richard Stark, 1989 • Computer algebra with Lisp and Reduce, F. Brackx, 1991 • Performantele inteligentei artificiale - de la teorie la aplicatii, Titu I. Bajenescu, 2002 • On Lisp - Advanced Techniques for Common Lisp, Paul Graham, 1994 (xerocopie) • Artificial Intelligence with Common Lisp, James L. Noyes, 1992 (xerocopie) • Giumale et al. 1987, Lisp, 2 vol. Baza de date a bibliotecii poate fi consultată din pagina de internet a Bibliotecii Centrale Universitare: http://www.bcu-iasi.ro/, accesând Catalogul on-line.
Puţină istorie • Lisp - unul din cele mai vechi limbaje • Vara lui 1956 (Dartmouth Summer Research Project on AI): • Newell, Shaw and Simon sunt preocupaţi să scrie un program de demonstrare automată a teoremelor. Ei simt nevoia unui limbaj care să le permită să manipuleze uşor expresii simbolice utilizând structuri de liste. IPL 2, un limbaj de procesare a listelor (va rula pe calculatorul JOHNNIAC al lui Rand Corporation). In acest limbaj ei vor implementa programul lor The Logic Theorist. • John McCarthy se preocupă de o soluţie algebrică a derivabilităţii funcţiilor. El crede că s-ar putea scrie definiţii recursive pentru derivarea simbolică Dif(f(x)*g(x)) = Dif(fx)*g(x) + f(x)*Dif(g(x)) n*xn-1, dacă f(x) = xn, cos(x), dacă f(x)= sin(x), -sin(x), dacă f(x) = cos(x) … Dif(f(x)) =
Inventarea Lisp-ului • Cum se pot scrie definiţii de funcţii recursive folosind expresii conditionale? • Limbajul cel mai evoluat de programare: FORTRAN • Definiţia de funcţie: function f(x) ...corpul funcţiei return(valoare) • Instrucţiunea if: if(expresie) et1, et2, et3 • La propunerea lui McCarthy, IBM este de acord să finanţeze un proiect de dezvoltare a unui limbaj simbolic plecând de la FORTRAN: • Herbert Gelernter şi Carl Gerberich de la IBM descriu FLPL (FORTRAN List Processing Language)
Inventarea Lisp-ului Totuşi FLPL nu avea nici expresii condiţionale, nici funcţii recursive, iar ştergerea listelor era făcută explicit de program • Cum să descrii expresii condiţionale? • McCarthy scrie în FORTRAN o funcţie XIF(M,N1,N2) la apel se evaluează atât N1 cât şi N2!!
Inventarea Lisp-ului • Vara lui 1958: McMarthy o petrece la IBM Information Research Department, încercând să scrie în FLPL un program de diferenţiere simbolică. Apar câteva idei (imposibil de realizat în FLPL): • scrierea funcţiilor recursive folosind expresii condiţionale • folosirea funcţiilor pe post de argument în alte funcţii McCarthy îşi aduce aminte de notaţia de funcţii a lui Alonso Church (1941), inventatorul -calculului, în care se pun în evidenţă parametrii formali ai funcţiei şi corpul ei (x) = x+2+y (x,y) = x+y • funcţia maplistcare formează o listăde aplicaţii ale unui argument funcţional elementelor unei liste Necesară pentru diferenţierea sumelor/produselor de oricât de mulţi termeni/factori. • ştergerea listelor abandonate... Soluţia ştergerii la cerere apărea neelegantă.
Inventarea Lisp-ului • Toamna lui 1958: John McCarthy este asistent la M.I.T. Împreună cu Marvin Minsky, el implementează prima versiune de Lisp: • ca interpretor • funcţiile de bază ale Lisp-ului actual • notaţia prefixată a apelului de funcţii (ulterior numită “Cambridge Polish” datorită asemănării cu notaţia lui Lukasiewicz) • mecanismul de “garbage collection” • IBM 704: car (content-address register) and cdr (content-decrement register) • funcţii cu şi fără efecte laterale Cele “fără” fiind candidate la demonstraţii automate de corectitudine. • funcţii Lisp reprezentate ca date Lisp
Lisp – un limbaj proiectat pentru problema mea • limbaj de prelucrări simbolice • limbaj specializat pentru prelucrarea listelor • paradigma de programare funcţională • limbajul care se mulează pe problema pe care o am de rezolvat • limbajul care se dezvoltă pe măsură ce rezolv problema • limbajul „de casă” al inteligenţei artificiale • incorporează viziunea de programare multi-strat
cazuri neprevăzute în proiect, posibil a fi acoperite de soluţie cazuri prevăzute în proiect dar neacoperite de soluţie cazuri prevăzute în proiect şi acoperite de soluţie proiectarea de sus în jos proiectarea de jos în sus Rezolvarea problemelor: bottom-up sau top-down?
Funcţii, maniere de definire şi apel • Transparenţa referenţială • o funcţie transparentă referenţial: function foo1(x) { return(x+2); } • ... şi una care nu e: int a; function foo2(int x) { x := x+a; return(x); }
Funcţii, maniere de definire şi apel • Efectul lateral • O funcţie fără efecte laterale: function foo1(x) { return(x+2); } • ... şi o funcţie care produce efecte laterale: int a; function foo3(int x) { a := x+2; return(a); }
Tipuri de date în Lisp s-expresie (expresie simbolică – symbolic expression) atom numeric întreg raţional (fracţie) real complex nenumeric (atom literal, atom simbolic, simbol) listă listă simplă listă cu punct şir (array) şir de caractere tablou (cu oricâte dimensiuni) tabelă de asociaţie (hash table) pachet (sau spaţiu de nume) flux de date
Obiecte în Lisp • variabile • constante • funcţii • macro-uri • forme speciale • în implementările orientate-obiect (CLOS): • clase • metode
Caractere cu semnificaţie specială ( – paranteza stângă – marchează începutul unei liste ) – paranteza dreaptă – marchează sfârşitul unei liste ’ – apostroful, urmat de o expresie e, ’e - scrierea condensată a unui apel (quote e) ; – punct-virgula – marchează începutul unui comentariu ” – între o pereche de ghilimele se include un şir de caractere \ – bara oblică stângă – prefixează un caracter ce e utilizat ca literă iar nu cu semnificaţia lui uzuală | – între o pereche de bare verticale poate fi dat un şir de caractere speciale: în nume de simboluri # – diezul – semnalează că următorul caracter defineşte modul în care trebuie interpretată construcţia care urmează: #’fn ` – un accent invers semnalează că ceea ce urmează este un template care conţine virgule – utilizat în macrouri , – virgulele – utilizate în template-uri pentru a semnala cazuri speciale de înlocuiri : – două puncte: în general: următorul simbol se evaluează la el însuşi în alte cazuri: despart numele unui pachet de numele unei variabile definite în acel pachet (user1:alpha, user1)
Numere • întregi: nnn, +nnn, -nnn, #nnRddddd, #nnrddddd, #b, #o, #x • reale: 3.1415926535897932384d0 6.02E+23 • fracţii: 1/2, -2/4, #x1A/5 • complexe: #c(1 2) #c(0 1) #c(2/3 1.3)
Simboluri • orice combinaţie de litere şi numere • următoarele caractere pot apare în simboluri: + - * / @ $ % ^ & _ = < > ~ . • exemple: alpha, a21, 1a2, *alpha*, a+b, a-b+c, a/1, $13, 1%2, a^b, cel_mare, a=b, a<b~c&, dudu@infoiasi • pot fi incluse şi caractere speciale: |&.+\:;| a|&.+\|:;|b a|&.+\| 2)<nl>|b
cdr car pointer către restul listei (a b c) restul listei (c) e lista vidă pointer către restul listei (b c) pointer către primul element al listei (a b c) pointer către primul element al listei (c) pointer către primul element al listei (b c) a c b întreaga listă (a b c) e reprezentată de această celulă cons lista (c) e reprezentată de această celulă cons lista (b c) e reprezentată de această celulă cons Reprezentarea listelor: celule cons