LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore...

27
LISP

Transcript of LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore...

Page 1: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale.

LISP

Page 2: LISP. Lisp Ispirato da funzioni ricorsive e lambda calcolo Inventato da John McCarthy Progenitore dei linguaggi di programmazione funzionale.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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