You are on page 1of 54

Programmazione Funzionale e Programmazione Logica

Alberto Casagrande Dip. di Matematica e Informatica Universit di Udine

In Questo Corso

Perch insegnare progr. Funzionale e Logica nella scuola secondaria? Su quali concetti puntare l'attenzione? Quali strumenti utilizzare? Risponderemo insieme (parzialmente) alle domande Non un corso di programmazione...

Riferimenti Bibliografici
(corsi di progr. Funzionale e Logica)

Pratt. Programming Languages. Prentice-Hall.


Sethi. Linguaggi di Programmazione. Zanichelli Bird Wadler. Introduction to Functional Programming. PrenticeHall. Peyton Jones. The Implementation of Functional Programming Languages. Prentice-Hall. Sterling Shapiro. The Art of Prolog. MIT Press. Console Lamma Mello. Programmazione Logica e Prolog. UTET.

Piano del Corso


Concetti Matematici:

Funzionale e Logica: Insiemi Funzionale: Funzioni, Composizione di Funzioni Logica: Relazioni, Formule Logiche

Strumenti:

Funzionale: Dr Scheme, ML Logica: Prolog

Le Basi Comuni per i 2 Paradigmi

Concetto di Insieme: raccolta di elementi (Scuole Elementari) Esempi di insiemi finiti Esempi di insiemi numerici

Base per i Linguaggi Funzionali

Una funzione una legge che associa ad ogni elemento del dominio uno ed un solo elemento del codominio (Scuole Superiori) Non sempre questo concetto chiaro!

Cosa intuiscono gli studenti?


