You are on page 1of 84

Vetaka inteligencija Osnove Lisp-a

Vladan Mihajlovi Aleksandar Milosavljevi

Jezici VI
z Funkcionalni
z

Lisp Prolog

z Logiki
z

Zato nauiti Lisp?


z Eric

Raymond Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.

Osnovne osobine Lisp-a


z

Programi i podaci se tretiraju na istovetan nain. Lisp koristi liste kao osnovne strukture podataka, a i poziv funkcije je lista iji je prvi element ime funkcije (koristi se prefix notacija). Automatsko i dinamiko upravljanje memorijom. Sistem sam rezervie i oslobaa memoriju prema potrebama. Jezik sa funkcionalnim nainom programiranja. Funkcionalno programiranje zasniva se na ideji da se rezultat svake funkcije moe iskoristiti kao argument druge funkcije. Lisp omoguava komponovanje (kombinovanje) funkcija. Rekurzija je prirodni nain programiranja.
4

Osnovne osobine Lisp-a


z

Interpretiran jezik. Primenjuje se ciklus read-evalexecute, Danas postoje i prevodioci za Lisp, a razvojna okruenja esto nude i prevodioce i interpretatore. Obino postoji inkrementalno prevoenje. Ne postoje tipovi podataka. Lisp je programski jezik bez javne definicije tipa. Mnogi dijalekti nude mogunost korienja tipova podataka, ali to nije neophodno. U tom sluaju provera i vezivanje tipa je dinamiko, tj. samo u procesu izvrenja. Jednostavna sintaksa. Lisp ima jednostavnu sintaksu, i moe se primeniti kako za matematika izraunavanja, tako i za simboliku obradu.
5

Lisp - ukratko
z z z z

z z

Sve u Lisp-u je ili atom ili lista (izraz) Lista predstavlja podatak ili funkciju Nema deklarisanja tipova podataka, ve se podaci dinamiki vezuju za tipove Nema sekvencijalnog niza naredbi, ve se rezultat postie ugnjedavanjem i komponovanjem poziva funkcija Rekurzivni pozivi funkcija su sutina programiranja u Lisp-u Omoguava definisanje izvrnih struktura jer su podaci i funkcije predstavljaju na isti nain listama
6

Osnovni elementi jezika Lisp


Simboliki izraz (S-izraz) z Atom (simbol, broj, string, t, nil, )
z

Nema razlike izmeu malih i velikih slova (osim u stringovima)

z Lista:
z

elementi liste su atomi ili liste

Prvi element liste se tretira kao ime funkcije, ako ispred liste nije quote (') z Ako je ako ispred liste quote (') onda se i prvi element liste tretira kao podatak
7

Atomi
z

Predefinisani literalni atomi (logike konstante)


z z

T, t TANO (True) Nil, nil, '() NETANO (False) ili prazna lista Npr. 12 , -135.28 Npr. A, tekst Poinju slovom Npr. a, vestacka, neki-atom_sa_dugackim-imenom, tema1
8

z z z

Numeriki atomi
z

Tekstualni atomi
z

Literali
z z

Liste
z Lista
z

atoma (elementi liste su atomi)

(a b c) z (1 b a 3 c) z (1 2 3 4 a b)
z Prava
z

lista (elementi liste su atomi i druge liste)


((a b) (c d) (e f)) z (1 (2 3) (c d (e) f) 4 5)
9

Elementi jezika Lisp


z z z z z z

Konstante Promenljive Funkcije Predikati Program = Forme + Funkcije Forme


z z z

Samo-evaluirajue Literali Liste Npr: ; prva linija komentara


10

Komentar deo linije iza znaka ;


z

Konstante i promenljive
z

Konstante
z z z z z z

T, Nil, '() string 1, 0, 5 numerike vrednosti 'simbol #\a karakter #( 1 2 3 ) vektor Poinju slovom Mogu biti razliite duine Nema razlike izmeu mali i velikih slova
11

Promenljive
z z z

Funkcije
z z

Zadaju u prefiks notaciji Predstavljaju se listom, tako da je prvi element liste ime funkcije, a ostali elementi argumenti:
z z

(ime-funkcije {argumenti}) (ime-funkcije arg1, arg2, ... , argn)

z z

Argumenti funkcija mogu biti konstante, literali, atomi, liste i pozivi drugih funkcija. Primeri poziva funkcije:
z z

