# Ecco (a livello "adulto") dei semplici esempi di FUNZIONI  (a uno o più input/output,
# ad output di vario tipo, anche non deterministico, anche grafico)  descritte col linguaggio
# del software R  (ma si potrebbero usare altri linguaggi formali)
#
cs <- function(x) -x; cs(-1.5)
#  1.5
a <- function(x,y) x+y; a(2,7)
#  9
# (la "negazione" (+/−) e l'"addizione" sono tra le prime funzioni che si usano su una CT)
a2 <- function(x) sum(x); a2( c(5,2,1,3) )
#  11
k <- function(x) sort(x); a <- c(5,2,1,3); k(a)
#  1  2  3  5
a <- c("te","lo","dirò","domani"); k(a)
#  "dirò"  "domani"  "lo"  "te"
h <- function(p,t) round(p/t*100,2); h(3,7)
#  42.86
M <- function(x) c(min(x),max(x)); M( c(5,2,1,3) )
#  1  5
E <- function(x,y) x & y; E(0,0); E(0,1); E(1,0); E(1,1)
#  FALSE
#  FALSE
#  FALSE
#  TRUE
V <- function(x,y,z) (x & y) | (z & y); V(1,0,1); V(0,1,1)
#  FALSE
#  TRUE
dadi <- function(n) {i <- 1:n; floor(runif(i)*6+1)}
dadi(2); dadi(5); dadi(5)
#  1  4
#  5  5  1  3  1
#  4  6  2  5  1
G <- function(f) {plot(f,-2,2); abline(h=0,v=0,col="red")}
f <- function(x) x^2-1; G(f)
                             
# Nota 1: in "matematica" ci sono essenzialmente (oltre a connettivi e quantificatori)
# questi tipi di entità:
# le costanti, le funzioni, le relazioni e le variabili. Le variabili e le costanti
# possono rappresentare oggetti matematici di vario tipo, le funzioni associano a
# degli input presi tra oggetti matematici di qualche tipo degli output che sono
# oggetti di qualche altro tipo (eventualmente lo stesso), le relazioni associano
# a input tra oggetti matematici di qualche tipo un output scelto tra TRUE e FALSE
# (o 1 e 0). Nel caso, particolare, dell'analisi matematica elementare una funzione
# può essere rappresentata da una collezione di coppie di numeri reali tale che se
# (a,b) e (a,c) stanno entrambe nella collezione allora b=c. Il "dominio" di una
# funzione F è l'insieme di tutti gli input a cui F associa un output (questa è la
# definizione standard data nei manuali di Calculus, dallo Spivak all'Apostol [*],
# dopo un paragrafo di esempi in cui sono descritti esempi più generali di funzioni).
# Il termine "funzione" impiegato in tutto il software matematico non è un uso
# "informatico", ma è un uso "matematico".
# Per altro il dominio di una funzione non è detto che lo si sappia individuare. Sia
# F la funzione che ad x associa 1 se x è razionale e 0 altrimenti. Qual è il dominio
# della funzione che ad x associa 1/(F(π+e)−x)?
# [cerca su WolframAlpha  Is  pi + e  a irrational number?  ]
# Per altro vi sono oggetti matematici per cui si può dimostrare che è "indecidibile"
# se appartengano ad un certa collezione di oggetti o no.
# Nota 2: runif (vedi l'esempio "dadi") in realtà è una funzione che ha un input
# "nascosto", il "seme":  se scelgo il seme posso determinare la sequenza.
set.seed(57); runif(5)
    0.24391435 0.51294954 0.03862843 0.16617658 0.73320525
set.seed(57); runif(3)
    0.24391435 0.51294954 0.03862843
# Nota 3: Le operazioni sono solo particolari funzioni che hanno input e output dello
# stesso tipo [la cosa dovrebbe essere ovvia, non solo per chi ha conoscenze di base
# di logica matematica; vedi ad esempio il capitolo 2 del classico manuale di algebra
# universale di Burris e Sankappanavar; nel corso di laurea in matematica, nei primi
# corsi di analisi si studiano in dettaglio (e si rappresentano graficamente) le
# funzioni ad 1 input ed 1 output, ma i paralleli corsi di algebra aprono subito la
# vista su funzioni a più input e più output!].
# Nota 4: In qualche manuale universitario di analisi matematica italiano si trova
# che una funzione è una regola che associa in modo univoco a un insieme di numeri
# reali altri numeri reali. Questa definizione è sbagliata: se è una "regola" può
# catturare solo una "parte" delle funzioni, e, poi, toglierebbe il senso ad ogni
# applicazione del concetto, volta a modellizzare situazioni reali. Per un esempio si
# pensi alle funzioni rappresentate graficamente qui sotto che associano ai vari mesi
# dell'anno i millimetri di pioggia caduti durante essi, mediamente, tra il 1971 e
# il 2000, nelle città di Palermo, Genova, Milano e Bolzano. Quali sono le "regole"
# che li determinano?