Una funzione un'uguaglianza (una cosa) A sinistra ci metto y a destra ci metto un'espressione (un po' di operazioni) con la x es. y= 4x+5 scelgo un valore per la x e la funzione mi sputa fuori un valore per la y

Cosa ne scaturisce?
es. Prof. Se f(y)=2*y+3, quanto vale f(8)? Studente Domanda trabocchetto! La x non c'!

Gli esercizi incomprensibili - 1

Si pu esprimere la temperatura in funzione del giorno oppure si pu esprimere il giorno in funzione della temperatura? Si pu esprimere l'altezza di una persona in funzione della sua et oppure...? Esistono due concetti A e B tali che posso esprimere A in funzione di B e B in funzione di A?

Perch sono incomprensibili?

Gli esercizi incomprensibili - 2

alcuni esercizi erano formulati male: - temperatura media giornaliera; - altezza misurata nel giorno del compleanno; - ... gli studenti sono in grado di correggere la formulazione in una corretta? fornendo agli studenti una formulazione corretta questi sono in grado di comprendere gli esercizi?

Non mancanza di fiducia negli studenti!

Da dove nasce la confusione?

Molto tempo da quando si vedono gli insiemi a quando si vedono le funzioni Gli insiemi sembrano giocattoli, mentre le funzioni sembrano complicate Si passa subito a fare esercizi sulle funzioni reali f: Il concetto di relazione non viene introdotto ma gli studenti spesso confondono relazioni e funzioni

... (che idee vi siete fatti voi?)

Un semplice concetto difficile:

Ariet di una Funzione

f(x,y) = x + y una funzione binaria su 2 o una funzione unaria su ? Che ariet hanno somma, prodotto, ? Le funzioni hanno sempre ariet 1 su un opportuno dominio

utile introdurre il concetto di ariet e proiettare i domini (es. derivate parziali)

Un altro concetto difficile:

Composizione di Funzioni
Data f : A B e g : B C considerare f g : A C Dire se una funzione composizione di altre dipende fortemente dalle funzioni base es. f(x) = (x + 5) non composta g(x) = (x + 2) + 3 composta, ma f=g??? un concetto fondamentale (es. derivate)

Duplice aiuto dai Linguaggi Funzionali

Dal punto di vista Matematico - capire generalit e potenza delle funzioni - capire differenza tra funzione e relazione - capire concetti di dominio e codominio Dal punto di vista Informatico - programma sequenza di passi - legami tra matematica e informatica

Programmazione Funzionale con Dr Scheme

Scheme un linguaggio funzionale non tipato Dr Scheme


un ambiente di programmazione grafico, interattivo ed integrato ideato per l'insegnamento di Scheme disponibile per Windows, Mac OSX, Unix distribuito con la licenza GNU Lesser General Public Licence (LGPL)

Riferimenti Bibliografici

Scheme

http://www.schemers.org/Documents/Standards/R5RS/

Dr Scheme

http://www.drscheme.org (download) http://www.htdp.org/2002-09-22 (libro on-line) Halperin et al. Concrete Abstractions. PWS

Dr Scheme
Scegliere Beginning Student!

Finestra Definizioni
Execute rende le definizioni utilizzabili nella...

Finestra Interazione
Pu essere usata anche senza aver definito funzioni

Le Prime Prove

si pu iniziare usando la finestra di interazione si valutano semplici espressioni numeriche le stringhe vanno scritte tra virgolette si usa; per i commenti le operazioni sono prefisse attenti alle parentesi!!

Funzionalit di DrScheme

Dall'help di DrScheme raggiungete


http://127.0.0.1:8001/servlets/external-search.ss?hd-url=/doc/tour

dove trovate i dettagli relativi a DrScheme


Save serve per salvare le definizioni... Check Syntax controlla che sia scritto bene Execute rende disponibili le definizioni Step per vedere l'esecuzione per passi Break ... se proprio va male per fermare tutto...

Funzioni Predefinite - 1

le funzioni aritmetiche + - * / sono funzioni predefinite in Scheme ovvero non occorre definirle una funzione predefinita fornisce il resto della divisione intera cosa accade se chiedo (remainder 4 3.1)? perch? (concetto di dominio)
remainder

altre: (sqrt x), (exp x y), (round x),


(sin x), (cos x), pi

Funzioni Predefinite - 2

oltre ai numeri ed alle stringhe esistono le costanti booleane #f (false) #t (true)


< una funzione binaria (< x y) true se x<y altrimenti analogo per >, =, <=, >= even? una funzione unaria (even? 3) restituisce false analogo per odd?

false

importante far capire che sono funzioni!!!

Funzioni Predefinite - 3

una funzione unaria prende in input un valore booleano l'output deve essere definito per true e per false > (if #t 5 ciao) ritorna valore 5 > (if #f 5 ciao) ritorna valore ciao
if

molto utile per costruire funzioni composte: il valore in input non una costante, ma una funzione che deve essere valutata l'output pu essere definito usando altre funzioni
if

La funzione define
La funzione associa un nome simbolico ad un espressione . Es.
(define )

Ogni istanza di viene sintatticamente interpretata come . Es.


> (if #t 5 ciao)

Qualche esempio

(define pippo (+ (* 3 5) 8)) define non serve solo per definire funzioni

o meglio pu definire funzioni costanti


in questo caso lo stepper mostra i passi (+ (* 3 5) 8)) (+ 15 8) 23 (define (somma1 x) ( + x 1)) (define pluto (somma1 5))

definisco una funzione e la sua valutazione in 5


vedere cosa fa lo stepper? In questo caso si usata solo la finestra di definizione

Scheme e Lambda?!?
(define (somma x y) (+ x y))

oppure
(define somma (lambda (x y) (+ x y))) Probabilmente non sar necessario introdurre la lambda notazione, ma se avete spiegato la funzione define... Anche relativamente alle potenzialit di DrScheme dovrete effettuare delle scelte...

Comporre Funzioni - 1
(define (id x) x) (define (doppio x) (+ (id x) (id x))) (define (triplo x) (+ (id x) (doppio x))) doppio composizione di id e + triplo composizione di id, doppio e + come scrivere triplo senza comporre funzioni? il concetto di composizione dipende da: 1. quali sono le funzioni predefinite; 2. come definisco una funzione.

Comporre Funzioni - 2

cosa succede se valuto


> id(ciao)

cosa succede se valuto


> doppio(ciao)

La funzione + non definita sulle stringhe Quando si compongono funzioni occorre fare attenzione a domini e codomini!!

La Funzione If - 1
(define (grande x y) (if (> x y) "si" "no")) > (grande 8 5) > si > (grande 3 3) > no

in questo caso viene valutato l'input si valuta se la funzione (> x y) vale #t o #f non servono valutazioni per l'output grande composizione di if e >

La Funzione If - 2
(define(pari>= x)(if (even? x) x (+ x 1))) > (pari>= 5) > 6 > (pari>= 6) > 6

Occorre valutare sull'input (even? x) Per ottenere l'output quando x dispari si valuta (+ x 1) Servono molti esercizi con composizioni ed if...

Composizioni di If
Il prezzo del biglietto per il cinema :
5 euro per adulti; 3 euro bambini; 4 euro pensionati.

Scrivere una funzione...


(define(prezzo x) (if(string=? x "adulto") 5 (if(string=? x "bambino") 3 (if (string=? x "pensionato") 4 "errore"))))

Si pu introdurre cond else... molto pericoloso...

Funzioni Predefinite - 4

una funzione binaria prende in input due valori booleani restituisce un valore booleano restituisce true solo se gli input sono true true
and or

una funzione binaria una funzione unaria

...

not

...

Sottolineate che if, and, or, not sono funzioni.

Composizione If, And, Or, Not

Le funzioni and, or, not hanno tutte input booleani ed output booleani... ... quindi facendo attenzione alle ariet possibile comporle La funzione if ha input booleani ed output non necessariamente booleani... ...le composizioni con if esterno funzionano Ci sono casi con l'if interno ad and, or, not??

Possibili Esercizi

Calcolo di perimetri, aree, volumi... Problemi distanza-velocita' Problemi di capitalizzazione Problemi di conversioni di misure Utilizzo della libreria draw.ss (Teachpack) http://www.htdp.org/2002-09-22

Ne trovate molti nei primi capitoli in

Ricorsione - 1

consideriamo f :

so quanto vale f(0) se n>0 per calcolare f(n) mi serve f(m) con per un qualche m<n

un caso particolare di funzione ricorsiva gi abbastanza complesso da capire quasi quanto basta in generale (vedere corso di fondamenti)

Ricorsione - 2

bene introdurre la ricorsione con molti esempi


(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1))))) (define (fact1 n) (* n (fact1 (- n 1)))) (define pippo (fact1 2))