(+ 2 3 5 7 100) (car '(a b c))


12

Primeri funkcija
5 4

+ (+ 5 4)

3 5 9

+ (+ 3 5 9)

17

(a b c d)

car

3 5 9

list

(3 5 9)

(car (a b c d))

(list 3 5 9)

13

Razlika izmeu podataka i funkcija


z z

Podaci i funkcije se predstavljaju kao liste Lista kao podatak ima ispred oznaku ' (quote)
z z z z

'(obj1 obj2 obj3 ... objn) quote(obj1 obj2 obj3 ... objn) '(+ 9 3) => (+ 9 3) (quote (+ 9 3)) => (+ 9 3) (proc arg1 arg2 ... argn) (+ 9 3) => 12
14

Lista kao funkcija je obina lista


z z

Predikati
z Posebna

vrsta funkcija z Vraaju vrednost tano (t) ili netano ('()) z Obino se imena predikata oznaavaju sufiksom na razliite naine z <ime>-p z listp, zerop
15

Sistemske funkcije
z Numericke:

+, -, *, /, log z Logicke: and, or, not, every z Funkcije za rad sa listama: cons, list, append, car, cdr, first, rest, nth, length z Predikati: atom, consp, listp, <, =, equal, member
16

Numerike funkcije
z z z z z z z z z z

(+ 1 2 3 4 5) => 15 (- 1 2 3 4 5) => -13 (* 5 4 3) => 60 (/ 12 3 2) => 2 (1+ 3) => 4 (mod 5 3) => 2 (random 100) => 55 (sqrt 2) => 1.4142135 (exp 1) => 2.7182817 (square 5) => 25
17

Logike funkcije
z (not

obj) - negacija objekta obj z (and obj1 obj2 objn) - logiko I z (or obj1 obj2 objn) - logiko ILI z (and '() '(1 2 3)) => ( ) z (or '() '(1 2 3)) => (1 2 3) z (not '()) => t z (or '(1 2 3) '(2 4 5)) => (1 2 3)
18

Funkcije za rad sa listama


z cons z list z append z car z cdr z first z rest z length,

itd.
19

Funkcija car
a a b c d

(a b c d)

car

(car (a b c d)) => a


20

Funkcija cdr

(a b c d)

cdr

(b c d)

(cdr (a b c d)) => (b c d)


21

Funkcije car i cdr


z z z z z z z z z z z z

Funkcija car vraa prvi element liste list kao rezultat Oblik: (car list) (car '(1 2 3 4)) => 1 (car 'a) => () (car nil) => () (car '((1 2) 3 4)) => (1 2) Funkcija cdr vraa ostatak liste list, tj. svi elementi kao lista, osim prvog Oblik: (cdr list) (cdr '(1 2 3 4)) => (2 3 4) (cdr 'a) => Error! (cdr nil) => () (cdr '((1 2) 3 4)) => (3 4)
22

Funkcije car, cdr, first i rest


(cadr '(a b c)) => b ekvivalentno sa: (car (cdr '(a b c))) (caddr '(1 2 3 4 5)) => 3 ekvivalentno sa: (car (cdr (cdr '(1 2 3 4 5)))) (cdar '((1 2 3) 4 5)) => (2 3) ekvivalentno sa: (cdr (car '((1 2 3) 4 5))) Funkcija first vraa prvi element liste kao rezultat Oblik: (first list) (first '(1 2 3 4)) => 1 Funkcija rest vraa ostatak liste, tj. svi elementi kao lista, osim prvog z Oblik: (rest list) z (rest '(1 2 3 4)) => (2 3 4) z car = first i cdr = rest
z z z z z z z z z

23

Funkcija cons
a a b c d

c
a

(b c d)

cons

(a b c d)

(cons a (b c d)) => (a b c d)


24

Funkcija cons
z z z z z z z z z z

Funkcija cons dodaje element na poetak liste (kao prvi element) Oblik: (cons elem list) Umee elem na poetak liste list Drugi argument funkcije mora biti lista (cons 'a '(b c d)) => (A B C D) (cons '(a b) (1 2 3 4 5)) => ((A B) 1 2 3 4 5) (cons '(a b c) '()) => ((A B C)) Ako je drugi argument funkcije atom formira se lista s takom ispred drugog argumenta funkcije (cons 'a 'b) => (A . B) (cons '(a b c) 'd) => ((A B C) . D)
25

Funkcija list
a b c d

a
a b c d

d
(a b c d)

list

(list a b c d) => (a b c d)
26

Funkcija list
z z z z z z z z z z z

Formira listu iji su elementi argumenti funkcije (broj elemenata nove lista jednak je broju argumenata) Oblik: (list list1 list2 ... listn) Formira listu u kojoj svaki od argumenate predstavlja pojedinani element (list 'a 2 'b) => (A 2 B) (list '(a b) '(c d)) => ((A B) (C D)) (list 'a) => (A) (list '()) => ('()) (list 'a 'b 'c 'd) => (A B C D) (cons 'a (cons 'b (cons 'c (d)))) => (A B C D) Funkcija list* formira lista s takom ispred poslednjeg argumenta funkcije (list* 'a 'b 'c 'd) => (A B C . D)

27

Funkcija append

a c

b d
(a b) (c d)

append

(a b c d)

(append (a b) (c d)) => (a b c d)


28

Funkcija append
z z z z z z z z z z z

