Professional Documents
Culture Documents
Összefoglalás
1
Áttekintés
Bevezetés
Függvények
Gyakorlatok
2
A Lisp nyelv jellegzetességei
1. Belső adattípusai a listák: könnyen felépíthetők, és kezelhetők
2. Dinamikus kötést használ
3. A program maga is egy adat
4. Az interpretált nyelvek osztályába tartozik
5. Deklaratív nyelv
A lényeg azon van, hogy MIT modellezünk, nem pedig hogyan!!!
6. Funkcionális nyelv
A szintaxis és a szemantika a rekurzív függvényeken alapszik
(belső függvények, ill. felhasználó által értelmezettek).
A szimbolikus adatokat könnyen kezeli (pl. a C++ nyelvhez
képest).
7. Népszerűsége a MI körében
Széles körben alkalmazzák a MI problémáinak modellezésére.
Eredetileg szimbolikus számítások elvégzésére tervezték
Ideális nyelv prototípus rendszerek felépítésére és tesztelésére.
3
Informális szintaxis
Atom: karaktersorozat. Ezt alkothatják
betűk, számok, egyéb karakterek (* + - / @
$ % ^ & _ < >).
Példa: A, *globális*, T, Lali-tanul6na, -15,
Egy lista atomok vagy újabb listák sorozata
zárojelek között felsorolva (rekurzív
struktúra!!!).
Példa: (1 2 3 4), (A (B C) D (E (F)))
S-kifejezés -atomok és listák együttese.
Példa: (A (B 3) (C) ( ( ) ) )
4
Formális szintaxis
6
A listák belső ábrázolása
7
Függvényhívások és adatok
Bármely függvényhívás egy lista:
a lista első eleme a függvény neve
a többi elemek az argumentumok
Példa: (F A B)meghívja az F függvényt az A
és B argumentumokkal
Az adatok atomok vagy listák
Példa: (F A B) egy háromelemű lista
Megjegyzés: A program maga is adatként
kezelhető!!!
8
Olvasás-értékelés-kiírás
Interaktív környezet
A felhasználó S-kifejezéseket vezet be.
A LISP az értelmezőprogrammal kiírja a
képernyőre az eredményt.
Kiértékelési szabályok
Atom: értéke saját maga (hibaüzenet, ha
nem kötött!)
Lista: a LISP úgy értékeli ki, mint egy
függvényt, vagyis kötelező módon
függvénydefiníció kell legyen az első eleme
(különben hibaüzenet!), majd a lista többi
elemét az adott függvény argumentumainak
tekinti és alkalmazza rájuk a definíciót.
9
A kiértékelés megakadályozása
10
Áttekintés
Bevezetés
Függvények
Gyakorlatok
11
Elemi beépített függvények
CAR (v. FIRST) - a lista fejét adja vissza
CDR (v. REST) - a lista farkát téríti vissza (a
fej nélküli listát!)
CONS - egy új fejet tesz be a listába
EQ - atomok egyenlősége
EQUAL - két S-kifejezés egyenlősége
ATOM - leteszteli hogy az argumentuma
atom-e
NUMBERP - leellenőrzi, hogy argumentuma
szám-e
12
Más hasznos függvény
13
CAR (FIRST)
(CONS ‘A ‘( B C )) ( A B C )
16
CONS példák
( (X Y) Z) (X Y) (Z) ( (X Y) Z)
(X) X () (X)
17
Pontozott párok
18
EQ
19
EQUAL
20
ATOM
21
IF
22
COND
COND - az összetett
if...then...elseif...then...elseif...then...
vezérlő-szerkezetet valósítja meg.
Argumentumai tetszőleges számú,
kételemű listák, a feltételekkel és
tevékenységekkel.
A függvény argumentumai sajátos
módon értékelődnek ki.
A COND is egy sajátos forma.
23
A COND alakja
(COND
(feltétel1 tevékenység1 )
(feltétel2 tevékenység2 )
...
(T tevékenységN) )
24
A sajátos formákról
25
Más hasznos függvény/1.
(LENGTH L) egy L lista hosszát adja
meg.
(LENGTH ‘((1 2) 3 (1 (4 (5))))) 3
(RANDOM N) , ahol N egy egész, egy 0
és N közötti véletlen egészet ad.
(AND e1 e2 ... eN)-logikai és. Az első NIL-
nél megáll a kiértékelésben.
(OR e1 e2 ... eN)- logikai vagy. Az első
nem-NIL-ig értékel.
(NOT e) – logikai tagadás.
26
Más hasznos függvény/forma 2.
(SETQ s f)- f értékét s-hez köti.
Csak f-et értékeli ki.
(SET h f)-f értékét h-hoz köti.
Mindkét argumentum kiértékelődik.
(SETF h f)- A SET általánosítása:
mikor h egy szimbólum, úgy
viselkedik, mint a SETQ, különben
mint a SET.
27
Példák a változók megkötésére
SET és SETQ
(setq x 1) 1 ;;; x felveszi az 1 értéket
(set a 2) ERROR!! ;;; a NEM értelmezett
(set ‘a 2) 2 ;;; az a szimbólumhoz 2 értéket rendel
(+ a x) 3
(setq l ‘(x y z)) (x y z)
(set (car l) g) g
l (g y z)
SETF
(setf x 1) 1
(setf a 2) 2
(+ a x) 3
(setf l ‘(x y z)) (x y z)
(setf (car l) g) g
l (g y z)
28
Saját függvények értelmezése
29
Tanácsok függvények írásához
Míg triviális a függvény, próbáljunk a COND
sajátos formával dolgozni.
Előbb az egyszerűbb esetekkel
foglalkozzunk .
Kerüljük, hogy több, mint egy alapesetünk
legyen.
Az alapeset általában az üres listát teszteli a
NULL függvénnyel.
Tégy valamit a CAR-ral és utána használd a
CDR-t.
30
Áttekintés
Bevezetés
Függvények
Gyakorlatok
31
Egyszerűbb példák
32
Rekurzió
33
Első példa a rekurzióra
(DEFUN HATVANY (X Y)
(COND ((= Y 0) 1)
(T (* X (HATVANY X (- Y 1))))))
34
A MEMBER értelmezése
35
Feladat: EGYESIT
Értelmezzünk egy függvényt két
halmaz egyesítésére.
Példa: (EGYESIT ‘(A B C) ‘(B C D E)(A B
C D E)
A rekurzív definíció:
(EGYESIT x y) = ha x első eleme benne van y-ban
akkor (EGYESIT (REST x) y)
különben összetesz (first x) (EGYESIT
(REST x) y)
36
Megoldás: EGYESIT
37
Halmazok metszete
(DEFUN METSZ (X Y)
(COND ((NULL X) NIL)
((MEMBER (FIRST X) Y)
(CONS (FIRST X)
(METSZ (REST X) Y)))
(T (METSZ (REST X) Y))))
38
Halmazok különbsége
(DEFUN KÜLÖNBSÉG (X Y)
(COND ((NULL X) NIL)
((MEMBER (FIRST X) Y)
(KÜLÖNBSÉG (REST X) Y))
(T (CONS (FIRST X)
(KÜLÖNBSÉG (REST X) Y)))))
39
Az EQUAL függvény értelmezése
(DEFUN EQUAL (X Y)
(COND ((NUMBERP X) (= X Y))
((ATOM X) (EQ X Y))
((ATOM Y) NIL)
((EQUAL (CAR X) (CAR Y))
(EQUAL (CDR X) (CDR Y)))))
40
Listákat feldolgozó példák
(DEFUN UJ-MEMBER (X L)
(COND ((ATOM L) NIL)
((EQUAL X (CAR L)) T)
(T (UJ-MEMBER X (CDR L))))
41
Variációk a REVERSE függvényre
44
Lapít II
;; ez a változat kikerüli az APPEND használatát,
;; amely költséges.
(DEFUN LAPIT (L) (LAPIT1 L NIL))
Új változók létrehozása
LET: párhuzamos értékadás, helyi kötés
LET*: szekvenciális értékadás
LET alakja:
(LET ((valtozó1 érték1) ... (változóN
értékN))
forma1
…
formaM)
46
Helyi változók - LET
Írjunk függvényt ax2+bx+c=0 megoldására.
(DEFUN GYOK1 (A B C)
(SETQ TEMP (SQRT (- (* B B) (* 4 A C))))
(LIST (/ (+ (- B) TEMP) (* 2 A))
(/ (- (- B) TEMP) (* 2 A))))
(GYOK1 1 2 1) (-1.0 -1.0)
TEMP 0.0
Helyi változó deklarálása LET-tel
(DEFUN GYOK2 (A B C)
(LET (TEMP)
(SETQ TEMP (SQRT (- (* B B) (* 4 A C))))
(LIST (/ (+ (- B) TEMP) (* 2 A))
(/ (- (- B) TEMP) (* 2 A)))))
47
Helyi változók - LET
(DEFUN GYOK3 (A B C)
(LET ((TEMP (SQRT (- (* B B) (* 4 A C))))
((NEVEZO (*2 A)))
(LIST (/ (+ (- B) TEMP) NEVEZO )
(/ (- (- B) TEMP) NEVEZO ))))
48
Farokrekurzió
49
Egyszer- illetve kétszer tesztelő
farokrekurzió
(DEFUN MPLANP (X) ;mind páratlan
(COND ((NULL X) NIL)
((ODDP (FIRST X)) T)
((T (MPLAN (REST X))))
(DEFUN ELSO-ATOM (X)
(COND ((ATOM X) X)
((T (ELSO-ATOM (FIRST X))))
(DEFUN SZAMOL (X) ;mit is???
(COND ((NULL X) 0)
(T (+ 1 (SZAMOL (REST X))))))
50
Több feltételhez kötés...
51
Többszörös rekurzió
(DEFUN FIB (N)
(COND (EQUAL N 0) 1)
(EQUAL N 1) 1)
(T (+ (FIB (- N 1))
(FIB (- N 2))))))
(DEFUN SZAM-KERES (X)
(COND ((NUMBERP X) X)
((ATOM X) NIL)
(T (OR (SZAM-KERES (CAR X))
(SZAM-KERES (CDR X))))))
52
Farekurzió (fej-farok)
53
Feladat: VEKTORÖSSZEG
(VEKTÖSSZ X Y) - argumentumai listák,
összeadja a megfelelő helyen levő
számokat a listában.
Példa: (VEKTÖSSZ ‘(3 6 9 10 4) ‘(8 5 2))
(11 11 11 10 4)
(DEFUN VEKTÖSSZ (X Y)
(COND
((NULL X) Y)
((NULL Y) X)
(T (COND (+ (CAR X) (CAR Y)
(VEKTÖSSZ (CDR X) (CDR Y))))))
54
Függvénytípusok
A tár tartalmát érintetlenül hagyó függvények, vagyis
mellékhatással nem rendelkezők
(pl. CAR, CDR, EQ, EQUAL)
Új cellákat lefoglaló függvények, amelyek a meglévők
tartalmát érintetlenül hagyják
(pl. CONS, LIST, APPEND)
Atomok értékmutatóját megváltoztató függvények
(pl. SETQ)
Rombolóak vagy rejtett értékadó függvények: az
atomok értékmutatóját nem változtaják meg, de a
listaszerkezetek mutatójának megváltoztatásával
megváltoztathatják egyes atomok értékét
(pl. NCONC, RPLACA, RPLACD, DELETE)
55
Magasabbrendű függvények
56
Magasabbrendű függvények
MAP függvények:
úgynevezett listabejáró függvények
a Lisp nyelv fontos eszközei
jellegzetességük, hogy rekurzív módon
bejárnak egy listát, amely a második
argumentumuk, és minden megvizsgált
listarészletre alkalmaznak egy függvényt
(ez az első argumentumuk).
pl. MAPCAR, MAPLIST, MAPCAN, MAPCON
57
MAPCAR
58
A MAPCAR definíciója és alkalmazása
(DEFUN MAPCAR (F L)
(IF (NULL L) NIL
(CONS (APPLY F (LIST (CAR L)))
(MAPCAR F (CDR L)))))
59
A MAPCAR-t mellőzve...
60
Újabb alkalmazás a MAPCAR-ra
Mit csinál az alábbi függvény?
(DEFUN MICSI (L)
(IF (ATOM L) 0 (MAX (LENGTH L) (APPLY
‘MAX (MAPCAR ‘MICSI L))))))
62
LAMBDA-kalkulus
Egy függvény értelmezésekor a definícióbeli
függvénynév-szimbólum úgynevezett lambdakifejezés
formájában tárolódik.
Általános alakja: (LAMBDA l f1 f2 ... fm)
A LAMBDA nem függvény, hanem szimbólum, a
lambdakifejezés első eleme, ami jelzi az
értelmezőprogramnak, hogy egy névtelen függvény
megadása következik. Ezért hibához vezet, ha a forma
első eleme maga a LAMBDA szimbólum, nem pedig a
lambdakifejezés. Használata: ((LAMBDA l f1 f2 ... fm) p1
p2 ... pn)
Példa: ((lambda (n) (+ n 1)) 5)
Rekurzivitás lambdakifejezésekben: címkézéssel
((LABEL név (LAMBDA l f1 f2 ... fm)) p1 p2 ... pn)
63
Példa a LAMBDA alkalmazására
64
Példa a LAMBDA alkalmazására
65
Példa a LABEL alkalmazására
;f(0)=f(1)=1, f(n)=f(n-1)+f(n-2), ha n>1
66
Laborfeladatok
Számokat tartalmazó lista legnagyobb elemének kiválasztása
(LEGNAGYOBB l)
Számokat tartalmazó lista legkisebb elemének kiválasztása
(LEGKISEBB l)
Számokat tartalmazó lista átlagának visszatérítése (ÁTLAG l)
Lista adott elemének törlése felső szinten (TÖRÖL e l)
Lista adott elemének törlése minden szinten (MINDTÖRÖL e l)
Azonos elemeket is tartalmazó lista ,,halmazosítása’’ gyűjtőváltozó
módszerével (HALMAZOSÍT l)
segédfüggvény: (HALM-SEGÉD l1 l2)
l1: az eddig talált atomok listája
l2 az l be nem járt része
Megállási feltétel: mikor az l2 üres lista lesz (nincs mit bejárni)
Ha l1-ben már megvan az éppen vizsgálandó elem, akkor változatlan
marad, különben az elem bekerül l1-be
Fakultatív: Matematikai kifejezés prefixes formára alakítása
(alapműveletek: összeadás, kivonás, szorzás, osztás, hatványozás)
67
Lispbox (Lisp in box)
71
Hivatkozások
http://people.inf.elte.hu/istenes/lisp/
http://apsymac33.uni-trier.de:8080/Lisp-
Course
http://www.cs.cmu.edu/~dst/LispBook/boo
k.pdf
http://www.cliki.net/Online%20Tutorial
http://www.cs.sfu.ca/CC/310/pwfong/Lisp/
http://www.nicklevine.org/declarative/lectu
res/index.html#additionals
72