Programmazione Funzionale - Esercizio sulle variabili locali

Programmazione Funzionale
Esercizio sulle variabili locali
Davide Mottin - Themis Palpanas
March 12, 2014
1/9
OCaml
Funzioni preparatorie
Sommario
2/9
Funzioni preparatorie
Costruire una funzione val even : int -> bool = <fun> che
restituisca vero se un numero `e pari, falso altrimenti.
Creare una funzione odd che calcoli l’opposto di even.
OCaml
3/9
Funzioni preparatorie
Costruire una funzione val even : int -> bool = <fun> che
restituisca vero se un numero `e pari, falso altrimenti.
Soluzione
let even n = if n mod 2 = 0 then true else false;;
Creare una funzione odd che calcoli l’opposto di even.
Soluzione
let odd n = not (even n);;
OCaml
3/9
Un esercizio pi`u complesso
Costruire una funzione che stampi ”Pari e divisibile per 3” se un
numero in input `e pari e divisibile per tre, altrimenti ”Pari ma non
divisibile per 3” oppure ”Dispari e divisibile per 3” e ”Dispari ma
non divisibile per 3”. Cercare di utilizzare, ove possibile,
dichiarazioni locali.
OCaml
4/9
Soluzione
( ∗ P r i n t w h e t h e r a number i s d i v i s i b l e by 2 and
by 3 ∗ )
let p r i n t d i v i s i b i l i t y n =
i f even n then
l e t out = ” P a r i ” in
i f n mod 3 = 0 t h e n
p r i n t s t r i n g ( out ˆ” e d i v i s i b i l e per 3” )
else
p r i n t s t r i n g ( o u t ˆ ” ma non d i v i s i b i l e p e r 3 ” )
else
l e t out = ” D i s p a r i ” in
i f n mod 3 = 0 t h e n
p r i n t s t r i n g ( out ˆ” e d i v i s i b i l e per 3” )
else
p r i n t s t r i n g ( o u t ˆ ” ma non d i v i s i b i l e p e r 3 ” ) ;
OCaml
5/9
Esercizio
Che tipo ha la funzione seguente e a cosa serve?
l e t a p p l y f ( n ,m) = ( f n m ) ; ;
OCaml
6/9
Esercizio
Che tipo ha la funzione seguente e a cosa serve?
l e t a p p l y f ( n ,m) = ( f n m ) ; ;
Soluzione. (α → β → γ) → α ∗ β → γ
Sapete fornire una possibile applicazione di questa funzione?
OCaml
6/9
Esercizio
Che tipo ha la funzione seguente e a cosa serve?
l e t a p p l y f ( n ,m) = ( f n m ) ; ;
Soluzione. (α → β → γ) → α ∗ β → γ
Sapete fornire una possibile applicazione di questa funzione?
Soluzione (possibile).
apply (fun x y -> sqrt (x**2.0 +. y**2.0)) (3.,4.);;
OCaml
6/9
Esercizio
Costruire una funzione conditional apply che, preso in input
due funzioni f e g ed un elemento x restituisca g applicata ad x se
f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della
funzione scritta.
OCaml
7/9
Esercizio
Costruire una funzione conditional apply che, preso in input
due funzioni f e g ed un elemento x restituisca g applicata ad x se
f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della
funzione scritta.
Soluzione
let conditional apply f g x =
i f f x then g x
else x ;;
Qual `e il tipo?
OCaml
7/9
Esercizio
Costruire una funzione conditional apply che, preso in input
due funzioni f e g ed un elemento x restituisca g applicata ad x se
f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della
funzione scritta.
Soluzione
let conditional apply f g x =
i f f x then g x
else x ;;
Qual `e il tipo?
Esercizio. Costruire una funzione to odd che preso in input un
valore se `e pari restituisce il suo successore, altrimenti restituisce lo
stesso valore.
OCaml
7/9
Esercizio
Costruire una funzione conditional apply che, preso in input
due funzioni f e g ed un elemento x restituisca g applicata ad x se
f (x) restituisce true e x altrimenti. Ragionare inoltre sul tipo della
funzione scritta.
Soluzione
let conditional apply f g x =
i f f x then g x
else x ;;
Qual `e il tipo?
Esercizio. Costruire una funzione to odd che preso in input un
valore se `e pari restituisce il suo successore, altrimenti restituisce lo
stesso valore.
Soluzione (possibile).
let to odd x = conditional apply even succ x;;
OCaml
7/9
Altri Esercizi
Costruire una funzione che restituisca la funzione della retta dato
in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi.
OCaml
8/9
Altri Esercizi
Costruire una funzione che restituisca la funzione della retta dato
in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi.
Soluzione
l e t l i n e m q x = m∗ . x +. q ; ;
OCaml
8/9
Altri Esercizi
Costruire una funzione che restituisca la funzione della retta dato
in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi.
Soluzione
l e t l i n e m q x = m∗ . x +. q ; ;
Esercizio
Usando la funzione precedente costruire una funzione che dato in
input due punti restituisce la funzione della retta passante per essi.
−y1
1 y2
Dato (x1 , y1 ) e (x2 , y2 ) m = xy22 −x
, q = y1 xx22 −x
−x1
1
OCaml
8/9
Altri Esercizi
Costruire una funzione che restituisca la funzione della retta dato
in input m e q (i.e., f (x) = mx + q). Attenzione ai tipi.
Soluzione
l e t l i n e m q x = m∗ . x +. q ; ;
Esercizio
Usando la funzione precedente costruire una funzione che dato in
input due punti restituisce la funzione della retta passante per essi.
−y1
1 y2
Dato (x1 , y1 ) e (x2 , y2 ) m = xy22 −x
, q = y1 xx22 −x
−x1
1
Soluzione
l e t l i n e e q u a t i o n x ( x1 , y1 ) ( x2 , y2 ) =
l i n e ( ( y2 −. y1 ) / . ( x2 −. x1 ) ) ( ( y1 ∗ . x2 −. x1 ∗ . y2 ) / . ( x2 −. x1 ) ) x ; ;
OCaml
8/9
Altri Esercizi - 2
Costruire una funzione che preso in input due funzioni e una
coppia (x,y) controlli se si intersecano in (x,y)
OCaml
9/9
Altri Esercizi - 2
Costruire una funzione che preso in input due funzioni e una
coppia (x,y) controlli se si intersecano in (x,y)
Soluzione
let intersect in l1 l2 (x , y) =
( l 1 x = y ) && ( l 2 x = y ) ; ;
OCaml
9/9
Altri Esercizi - 2
Costruire una funzione che preso in input due funzioni e una
coppia (x,y) controlli se si intersecano in (x,y)
Soluzione
let intersect in l1 l2 (x , y) =
( l 1 x = y ) && ( l 2 x = y ) ; ;
Esercizio
Costruire una funzione che calcoli il baricentro tra tre punti.
OCaml
9/9
Altri Esercizi - 2
Costruire una funzione che preso in input due funzioni e una
coppia (x,y) controlli se si intersecano in (x,y)
Soluzione
let intersect in l1 l2 (x , y) =
( l 1 x = y ) && ( l 2 x = y ) ; ;
Esercizio
Costruire una funzione che calcoli il baricentro tra tre punti.
Soluzione
l e t b a r y c e n t e r ( x1 , y1 ) ( x2 , y2 ) ( x3 , y3 ) =
( ( x1 +. x2 +. x3 ) / . 3 . , ( y1 +. y2 +. y3 ) / . 3 . ) ; ;
OCaml
9/9