Paradigmi - funzionale Flashcards
Booleani di church
FALSE
FALSE = fn x => fn y => y
Booleani di church
NOT
NOT = fn x => fn y => yx
Booleani di church
- cosa sono
- come sono fatti
I booleani di church sono una rappresentazione dei valori booleani e dei costrutti logici elementari utilizzando solo i lambda termini, ossia :
M ::= x | fn x => M | MN
Quindi in altre parole sono i booleani scritti sotto forma di funzioni.
Booleani di church
If
IF = fn z a b => z a b;
Booleani di church
And
AND = fn xy => x y false
Booleani di church
Or
OR = fn xy => x true y
Booleani di church
True
TRUE = fn x => fn y => x
Numeri di church
- cosa sono
- come sono fatti
I numeri di Church sono una rappresentazione dei numeri naturali come lambda termini, ossia :
M ::= x | fn x => M | MN
In altre parole sono scritti sotto forma di funzioni.
L’idea è quella di rappresentare il naturale i come i applicazioni di un argomento y a una funziona x:
2 = fn xy => x(xy)
In generale quindi:
n-esimo num di church = fn xy => x^n y
Numeri di church - successore
fn zxy => x(zxy)
La funziona successore riceve un numero z e restituisce quel numero che applica x a y una volta in più
Numeri di church - somma
fn zwxy => z(wxy)
La funziona somma riceve due numeri di church x e w, e restituisce quel numero che applica w volte x a y, e poi viene viene passato a z che applica altre z volte x a y
alternativa: fn zw => z succ w
applico z volte la funzione successore a partire da w
Numeri di church - eval (da num di church a numero normale)
fn z => z succ 0
La funzione eval riceve un numero di church in input e restituisce il risultato della funzione successore applicato x volte a 0
Numeri di church - moltiplicazione
fn uvx => u(vx)
u e v sono numeri di churhc. viene restituita la funzione che applica u volte la funziona v all’argomento x
alternativa: fn zw => z (plus w) c0
La funzione times riceve due numeri di church in input e restituisce la funzione che applica x volte plus a
Numeri di church - lave
fun lave 0 = (fn x => fn y => y)
| lave n = succ( lave(n-1));
(* n=2
succ(succ(0))
0 = fn x => fn y => y
succ(z) = fn x => fn y => x (z x y)
succ(succ(z)) = fn x => fn y => x (succ(z) x y)
succ(succ(z)) = fn x => fn y => x (fn x => fn y => x (z x y) x y
succ(succ(fn x => fn y => y)) = fn x => fn y => x (fn x => fn y => x (fn x => fn y => y (x y)) x y
succ(succ(fn x => fn y => y)) = fn x => fn y => x (x y)
Numeri di church - predecessore
S ≡ fn z ⇒ <succ (P2,1 z), P2,1 zi
pred ≡ fn z ⇒ P2,2 (z S hc0, c0i)
Numeri di church - fattoriale
Numeri di church - zero
val zero = fn x => fn y => y
Qual è il suo tipo
a -> b -> b
Numeri di church - uno
val uno = fn x => fn y => x y;
Qual è il suo tipo
(a -> b) -> a -> b
Numeri di church - due
val due = fn x => fn y => x (x y);
Qual è il suo tipo
(‘a -> ‘a) -> ‘a -> ‘a
Numeri di church - tre
val tre = fn x => fn y => x ( x (x y ));
Qual è il suo tipo
(a -> a) -> a -> a
Costrutti logici - TRUE = fn x => fn y => x
Qual è il suo tipo
a -> b -> a
Costrutti logici - FALSE = fn x => fn y => y
Qual è il suo tipo
a -> b -> b
Costrutti logici - NOT = fn x => fn y => yx
Qual è il suo tipo
b -> (b -> a) -> a
Costrutti logici - IF = fn z => fn a => fn b => z a b;
Qual è il suo tipo
(a -> b -> c) -> a -> b -> c
Costrutti logici - AND = fn x => fn y => x y false
Qual è il suo tipo
(a -> (b -> c -> c) -> d) -> a -> d
o anche (‘a -> bool -> ‘b) -> ‘a -> ‘b
Costrutti logici - OR = fn x => fn y => x true y
Qual è il suo tipo
( (a -> b -> a) -> c -> d) -> c -> d
o anche (bool -> a -> b) -> a -> b