![Page 1: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/1.jpg)
LISP
![Page 2: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/2.jpg)
Lisp
•Ispirato da funzioni ricorsive e lambda calcolo•Inventato da John McCarthy•Progenitore dei linguaggi di programmazione funzionale
![Page 3: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/3.jpg)
LISP: LISt Processor
LISP è stato disegnato originariamente per l’Intelligenza ArtificialeHa vari dialetti: Common Lisp, FranzLisp, AutoLisp, etc.E’ basato su un approccio ricorsivo ed incrementalePrevalentemente utilizzato mediante interpreti
![Page 4: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/4.jpg)
LISP: Stile interattivo
• Utente: definisce funzioni o richiede un calcolo
• Interprete: accetta la definizione o esegue il calcolo
![Page 5: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/5.jpg)
Tipi di dato in Lisp
Liste
S - espressioni
Floating point
Integer
Lista non vuota
Lista vuota
Atomi
Simboli
Numeri
![Page 6: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/6.jpg)
Esempi
• Lista vuota: ‘()’ anche chiamata ‘NIL’
• Atomo: ‘ALPHA’
• Lista (piatta): ‘( A B D )’
• Lista: ‘( A B ( D E ) A)’
• Intero: 3
• Floating point: 3.14
![Page 7: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/7.jpg)
Liste
• Liste:– Una lista può contenere come
elementi atomi o altre liste.– Gli elementi sono racchiusi tra
parentesi.– Una lista può essere vuota.
![Page 8: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/8.jpg)
Operazioni su liste
• CAR : restituisce il primo elemento di una lista– (CAR ‘(5 2 9)) 5
• CDR : restituisce la lista senza il primo elemento.– (CDR ‘(5 2 9)) (2 9)
• Possiamo mescolare CAR e CDR in ogni combinazione.
![Page 9: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/9.jpg)
Esempi:(CAR (CDR L)) = (CADR L)Es. : (CAR (CDR ‘(1 2 3 4)))
2
(CDR (CAR L)) = (CDAR L)Es. : (CDR (CAR ‘((1 2) (2 3) (3 4) (4 5))))
(2)
•CAR restituisce un ELEMENTO (atomo o lista)•CDR restituisce una LISTA•(CAR NIL) = (CDR NIL) = NIL
Che cos’e’ l’apice che precede le liste di numeri?
![Page 10: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/10.jpg)
QUOTE (‘)
•Notazione prefissa: il primo elemento di una lista e’
la funzione, gli altri elementi sono gli operandi.
•Come distinguo (+ 1 1) (= somma dei numeri 1 e
1) dalla lista costituita dai simboli “+”, “1” e “1”?
•Soluzione: operatore QUOTE (abbreviato con
l’apice):
(QUOTE (1 2 3)) = ‘(1 2 3)
La lista (1 2 3) non viene “valutata” (= non si cerca
una funzione 1 da applicare a 2 e 3)
![Page 11: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/11.jpg)
Altre operazioni su liste: CONS
CONS: Accetta un elemento e una lista e restituisce la lista con l’elemento inserito al primo posto
(CONS ‘A ‘(B C))(A B C)
(CONS ‘A (CDR ‘(B C)))(A C)
![Page 12: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/12.jpg)
Funzioni aritmetiche(+ 3.14 2.5)5.64
(+ 2 (+ 3 6))11
(* 6 4)24
(/ 25 5)5
![Page 13: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/13.jpg)
Float e Integer
(/ 27 9) Divisione tra interi con risultato intero3
(/ 14.0 4.0) Divisione tra reali3.5
(/ (FLOAT 14) (FLOAT 4)) Equivalente al precedente3.5
![Page 14: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/14.jpg)
Altre funzioni matematiche
(MAX 7 6 8)8
(MIN 7 6 8)6
(ABS -8)8
(EXPT 2 3)8
(SQRT 25)5
(ROUND 1.25)1
(ROUND 1.75)2
X intero:X=(ROUND (FLOAT X))
![Page 15: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/15.jpg)
Altre funzioni matematiche
(TRUNCATE 14 4) Divisione tra interi3
(REM 14 4) REMainder: resto2
X,Y interi; Y diverso da 0:(+ (* (TRUNCATE X Y) Y) (REM X Y)=X
![Page 16: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/16.jpg)
Funzioni predefinite su liste: LIST
LIST prende n operandi e restituisce la lista i cui elementi sono gli n operandi
(LIST ‘A)(A)
(LIST ‘A ‘B)(A B)
(LIST ‘A (CDR ‘(A B C)))(A (B C))
![Page 17: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/17.jpg)
Funzioni predefinite su liste: APPEND
APPEND prende n liste e restituisce la lista composta dagli elementi delle n liste
(APPEND ‘(1 2) ‘(3 4))(1 2 3 4)
(APPEND ‘(1 2) ‘(CDR (1 2)))(1 2 CDR (1 2))
![Page 18: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/18.jpg)
Predicati True/False
In Lisp la lista vuota (NIL) è False; tutto il resto è True.
Per indicare esplicitamente il valore True si usa T.
![Page 19: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/19.jpg)
Esempi di predicati
• ATOM verifica se l’operando è un atomo• LISTP verifica se l’operando è una lista• NULL verifica se l’operando è una lista vuota• EQ verifica se gli operandi (S-espressioni)
sono ugualiOltre a questi ci sono, tra gli altri, gli operatori
relazionali: =, >,< che operano su numeri
![Page 20: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/20.jpg)
Numero di operandi
• N: +,*,-,\,MAX, MIN, APPEND, LIST, AND
• 2: TRUNCATE, REM, EXPT, EQ, =, >,<
• 1: ABS, SQRT, FLOAT, NOT, NULL, ATOM, LISTP
![Page 21: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/21.jpg)
Definizione di funzioni: DEFUN
• Sintassi:
• (DEFUN <nome_funzione> (<operando1> <operando2>…<operandoN>) (<corpo_della_funzione>) )
![Page 22: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/22.jpg)
Esempio di definizione di funzione
(DEFUN Secondo (L) (CADR L))
Esempio:
(Secondo ‘( A C D))
C
![Page 23: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/23.jpg)
Espressioni condizionali: COND
Sintassi
(COND (<espressione1> <azione1>)
(<espressione2> <azione2>)
…
(<espressioneN> <azioneN>))
![Page 24: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/24.jpg)
Esempio: funzione PARI
PARI(X)= T se X è pari
NIL altrimenti
(DEFUN PARI (X)
(COND ((= (REM X 2) 0) T)
(T NIL)))
![Page 25: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/25.jpg)
Ricursione
APPARTIENE(A,L)= T se A appartiene alla lista L NIL altrimenti
(DEFUN APPARTIENE (A L)(COND ((NULL L) NIL)
((EQ A (CAR L)) T)(T (APPARTIENE A (CDR L)) )))
(APPARTIENE 'A '(A B C))T
![Page 26: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/26.jpg)
Altri esempi
(DEFUN UNIONE (L1 L2)
(COND ((NULL L1) L2)
((APPARTIENE (CAR L1) L2) (UNIONE (CDR L1) L2))
(T (UNIONE (CDR L1) (CONS (CAR L1) L2)))))
(UNIONE '(A B C) '(C D E))
(B A C D E)
![Page 27: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale](https://reader035.vdocuments.site/reader035/viewer/2022062418/5542eb57497959361e8c18ca/html5/thumbnails/27.jpg)
Cenni sull’interprete
Valutazione di S-espressioni:• Atomi: la valutazione di numeri (simboli)
restituisce il numero (simbolo) stesso.• Liste: vengono valutati tutti gli elementi di primo
livello (a meno di QUOTE)– Il primo elemento è sempre un nome di funzione; viene
valutato il corpo della funzione corrispondente.– Tutti gli altri elementi vengono valutati e i risultati
corrispondenti vengono usati come argomenti della funzione