utile vedere cosa succede usando lo stepper

cosa succede se valuto (factorial (factorial 3.5) ?

-1)

oppure

Ricorsione - 3

Rivediamo l'esempio del fattoriale con dominio(define (fact2 n)


(if (= n 0) 1 (* n (fact2 (- n 1))))) (define (dfact n) (if (< n 0) errore (fact2 n)))

ancora sbagliato! perch?

(define (fact3 n) (if (< n 0) -1 (if (= n 0) 1 (* n (fact3 (- n 1)))))) (define (dfact2 n) (if (< (fact3 n) 0) errore (fact3 n)))

..

Esempi ed Esercizi

divisione intera
(define (diviso n m) (if (< n m) 0 (+ (diviso (- n m) m) 1)))

cosa succede se valuto (diviso

4.7 3)

prodotto tra interi senza usare*


(define (prodotto n m) (if (= 0 m) 0 (+ n (prodotto n (- m 1)))))

cosa succede se valuto (prodotto


(prodotto 4 3.7)

4.7 3)

Esempi ed Esercizi

sommare tutti i numeri naturali appartenenti ad un intervallo; contare le cifre di un numero; il problema di Giuseppe;... decidere se un numero primo
(define (qprimo n m) (if (= m 1) #t (if (= (remainder n m) 0) #f (qprimo n (- m 1))))) (define (numprimo n)(qprimo n (- n 1)))

come migliorarlo?

Esempi ed Esercizi

calcolare il Massimo Comun Divisore


(define (mcd n m) (if (= m n) n (if (> n m) (mcd (- n m) m) (mcd (- m n) n))))

come migliorarlo?

(define (fastmcd n m) (if (> n m) (if (= (remainder n m) 0 ) m (fastmcd (remainder n m) m)) (fastmcd m n)))

cosa manca?

Le Liste

lista = elenco di elementi in un dato ordine [] la lista vuota; [3] la lista con 3 come unico elemento; [4, 7] la lista con primo elemento 4 e...; [4, 7] diversa da [7, 4]; [a, 2, 5] una lista in cui ... Scheme fornisce delle funzioni predefinite per lavorare con le liste: cons, car, cdr, null? Scheme fornisce anche la funzione list, ma list non ha un'ariet... un po' pericolosa...

Funzioni Predefinite per Liste

cons una funzione binaria prende in input un elemento el ed una lista l restituisce in output la lista [el,l] sono funzioni unarie

car che prende in input una lista [el,l] e

restituisce in output el

cdr che prende in input una lista [el,l] e

restituisce in output l

null? che prende in input una lista l e restituisce in output #t solo se l la lista vuota

'() la costante che rappresenta la lista vuota

Esempi con Liste in Input


trovare il terzo elemento di una lista ricercare un elemento in una lista calcolare la lunghezza di una lista dire se due liste sono uguali (si pu usare la funzione predefinita equal?) sommare gli elementi di una lista trovare il massimo di una lista ... altre funzioni in cui l'output non sia una lista

Sommare gli elementi di una Lista


Una possibile soluzione...
(define (sommalista lista) (if (null? lista) 0 (+ (car lista)(sommalista (cdr lista)))))

Esempi di calcolo
> (define pippo (list 1 2 3)) > (sommalista pippo) > 6

Trovare il Massimo di una Lista


Una possibile soluzione... indipendente dalla presenza di numeri negativi...
(define (qmassimo n t) (if (null? t) n (if (< n (car t)) (qmassimo (car t)(cdr t)) (qmassimo n (cdr t))))) (define (massimo l) (if (null? l) "lista vuota" (qmassimo (car l)(cdr l))))

Dire se due Liste sono Uguali


Una possibile soluzione...
(define (uguali t s) (or (and (null? t) (null? s)) (and (not (null? t)) (not (null? s)) (= (car t) (car s)) (uguali (cdr t)(cdr s)))))

Cosa succede se testo


> (uguali (list 3 4)(list 3 (+ 3 1))) > (uguali (list 3 4)(list 3 (+ 3 1))) > (uguali (list 4 a) (list 3 a)) > (uguali (list a 4) (list a 4))

Esempi con Liste in Output


dato n, scrivere una lista con n elementi dato n, scrivere la lista [n,n-1,...,0] dati x y z w, scrivere la lista [x, y, z, w] dati x y z w, scrivere la lista [y, x, w, z] ... altri aventi le liste in output, ma non in input

Esempi

lista con n elementi


(define (mylist n) (if (<= n 0) empty (cons 0 (mylist (- n 1)))))

lista con elementi n, n-1, ..., 0


(define (mylist n) (if (<= n 0) empty (cons n (mylist (- n 1)))))

Esempi Liste Input Output


aggiungere el in posizione i di una lista l eliminare el dalla posizione i di una lista l aggiungere el in fondo alla lista l
(define (inseriscicoda x l) (if (null? l)(cons x l) (cons (car l)(inseriscicoda x (cdr l)))))

mettere insieme due liste (esiste la funzione predefinita append) invertire una lista ed ordinare una lista

Esempi Liste Input Output

aggiungere el in fondo alla lista l

(define (inseriscicoda x l) (if (null? l)(cons x l) (cons (car l)(inseriscicoda x (cdr l)))))

invertire una lista

(define (invert l) (if (null? l) l (inseriscicoda (car l) (invert (cdr l)))))

Composizione e Liste

dato n, produrre la lista [0,1,..., n] una volta svolti gli esercizi precedenti diventa una semplice composizione di funzioni produco la lista [n,...,1,0] e la inverto oppure uso l'inserimento in coda

altri possibili esercizi?

Liste come input per funzioni di ariet indefinita

Abbiamo Tralasciato

lambda notazione funzioni higher-order significato dell'apice ' (questo semplice) l'uso del let (anche questo semplice) vi viene in mente qualcos'altro?

Abbiamo Trascurato

Scheme un linguaggio non tipato Risulta pi immediato programmare :-) La nozione di dominio sfumata

:-(

le funzioni predefinite sono tipate le funzioni definite dall'utente possono essere usate in modo improprio

possibile cercare di tipare le funzioni aggiungendo condizioni

Un'alternativa Tipata

ML linguaggio funzionale fortemente tipato SML/NJ (Standard ML of New Jersey) free http://www.smlnj.org//index.html2 per Windows, Unix, Linux In questo indirizzo trovate anche testi, tutorial, ed esempi (benchmarks) Se riuscite a compilare un programma, allora al 99% anche semanticamente corretto!!

Gli Svantaggi di ML

All'inizio pu essere molto frustrante scrivere un programma che venga compilato senza errori L'interfaccia a dir poco spartana