+ Prima di abbandonare la postazione:
+
+ * compilare il questionario in fondo al file
+
+ * salvare il file (menu `File ▹ Save as ...`) nella directory (cartella)
+ /public/ con nome linguaggi_Account1.ma, ad esempio Mario Rossi, il cui
+ account è mrossi deve salvare il file in /public/linguaggi_mrossi.ma
+*)
+
+(*DOCBEGIN
+
+Come scrivere i simboli
+=======================
+
+Per inserire i simboli matematici è necessario digitare il loro nome
+e poi premere ALT-L. In generale i nomi dei simboli sono della forma
+`\nome`, ad esempio `\equiv`. Alcuni simboli molto frequenti hanno
+dei sinonimi più comodi da digitare, per esemio `⇒` ha sia il nome
+`\Rightarrow` sia `=>`.
+
+Segue un elenco dei simboli più comuni e i loro nomi separati da virgola,
+Se sono necessari dei simboli non riportati di seguito si può visualizzare
+l'intera lista dal menù a tendina `View ▹ TeX/UTF8 table`.
+
+* `→` : `\to`, `->`
+* `⇒` : `\Rightarrow`, `=>`
+* `ℕ` : `\naturals`
+* `≝` : `\def`, `:=`
+* `≡` : `\equiv`
+* `∀` : `\forall`
+
+La sintassi `∀x.P` significa "per tutti gli `x` vale `P`".
+
+La sintassi `F → G` dove `F` e `G` sono proposizioni nel metalinguaggio
+significa "`F` implica `G`". Attenzione, il simbolo `⇒` (usato a lezione)
+non ha lo stesso significato in Matita.
+
+La sintassi `ℕ → ℕ` è il tipo delle funzioni che preso un numero naturale
+restituiscono un numero naturale.
+
+La sintassi di Matita
+=====================
+
+Il linguaggio di Matita si basa sul λ-calcolo CIC, la cui sintassi si
+differenzia in vari aspetti da quella che solitamente viene utilizzata
+per fare matematica, e ricorda quella di Scheme che state vedendo nel corso
+di programmazione.
+
+* applicazione
+
+ Se `f` è una funzione che si aspetta due argomenti, l'applucazione di `f`
+ agli argomenti `x` e `y` si scrive `(f x y)` e non `f(x,y)`. Le parentesi
+ possono essere omesse se il senso è chiaro dal contesto. In particolare
+ vengono omesse quando l'applicazione è argomento di un operatore binario.
+ Esempio: `f x y + f y x` si legge `(f x y) + (f y x)`.
+
+* minimo e massimo
+
+ Le funzioni `min` e `max` non fanno eccezione, per calcolare il
+ massimo tra `x` e `y` si scrive `(max x y)` e non `max{x,y}`
+
+* Le funzioni definite per ricorsione strutturale utilizzano il costrutto
+ `let rec` (ricorsione) e il costrutto `match` (analisi per casi).
+
+ Ad esempio la funzione count definita a lezione come
+
+ count ⊤ ≝ 1
+ count (F1 ∧ F2) ≝ 1 + count F1 + count F2
+ ...
+
+ la si esprime come
+
+ let rec count F on F ≝
+ match F with
+ [ ⊤ ⇒ 1
+ | F1 ∧ F2 ⇒ 1 + count F1 + count F2
+ ...
+ ].
+
+* Per dare la definizione ricorsiva (di un linguaggio) si usa una sintassi
+ simile a BNF. Per esempio per definire
+
+ <A> ::= <A> "+" <A> | <A> "*" <A> | "0" | "1"
+
+ si usa il seguente comando
+
+ inductive A : Type ≝
+ | Plus : A → A → A
+ | Times : A → A → A
+ | Zero : A
+ | One : A
+ .
+
+La ratio è che `Plus` prende due argomenti di tipo `A` per darmi un `A`,
+mentre `Zero` non prende nessun argomento per darmi un `A`. Al posto di usare
+operatori infissi `(0 + 0)` la definizione crea operatori prefissi (funzioni).
+Quindi `(0+0)` si scriverà come `(Plus Zero Zero)`.
+
+DOCEND*)
+
+(* ATTENZIONE
+ ==========
+
+ Non modificare le seguenti tre righe
+*)
+include "nat/minus.ma".
+definition max : nat → nat → nat ≝ λa,b:nat.let rec max n m on n ≝ match n with [ O ⇒ b | S n ⇒ match m with [ O ⇒ a | S m ⇒ max n m]] in max a b.
+definition min : nat → nat → nat ≝ λa,b:nat.let rec min n m on n ≝ match n with [ O ⇒ a | S n ⇒ match m with [ O ⇒ b | S m ⇒ min n m]] in min a b.
+
+
+(* Esercizio 1
+ ===========
+
+ Definire il linguaggio delle formule riempiendo gli spazi
+*)