Formira novu listu koja sadri elemente iz liste prvog argumenta i elemente liste drugog argumenta funkcije Oblik: (append arg1 arg2 ... argn) Spaja prvi argument, drugi, trei i ostale u jedinstvenu listu, tj. vri nadovezivanje listi Argumenti ove funkcije moraju biti liste (append '(1 2 3 4) '(a b c d)) => (1 2 3 4 A B C D) (append '(a b c) '(d (e f (g h i) j k l)) => (A B C D (E F (G H I) J K L) (append '() '(a)) => (A) Razlike izmeu cons, list i append (cons '(a b) '(c d)) => ((A B) C D) (list '(a b) '(c d)) => ((A B) (C D)) (append '(a b) '(c d)) => (A B C D)

29

Funkcija lenght
z Funkcija

vraa broj elemenata liste z Oblik: (lenght list) z (length '(1 2 3 4 5)) => 5 z (length '()) => 0 z (lenght '(a (b c) d))) => 3 z (lenght '(a b c d (e f (g h i) j k l)) => 5

30

Funkcije nth i last


z z z z z z z z z z z

Ove funkcije vraaju jedan element iz liste Elementi liste imaju indekse koji poinju od 0. Funkcija nth vraa n-ti element liste ili praznu listu ako taj element liste ne postoji Oblik: (nth list) (nth 2 '(1 2 3 4)) => 3 (nth 4 '(1 2 3 4)) => '() (nth 1 '(a (b c) d))) => (B C) Funkcija last vraa poslednji element liste. Oblik: (last list) (last '(1 2 3 4)) => (4) (last '(a b c d (e f (g h i) j k l))) => ((e f (g h i) j k l))
31

Funkcije reverse
z Funkcija

reverse vraa listu sa svim elementima ulazne liste ali ureenim u obrnutom redosledu z Pri izmeni redosleda ne ulazi u podliste z Oblik: (reverse list) z (reverse '(a b c d)) => (D C B A) z (reverse '((a b) (c d))) => ((C D) (A B))
32

Predikati atom i listp


z z z z z z z z z z

Predikat atom vraa logiku vrednost tano (t) ako je argument atom u suprotnom netano. Oblik: (atom arg) (atom '(1 2 3 4 5)) => '() (atom '()) => T (atom 'a) => T Predikat listp vraa logiku vrednost tano (t) ako je argument lista u suprotnom netano. Oblik: (listp arg) (listp '(1 2 3 4 5)) => T (listp '()) => '() (listp 'a) => '()
33

Predikati null, zerop i functionp


z z z z z z z z z z z z z

Predikat null vraa logiku vrednost tano (t) ako je argument prazna lista. Oblik: (null arg) (null '(1 2 3 4 5)) => '() (null 'a) => '() (null '()) => T Predikat zerop vraa logiku vrednost tano (t) ako je argument lista jednak 0. Oblik: (zerop arg) (zerop '(1 2 3 4 5)) => '() (zerop '0) => T Predikat functionp vraa logiku vrednost tano (t) ako je argument predikata funkcija. Oblik: (functionp arg) (functionp #zerop) => T (functionp zerop) => '()
34

Predikati poreenja
z

z z z z z z z z z z

Predikati poreenja ispituju da li su dva objekta jednaka (razlikuju se po nainu poreenja, tj da li su fiziki identini u memoriji, operaciono identini, ili identini po vrednosti): (eq obj1 obj2) ispituje da li su adrese objekata jednake (eql obj1 obj2) ispituje da li su objekti logiki jednaki (eqv obj1 obj2) ispituje da li su objekti operaciono jednaki (equal obj1 obj2) ispituje da li su objekti jednaki po strukturi i vrednosti (equalp obj1 obj2) ispituje da li su objekti jednaki po vrednosti (equal 'a 'b) => '() (equalp 'a 'b) => '() (equal 'a 'a) => T (equalp 'a 'a) => T (equal 3 3) => T (equalp 3 3) => T (equal 3 3.0) => '() (equalp 3 3.0) => T (equal 3.0 3.0) => T (equalp 3.0 3.0) => T

35

Funkcije klase member


z

z z z z z z z z z z z

Funkcija member ispituje da li element postoji u listi i vraa listu koja sadri elemente liste poevi od prvog pojavljivanja prvog argumenta (ukljuujui i njega) do kraja Oblik: (member elem list) (member '2 lista) => (2 3 4 5) (member 2 '(1 2 3)) => (2 3) (member 'e '(a b c d)) => '() (member 'a '((a b) c d)) => '() (member '(d e) '((a b) c (d e) f)) => () Funkcije member-if i member-if-not ispituju da li predikat koji je prvi argument vraa tano primenjen na elemente liste drugog argumenta Oblik: (member-if pred list) i (member-if-not pred list) (member-if #'atom '((a b) c d)) => (C D) (member-if #'numberp '(a #\Space 5 rec)) => (5 rec) (member-if-not #listp '((a b) c d)) => (C D)

36

Postavljanje globalnih promenljivih


z

z z z z z z

Funkcije setq i setf vraa naziv promenljive iji se sadraj postaje lista navedena kao drugi argument funkcije Oblik: (setq var list) i (setf var list) (setq lista '(1 2 3 4 5)) => lista (lista) => (1 2 3 4 5) (setq alista ((A (1 5)) (B (2 6)))) => alista (alista) => ((A (1 5)) (B (2 6))) Napomena: Za definisanje promenljivih dovoljno je pozvati jednu od ovih funkcija.
37

Uslovna funkcija if
z

z z z z z z

Funkcija if ako je uslov ispunjen vraa rezultat then izraza, u suprotnom rezultat else izraza ako postoji ili praznu listu Oblik: (if test then_form else_form) Uslov (test) je predikat Then izraz i else izraz mogu biti promenljive, atomi, liste ili pozivi funkcije (setq lista '(1 2 3 4 5)) => (1 2 3 4 5) (if (listp lista) (car lista) (cdr lista)) => 1 (if (equal (car lista) (cadr lista)) (car lista)) => '()
38

Uslovna funkcija cond


z z z z z

z z z

Funkcija cond omoguava postavljanje viestrukih uslova i grananja. Oblik: (cond (test1 exp1) (test2 exp2) ... (testN expN)) Uslov (test) koji se ispituje je relacioni operator ili predikat Izraz je promenljiva, atom, lista ili poziv funkcije Uslovi (test) se ispituju sekvencijalno po redu navoenja i funkcija cond vraa rezultat izraza (exp) za uslov koji je zadovoljen (cond ((equal op 'zbir) (+ x y)) ((equal op 'proizvod) (* x y)) (t '(nedefinisano)))
39

Definisanje funkcija
z z z z z z z z

Za definisanje se koristi makro defun. Oblik: (defun name (arg...) exp) Ime je naziv funkcije i mora se razlikovati od ve postojeih funkcija, Argumenti su navedeni kao lista i prenose se po vrednosti Telo funkcije ine ugnjedeni i komponovani pozivi funkcija Izlaz iz funkcije je rezultat poslednje izvrene funkcije iz tela (defun kvadrat (n) (* n n)) => KVADRAT (kvadrat 3) => 9
40

Funkcije za rotiranje
z z z z z z z z

(defun rotate-left (l) (append (cdr l) (list (car l)))) (rotate-left '(a b c d e f)) => (B C D E F A) (defun rotate-right (l) (cons (car (reverse l)) (reverse (cdr (reverse l))))) (rotate-right '(a b c d e f)) => (F A B C D E)
41

Izraunavanje faktorijela
z z z z z z z z z z z z z z

Napisati funkciju na lispu koja odreuje faktorijel broja 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1 * 0! 0! = 1 1! = 1 * 1 2! = 2 * 1 3! = 3 * 2 4! = 4 * 6 Rekurzivna formula: n! = n * (n-1)! Zavretak rekurzije: 0! = 1
42

Izraunavanje faktorijela
z z z z z z z z z z

(defun fact (n) (if (= n 0) '1 (* n (fact (1- n))))) (fact 5) => 120 (fact 5) => (* 5 (fact 4)) => (* 5 (* 4 (fact 3))) => (* 5 (* 4 (* 3 (fact 2)))) => (* 5 (* 4 (* 3 (* 2 (fact 1))))) => (* 5 (* 4 (* 3 (* 2 (* 1 (fact 0)))))) => (* 5 (* 4 (* 3 (* 2 (* 1 1))))) => (* 5 (* 4 (* 3 (* 2 1)))) => (* 5 (* 4 (* 3 2))) => (* 5 (* 4 6)) => (* 5 24) =>120

43

Logika programiranja u Lisp-u


z z z

Koraci obrade liste Uslov za kraj ako je lista prazna vratiti odgovarajuu vrednost (obino praznu listu) Ispitivanje i obrada prvog elementa liste ispitati da li prvi element liste zadovoljava zadati uslov i izvriti njegovu obradu na odgovarajui nain Nastaviti sa obradom ostatka liste ukomponovati rekurzivni poziv funkcije, uz promenu argumenta, sa pozivom funkcija za rad sa listama prema zahtevu zadatka obrade
44

Odreivanje broja elemenata liste


z z z z z z z z z

Napisati funkciju na lispu koja odreuje broj elemenata liste (broj '(a b c d)) = 1 + (broj '(b c d)) (broj '(b c d)) = 1 + (broj '(c d)) (broj '(c d)) = 1 + (broj '(d)) (broj '(d)) = 1 + (broj '()) (broj '()) = 0 (broj '(a b c d)) = 1 + 1 + 1 + 1 + 0 Obrada: poveati broj elemenata liste za 1 i nastaviti sa obradom ostatka liste Zavretak: prazna lista nema nijedan element
45

Odreivanje broja elemenata liste


z z z z z

(defun broj (l) (cond ((null l) '0) (t (1+ (broj (cdr l)))))) (broj '(a b c d e f)) => 6 (broj '(a b (c d e) f) => 4

46

Odreivanje broja elemenata liste


z (defun

clanp (el l) z (cond ((null l) '()) z ((equal el (car l)) t) z (t (clanp el (cdr l))))) z (clanp 'a '(a b c)) => t z (clanp '(1 2) '((1 2 3) 4 (1 2) 5 6)) => t z (clanp '(1 2) '((1 2 3) (4 (1 2) 5) 6)) => '()
47

Odreivanje pozicije maksimalnog elementa liste


z (defun

maxpoz (l) z (if (null l) '() (maxpoz1 0 1 l))) z (defun maxpoz1 (maxp ind lp) z (cond ((null (cdr lp)) maxp) z ((> (car lp) (cadr lp)) z (maxpoz1 maxp (1+ ind) z (cons (car lp) (cddr lp)))) 48 z (t (maxpoz1 ind (1+ ind) (cdr l )))))

Rotiranje elemenata liste


z z z z z z z z z z

(defun rotate-right (l) (cond ((null l) '()) (t (rotright (list (car l)) l)))) (defun rotright (l1 l2) (cond ((null l2) '()) ((null (cdr l2)) (cons (car l2) l1)) (t (rotright (append l1 (car l2)) (cdr l2))))) (rotate-right '(a b c d e f)) => (F A B C D E) (rotate-right '(a (b c (d e)) f (g h))) => ((G H) A (B C (D E)) F)

49

Funkcije remove
z z z z z z z z z z z

Funkcija remove brie sva pojavljivanja zadatog elementa iz liste Oblik: (remove elem list) (remove '1 '(1 2 3 4 5)) => (2 3 4 5) (remove 'a '(1 2 3 4 5)) => (1 2 3 4 5) (remove '1 '(a 1 2 3 1 5) :test 'equal :from-end t) => (A 2 3 5) (remove '1 '((a 1) (2 3) (1) (5)) :test 'member :from-end t) =>((2 3) (5)) (remove '1 '((a 1) (2 3) (1) (5)) :test 'equal :key 'car) =>((A 1) (2 3) (5)) (remove '1 '((a 1) (2 3) (1) (5)) :test-not 'equal :key 'car) =>((1)) Funkcija remove-duplicates vraa listu koja nema duplikata Oblik: (remove-duplicates list) (remove-duplicates '((a 2)(b 3)(c 5)(d 3)) :test 'equal :key 'cadr :from-end t) => ((A 2) (B 3) (C 5))

50

Asocijativne liste
z

z z z z z z z

Asocijativna lista je lista kod koje je svaki element lista sa dva elementa. Prvi element podliste je klju, a drugi odgovarajua vrednost. ((A 1) (B 3) (C 10)) ((A (1 5)) (B (2 6)) (C (3 7))) Funkcija za pristup vrednostima asocijativne liste na osnovu kljua je assoc Funkcija assoc vraa podlistu argumenta alist (mora biti asocijativna lista) iji je klju jednak argumentu key Oblik: (assoc key alist) (assoc 'B ((A 1) (B 3) (C 10))) => (B 3) (assoc 'C ((A (1 5)) (B (2 6)) (C (3 7)))) => (C (3 7))
51

Liste osobina
z z z z z z z z z z

Liste osobina su osobine koje se pridruuju navedenom simbolu. Jednom simbolu se moe pridruiti vie osobina, i svakoj osobini se mogu dodeljivati i menjati vrednosti. Funkcija gensym generie novi simbol. Oblik: (gensym) Poziv iste funkcije sa argumentom s omoguava formiranje simbola koji poinju slovom s: Oblik: (gensym 's) Funkcija get ita vrednosti osobine key simbola sym. Oblik: (get sym key) Funkcija set postavlja vrednost osobine key simbola sym. Oblik:(set (get sym key) val)

52

Postavljanje globalnih promenljivih


z

z z z z z z

Funkcije setq i setf vraa naziv promenljive iji se sadraj postaje lista navedena kao drugi argument funkcije Oblik: (setq var list) i (setf var list) (setq lista '(1 2 3 4 5)) => lista (lista) => (1 2 3 4 5) (setq alista ((A (1 5)) (B (2 6)))) => alista (alista) => ((A (1 5)) (B (2 6))) Napomena: Za definisanje promenljivih dovoljno je pozvati jednu od ovih funkcija.
53

Postavljanje lokalnih promenljivih


z z z z z z z z z z

Funkcije let i let* dodeljuje promenljivoj (id) listu (val) i vraa vrednost izraza (exp) Oblik: (let ((id val)...) exp) Oblik: (let* ((id val)...) exp) Mogue je definisanje vie promenljivih jednom naredbom Bitno: domen vaenja promenljive je let izraz (exp) (let ((x 3)) (+ x 3)) => 6 (let ((a 5) (b 6)) (* a b)) => 30 (let ((x 1)) (let ((x (+ x 1))) (+ x 2))) => 4 (let ((x 9)) (* x (let ((x (/ x 3))) (+ x x)))) => 54 (let ((x 9)) (* x (let ((x (/ x 3))) x) (+ x x))) => 486
54

Razlike let i let*


z z z z z z z z z

Funkcije let i let* se razlikuju po redosledu dodele vrednosti. Funkcija let dodeljuje vrednosti paralelno svim promenljivama Funkcija let* dodeljuje vrednosti sekvencijalno promenljivama (let ((x 0) (y 1)) (let ((x y) (y x)) (list x y))) => (1 0) (let ((x 0) (y 1)) (let* ((x y) (y x)) (list x y))) => (1 1)
55

Definisanje parametara, konstanti i promenljivih


z z z

z z z z z z z

Definisanje parametara: (defparameter *p* 1) => *P* - definisan parametar *p*, dodeljena mu je vrednost 1 Vrednost parametra se moe jednostavno prikazati: *p* => 1 Definisanje konstanti: (constantp '*p*) => false definisanje konstante *p* (moe se definisati iako je pre toga definisan parametar sa istim imenom) (setq *p* 2) => 2 - postavljanje vrednosti za *p* na 2 (defparameter *p* 3) => *P* *p* => 3 (defvar *v* 1) => *V* - definisanje promenljive *v* sa poetnom vrednou 1 *v* => 1 - pristupanje vrednosti promenljive *v* (constantp *v*) => '() - definisanje konstante *v* (setq *v* 2) => 2 - postavljanje vrednosti za *v* na 2 (defvar *v* 3) => *V* - ponovo definisanje promenljive *v* sa poetnom vrednou 3
56

Funkcije za evaluaciju izraza


z

z z z z z z

U Lisp-u se podaci i funkcije tretiraju na isti nain. Zbog toga postoje funkcije koje omoguavaju evaluaciju izraza, tj. listi koje su pre toga tretirane kao podaci. Funkcija eval izvrava funkciju koja je prvi element u argumentu Oblik: (eval arg) (eval '(+ 2 3)) => 5 Funkcija apply primenjuje funkciju na listu Oblik: (apply fun list) (apply 'car '(a b c d)) => A
57

Iteracije
z z

z z z z z z

Iteracija: do, do*, dolist, dotimes, dolist, loop, loopfinish Najee koriena funkcija je do, koja odgovara standardnoj DO petlji u drugim programskim jezicima, s tim da se u Lisp-u mogu definisati i vie paralelnih petlji: (do ({var | (var [ init-form [step-form ]])}*) (end-test-form {result-form}*) {declaration}* {tag | statement}* ) (do ( (temp-one 1 (1+ temp-one)) (temp-two 0 (1- temp-two)) ) ((> (- temp-one temp-two) 5) temp-one)) => 4
58

Funkcije do, do* i dolist


z z z z z z z z z z

(do ( (temp1 1 (1+ temp1)) (temp2 0 (1+ temp1)) ) ((= 3 temp2) temp1)) => 3 (do* ( (temp1 1 (1+ temp1)) (temp2 0 (1+ temp1)) ) ((= 3 temp2) temp1)) => 2 Funkcija dolist omoguava iterativnu obradu elemenata liste. (setq temp2 '()) => '() (dolist (temp1 '(1 2 3 4) temp2) (append temp1 temp2)) => (4 3 2 1)
59

Funkcije za definisanje niza naredbi


z z z z z z z

Funkcije prog1 i progn omoguavaju definisanje niza naredbi kao u standardnim programskim jezicima Funkcija prog1 vraa rezultat poziva prve funkcije u nizu (func1). Oblik: (prog1 func1 func2 ... funcn) Funkcija prog1 vraa rezultat poziva poslednje funkcije u nizu (funcn). Oblik: (progn func1 func2 ... funcn) (prog1 (setq x 'mis) (setq x 'slon) (setq x 'tigar) 'dobro) => mis (progn (setq x 'mis) (setq x 'slon) (setq x 'tigar) 'dobro) => dobro

60

Klasa map funkcija


z

z z z z z z

Funkcija mapfun sekvencijalno poziva funkciju definisanu u mapfun (fun) za svaki element liste i nad rezultatom izvrava funkciju (func) i rezultat vraa na mesto elementa stare liste. Oblik: (mapfun func list) (setq words '((one jedan) (two dva) (three tri))) (mapcar 'car words) => (one two three) (mapcar 'cadr words) => (jedan dva tri) (mapcar 'reverse words) => ((jedan one) (dva two) (tri three)) (mapcon 'reverse words) => ((three tri) (two dva) (one jedan) (three tri) (two dva) (three tri))

61

Funkcija mapcar

(one jedan) (two dva) mapcar

(three tri)

car

car

car

(one jedan)

(two dva)
62

(three tri)

Funkcija lambda
z z

z z z

Ova funkcija omoguuje izvravanje poziva vie funkcija pri korienju map funkcija Funkcija lambda povezuje promenljivu (var) sa elementom liste koju izdvaja map funkcija i poziva funkcije argumente lambda nad ovim elementom. Rezultat se prosleuje map funkciji. Oblik: (mapfun (lambda (var) func...) list) (mapcar (lambda (x) (* x x)) '(1 2 3 4 5)) => (1 4 9 16 25) (mapcar (lambda (x) (car x) (cadr x)) words) => (jedan dva tri)

63

Strukture
z z z z z z z z

Strukture u Lisp-u odgovaraju strukturama u drugim programskim jezicima Struktura se definie funkcijom defstruct (defstruct struct_name slot1 slotn) Slotovi su elementi strukture kojima se moe dodeliti vrednost. Funkcija za pravljenje strukture: make-struct_name Funkcije za pristup slotovima: struct-name_slot1, struct_name-slotn Predikat ispitivanja pripadnosti strukture: struct_namep Funkcija kopiranja strukture: copy-struct_name
64

Kreiranje i korienje struktura


z z z z z z z z z z z z z z

(defstruct predmet naziv godina semestar) (setq vestacka (make-predmet :naziv "vestacka :godina '4 :semestar 8)) (defstruct rectangle height width) (defstruct circle radius)
65

z z z z z z z z z z z z z

(defun area (x) (cond ((rectangle-p x) (* (rectangle-height x) (rectangle-width x))) ((circle-p x) (* pi (expt (circle-radius x) 2))))) (let ((r (make-rectangle))) (setf (rectangle-height r) 2 (rectangle-width r) 3) (area r)) => 6 (let ((c (make-circle))) (setf (circle-radius c) 5) (area c)) => 6

Ulaz i izlaz u Lisp-u


z z z z z z z z

Funkcija read je ekvivalent funkciji cin u jeziku C++. ita se ce red unet sa tastature. Primer: (setq A (read)) Funkcije princ i print slue za ispis na ekranu. Razlika je u izlazu iz funkcije, dok je ispis isti. (princ "sam") => "sam" sam (print "sam") => "sam" "sam" (defun out () (print "sam") (princ "sam")) (out) => "sam" "sam" sam "sam"
66

Funkcija format
z z z z z z z z z

Za formiranje preglednijeg izlaza koristi se funkcija format. Konverzija ~a se upotrebljava jer radi za sve tipove podataka (defun zdravo1 () (format t zdravo")) (zdravo1) => zdravo" (defun zdravo2 (N) (format t "~%zdravo ~a" N)) (zdravo2 MIlane) => zdravo Milane (setq lista '(M I L A N)) => lista (defun stampaj_listu (l) (format t "~% Lista: ~a" l)) (stampaj_listu lista) => (M I L A N)
67

Pravljenje liste atoma


z z z z z z z z z z

(defun flatten (l) (cond ((null l) '()) ((atom l) (list l)) ((atom (car l)) (cons (car l) (flatten (cdr l)))) (t (append (flatten (car l)) (flatten (cdr l)))))) (flatten '(1 2 3)) => (1 2 3) (flatten '(1 2 (3 4) 5)) => (1 2 3 4 5) (flatten '(1 2 ((3 4) 5 (6)) 7)) => (1 2 3 4 5 6 7)
68

Izvrenje funkcije flatten


z z z z z z z z z z z z z z z

(flatten '(1 2 (3 4) 5)) => (cons '1 (flatten '( 2 (3 4) 5)) => (cons '1 (cons '2 (flatten '( (3 4) 5)) => (cons '1 (cons '2 (append (flatten (3 4)) (flatten (5))))) => (cons '1 (cons '2 (append (cons '3 (flatten (4))) (flatten (5))))) => (cons '1 (cons '2 (append (cons '3 (cons 4 (flatten '()) (flatten (5))))) => (cons '1 (cons '2 (append (cons '3 (cons 4 '()) (flatten (5))))) => (cons '1 (cons '2 (append (cons '3 '(4)) (flatten (5))))) => (cons '1 (cons '2 (append '(3 4) (flatten (5))))) => (cons '1 (cons '2 (append '(3 4) (cons '5 (flatten '())))) => (cons '1 (cons '2 (append '(3 4) (cons '5 '()))) => (cons '1 (cons '2 (append '(3 4) '(5))) => (cons '1 (cons '2 '(3 4 5))) => (cons '1 '(2 3 4 5)) => (1 2 3 4 5)

69

Brisanje zadatog elementa liste


z z z z z z z z

(defun obrisi (el l) (cond ((null l) '()) ((equal el (car l)) (obrisi el (cdr l))) (t (cons (car l) (obrisi el (cdr l)))))) (obrisi 'a '(a b (a f) j a k)) => (B (A F) J K) (obrisi '(1 2) '(1 2 (1 2 3) 6 (1 2) 8 3 (5 (1 2) 4))) => (1 2 (1 2 3) 6 8 3 (5 (1 2) 4)))
70

Brisanje zadatog elementa liste


z z z z z z z z z

(defun obrisi-sve (el l) (cond ((null l) '()) ((equal el (car l)) (obrisi-sve el (cdr l))) ((atom (car l)) (cons (car l) (obrisi-sve el (cdr l)))) (t (cons (obrisi-sve el (car l)) (obrisi-sve el (cdr l)))))) (obrisi-sve 'a '(a b (a f) j a k)) => (B (F) J K) (obrisi-sve '(1 2) '(1 2 (1 2 3) 6 (1 2) 8 3 (5 (1 2) 4))) => (1 2 (1 2 3) 6 8 3 (5 4)))

71

Okretanje redosleda elemenata liste


z

ta uraditi s prvim elementom liste?


z

Prvi element liste treba postaviti na poslednju poziciju, a ostale ispred njega. Ostatku liste treba okrenuti redosled.

z z

ta uraditi sa ostalim lanovima liste?


z

Kako povezati prvi obraeni lan liste sa ostatkom liste nakon obrade?
z

Izlaz funkcije je lista, pa se povezivanje obavlja nekom od funkcija za pravljenje liste.

Kada se obrada zavrava i koji je povratna vrednost za kraj?


z

Kada je ulazna lista prazna. Povratna vrednost je neutralni element za pravljenje liste prazna lista.
72

Okretanje redosleda elemenata liste


z z z

(defun okreni (l) (cond ((null l) '()) (t (append (okreni (cdr l)) (list (car l)))))) (okreni '(a b c)) => (C B A) (okreni '(a (b c) d e f)) => (F E D (B C) A) (okreni '(a (b c (d e) f) g (h i))) => ((H I) G (B C (D E) F) A)
73

z z z

Okretanje redosleda elemenata liste


z z z z z z z z z z

(defun okreni-sve (l) (cond ((null l) '()) ((atom (car l)) (append (okreni-sve (cdr l)) (list (car l)))) (t (append (okreni-sve (cdr l)) (list (okreni-sve (car l))))))) (okreni-sve '(a b c)) => (C B A) (okreni-sve '(a (b c) d e f)) => (F E D (C B) A) (okreni-sve '(a (b c (d e) f) g (h i))) => ((I H) G (F (E D) C B) A)

74

Presek skupova
z z z z

Reenje: Uporediti sve elemente prve liste se poredi sa elementima druge liste. Element prve liste uporeuje se sa svim elementima druge liste. Ako je element prve liste jednak bilo kom elementu druge dodati ga u izlaznu listu. Ako je element prve liste ne nalazi u drugoj prei na sledei element prve liste. Postoje dve rekurzije, za elemente prve liste i druge liste, koje treba realizovati jednom funkcijom.
z

Definisati uslov koji e da razdvoji prvu rekurziju od druge.


75

Presek skupova
z z z z z z z z z z z

(defun presek (l1 l2) (cond ((null l1) '()) ((null l2) '()) ((atom l1) (if (equal l1 (car l2)) (list l1) (presek l1 (cdr l2)))) (t (append (presek (car l1) l2) (presek (cdr l1) l2))))) (presek '(a b d) '(g)) => () (presek '(1 3 4) '(5 1 2)) => (1) (presek '(a b d e f j k m) '(a c d e j l m)) => (A D E J M)
76

Predstavljanje stabla i grafa


A B D H E G I J
77

z z

C F

z z z z z z z

((cvor1 (pot11 pot12 ...)) (cvor2 (pot21 pot22 ...))...) (setq graf '((A (B C)) (B (D E)) (C (F G)) (D (H)) (E (I)) (F (J)) (G (J)) (H) (I (J)) (J)))

Stablo i graf jednostavne funkcije


z z z z z z z z z z z z

Izdvajanje liste svih vorova u grafu (defun izdvoji (graf) (if (null graf) '() (cons (caar graf) (izdvoji (cdr graf)))))) (izdvoji graf) => (A B C D E F G H I J) Izdvajanje listova u grafu (defun izdvojiL (graf) (cond ((null graf) '()) ((null (cdar graf)) (cons (caar graf) (izdvojiL (cdr graf)))) (t (izdvojiL (cdr graf))))) (izdvojiL graf) => (H J)
78

Stablo izdvajanje sledbenika


z z z z z z z z z

(defun sledS (cvor stablo) (cond ((null stablo) '()) ((equal (caar stablo) cvor) (if (null (cdar stablo)) '() (cadar stablo))) (t (sledS cvor (cdr stablo))))) (sledS 'B graf) => (D E) (sledS 'D graf) => (H) (sledS 'H graf) => ()
79

Graf izdvajanje sledbenika


z z z z z z z z z z z z

(defun sledG (cvor graf obradjeni) (cond ((null graf) '()) ((equal (caar graf) cvor) (dodaj (cadar graf) obradjeni)) (t (sledG cvor (cdr graf) obradjeni)))) (defun dodaj (potomci obradjeni) (cond ((null potomci) '()) ((member (car potomci) obradjeni) (dodaj (cdr potomci) obradjeni)) (t (cons (car potomci) (dodaj (cdr potomci) obradjeni))))) (sledG 'B graf (A D G)) => (E)
80

Dodavanje elementa u graf


z z z z z z z z z z z z z z z z

(defun dodavanje (graf cvor potomci roditelji) (dodaj_veze (dodaj_cvor graf cvor potomci) cvor roditelji)) (defun dodaj_cvor (graf cvor potomci) (cond ((null graf) (list (cons cvor (list potomci)))) ((equal cvor (caar graf)) (cons (cons (caar graf) (list (dodaj potomci (cadar graf)))) (cdr graf))) (t (cons (car graf) (dodaj_cvor (cdr graf) cvor potomci))))) (defun dodaj_veze (graf cvor roditelji) (cond ((null roditelji) graf) (t (dodaj_veze (dodaj_pot graf (car roditelji) cvor) cvor (cdr roditelji))))) (defun dodaj_pot (graf cvor pot) (cond ((null graf) graf) ((equal cvor (caar graf)) (cons (cons (caar graf) (list (append (cadar graf) (list pot)))) (cdr graf))) (t (cons (car graf) (dodaj_pot (cdr graf) cvor pot)))))
81

Sortiranje liste atoma


z z z z z z z z z

(defun sort (l op) (cond ((null l) '()) (t (umetni (car l) (sort (cdr l) op) op)))) (defun umetni (el l op) (cond ((null l) (list el)) ((apply op (list el (car l))) (cons el l)) (t (cons (car l) (umetni el (cdr l) op))))) (sort '(4 6 2 8 1) '<) => (1 2 4 6 8) (sort '(4 6 2 8 1) '>) => (8 6 4 2 1)
82

Sortiranje liste atoma


z z z z z z z z z z z z z z z

(defun sort (l op) (cond ((null l) '()) (t (dodaj (car l) (sort (cdr l) op) op)))) (sort '(4 6 2 8 1) '<) => (dodaj '4 (sort '(6 2 8 1) '<) '<) => (dodaj '4 (dodaj '6 (sort '(2 8 1) '<) '<) '<) => (dodaj '4 (dodaj '6 (dodaj '2 (sort '(8 1) '<) '<) '<) '<) => (dodaj '4 (dodaj '6 (dodaj '2 (dodaj '8 (sort '(1) '<) '<) '<) '<) '<) => (dodaj '4 (dodaj '6 (dodaj '2 (dodaj '8 (dodaj '1 (sort '() '<) '<) '<) '<) '<) => (dodaj '4 (dodaj '6 (dodaj '2 (dodaj '8 (dodaj '1 '() '<) '<) '<) '<) '<) => (dodaj '4 (dodaj '6 (dodaj '2 (dodaj '8 '1 '<) '<) '<) '<) => (dodaj '4 (dodaj '6 (dodaj '2 '(1 8) '<) '<) '<) => (dodaj '4 (dodaj '6 '(1 2 8) '<) '<) => (dodaj '4 '(1 2 6 8) '<) => (1 2 4 6 8)

83

Sortiranje liste atoma


z z z z z z z z z z z z z z z

(defun dodaj (el l op) (cond ((null l) (list el)) ((apply op (list el (car l))) (cons el l)) (t (cons (car l) (dodaj el (cdr l) op))))) (dodaj '8 '1 '<) => (cons '1 (dodaj '8 '() '<)) => (cons '1 '(8)) => (1 8) (dodaj '2 '(1 8) '<) => (cons '1 (dodaj '2 '(8) '<)) => (cons '1 '(2 8)) => (1 2 8) (dodaj '6 '(1 2 8) '<) => (cons '1 (dodaj '6 '(2 8) '<)) => (cons '1 (cons '2 (dodaj '6 '(8) '<))) => (cons '1 (cons '2 '(6 8))) => (cons '1 '(2 6 8)) => (1 2 6 8)

84

You might also like