cerca
Dispense Tetty - Capitolo 1
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Uni.TettyCap1 History

Hide minor edits - Show changes to output

Changed lines 61-62 from:
%center%http://doppioclic.altervista.org/wiki/local/tetty/tabelle_verita.jpg
to:
%center%Attach:tabelle_verita.jpg
Changed lines 119-120 from:
http://doppioclic.altervista.org/wiki/local/tetty/deMorgan.jpg
to:
Attach:deMorgan.jpg
Changed lines 365-367 from:
[[Torna alla pagina di Programmazione degli Elaboratori -> Uni.ProgrammazioneElaboratori]]
----
[[!UniCrema
]]
to:
[[Torna alla pagina di Programmazione degli Elaboratori -> Uni.ProgrammazioneElaboratori]]
Changed line 3 from:
[[Torna alla pagina di Tetty -> Tetty]] | [[Guarda le domande sul capitolo -> TettyDom1]]
to:
[[Torna alla pagina di Programmazione degli Elaboratori -> Uni.ProgrammazioneElaboratori]]
Changed line 365 from:
[[Torna alla pagina di Tetty -> Tetty]] | [[Guarda le domande sul capitolo -> TettyDom1]]
to:
[[Torna alla pagina di Programmazione degli Elaboratori -> Uni.ProgrammazioneElaboratori]]
Changed lines 5-6 from:
!Concetti di base
to:
%titolo%''':: Capitolo 1: Concetti di base ::'''
Changed lines 364-366 from:
[[Torna alla pagina di Tetty -> Tetty]] | [[Guarda le domande sul capitolo -> TettyDom1]]
to:
[[Torna alla pagina di Tetty -> Tetty]] | [[Guarda le domande sul capitolo -> TettyDom1]]
----
[[!UniCrema
]]
Changed lines 150-151 from:
La logica dei predicati mette inoltre a disposizione due utili elementi, i ''quantificatori'', grazie ai quali è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Ne esistono di due tipi, quello ''esistenziale'' ∃ (“esiste”) e quello ''universale'' ∀ (“per ogni”). %red%Molto importante ricordare come i quantificatori possano essere applicati alle sole variabili libere di una formula.%%
to:
La logica dei predicati mette inoltre a disposizione due utili elementi, i ''quantificatori'', grazie ai quali è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Ne esistono di due tipi, quello ''esistenziale'' ∃ (“esiste”) e quello ''universale'' ∀ (“per ogni”). %red%Molto importante ricordare come i quantificatori possano essere applicati alle sole variabili libere di una formula.%%
Changed lines 158-159 from:
%red%L'algoritmo è una procedura passo per passo grazie alla quale un'operazione può essere svolta [[senza alcun esercizio di intelligenza->rasputin]] e quindi, per esempio, da una macchina.%% Se il suo scopo è quello di risolvere problemi, capite bene con quanti algoritmi abbiamo a che fare tutti i giorni. %red%Un esempio legittimo di algoritmo potrebbe essere perfino una [[ricetta di cucina->pinguino]].
to:
%red%L'algoritmo è una procedura passo per passo grazie alla quale un'operazione può essere svolta senza alcun esercizio di intelligenza e quindi, per esempio, da una macchina.%% Se il suo scopo è quello di risolvere problemi, capite bene con quanti algoritmi abbiamo a che fare tutti i giorni. %red%Un esempio legittimo di algoritmo potrebbe essere perfino una [[ricetta di cucina->pinguino]].
Changed line 161 from:
* %red%''poter essere risolto in un numero finito di operazioni''%%, perché va da sé che se fosse infinito non si arriverebbe mai a risolvere il problema. Se quindi ''trovare i primi dieci numeri primi'' è un algoritmo (basta applicare determinate operazioni per un numero finito di volte), ''trovare '''''tutti''''' i numeri primi'' non lo è più (le operazioni da eseguire sono ''le stesse'', ma non si finirà mai di ripeterle);
to:
* %red%''poter essere risolto in un numero finito di operazioni''%%, perché va da sé che se il numero fosse infinito non si arriverebbe mai a risolvere il problema. Ad esempio, se ''trovare i primi dieci numeri primi'' è un algoritmo (basta applicare determinate operazioni per un numero finito di volte), ''trovare '''''tutti''''' i numeri primi'' non lo è più (le operazioni da eseguire sono ''le stesse'', ma non si finirà mai di ripeterle);
Changed line 166 from:
%red%L'analisi di un algoritmo è lo studio della sua complessità computazionale. Questa dipende dalla quantità di risorse necessarie alla sua esecuzione,%% strettamente dipendenti dalla difficoltà del problema da risolvere. Le due risorse principali, strettamente collegate, sono:
to:
%red%L' ''analisi di un algoritmo'' è lo studio della sua ''complessità computazionale'', che dipende dalla quantità di risorse necessarie alla sua esecuzione,%% a loro volta strettamente dipendenti dalla difficoltà del problema da risolvere. Le due risorse principali sono:
Changed line 174 from:
Se spazio e tempo dipendono dal particolare ingresso dell'algoritmo, per il loro studio non possiamo interessarci di pochi casi particolari, ma di una statistica su tutte le possibili esecuzioni. Di tutte le statistiche possibili (caso migliore, caso medio, caso peggiore), %red%l'analisi degli algoritmi si concentra sul caso peggiore (maggior impiego di tempo e di spazio possibile) per tre buoni motivi:
to:
Lo spazio e il tempo dipendono fortemente dal particolare ingresso dell'algoritmo, quindi per il loro studio non possiamo interessarci di pochi casi particolari, ma di una statistica su tutte le possibili esecuzioni. Le statistiche possibili sono tre (''caso migliore'', ''caso medio'', ''caso peggiore''), ma %red%l'analisi degli algoritmi si concentra sul caso peggiore (maggior impiego di tempo e di spazio possibile) per tre buoni motivi:
Changed lines 179-180 from:
%red%Ciò che però realmente determina la complessità di un algoritmo non è la quantità precisa di risorse, ma il suo tasso di crescita (logaritmico, lineare, cubico, esponenziale, ...) al crescere delle dimensioni dell'ingresso, detto ''ordine''. Ovviamente, più l'ordine è basso e più l'algoritmo è semplice ed efficiente.
to:
%red%Ciò che però realmente determina la complessità di un algoritmo non è la quantità precisa di risorse, ma l' ''ordine'', ovvero il suo tasso di crescita (logaritmico, lineare, cubico, esponenziale, ...) al crescere delle dimensioni dell'ingresso. Ovviamente più l'ordine è basso e più l'algoritmo è semplice ed efficiente.
Changed lines 120-123 from:
Dati ''n'' insiemi ''U'_1_', U'_2_', ... U'_n_''', il loro prodotto cartesiano ''U'_1_' X U'_2_' X ... X U'_n_''' è l'insieme di tutte le ''n''-uple ordinate (''u'_1_' X u'_2_' X ... X u'_n_''') dove ui ∈ Ui per i = 1, 2, ... , n.

Dati due insiemi A e B, una ''funzione f'' di dominio A e codominio B, in simboli f: A → B, è una mappa che associa ad ogni elemento a ∈ A un elemento b = f(a) ∈ A.
to:
Dati ''n'' insiemi ''U'_1_', U'_2_', ... U'_n_''', il loro prodotto cartesiano ''U'_1_' X U'_2_' X ... X U'_n_''' è l'insieme di tutte le ''n''-uple ordinate (''u'_1_' X u'_2_' X ... X u'_n_''') dove u'_i_' ∈ U'_i_' per i = 1, 2, ... , n.

Dati due insiemi A e B, una ''funzione f'' di dominio A e codominio B è una mappa che associa ad ogni elemento ''a ∈ A'' un elemento ''b = f(a) ∈ A''. In formula, ''f: A → B''.
Changed lines 135-136 from:
La ''logica dei predicati'' è un passo avanti nel livello di astrazione della descrizione degli eventi. Tradotto in italiano, significa che offre strumenti di descrizione molto più potenti e versatili di quelli della logica delle proposizioni. Facendo un esempio, se abbiamo dieci lampadine e dobbiamo dire se funzionano o se sono fulminate, nella logica delle proposizioni dovremo definire una proposizione per ogni lampadina. Ok quando sono dieci lampadine, ma quando sono diecimila? In questo caso giunge in soccorso la logica dei predicati, in grado di parametrizzare e riassumere i vari eventi.
to:
La ''logica dei predicati'' è un passo avanti nel livello di astrazione della descrizione degli eventi, perché offre strumenti di descrizione molto più potenti e versatili di quelli della logica delle proposizioni. Facendo un esempio, se abbiamo dieci lampadine e dobbiamo dire se funzionano o se sono fulminate, nella logica delle proposizioni dovremo definire una proposizione per ogni lampadina. Il che può andare bene quando le lampadine sono dieci, ma quando sono diecimila? E' qui che giunge in soccorso la logica dei predicati, in grado di parametrizzare e quindi "riassumere" i vari eventi.
Changed lines 58-59 from:
Le ''tabelle di verità'' sono tabelle (!) che indicano il valore di verità di una fbf a seconda del valore di verità delle sue “sotto-fbf”. %red%Da notare che se una fbf è combinazione di ''n'' atomiche, la sua tabella di verità sarà formata da ''2n'' righe%%. Le tabelle di verità dei connettivi logici sono:
to:
Le ''tabelle di verità'' sono tabelle (!) che indicano il valore di verità di una fbf a seconda del valore di verità delle sue “sotto-fbf”. %red%Da notare che se una fbf è combinazione di ''n'' atomiche, la sua tabella di verità sarà formata da ''2'^n^''' righe%%. Le tabelle di verità dei connettivi logici sono:
Changed lines 63-66 from:
* %red%''valida'' (o tautologia), se è vera per qualsiasi interpretazione. Es. A   A;
*
%red%''inconsistente'' (o contraddizione), se è falsa per ogni interpretazione. Es. A ∧  A;
* %red%''soddisfacibile'', se e solo se esiste almeno un'interpretazione per cui essa è vera, ovvero che la soddisfa.
to:
* %red%''valida'' (tautologia), se è vera per qualsiasi interpretazione. Es. "io sono io";
* %red%''inconsistente'' (contraddizione), se è falsa per ogni interpretazione. Es. "io sono un sasso";
* %red%''soddisfacibile'', se e solo se esiste almeno un'interpretazione per cui essa è vera, ovvero che la soddisfa. Es. "io sono alto".
Changed line 79 from:
# P ∧ T = P , P ∨ ⊥ = P ;
to:
# P ∧ T = P , P ∨ ⊥ = P ; [-(T è la proposizione sempre vera, mentre ⊥ è sempre falsa)-]
June 18, 2007, at 08:54 PM by MINCULPOP - cambiato il titolo e aggiunti i link alle domande (in alto e in fondo)
Changed lines 1-3 from:
(:title Tetty Cap 1:)
[[Torna alla pagina di Tetty -> Tetty]]
----
to:
(:title Dispense Tetty - Capitolo 1:)
Added lines 3-4:
[[Torna alla pagina di Tetty -> Tetty]] | [[Guarda le domande sul capitolo -> TettyDom1]]
----
Deleted lines 362-363:
[[Domande sul capitolo->TettyDom1]]
Changed line 364 from:
[[Torna alla pagina di Tetty -> Tetty]]
to:
[[Torna alla pagina di Tetty -> Tetty]] | [[Guarda le domande sul capitolo -> TettyDom1]]
June 18, 2007, at 05:14 PM by Teto - correzioni varie
Changed lines 36-37 from:
!!!1 Che cos'è la programmazione degli elaboratori
to:
!!!1. Che cos'è la programmazione degli elaboratori
Changed lines 48-49 from:
!!!2 Elementi di matematica e logica per la programmazione
to:
!!!2. Elementi di matematica e logica per la programmazione
Changed lines 52-53 from:
La logica proposizionale si occupa della verità o falsità delle proposizioni, dove %red%per ''proposizione'' si intende una frase di senso compiuto che può essere vera o falsa%%. Un esempio di proposizione potrebbe essere che è pomeriggio, o che il sole è freddo, o che [[questa->ronaldinho]] è una donna. Per comodità di manipolazione, viene spesso associato ad ogni proposizione una simbolo, così da sfruttare le più compatte ed esaustive notazioni matematiche per descrivere le interazioni dei vari eventi (ad esempio, N: “io sono nudo”).
to:
La logica proposizionale si occupa della verità o falsità delle proposizioni, dove %red%per ''proposizione'' si intende una frase di senso compiuto che può essere vera o falsa%%. Un esempio di proposizione potrebbe essere che è pomeriggio, o che il sole è freddo, o che [[questa->ronaldinho]] è una donna. Per comodità di manipolazione, viene spesso associato ad ogni proposizione un simbolo, così da sfruttare le più compatte ed esaustive notazioni matematiche per descrivere le interazioni dei vari eventi (ad esempio, N: “io sono nudo”).
Changed lines 56-57 from:
Il valore di verità di una fbf ci dice se questa è vera o falsa, e dipende dai valori di verità delle proposizioni che la compongono. Questi ultimi cambiano a seconda del contesto in cui li caliamo, dalla loro %red%''interpretazione'', ovvero dal particolare assegnamento di valori di verità dato ad ogni proposizione atomica%% (riprendendo l'esempio di prima, N è vero quando prendo il sole integrale ma è falso quando sono in università).
to:
Il ''valore di verità'' di una fbf ci dice se questa è vera o falsa, e dipende dai valori di verità delle proposizioni che la compongono. Questi ultimi cambiano a seconda del contesto in cui li caliamo, dalla loro %red%''interpretazione'', ovvero dal particolare assegnamento di valori di verità dato ad ogni proposizione atomica%% (riprendendo l'esempio di prima, N è vero quando prendo il sole integrale ma è falso quando sono in università).
Changed line 64 from:
* %red%''inconsistente'' (o contraddizione), se è falsa per ogn interpretazione. Es. A ∧  A;
to:
* %red%''inconsistente'' (o contraddizione), se è falsa per ogni interpretazione. Es. A ∧  A;
Changed lines 156-157 from:
!!!3 La nozione di "algoritmo"
to:
!!!3. La nozione di "algoritmo"
Changed lines 201-202 from:
!!!4 I linguaggi di programmazione
to:
!!!4. I linguaggi di programmazione
Changed lines 274-275 from:
!!!5 Fasi della programmazione
to:
!!!5. Fasi della programmazione
Changed lines 327-328 from:
!!!6 Strumenti di modellazione della programmazione
to:
!!!6. Strumenti di modellazione della programmazione
Changed lines 345-346 from:
!!!7 Documentazione
to:
!!!7. Documentazione
Added lines 363-364:
[[Domande sul capitolo->TettyDom1]]
Changed lines 351-352 from:
%red%La documentazione interna di un programma è costituita principalmente dai commenti introdotti nel corpo del programma%% nella fase di codifica, con lo scopo di chiarire il suo funzionamento. %red%Perfino la formattazione di un programma (indentazione, distribuzione su più righe, ...) e le asserzioni sono una forma di documentazione interna.
to:
%red%La ''documentazione interna'' di un programma è costituita principalmente dai commenti introdotti nel codice nella fase di codifica%%, con lo scopo di chiarire il suo funzionamento. %red%Perfino la formattazione di un programma (indentazione, distribuzione su più righe, ...) e le asserzioni (vedi [[Capitolo 3->TettyCap3]]) sono una forma di documentazione interna.
Changed lines 355-359 from:
%red%La documentazione esterna di un programma è costituita dai vari documenti di progetto prodotti separatamente dal programma. %%Essi sono documenti di specifica, spiegazioni scritte, manuali di riferimento, schemi e diagrammi (praticamente tutto il materiale prodotto nella fase di modellazione).

La documentazione non deve limitarsi alla mera codifica del programma, ma anche alla fase di collaudo, con la spiegazione dei sistemi di verifica applicati e dei risultati che hanno restituito.
Terminata anche la fase di collaudo (e relativa documentazione), ogni programma complesso dovrebbe essere fornito di un proprio manuale. Ne esistono di due tipi: il manuale utente (per l'utente comune che dovrà utilizzare il programma) e il manuale di riferimento (per l'utente avanzato o per un eventuale programmatore che potrebbe utilizzare il programma come componente di un altro più grande). Fasi della programmazione
to:
%red%La documentazione esterna di un programma è costituita dai vari documenti di progetto prodotti separatamente dal programma. %%Sono documenti di specifica, spiegazioni scritte, manuali di riferimento, schemi e diagrammi, ... praticamente tutto il materiale prodotto nella fase di modellazione.

La documentazione non deve limitarsi alla mera fase di codifica del programma, ma anche a quella di collaudo, con la spiegazione dei sistemi di verifica applicati e dei risultati che hanno restituito.

Per quanto riguarda i manuali, consigliati per ogni programma
complesso, si distinguono due tipi: il ''manuale utente'' (per l'utente comune che dovrà utilizzare il programma) e il ''manuale di riferimento'' (per l'utente avanzato o per un eventuale programmatore che potrebbe riutilizzare il programma come componente di un altro più grande).
Changed lines 329-330 from:
Esistono diversi strumenti più o meno formali per aiutare il programmatore nella delicata fase di modellazione, ovvero quella intermedia tra l'algoritmo e il programma. Questi strumenti sono i diagrammi di flusso e lo pseudocodice.
to:
Esistono fondamentalmente due strumenti più o meno formali per aiutare il programmatore nella delicata fase di modellazione (quella intermedia tra l'algoritmo e il programma): i diagrammi di flusso e lo pseudocodice.
Changed lines 333-334 from:
Un diagramma di flusso è la rappresentazione grafica simbolica dell'algoritmo, realizzata come sequenza di blocchi contenenti i passi dell'algoritmo stesso.
to:
Un ''diagramma di flusso'' è la rappresentazione grafica simbolica dell'algoritmo, realizzata come sequenza di blocchi contenenti i vari passi dell'algoritmo stesso.
Changed lines 339-340 from:
%red%Un altro strumento di modellazione della programmazione è lo pseudocodice%%, ovvero un linguaggio di programmazione finto, con una sintassi ben precisa, un certo repertorio di comandi predefiniti, ecc. ma con una maggiore flessibilità, un repertorio di comandi predefiniti espandibile a piacere e idealmente coincidente con quelli che il programmatore considera dei “compiti elementari” e con la possibilità di utilizzare delle espressioni in linguaggio naturale laddove sia necessario specificare con maggiore chiarezza che cosa debba fare una particolare linea di codice.
to:
%red%Un altro strumento di modellazione della programmazione è lo ''pseudocodice''%%, ovvero un linguaggio fittizio che permette di descrivere un algoritmo senza utilizzare la sintassi di un linguaggio di programmazione specifico. Non può essere eseguito direttamente dal computer, ma aiuta il programmatore nella stesura del codice vero e proprio.
Changed lines 260-262 from:
Le carte sintattiche sono dei diagrammi che permettono di visualizzare le regole di una grammatica in forma grafica. \\
In un diagramma i simboli non terminali vengono rappresentati da rettangoli, mentre quelli terminali da elementi rotondi o rettangolari con gli angoli smussati. I simboli sono collegati tra loro con delle frecce orientate.
to:
Le carte sintattiche sono dei diagrammi che permettono di visualizzare le regole di una grammatica in forma grafica. In un diagramma i simboli non terminali vengono rappresentati da rettangoli, mentre quelli terminali da elementi rotondi o rettangolari con gli angoli smussati. I simboli sono collegati tra loro con delle frecce orientate.
Changed lines 277-282 from:
* %red%specifica;
* %red%progettazione;
* %red%modellazione;
* %red%codifica;
* %red%verifica e correzione.
to:
# %red%specifica;
# %red%progettazione;
# %red%modellazione;
# %red%codifica;
# %red%verifica e correzione.
Changed lines 285-296 from:
La specifica è la fase in cui viene descritto in modo più o meno formale il problema che il programma deve risolvere, più gli eventuali vincoli che dovrà rispettare.

Una specifica informale non è altro che un testo con la descrizione del problema da risolvere e le relazioni che si desidera mantenere tra ingressi e uscite.

%red%Una specifica formale è una quadrupla S = <X, Y, I, U>, dove:
* %red%X sono gli ingressi%%, ovvero i dati da fornire al programma;
* %red%Y sono le uscite%%, cioè i risultati che il programma deve produrre;
* %red%I sono le precondizioni%%, cioè le condizioni che gli ingressi devono rispettare;
* %red%U sono le postcondizioni%%, ovvero le proprietà che i risultati del programma devono soddisfare perché si possa dire che è corretto.

Per
ogni dato x &#8712; X che soddisfa la formula I(x) il risultato y &#8712; Y prodotto dal programma deve soddisfare la formula U(x, y).
to:
La ''specifica'' è la fase in cui viene descritto in modo più o meno formale il problema che il programma deve risolvere, più gli eventuali vincoli e requisiti che dovrà rispettare.

Una ''specifica informale'' non è altro che un testo con la descrizione del problema da risolvere e le relazioni che si desidera mantenere tra ingressi e uscite.

%red%Una ''specifica formale'' è una quadrupla S = <X, Y, I, U>, dove:
* %red%''X'' sono gli ''ingressi''%%, ovvero i dati da fornire al programma;
* %red%''Y'' sono le ''uscite''%%, cioè i risultati che il programma deve produrre;
* %red%''I'' sono le ''precondizioni''%%, cioè le condizioni che gli ingressi devono rispettare;
* %red%''U'' sono le ''postcondizioni''%%, ovvero le condizioni che le uscite devono soddisfare perché il programma sia corretto.

Esprimendo i concetti in formule, per
ogni dato x &#8712; X che soddisfa la formula I(x), il risultato y &#8712; Y prodotto dal programma deve soddisfare la formula U(x, y).
Changed lines 299-304 from:
La progettazione consiste nell'analisi del problema da risolvere e nel concepimento in modo astratto dell'algoritmo. %red%Esistono due approcci antitetici alla progettazione:
* %red%analisi top down (dall'alto verso il basso)%%, che scompone i requisiti da soddisfare per risolvere il problema in un numero minore di sotto-requisiti, a loro volta scomposti fino ad essere costituiti da soli compiti elementari;
* %red%analisi bottom up (dal basso verso l'alto)%%, che parte dai compiti elementari che si sanno già svolgere e cerca di combinarli nel modo più opportuno per ottenere la soluzione al problema. In questo modo si creano tanti piccoli programmi funzionali, organizzabili in librerie da cui poterli prelevare e riutilizzare.

I due approcci di progettazione possono essere anche combinati, ad esempio scomponendo un problema dall'alto e individuando quali sottorequisiti comuni e ricorrenti possono essere progettati in stile bottom-up.
to:
La ''progettazione'' consiste nell'analisi del problema da risolvere e nella progettazione in modo astratto dell'algoritmo. %red%Esistono due approcci antitetici alla progettazione:
* %red%''analisi top-down'' (dall'alto verso il basso)%%, che scompone i requisiti da soddisfare in un numero minore di sotto-requisiti, a loro volta scomposti in... ecc. fino a che il programma è scomposto in una sequenza di compiti elementari;
* %red%''analisi bottom-up'' (dal basso verso l'alto)%%, che parte dai compiti elementari che si sanno già svolgere e che cerca di combinarli nel modo più opportuno per ottenere la soluzione al problema. Con questo sistema si creano collezioni di piccoli programmi funzionali, comodamente organizzabili in librerie da cui poi prelevarli e riutilizzarli.

Questi due approcci di progettazione possono essere combinati, ad esempio scomponendo un problema dall'alto e individuando quali sottorequisiti comuni e ricorrenti possono essere progettati in stile bottom-up.
Changed lines 309-310 from:
La modellazione è la fase in cui viene rappresentato l'algoritmo in maniera più formale e dettagliata, con lo scopo di renderne evidenti i passaggi e la struttura concettuale.
to:
La ''modellazione'' è la fase in cui viene rappresentato l'algoritmo in maniera più formale e dettagliata, con lo scopo di renderne più evidenti i passaggi e più chiara la struttura concettuale.
Changed lines 315-316 from:
La codifica è il momento in cui il programma viene effettivamente scritto nel linguaggio di programmazione prescelto. Tale scelta può dipendere da vari fattori, sia interni che esterni.
to:
La ''codifica'' è il momento in cui il programma viene effettivamente scritto nel linguaggio di programmazione prescelto. Tale scelta può dipendere da vari fattori, sia interni (ad esempio, preferenze) che esterni (ad esempio, imposizioni del richiedente).
Changed lines 319-320 from:
La verifica è quella fase più o meno lunga in cui viene testato il programma, essendo molto improbabile che esso venga prodotto privo di un errori al primo colpo. La correzione degli errori è la logica conseguenza della fase di verifica, in cui vengono corrette le parti del codice segnalate dal testing. %red%Si può dire che un programma è corretto solo quando soddisfa le sue specifiche.
to:
La ''verifica'' è quella fase eterna in cui viene testato il programma, un momento necessario dato che è molto improbabile che esso sia privo di errori al primo colpo. La ''correzione'' degli errori è la logica conseguenza della fase di verifica, in cui vengono corrette (!) le parti del codice segnalate dal testing.

Tutte queste attività si basano sul concetto che %red%un programma è corretto solo quando soddisfa ''tutte''
le sue specifiche.
Changed lines 247-249 from:
Esistono altri tipi di notazione per definire le grammatiche, di più pratica e comoda lettura e scrittura. Ne è un esempio quella di Backus e Naur (abbreviato BNF), creata negli anni '60 per definire la sintassi del linguaggio Algol 60.

Alcune differenze rispetto alla notazione precedente:
to:
Esistono altri tipi di notazione per definire le grammatiche, di più pratica lettura e scrittura. Ne è un esempio quella di Backus e Naur (abbreviato ''BNF''), creata negli anni '60 per definire la sintassi del linguaggio Algol 60.

Alcune differenze rispetto alla notazione vista prima:
Changed line 251 from:
* i simboli non terminali sono rappresentati da stringhe alfanumeriche racchiuse tra parentesi angolari, come <espressione> ;
to:
* i simboli non terminali sono rappresentati da stringhe alfanumeriche tra parentesi angolari, come <esempio> ;
Changed lines 255-257 from:
<cifra_iniziale> ::== '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0'
che associa al non terminale cifra_iniziale uno dei i valori messi tra virgolette e separati dal metasimbolo di alternativa |.
to:
<cifra> ::== '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0'
che associa al non terminale cifra uno dei 10 valori messi tra virgolette e separati dal metasimbolo di alternativa '''|'''.
Changed lines 260-261 from:
Le carte sintattiche sono dei diagrammi che esprimono le regole di una grammatica in forma grafica. Nel diagramma i simboli non terminali vengono rappresentati da rettangoli, mentre quelli terminali da elementi rotondi o rettangolari con gli angoli smussati. I simboli sono collegati tramite frecce orientate.
to:
Le carte sintattiche sono dei diagrammi che permettono di visualizzare le regole di una grammatica in forma grafica. \\
In un
diagramma i simboli non terminali vengono rappresentati da rettangoli, mentre quelli terminali da elementi rotondi o rettangolari con gli angoli smussati. I simboli sono collegati tra loro con delle frecce orientate.
Changed lines 265-268 from:
Un linguaggio di programmazione può essere o direttamente comprensibile da una macchina o più vicino al modo di ragionare di chi lo dovrà utilizzare. Nel primo caso si tratta di un linguaggio di basso livello (come l'assembly o il MIXAL), nel secondo caso invece di alto livello. Per rendere anche quest'ultimo comprensibile alla macchina, ci sarà bisogno di:
* %red%un interprete
, che interpreta ed esegue le istruzioni di un altro programma scritto in un altro linguaggio, rendendo difatto i programmi portabili, oppure
* un compilatore,
che traduce automaticamente il programma di alto livello in uno direttamente eseguibile dalla macchina.
to:
Un linguaggio di programmazione può essere o direttamente comprensibile dalla macchina o più vicino al modo di ragionare di chi lo dovrà utilizzare. Nel primo caso si parla di un ''linguaggio di basso livello'' (come l'assembly o il MIXAL), nel secondo caso di ''alto livello'' (come il C++ o il Java).

Per rendere anche questi ultimi comprensibili dalla macchina
, ci sarà bisogno di:
* %red%un ''interprete'', che interpreta ed esegue le istruzioni di un altro programma scritto in un altro linguaggio, rendendo difatto i programmi ''portabili'', oppure
* un ''compilatore''
, che traduce automaticamente il programma di alto livello in uno direttamente eseguibile dalla macchina.
Changed lines 230-232 from:
* N sono i ''non terminali'', ovvero simboli che non compaiono negli enunciati ma che servono a indicarne gli elementi. Da notare che: N &#8745; &#931; = &#8709;;
*
&#8721; è l'''alfabeto'' del linguaggio, i cui simboli sono chiamati ''terminali'' (in quanto usati per costruire gli enunciati);
* R è l' ''insieme delle regole di produzione''. \\
to:
* '''N''' sono i ''non terminali'', ovvero simboli che non compaiono negli enunciati ma che servono a indicarne gli elementi. Da notare che: N &#8745; &#931; = &#8709;;
*
'''&#8721;''' è l'''alfabeto'' del linguaggio, i cui simboli sono chiamati ''terminali'' (in quanto usati per costruire gli enunciati);
* '''R''' è l' ''insieme delle regole di produzione''. \\
Changed lines 235-236 from:
* S è il ''simbolo di partenza'', un simbolo non terminale speciale (e quindi S &#8712; N) che indica un enunciato valido.
to:
* '''S''' è il ''simbolo di partenza'', un simbolo non terminale speciale (e quindi S &#8712; N) che indica un enunciato valido.
Changed line 232 from:
* R è l'''insieme delle regole di produzione''. \\
to:
* R è l' ''insieme delle regole di produzione''. \\
Changed line 114 from:
se A &#8804; B &#8804; C, allora A &#8804; C
to:
se A &#8838; B &#8838; C, allora A &#8838; C
Changed lines 219-221 from:
&#8721; = {c,a}, &#8721;* = {&#1108;, c, a, ca, ac, acc, ..., acca, ..., cacca, ...}.

Una definizione più formale di linguaggio potrebbe essere: ''un linguaggio L è un sottoinsieme delle parole costruibili su un alfabeto &#8721;, L &#8804; &#61472;&#8721;*''. Ne consegue che, data una parola w &#8712; &#8721;* ci sono due possibilità:
to:
&#8721; = {c,a}, &#8721;* = {&#1108;, c, a, ca, ac, acc, ..., acca, caca, ..., cacca, ...}.

Una definizione più formale di linguaggio potrebbe essere: ''un linguaggio L è un sottoinsieme delle parole costruibili su un alfabeto &#8721;, L &#8838; &#61472;&#8721;*''. Ne consegue che, data una parola w &#8712; &#8721;* ci sono due possibilità:
Changed lines 227-228 from:
Per rappresentare L è necessario definire una procedura in grado di generare tutte le sue parole. %red%Una grammatica è%% uno di questi sistemi generativi, %red%un insieme di regole di produzione%% impiegate per descrivere in modo finito linguaggi infiniti.
to:
Un modo esauriente per rappresentare il linguaggio L è definire una procedura in grado di generare tutte le sue parole. %red%Una ''grammatica'' è proprio uno di questi sistemi generativi, quindi ''un insieme di regole di produzione impiegate per descrivere in modo finito linguaggi infiniti''.
Changed lines 230-236 from:
* N sono i non terminali, ovvero simboli che non compaiono negli enunciati ma che servono a indicarne gli elementi. Da notare che: N &#8745; &#931; = &#8709;;
* &#8721; è l'alfabeto del linguaggio, i cui simboli sono chiamati terminali (in quanto usati per costruire gli enunciati);
* R è l'insieme delle regole di produzione. \\
Queste hanno forma &#945; &#8594; &#946;, dove &#945; &#8712; N* \ {&#1108;} e &#946; &#8712; (N &#8746; &#931;)*;
* S è il simbolo di partenza, un simbolo non terminale speciale (e quindi S &#8712; N) che denota un enunciato valido.

La relazione di produzione in una grammatica G è espressa
come:
to:
* N sono i ''non terminali'', ovvero simboli che non compaiono negli enunciati ma che servono a indicarne gli elementi. Da notare che: N &#8745; &#931; = &#8709;;
* &#8721; è l'''alfabeto'' del linguaggio, i cui simboli sono chiamati ''terminali'' (in quanto usati per costruire gli enunciati);
* R è l'''insieme delle regole di produzione''. \\
Queste hanno forma &#945; &#8594; &#946;, dove &#945; &#8712; N* \ {&#1108;} e &#946; &#8712; (N &#8746; &#931;)* \\
[-(tradotto in parole: "'''se''' ho ''alfa'' '''allora''' produco ''beta'', dove alfa appartiene all'insieme dei non terminali (meno la parola vuota) mentre beta appartiene all'unione tra i non terminali e l'alfabeto (parola vuota compresa)")-];
* S è il ''simbolo di partenza'', un simbolo non terminale speciale (e quindi S &#8712; N) che indica un enunciato valido.

La relazione di produzione in una grammatica G è espressa
come:\\
Changed line 221 from:
Una definizione più formale di linguaggio potrebbe essere: un linguaggio L è un sottoinsieme delle parole costruibili su un alfabeto &#8721;, L &#61645;&#61472;&#8721;*. Ne consegue che, data una parola w &#8712; &#8721;* ci sono due possibilità:
to:
Una definizione più formale di linguaggio potrebbe essere: ''un linguaggio L è un sottoinsieme delle parole costruibili su un alfabeto &#8721;, L &#8804; &#61472;&#8721;*''. Ne consegue che, data una parola w &#8712; &#8721;* ci sono due possibilità:
Changed line 161 from:
* %red%''poter essere risolto in un numero finito di operazioni''%%, perché va da sé che se fosse infinito non si arriverebbe mai a risolvere il problema. Se quindi ad esempio trovare i primi dieci numeri primi è un algoritmo (basta applicare determinate operazioni per un numero finito di volte), trovare ''tutti'' i numeri primi non lo è più (le operazioni da eseguire sono ''le stesse'', ma non si finirà mai di ripeterle);
to:
* %red%''poter essere risolto in un numero finito di operazioni''%%, perché va da sé che se fosse infinito non si arriverebbe mai a risolvere il problema. Se quindi ''trovare i primi dieci numeri primi'' è un algoritmo (basta applicare determinate operazioni per un numero finito di volte), ''trovare '''''tutti''''' i numeri primi'' non lo è più (le operazioni da eseguire sono ''le stesse'', ma non si finirà mai di ripeterle);
Changed lines 203-206 from:
Un linguaggio di programmazione è un linguaggio non ambiguo e molto preciso, grazie al quale è possibile comunicare ad una macchina quali operazioni deve eseguire in modo del tutto meccanico e automatico.

Un programmatore non dovrà scegliere un linguaggio di programmazione ed usare sempre quello, ma dovrà man mano scegliere l'uno o l'altro a seconda delle necessità.
to:
Un linguaggio di programmazione è un linguaggio non ambiguo ed estremamente preciso, grazie al quale è possibile comunicare ad una macchina le operazioni che deve eseguire in modo del tutto meccanico e automatico.

Non esiste un unico linguaggio di programmazione, ed un buon programmatore non deve impararne uno a menadito ed usare sempre e solo quello, ma dovrà scegliere l'uno o l'altro a seconda delle necessità e di ciò che deve fare.
Changed lines 209-210 from:
Un linguaggio è un repertorio di segni convenzionali e di regole per combinarli in enunciati più complessi, più altre regole che associano un significato ad ogni enunciato. Esistono tre livelli di linguaggio:
* ''sintattico'', l’insieme delle regole che specificano in quali modi i segni possono essere combinati per formare enunciati;
to:
Un ''linguaggio'' è un repertorio di segni convenzionali e di regole per combinarli in enunciati più complessi, più altre regole che associano un significato ad ogni enunciato.

Esistono tre livelli di linguaggio:
* ''sintattico'', l’insieme delle regole che specificano in quali modi i segni possono essere combinati per formare enunciati. Ad esempio, nel linguaggio italiano ad una "q" non può seguire una "f";
Changed lines 216-219 from:
L’insieme dei segni convenzionali (simboli o token) grazie ai quali è possibile costruire gli enunciati di un linguaggio è chiamato indifferentemente alfabeto o vocabolario. %red%Una parola (in alcuni casi detta stringa o frase) è una sequenza di lunghezza finita di simboli dell’alfabeto. Un linguaggio è completamente definito dall'insieme delle parole che gli appartengono.

Una parola vuota è una sequenza di zero simboli, uguale per qualsiasi alfabeto e indicata con &#1108;. Se &#8721; è un alfabeto,
&#8721;* indica l’insieme di tutte le parole composte da elementi di &#8721;, &#1108; compresa. Per esempio se &#8721; = {0,1}, &#8721;* = {&#1108;, 0, 1, 00, 01, 10, 11, …}.
to:
L’insieme dei segni convenzionali (anche detti ''simboli'' o ''token'') con i quali si possono costruire gli enunciati di un linguaggio, viene chiamato indifferentemente ''alfabeto'' o ''vocabolario''. %red%Una ''parola'' (in alcuni casi detta ''stringa'' o ''frase'') è invece una sequenza di lunghezza finita di simboli dell’alfabeto. ''Un linguaggio è completamente definito dall'insieme delle parole che gli appartengono.''

Una parola vuota è una sequenza di zero simboli, uguale per qualsiasi alfabeto e indicata con
&#1108;. Se &#8721; è un alfabeto, &#8721;* indica l’insieme di tutte le parole composte da elementi di &#8721;, &#1108; compresa. Per esempio se\\
&#8721; = {c,a}, &#8721;* = {&#1108;, c, a, ca, ac, acc, ..., acca, ..., cacca, ...}.
Changed lines 98-99 from:
Il complemento di un insieme A è l'insieme di tutti gli elementi che non appartengono ad A.\\
to:
Il complemento di un insieme A è l'insieme di tutti gli elementi che non appartengono ad A.
Changed line 124 from:
Una funzione f si dice ''iniettiva'' se e solo se x1 &#61625; x2 implica f (x1) &#61625; f (x2).
to:
Una funzione f si dice ''iniettiva'' se e solo se x'_1_' &#8800; x'_2_' implica f (x'_1_') &#8800; f (x'_2_').
Changed lines 150-151 from:
La logica dei predicati mette inoltre a disposizione due utili elementi, ovvero i ''quantificatori'', grazie ai quali è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Ne esistono di due tipi, quello ''esistenziale'' &#8707; (“esiste”) e quello ''universale'' &#8704; (“per ogni”). %red%Molto importante ricordare come i quantificatori possano essere applicati alle sole variabili libere di una formula.%%
to:
La logica dei predicati mette inoltre a disposizione due utili elementi, i ''quantificatori'', grazie ai quali è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Ne esistono di due tipi, quello ''esistenziale'' &#8707; (“esiste”) e quello ''universale'' &#8704; (“per ogni”). %red%Molto importante ricordare come i quantificatori possano essere applicati alle sole variabili libere di una formula.%%
Changed lines 158-159 from:
%red%L'algoritmo è una procedura passo per passo grazie alla quale un'operazione può essere svolta senza alcun esercizio di intelligenza e quindi, per esempio, da una macchina.%% Il suo scopo è dunque quello di risolvere problemi. %red%Un esempio legittimo di algoritmo potrebbe essere una ricetta di cucina.
to:
%red%L'algoritmo è una procedura passo per passo grazie alla quale un'operazione può essere svolta [[senza alcun esercizio di intelligenza->rasputin]] e quindi, per esempio, da una macchina.%% Se il suo scopo è quello di risolvere problemi, capite bene con quanti algoritmi abbiamo a che fare tutti i giorni. %red%Un esempio legittimo di algoritmo potrebbe essere perfino una [[ricetta di cucina->pinguino]].
Changed lines 161-163 from:
* %red%poter essere risolto in un numero finito di operazioni%%, perché se fosse infinito non si risolverebbe il problema. Ad esempio non è un algoritmo la procedura per trovare i numeri primi, che pur avendo passi ben precisi non ha una fine;
* essere il meno ambiguo possibile. Ad esempio, in una ricetta di cucina la frase “''un pizzico di sale
'' non potrebbe essere ben interpretata da tutti (''un milligrammo? Dieci milligrammi? Sedici tonnellate?'').
to:
* %red%''poter essere risolto in un numero finito di operazioni''%%, perché va da sé che se fosse infinito non si arriverebbe mai a risolvere il problema. Se quindi ad esempio trovare i primi dieci numeri primi è un algoritmo (basta applicare determinate operazioni per un numero finito di volte), trovare ''tutti'' i numeri primi non lo è più (le operazioni da eseguire sono ''le stesse'', ma non si finirà mai di ripeterle);
* ''essere il meno ambiguo possibile''. Ad esempio, in una ricetta di cucina la frase "''un pizzico di sale''"
non potrebbe essere ben interpretata da tutti (''un milligrammo? Dieci milligrammi? Sedici tonnellate?'').
Changed lines 166-167 from:
%red%L'analisi di un algoritmo è lo studio della sua complessità computazionale.
La complessità computazionale di un algoritmo dipende dalla quantità di risorse necessarie alla sua esecuzione,%% strettamente dipendenti dalla difficoltà del problema da risolvere. Le due risorse principali, strettamente collegate, sono:
to:
%red%L'analisi di un algoritmo è lo studio della sua complessità computazionale. Questa dipende dalla quantità di risorse necessarie alla sua esecuzione,%% strettamente dipendenti dalla difficoltà del problema da risolvere. Le due risorse principali, strettamente collegate, sono:
Changed lines 172-175 from:
%red%Dal momento che sarebbe troppo complicato studiare la complessità di un algoritmo su una macchina reale, il suo studio avviene su un modello generico della tecnologia che verrà utilizzata per realizzarlo.%% Il nostro modello sarà una macchina con accesso casuale alla memoria e con un processore singolo, la random-access machine (RAM). %red%Peculiarità della RAM è che le istruzioni vengono eseguite in sequenza, con lo stesso tempo di esecuzione e senza operazioni concorrenti. Questo vuol dire che il tempo di esecuzione di un algoritmo su un dato ingresso è dato dal numero di passi necessari per eseguirlo moltiplicato per una costante di tempo t'_i_'.%% Per quanto riguarda lo spazio occupato, si considera invece la quantità massima di informazione da mantenere passo per passo durante l'esecuzione.

Dal momento che spazio e tempo dipendono dal particolare ingresso dell'algoritmo, non ci interessano molto i casi particolari, ma una statistica su tutte le possibili esecuzioni. Di tutte le statistiche possibili (caso migliore, caso medio, caso peggiore), %red%l'analisi degli algoritmi si concentra sul caso peggiore (maggior impiego di tempo e di spazio possibile) perché:
* %red%stabilisce un limite superiore alle risorse che l'esecuzione dell'algoritmo potrebbe
richiedere;
to:
%red%Dal momento che sarebbe troppo complicato studiare la complessità di un algoritmo su una macchina reale, il suo studio avviene su un modello generico della tecnologia che verrà utilizzata per realizzarlo.%% Il nostro modello sarà una macchina con accesso casuale alla memoria e con un processore singolo, la ''random-access machine'' (RAM). %red%Peculiarità della RAM è che le istruzioni vengono eseguite in sequenza, con lo stesso tempo di esecuzione e senza operazioni concorrenti. Questo significa che il tempo di esecuzione di un algoritmo su un dato ingresso è dato dal numero di passi necessari per eseguirlo moltiplicato per una costante di tempo t'_i_'.%% Per quanto riguarda lo spazio occupato, si considera invece la quantità massima di informazione da mantenere durante l'esecuzione.

Se spazio e tempo dipendono dal particolare ingresso dell'algoritmo, per il loro studio non possiamo interessarci di pochi casi particolari, ma di una statistica su tutte le possibili esecuzioni. Di tutte le statistiche possibili (caso migliore, caso medio, caso peggiore), %red%l'analisi degli algoritmi si concentra sul caso peggiore (maggior impiego di tempo e di spazio possibile) per tre buoni motivi:
* %red%stabilisce un limite superiore alle risorse che l'esecuzione dell'algoritmo potrebbe
richiedere (quindi le risorse messe a disposizione saranno sufficienti per ogni caso possibile);
Changed lines 177-180 from:
* %red%accade molto spesso che il caso medio è molto simile a quello peggiore.

%red%Ciò che però realmente determina la complessità di un algoritmo non è la quantità precisa di risorse, ma il suo tasso di crescita (logaritmico, lineare, cubico, esponenziale, ...) al crescere delle dimensioni dell'ingresso, detto ordine. Ovviamente, più l'ordine è basso e più l'algoritmo è semplice ed efficiente.
to:
* %red%è molto frequente che il caso medio sia molto simile a quello peggiore.

%red%Ciò che però realmente determina la complessità di un algoritmo non è la quantità precisa di risorse, ma il suo tasso di crescita (logaritmico, lineare, cubico, esponenziale, ...) al crescere delle dimensioni dell'ingresso, detto ''ordine''. Ovviamente, più l'ordine è basso e più l'algoritmo è semplice ed efficiente.
Changed lines 189-196 from:
* %red%''indecidibili'', quando non possono essere risolti in un tempo finito da nessun algoritmo e quindi da nessun programma. Ad esempio il problema "dell'arresto", che consiste nello stabilire se, dato un programma, questo termina su un dato ingresso, è un classico esempio di algoritmo indecidibile.

In base alla loro complessità computazionale, gli algoritmi possono essere suddivisi in classi di complessità, assegnate in base alla scelta del modello di calcolo (come
la RAM o, ancora più astratto, la macchina di Turing e la macchina di Turing con oracolo) ed al concetto di riduzione del problema.

La macchina di Turing è un dispositivo governato da una logica interna costituita da un automa a stati finiti ed equipaggiato con una testina che legge e scrive simboli di un certo alfabeto su un nastro infinito, sul quale si può spostare di una casella alla volta. La macchina di Turing con oracolo o “non deterministica” è una macchina di Turing ideale nella quale ogni volta che l’algoritmo prevede il compimento di una scelta, lui fa sempre quella giusta.

La riduzione o riducibilità
permette di verificare se un certo algoritmo associato alla risoluzione di uno specifico problema può essere adoperato per risolverne anche altri.
to:
* %red%''indecidibili'', quando non possono essere risolti in un tempo finito da nessun algoritmo e quindi da nessun programma. Ne è un classico esempio il problema "dell'arresto", che consiste nello stabilire se, dato un programma, questo termina su un particolare ingresso.

In base alla loro complessità computazionale, gli algoritmi possono essere suddivisi in ''classi di complessità'', assegnate in base alla scelta del modello di calcolo (come la RAM o, ancora più astratto,
la macchina di Turing e la macchina di Turing con oracolo) ed al concetto di riduzione del problema.

''...e tanto per sapere:'' La macchina di Turing è un dispositivo governato da una logica interna costituita da un automa a stati finiti ed equipaggiato con una testina che legge e scrive simboli di un certo alfabeto su un nastro infinito, sul quale si può spostare di una casella alla volta. La macchina di Turing con oracolo o “non deterministica” è una macchina di Turing ideale nella quale ogni volta che l’algoritmo prevede il compimento di una scelta, lui fa sempre quella giusta.

Ultimo concetto da prendere in considerazione nell'analisi di un algoritmo è quello di ''riduzione'' o ''riducibilità'', che
permette di verificare se un certo algoritmo associato alla risoluzione di uno specifico problema può essere adoperato per risolverne anche altri.
Changed lines 91-99 from:
Un ''insieme'' è una qualsiasi collezione di elementi.
Un elemento x che appartiene ad un insieme A si indica con la notazione x &#8712; A.
Due insiemi si dicono uguali se e solo se contengono gli stessi elementi.
Un insieme A è sottoinsieme di B se e solo se ogni elemento di A è anche elemento di B.
L'intersezione di due insiemi A &#8745; B è l'insieme di tutti gli elementi comuni ad A e B.
L'unione di due insiemi A U B è l'insieme di tutti gli elementi che appartengono ad A o a B, o ad entrambi.
Un insieme che non contiene nessun elemento si chiama insieme vuoto e si indica con &#61638;.
Il complemento di un insieme A è l'insieme di tutti gli elementi che non appartengono ad A.
to:
Un ''insieme'' è una qualsiasi collezione di elementi. \\
Un elemento x che appartiene ad un insieme A si indica con la notazione x &#8712; A. \\
Due insiemi si dicono uguali se e solo se contengono gli stessi elementi.\\
Un insieme A è sottoinsieme di B se e solo se ogni elemento di A è anche elemento di B.\\
L'intersezione di due insiemi A &#8745; B è l'insieme di tutti gli elementi comuni ad A e B.\\
L'unione di due insiemi A U B è l'insieme di tutti gli elementi che appartengono ad A o a B, o ad entrambi.\\
Un insieme che non contiene nessun elemento si chiama insieme vuoto e si indica con Ø.\\
Il complemento di un insieme A è l'insieme di tutti gli elementi che non appartengono ad A.\\
Changed line 112 from:
A U &#61638; = A --- A &#8745; U = A --- A &#8745; Ø = Ø --- A U U = U
to:
A U Ø = A --- A &#8745; U = A --- A &#8745; Ø = Ø --- A U U = U
Changed line 114 from:
se A &#61645; B &#61645; C, allora A &#61645; C
to:
se A &#8804; B &#8804; C, allora A &#8804; C
Changed line 112 from:
A U &#61638; = A --- A &#8745; U = A --- A &#8745; &#61638; = &#61638; --- A U U = U
to:
A U &#61638; = A --- A &#8745; U = A --- A &#8745; Ø = Ø --- A U U = U
Changed lines 54-55 from:
%red%Le proposizioni possono essere atomiche (semplici) oppure composte. Le seconde sono ottenute combinando una o più atomiche con i connettivi logici ''non'' (¬), ''e'' (&#8743;), ''o'' (&#8743;), ''implica'' (&#61641;), ''se e solo se'' (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di ''formule ben formate'' o ''fbf''.
to:
%red%Le proposizioni possono essere atomiche (semplici) oppure composte. Le seconde sono ottenute combinando una o più atomiche con i connettivi logici ''non'' (¬), ''e'' (&#8743;), ''o'' (&#8744;), ''implica'' (&#8835;), ''se e solo se'' (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di ''formule ben formate'' o ''fbf''.
Changed lines 54-55 from:
%red%Le proposizioni possono essere atomiche (semplici) oppure composte. Le seconde sono ottenute combinando una o più atomiche con i connettivi logici ''non'' (&#61656;), ''e'' (&#61657;), ''o'' (&#61658;), ''implica'' (&#61641;), ''se e solo se'' (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di ''formule ben formate'' o ''fbf''.
to:
%red%Le proposizioni possono essere atomiche (semplici) oppure composte. Le seconde sono ottenute combinando una o più atomiche con i connettivi logici ''non'' (¬), ''e'' (&#8743;), ''o'' (&#8743;), ''implica'' (&#61641;), ''se e solo se'' (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di ''formule ben formate'' o ''fbf''.
Changed line 79 from:
# P &#8743; > = P , P &#8744; &#8869; = P ;
to:
# P &#8743; T = P , P &#8744; &#8869; = P ;
Changed lines 135-136 from:
La logica dei predicati consente di aggirare alcuni limiti di quella proposizionale (soprattutto a livello di astrazione).
to:
La ''logica dei predicati'' è un passo avanti nel livello di astrazione della descrizione degli eventi. Tradotto in italiano, significa che offre strumenti di descrizione molto più potenti e versatili di quelli della logica delle proposizioni. Facendo un esempio, se abbiamo dieci lampadine e dobbiamo dire se funzionano o se sono fulminate, nella logica delle proposizioni dovremo definire una proposizione per ogni lampadina. Ok quando sono dieci lampadine, ma quando sono diecimila? In questo caso giunge in soccorso la logica dei predicati, in grado di parametrizzare e riassumere i vari eventi.
Changed lines 138-149 from:
* %red%simboli individuali%% (i nomi degli oggetti coinvolti nel ragionamento, chiamati istanze);
* %red%variabili%% (tipo x, y e z), che assumono valori dall'insieme dei simboli individuali;
* %red%simboli di funzione%%, utilizzati per costruire nuove istanze;
* %red%simboli di predicato%%, utilizzati per costruire proposizioni su particolari
istanze.

%red%I termini sono gli argomenti di un predicato nella logica dei predicati%%, ovvero delle entità sulle quali è possibile costruire affermazioni. Possono essere:
* simboli individuali;
* variabili;
* %red%se f è una funzione n-aria e t1, ... , tn sono termini, anche f(t1, ... , tn) è un termine.

Attraverso l'utilizzo dei termini sarà possibile scrivere formule in cui ciascuna variabile può essere sostituita da una qualsiasi delle istanze. Usando dei quantificatori è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Esistono due tipi di %red%quantificatori%%, quello esistenziale &#8707; (“esiste”) e quello universale &#8704; (“per ogni”), %red%applicabili alle sole variabili libere di una formula.
to:
* %red%''simboli individuali''%% (i nomi degli oggetti coinvolti nel ragionamento, chiamati anche ''istanze'');
* %red%''variabili''%% (ad esempio x, y e z), che possono assumere dei valori attinti dall'insieme dei simboli individuali;
* %red%''simboli di funzione''%%, utilizzati per costruire nuove istanze;
* %red%''simboli di predicato''%%, utilizzati per costruire proposizioni su particolari
istanze.

%red%I ''termini'' sono gli argomenti di un predicato nella logica dei predicati%%, e rappresentano quelle entità sulle quali è possibile costruire affermazioni. Possono essere:
* ''simboli individuali'';
* ''variabili'';
* %red%se f è una funzione ''n''-aria e t'_1_', ... , t'_n_' sono termini, anche f(t'_1_', ... , t'_n_') è un termine.

Attraverso l'utilizzo dei termini diventa possibile scrivere della formule in cui ciascuna variabile può essere sostituita da una qualsiasi delle istanze.

La logica
dei predicati mette inoltre a disposizione due utili elementi, ovvero i ''quantificatori'', grazie ai quali è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Ne esistono di due tipi, quello ''esistenziale'' &#8707; (“esiste”) e quello ''universale'' &#8704; (“per ogni”). %red%Molto importante ricordare come i quantificatori possano essere applicati alle sole variabili libere di una formula.%%
Changed line 91 from:
Un insieme è una qualsiasi collezione di elementi.
to:
Un ''insieme'' è una qualsiasi collezione di elementi.
Changed lines 120-128 from:
Dati n insiemi U1, U2, ... Un, il loro prodotto cartesiano U1 X U2 X ... X Un è l'insieme di tutte le n-uple ordinate (u1 X u2 X ... X un) dove ui &#8712; Ui per i = 1, 2, ... , n.

Dati due insiemi A e B
, una funzione f di dominio A e codominio B, in simboli f: A &#8594; B, è una mappa che associa ad ogni elemento a &#8712; A un elemento b = f(a) &#8712; A.

Una funzione f
si dice iniettiva se e solo se x1 &#61625; x2 implica f (x1) &#61625; f (x2).
Una funzione si dice suriettiva se la sua immagine coincide con il suo codominio.
Una corrispondenza biunivoca
(o funzione biiettiva) è una funzione sia iniettiva che suriettiva.

La cardinalità
di un insieme A è il numero di elementi che appartengono all'insieme A, e si denota &#9553;A&#9553;. Dati due insiemi A e B:
to:
Dati ''n'' insiemi ''U'_1_', U'_2_', ... U'_n_''', il loro prodotto cartesiano ''U'_1_' X U'_2_' X ... X U'_n_''' è l'insieme di tutte le ''n''-uple ordinate (''u'_1_' X u'_2_' X ... X u'_n_''') dove ui &#8712; Ui per i = 1, 2, ... , n.

Dati due insiemi A e B, una ''funzione
f'' di dominio A e codominio B, in simboli f: A &#8594; B, è una mappa che associa ad ogni elemento a &#8712; A un elemento b = f(a) &#8712; A.

Una funzione
f si dice ''iniettiva'' se e solo se x1 &#61625; x2 implica f (x1) &#61625; f (x2).
Una
funzione si dice ''suriettiva'' se la sua immagine coincide con il suo codominio.
Una ''corrispondenza biunivoca'' (o funzione biiettiva) è una funzione sia iniettiva che suriettiva.

La ''cardinalità''
di un insieme A è il numero di elementi che appartengono all'insieme A, e si denota &#9553;A&#9553;. Dati due insiemi A e B:
Changed lines 130-132 from:
* l'insieme delle funzioni f: A &#8594; B ha una cardinalità esponenziale data da &#9553;B&#9553;^&#9553;A&#9553;;
*%red%l'insieme di tutti i sottoinsiemi di A ha cardinalità 2^&#9553;A&#9553;.
to:
* l'insieme delle funzioni f: A &#8594; B ha una cardinalità esponenziale data da &#9553;B&#9553;'^&#9553;A&#9553;^';
*%red%l'insieme di tutti i sottoinsiemi di A ha cardinalità 2'^&#9553;A&#9553;^'.
Changed lines 40-43 from:
%red%Gli elaboratori elettronici sono delle macchine per elaborare informazioni%%, dove per macchine si intendono dispositivi - anche molto complessi - il cui scopo è sostituire o facilitare il lavoro umano nello svolgimento di compiti ripetitivi, difficili o faticosi. Una macchina in grado di compiere più compiti è meglio di una che ne sa svolgere uno solo, dal momento che con un unico dispositivo (e quindi un'unica spesa, trasporto, manuale) otterremo qualcosa che normalmente richiederebbe l'impiego di più strumenti diversi. È questo concetto di versatilità che sta alla base della programmazione.

%red%Gli elaboratori elettronici sono quindi programmabili per motivi economici%% e per versatilità.
to:
%red%Gli elaboratori elettronici sono delle macchine per elaborare informazioni%%, dove per macchine si intendono dispositivi - anche molto complessi - il cui scopo è sostituire o facilitare il lavoro umano nello svolgimento di compiti ripetitivi, difficili o faticosi.

Il concetto che sta alla base della programmazione
è che una macchina in grado di compiere più compiti è meglio di una che ne sa svolgere uno solo, dal momento che con un unico dispositivo (e quindi un'unica spesa, trasporto, manuale, ...) otterremo qualcosa che normalmente richiederebbe l'impiego di più strumenti diversi. %red%Gli elaboratori elettronici sono quindi programmabili per motivi economici%% e per versatilità.
Changed lines 52-61 from:
La logica proposizionale si occupa della verità o falsità di proposizioni, a loro volta composte sulla base della verità o falsità delle sotto-proposizioni che le compongono.

%red%Per proposizione si intende una frase di senso compiuto che può essere vera o falsa%%. Generalmente ad ogni proposizione viene associato un simbolo per
comodità di manipolazione (ad esempio, P: “è notte”).

%red%Le proposizioni possono essere atomiche (semplici) o composte, queste ultime ottenute collegando una o più atomiche con i connettivi logici non
(&#61656;), e (&#61657;), o (&#61658;), implica (&#61641;), se e solo se (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di formule ben formate o fbf.

Il valore di verità di una fbf ci dice se questa è vera o falsa,
e dipende dai valori di verità delle proposizioni che la compongono. Questi ultimi cambiano a seconda del contesto in cui li caliamo, ovvero dalla loro interpretazione (riprendendo l'esempio di prima, P è vero alle 2:00 am ma è falso alle 4:00 pm). %red%Per interpretazione si intende un assegnamento di valori di verità ad ogni proposizione atomica.

Le tabelle
di verità sono delle tabelle che indicano il valore di verità di una fbf a seconda del valore di verità delle sue “sotto-fbf”. %red%Se una fbf è combinazione di n atomiche, la sua tabella di verità sarà formata da 2n righe%%. Le tabelle di verità dei connettivi logici sono:
to:
La logica proposizionale si occupa della verità o falsità delle proposizioni, dove %red%per ''proposizione'' si intende una frase di senso compiuto che può essere vera o falsa%%. Un esempio di proposizione potrebbe essere che è pomeriggio, o che il sole è freddo, o che [[questa->ronaldinho]] è una donna. Per comodità di manipolazione, viene spesso associato ad ogni proposizione una simbolo, così da sfruttare le più compatte ed esaustive notazioni matematiche per descrivere le interazioni dei vari eventi (ad esempio, N: “io sono nudo”).

%red%Le proposizioni possono essere atomiche
(semplici) oppure composte. Le seconde sono ottenute combinando una o più atomiche con i connettivi logici ''non'' (&#61656;), ''e'' (&#61657;), ''o'' (&#61658;), ''implica'' (&#61641;), ''se e solo se'' (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di ''formule ben formate'' o ''fbf''.

Il valore di verità di una fbf ci dice se questa è vera o falsa, e dipende dai valori di verità delle proposizioni che la compongono. Questi ultimi cambiano a seconda del contesto in cui li caliamo, dalla loro %red%''interpretazione'', ovvero dal particolare assegnamento
di valori di verità dato ad ogni proposizione atomica%% (riprendendo l'esempio di prima, N è vero quando prendo il sole integrale ma è falso quando sono in università).

Le ''tabelle di verità'' sono tabelle (!) che indicano il valore di verità di una fbf a seconda del valore di verità delle sue “sotto-fbf”. %red%Da notare che se una fbf è combinazione di ''n'' atomiche, la sua tabella di verità sarà formata da ''2n''
righe%%. Le tabelle di verità dei connettivi logici sono:
Changed lines 63-66 from:
* %red%valida (o tautologia), se è vera per qualsiasi interpretazione. Es. A &#61658; &#61656; A;
* %red%inconsistente (o contraddizione), se è falsa per ogn interpretazione. Es. A &#8743; &#61656; A;
* %red%soddisfacibile, se e solo se esiste almeno un'interpretazione per cui essa è vera, ovvero che la soddisfa.
to:
* %red%''valida'' (o tautologia), se è vera per qualsiasi interpretazione. Es. A &#61658; &#61656; A;
* %red%''inconsistente'' (o contraddizione), se è falsa per ogn interpretazione. Es. A &#8743; &#61656; A;
* %red%''soddisfacibile'', se e solo se esiste almeno un'interpretazione per cui essa è vera, ovvero che la soddisfa.
Changed lines 36-37 from:
!!!1.1 Che cos'è la programmazione degli elaboratori
to:
!!!1 Che cos'è la programmazione degli elaboratori
Changed lines 48-51 from:
!!!1.2 Elementi di matematica e logica per la programmazione

!!!!1.2.1 Logica Proposizionale
to:
!!!2 Elementi di matematica e logica per la programmazione

!!!!2.1 Logica Proposizionale
Changed lines 91-92 from:
!!!!1.2.2 Insiemistica
to:
!!!!2.2 Insiemistica
Changed lines 135-136 from:
!!!!1.2.3 Logica dei predicati
to:
!!!!2.3 Logica dei predicati
Changed lines 156-157 from:
!!!1.3 La nozione di "algoritmo"
to:
!!!3 La nozione di "algoritmo"
Changed lines 202-203 from:
!!!1.4 I linguaggi di programmazione
to:
!!!4 I linguaggi di programmazione
Changed lines 208-209 from:
!!!!1.4.1 Definizione formale di linguaggio
to:
!!!!4.1 Definizione formale di linguaggio
Changed lines 223-224 from:
!!!!1.4.2 Grammatica
to:
!!!!4.2 Grammatica
Changed lines 242-243 from:
!!!!1.4.3 Grammatiche nel formato di Backus e Naur
to:
!!!!4.3 Grammatiche nel formato di Backus e Naur
Changed lines 255-256 from:
!!!!1.4.4 Carte sintattiche
to:
!!!!4.4 Carte sintattiche
Changed lines 259-260 from:
!!!!1.4.5 Linguaggi di alto e basso livello
to:
!!!!4.5 Linguaggi di alto e basso livello
Changed lines 269-270 from:
!!!1.5 Fasi della programmazione
to:
!!!5 Fasi della programmazione
Changed lines 278-279 from:
!!!!1.5.1 Specifica
to:
!!!!5.1 Specifica
Changed lines 292-293 from:
!!!!1.5.2 Progettazione
to:
!!!!5.2 Progettazione
Changed lines 302-303 from:
!!!!1.5.3 Modellazione
to:
!!!!5.3 Modellazione
Changed lines 308-309 from:
!!!!1.5.4 Codifica
to:
!!!!5.4 Codifica
Changed lines 312-313 from:
!!!!1.5.5 Verifica e correzione
to:
!!!!5.5 Verifica e correzione
Changed lines 320-321 from:
!!!1.6 Strumenti di modellazione della programmazione
to:
!!!6 Strumenti di modellazione della programmazione
Changed lines 324-325 from:
!!!!1.6.1 Diagrammi di flusso
to:
!!!!6.1 Diagrammi di flusso
Changed lines 329-330 from:
!!!!1.6.2 Pseudocodice
to:
!!!!6.2 Pseudocodice
Changed lines 337-338 from:
!!!1.7 Documentazione
to:
!!!7 Documentazione
Changed lines 341-342 from:
!!!!1.7.1 Documentazione interna
to:
!!!!7.1 Documentazione interna
Changed lines 345-346 from:
!!!!1.7.2 Documentazione esterna
to:
!!!!7.2 Documentazione esterna
Changed line 8 from:
1 [[#c11|Che cos'è la programmazione degli elaboratori]]
to:
1 [[#c11|Che cos'è la programmazione degli elaboratori]]\\
Changed lines 8-9 from:
1 [[#c11|Concetti di base]]
-> 1.1 Che cos'è la programmazione degli elaboratori
to:
1 [[#c11|Che cos'è la programmazione degli elaboratori]]
Changed lines 136-137 from:
!!!1.2.3 Logica dei predicati
to:
!!!!1.2.3 Logica dei predicati
Changed lines 330-331 from:
1.6.2 Pseudocodice
to:
!!!!1.6.2 Pseudocodice
Changed line 238 from:
ed il linguaggio generato da questa grammatica, indicato con L(G) è definito come:
to:
ed il linguaggio generato da questa grammatica, indicato con L(G) è definito come:\\
Added lines 266-354:
[[#su|[-'''Torna su'''-]]]


[[#c15]]
!!!1.5 Fasi della programmazione

%red%Esistono cinque fasi distinte nella scrittura di un programma:
* %red%specifica;
* %red%progettazione;
* %red%modellazione;
* %red%codifica;
* %red%verifica e correzione.

!!!!1.5.1 Specifica

La specifica è la fase in cui viene descritto in modo più o meno formale il problema che il programma deve risolvere, più gli eventuali vincoli che dovrà rispettare.

Una specifica informale non è altro che un testo con la descrizione del problema da risolvere e le relazioni che si desidera mantenere tra ingressi e uscite.

%red%Una specifica formale è una quadrupla S = <X, Y, I, U>, dove:
* %red%X sono gli ingressi%%, ovvero i dati da fornire al programma;
* %red%Y sono le uscite%%, cioè i risultati che il programma deve produrre;
* %red%I sono le precondizioni%%, cioè le condizioni che gli ingressi devono rispettare;
* %red%U sono le postcondizioni%%, ovvero le proprietà che i risultati del programma devono soddisfare perché si possa dire che è corretto.

Per ogni dato x &#8712; X che soddisfa la formula I(x) il risultato y &#8712; Y prodotto dal programma deve soddisfare la formula U(x, y).

!!!!1.5.2 Progettazione

La progettazione consiste nell'analisi del problema da risolvere e nel concepimento in modo astratto dell'algoritmo. %red%Esistono due approcci antitetici alla progettazione:
* %red%analisi top down (dall'alto verso il basso)%%, che scompone i requisiti da soddisfare per risolvere il problema in un numero minore di sotto-requisiti, a loro volta scomposti fino ad essere costituiti da soli compiti elementari;
* %red%analisi bottom up (dal basso verso l'alto)%%, che parte dai compiti elementari che si sanno già svolgere e cerca di combinarli nel modo più opportuno per ottenere la soluzione al problema. In questo modo si creano tanti piccoli programmi funzionali, organizzabili in librerie da cui poterli prelevare e riutilizzare.

I due approcci di progettazione possono essere anche combinati, ad esempio scomponendo un problema dall'alto e individuando quali sottorequisiti comuni e ricorrenti possono essere progettati in stile bottom-up.

Un sistema di progettazione tra i più recenti è quello %red%ad oggetti%%, che consiste nell'individuare tutti gli elementi rilevanti che compaiono nella definizione del problema (gli oggetti) e quindi modellizzarli e strutturarli tra loro.

!!!!1.5.3 Modellazione

La modellazione è la fase in cui viene rappresentato l'algoritmo in maniera più formale e dettagliata, con lo scopo di renderne evidenti i passaggi e la struttura concettuale.

È una fase molto importante e troppo spesso sottovalutata, che aiuta il programmatore a creare un programma corretto e corredato di una buona documentazione.

!!!!1.5.4 Codifica

La codifica è il momento in cui il programma viene effettivamente scritto nel linguaggio di programmazione prescelto. Tale scelta può dipendere da vari fattori, sia interni che esterni.

!!!!1.5.5 Verifica e correzione

La verifica è quella fase più o meno lunga in cui viene testato il programma, essendo molto improbabile che esso venga prodotto privo di un errori al primo colpo. La correzione degli errori è la logica conseguenza della fase di verifica, in cui vengono corrette le parti del codice segnalate dal testing. %red%Si può dire che un programma è corretto solo quando soddisfa le sue specifiche.

[[#su|[-'''Torna su'''-]]]


[[#c16]]
!!!1.6 Strumenti di modellazione della programmazione

Esistono diversi strumenti più o meno formali per aiutare il programmatore nella delicata fase di modellazione, ovvero quella intermedia tra l'algoritmo e il programma. Questi strumenti sono i diagrammi di flusso e lo pseudocodice.

!!!!1.6.1 Diagrammi di flusso

Un diagramma di flusso è la rappresentazione grafica simbolica dell'algoritmo, realizzata come sequenza di blocchi contenenti i passi dell'algoritmo stesso.
%red%Ogni diagramma di flusso ha uno stato di partenza e zero o più stati finali (rappresentati come cerchietti), più altri blocchi intermedi rappresentati come rettangoli per le istruzioni e come rombi per i test.%% Blocchi e stati sono collegati con delle frecce, che puntano al blocco successivo da eseguire.

1.6.2 Pseudocodice

%red%Un altro strumento di modellazione della programmazione è lo pseudocodice%%, ovvero un linguaggio di programmazione finto, con una sintassi ben precisa, un certo repertorio di comandi predefiniti, ecc. ma con una maggiore flessibilità, un repertorio di comandi predefiniti espandibile a piacere e idealmente coincidente con quelli che il programmatore considera dei “compiti elementari” e con la possibilità di utilizzare delle espressioni in linguaggio naturale laddove sia necessario specificare con maggiore chiarezza che cosa debba fare una particolare linea di codice.

[[#su|[-'''Torna su'''-]]]


[[#c17]]
!!!1.7 Documentazione

La documentazione di un programma è tutto quel materiale informativo prodotto per facilitare la comprensione - e quindi l'utilizzo - del programma stesso. Può essere di due tipi: interna ed esterna.

!!!!1.7.1 Documentazione interna

%red%La documentazione interna di un programma è costituita principalmente dai commenti introdotti nel corpo del programma%% nella fase di codifica, con lo scopo di chiarire il suo funzionamento. %red%Perfino la formattazione di un programma (indentazione, distribuzione su più righe, ...) e le asserzioni sono una forma di documentazione interna.

!!!!1.7.2 Documentazione esterna

%red%La documentazione esterna di un programma è costituita dai vari documenti di progetto prodotti separatamente dal programma. %%Essi sono documenti di specifica, spiegazioni scritte, manuali di riferimento, schemi e diagrammi (praticamente tutto il materiale prodotto nella fase di modellazione).

La documentazione non deve limitarsi alla mera codifica del programma, ma anche alla fase di collaudo, con la spiegazione dei sistemi di verifica applicati e dei risultati che hanno restituito.
Terminata anche la fase di collaudo (e relativa documentazione), ogni programma complesso dovrebbe essere fornito di un proprio manuale. Ne esistono di due tipi: il manuale utente (per l'utente comune che dovrà utilizzare il programma) e il manuale di riferimento (per l'utente avanzato o per un eventuale programmatore che potrebbe utilizzare il programma come componente di un altro più grande). Fasi della programmazione

[[#su|[-'''Torna su'''-]]]
Changed line 14 from:
3 [[#c13|La nozione di “algoritmo”]]
to:
3 [[#c13|La nozione di “algoritmo”]]\\
Changed lines 157-158 from:
!!!La nozione di "algoritmo"
to:
!!!1.3 La nozione di "algoritmo"
Changed lines 188-192 from:
* semplici, quando sono risolvibili da algoritmi di ordine logaritmico o lineare;
* trattabili, quando hanno complessità polinomiale in tempo di calcolo;
* %red%difficili o intrattabili, quando richiedono una quantità esponenziale di tempo;
* %red%indecidibili, quando non possono essere risolti in un tempo finito da nessun algoritmo e quindi da nessun programma. Ad esempio il problema "dell'arresto", che consiste nello stabilire se, dato un programma, questo termina su un dato ingresso, è un classico esempio di algoritmo indecidibile.
to:
* ''semplici'', quando sono risolvibili da algoritmi di ordine logaritmico o lineare;
* ''trattabili'', quando hanno complessità polinomiale in tempo di calcolo;
* %red%''difficili'' o ''intrattabili'', quando richiedono una quantità esponenziale di tempo;
* %red%''indecidibili'', quando non possono essere risolti in un tempo finito da nessun algoritmo e quindi da nessun programma. Ad esempio il problema "dell'arresto", che consiste nello stabilire se, dato un programma, questo termina su un dato ingresso, è un classico esempio di algoritmo indecidibile.
Changed lines 202-203 from:
to:
[[#c14]]
!!!1.4 I linguaggi di programmazione

Un linguaggio di programmazione è un linguaggio non ambiguo e molto preciso, grazie al quale è possibile comunicare ad una macchina quali operazioni deve eseguire in modo del tutto meccanico e automatico.

Un programmatore non dovrà scegliere un linguaggio di programmazione ed usare sempre quello, ma dovrà man mano scegliere l'uno o l'altro a seconda delle necessità.

!!!!1.4.1 Definizione formale di linguaggio

Un linguaggio è un repertorio di segni convenzionali e di regole per combinarli in enunciati più complessi, più altre regole che associano un significato ad ogni enunciato. Esistono tre livelli di linguaggio:
* ''sintattico'', l’insieme delle regole che specificano in quali modi i segni possono essere combinati per formare enunciati;
* ''semantico'', l’insieme delle regole che permettono di associare un significato a segni ed enunciati;
* ''pragmatico'' (non interessa ai nostri fini), che riguarda le conseguenze pratiche di un enunciato.

L’insieme dei segni convenzionali (simboli o token) grazie ai quali è possibile costruire gli enunciati di un linguaggio è chiamato indifferentemente alfabeto o vocabolario. %red%Una parola (in alcuni casi detta stringa o frase) è una sequenza di lunghezza finita di simboli dell’alfabeto. Un linguaggio è completamente definito dall'insieme delle parole che gli appartengono.

Una parola vuota è una sequenza di zero simboli, uguale per qualsiasi alfabeto e indicata con &#1108;. Se &#8721; è un alfabeto, &#8721;* indica l’insieme di tutte le parole composte da elementi di &#8721;, &#1108; compresa. Per esempio se &#8721; = {0,1}, &#8721;* = {&#1108;, 0, 1, 00, 01, 10, 11, …}.

Una definizione più formale di linguaggio potrebbe essere: un linguaggio L è un sottoinsieme delle parole costruibili su un alfabeto &#8721;, L &#61645;&#61472;&#8721;*. Ne consegue che, data una parola w &#8712; &#8721;* ci sono due possibilità:
* w appartiene al linguaggio e quindi rappresenta un enunciato di L;
* w non appartiene al linguaggio e dunque non ne rappresenta un enunciato valido.

!!!!1.4.2 Grammatica

Per rappresentare L è necessario definire una procedura in grado di generare tutte le sue parole. %red%Una grammatica è%% uno di questi sistemi generativi, %red%un insieme di regole di produzione%% impiegate per descrivere in modo finito linguaggi infiniti.

Più formalmente, una grammatica G è una quadrupla (N, &#8721;, R, S), dove:
* N sono i non terminali, ovvero simboli che non compaiono negli enunciati ma che servono a indicarne gli elementi. Da notare che: N &#8745; &#931; = &#8709;;
* &#8721; è l'alfabeto del linguaggio, i cui simboli sono chiamati terminali (in quanto usati per costruire gli enunciati);
* R è l'insieme delle regole di produzione. \\
Queste hanno forma &#945; &#8594; &#946;, dove &#945; &#8712; N* \ {&#1108;} e &#946; &#8712; (N &#8746; &#931;)*;
* S è il simbolo di partenza, un simbolo non terminale speciale (e quindi S &#8712; N) che denota un enunciato valido.

La relazione di produzione in una grammatica G è espressa come:
&#8658;G &#8838; (N &#8746; &#931;)'^&#8727;^' × (N &#8746; &#931;)'^&#8727;^'

ed il linguaggio generato da questa grammatica, indicato con L(G) è definito come:
L(G) = {w : w &#8712; &#931;'^&#8727;^' &#8743; S &#8658;'^&#8727;^'w}

ovvero tutte le stringhe w &#8712; &#931;'^&#8727;^' che derivano dal simbolo di partenza S utilizzando le regole della grammatica.

!!!!1.4.3 Grammatiche nel formato di Backus e Naur

Esistono altri tipi di notazione per definire le grammatiche, di più pratica e comoda lettura e scrittura. Ne è un esempio quella di Backus e Naur (abbreviato BNF), creata negli anni '60 per definire la sintassi del linguaggio Algol 60.

Alcune differenze rispetto alla notazione precedente:
* la freccia a destra &#8594; delle regole viene sostituita da ::= ;
* i simboli non terminali sono rappresentati da stringhe alfanumeriche racchiuse tra parentesi angolari, come <espressione> ;
* i simboli terminali sono racchiusi tra virgolette, singole o doppie.

Un esempio di notazione in BNF potrebbe essere:
<cifra_iniziale> ::== '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0'
che associa al non terminale cifra_iniziale uno dei i valori messi tra virgolette e separati dal metasimbolo di alternativa |.

!!!!1.4.4 Carte sintattiche

Le carte sintattiche sono dei diagrammi che esprimono le regole di una grammatica in forma grafica. Nel diagramma i simboli non terminali vengono rappresentati da rettangoli, mentre quelli terminali da elementi rotondi o rettangolari con gli angoli smussati. I simboli sono collegati tramite frecce orientate.

!!!!1.4.5 Linguaggi di alto e basso livello

Un linguaggio di programmazione può essere o direttamente comprensibile da una macchina o più vicino al modo di ragionare di chi lo dovrà utilizzare. Nel primo caso si tratta di un linguaggio di basso livello (come l'assembly o il MIXAL), nel secondo caso invece di alto livello. Per rendere anche quest'ultimo comprensibile alla macchina, ci sarà bisogno di:
* %red%un interprete, che interpreta ed esegue le istruzioni di un altro programma scritto in un altro linguaggio, rendendo difatto i programmi portabili, oppure
* un compilatore, che traduce automaticamente il programma di alto livello in uno direttamente eseguibile dalla macchina.
Changed line 10 from:
2 [[#c11|Elementi di matematica e logica per la programmazione]]
to:
2 [[#c12|Elementi di matematica e logica per la programmazione]]
Changed lines 14-15 from:
3 La nozione di “algoritmo”\\
4 I linguaggi di programmazione
to:
3 [[#c13|La nozione di “algoritmo”]]
4 [[#c14|I linguaggi di programmazione]]
Changed line 21 from:
5 Fasi della programmazione
to:
5 [[#c15|Fasi della programmazione]]
Changed line 27 from:
6 Strumenti di modellazione della programmazione
to:
6 [[#c16|Strumenti di modellazione della programmazione]]
Changed line 30 from:
7 Documentazione
to:
7 [[#c17|Documentazione]]
Changed lines 156-203 from:
to:
[[#c13]]
!!!La nozione di "algoritmo"

%red%L'algoritmo è una procedura passo per passo grazie alla quale un'operazione può essere svolta senza alcun esercizio di intelligenza e quindi, per esempio, da una macchina.%% Il suo scopo è dunque quello di risolvere problemi. %red%Un esempio legittimo di algoritmo potrebbe essere una ricetta di cucina.

%red%Requisiti essenziali per un algoritmo sono:
* %red%poter essere risolto in un numero finito di operazioni%%, perché se fosse infinito non si risolverebbe il problema. Ad esempio non è un algoritmo la procedura per trovare i numeri primi, che pur avendo passi ben precisi non ha una fine;
* essere il meno ambiguo possibile. Ad esempio, in una ricetta di cucina la frase “''un pizzico di sale''” non potrebbe essere ben interpretata da tutti (''un milligrammo? Dieci milligrammi? Sedici tonnellate?'').

Non esiste un unico linguaggio per esprimere un algoritmo, dipende da cosa bisogna fare, come bisogna farlo e da chi farlo eseguire.

%red%L'analisi di un algoritmo è lo studio della sua complessità computazionale.
La complessità computazionale di un algoritmo dipende dalla quantità di risorse necessarie alla sua esecuzione,%% strettamente dipendenti dalla difficoltà del problema da risolvere. Le due risorse principali, strettamente collegate, sono:
* ''il tempo impiegato'' per eseguire l'algoritmo;
* ''lo spazio'', ovvero la quantità di memoria necessaria per contenere i dati iniziali, intermedi e finali del problema che si sta risolvendo.

%red%Da notare che la difficoltà di un problema è misurata dalla complessità computazionale del più efficiente algoritmo che lo risolve.

%red%Dal momento che sarebbe troppo complicato studiare la complessità di un algoritmo su una macchina reale, il suo studio avviene su un modello generico della tecnologia che verrà utilizzata per realizzarlo.%% Il nostro modello sarà una macchina con accesso casuale alla memoria e con un processore singolo, la random-access machine (RAM). %red%Peculiarità della RAM è che le istruzioni vengono eseguite in sequenza, con lo stesso tempo di esecuzione e senza operazioni concorrenti. Questo vuol dire che il tempo di esecuzione di un algoritmo su un dato ingresso è dato dal numero di passi necessari per eseguirlo moltiplicato per una costante di tempo t'_i_'.%% Per quanto riguarda lo spazio occupato, si considera invece la quantità massima di informazione da mantenere passo per passo durante l'esecuzione.

Dal momento che spazio e tempo dipendono dal particolare ingresso dell'algoritmo, non ci interessano molto i casi particolari, ma una statistica su tutte le possibili esecuzioni. Di tutte le statistiche possibili (caso migliore, caso medio, caso peggiore), %red%l'analisi degli algoritmi si concentra sul caso peggiore (maggior impiego di tempo e di spazio possibile) perché:
* %red%stabilisce un limite superiore alle risorse che l'esecuzione dell'algoritmo potrebbe richiedere;
* %red%per alcuni algoritmi il caso peggiore è quello che accade più spesso;
* %red%accade molto spesso che il caso medio è molto simile a quello peggiore.

%red%Ciò che però realmente determina la complessità di un algoritmo non è la quantità precisa di risorse, ma il suo tasso di crescita (logaritmico, lineare, cubico, esponenziale, ...) al crescere delle dimensioni dell'ingresso, detto ordine. Ovviamente, più l'ordine è basso e più l'algoritmo è semplice ed efficiente.

Facciamo due esempi:
# %red%abbiamo due algoritmi A e B. Il primo nel caso peggiore gira in un tempo pari a nlogn, mentre il secondo in un tempo pari a 100logn. Anche se per n piccolo è A il più veloce, l'ordine di crescita di A è esponenziale, mentre quello di B logaritmico. Quindi B è un algoritmo più efficiente di A;
# %red%abbiamo due algoritmi A e B. Il primo nel caso peggiore gira in un tempo pari a nlogn, mentre il secondo in un tempo pari a 6nlogn. Il coefficiente 6 non deve trarre in inganno, perché l'ordine di crescita al crescere delle dimensioni dell'ingresso è esponenziale per entrambi. Quindi A e B hanno stessa complessità computazionale.

In base al loro ordine, i problemi si possono suddividere in:
* semplici, quando sono risolvibili da algoritmi di ordine logaritmico o lineare;
* trattabili, quando hanno complessità polinomiale in tempo di calcolo;
* %red%difficili o intrattabili, quando richiedono una quantità esponenziale di tempo;
* %red%indecidibili, quando non possono essere risolti in un tempo finito da nessun algoritmo e quindi da nessun programma. Ad esempio il problema "dell'arresto", che consiste nello stabilire se, dato un programma, questo termina su un dato ingresso, è un classico esempio di algoritmo indecidibile.

In base alla loro complessità computazionale, gli algoritmi possono essere suddivisi in classi di complessità, assegnate in base alla scelta del modello di calcolo (come la RAM o, ancora più astratto, la macchina di Turing e la macchina di Turing con oracolo) ed al concetto di riduzione del problema.

La macchina di Turing è un dispositivo governato da una logica interna costituita da un automa a stati finiti ed equipaggiato con una testina che legge e scrive simboli di un certo alfabeto su un nastro infinito, sul quale si può spostare di una casella alla volta. La macchina di Turing con oracolo o “non deterministica” è una macchina di Turing ideale nella quale ogni volta che l’algoritmo prevede il compimento di una scelta, lui fa sempre quella giusta.

La riduzione o riducibilità permette di verificare se un certo algoritmo associato alla risoluzione di uno specifico problema può essere adoperato per risolverne anche altri.

[[#su|[-'''Torna su'''-]]]


Changed lines 133-137 from:
* l'insieme delle funzioni f: A &#8594; B ha una cardinalità esponenziale data da &#9553;B&#9553;&#9553;A&#9553;;
*%red%l'insieme di tutti i sottoinsiemi di A ha cardinalità 2&#9553;A&#9553;.

1.2.3 Logica dei predicati
to:
* l'insieme delle funzioni f: A &#8594; B ha una cardinalità esponenziale data da &#9553;B&#9553;^&#9553;A&#9553;;
*%red%l'insieme di tutti i sottoinsiemi di A ha cardinalità 2^&#9553;A&#9553;.

!!!1.2.3 Logica dei predicati
Changed lines 140-151 from:
La logica dei predicati è costituita da:
simboli individuali (i nomi degli oggetti coinvolti nel ragionamento, chiamati istanze);
variabili (tipo x, y e z), che assumono valori dall'insieme dei simboli individuali;
simboli di funzione, utilizzati per costruire nuove istanze;
simboli di predicato, utilizzati per costruire proposizioni su particolari istanze.
I termini sono gli argomenti di un predicato nella logica dei predicati, ovvero delle entità sulle quali è possibile costruire affermazioni. Possono essere:
simboli individuali;
variabili;
se f è una funzione n-aria e t1, ... , tn sono termini, anche f(t1, ... , tn) è un termine.

Attraverso l'utilizzo dei termini sarà possibile scrivere formule in cui ciascuna variabile può essere sostituita da una qualsiasi delle istanze. Usando dei quantificatori è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Esistono due tipi di quantificatori, quello esistenziale &#8707; (“esiste”) e quello universale &#8704; (“per ogni”), applicabili alle sole variabili libere di una formula.
to:
%red%La logica dei predicati è costituita da:
* %red%simboli individuali%% (i nomi degli oggetti coinvolti nel ragionamento, chiamati istanze);
* %red%variabili%% (tipo x, y e z), che assumono valori dall'insieme dei simboli individuali;
* %red%simboli di funzione%%, utilizzati per costruire nuove istanze;
* %red%simboli di predicato%%, utilizzati per costruire proposizioni su particolari istanze.

%red%
I termini sono gli argomenti di un predicato nella logica dei predicati%%, ovvero delle entità sulle quali è possibile costruire affermazioni. Possono essere:
* simboli individuali;
* variabili;
* %red%se f è una funzione n-aria e t1, ... , tn sono termini, anche f(t1, ... , tn) è un termine.

Attraverso l'utilizzo dei termini sarà possibile scrivere formule in cui ciascuna variabile può essere sostituita da una qualsiasi delle istanze. Usando dei quantificatori è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Esistono due tipi di %red%quantificatori%%, quello esistenziale &#8707; (“esiste”) e quello universale &#8704; (“per ogni”), %red%applicabili alle sole variabili libere di una formula.

[[#su|[-'''Torna su'''-]]]
Changed lines 132-135 from:
il prodotto cartesiano A × B ha una cardinalità data dal prodotto delle cardinalità degli insiemi A e B, cioè &#9553;A × B&#9553; = &#9553;A&#9553; · &#9553;B&#9553;;
l'insieme delle funzioni f: A &#8594; B ha una cardinalità esponenziale data da &#9553;B&#9553;&#9553;A&#9553;;
l'insieme di tutti i sottoinsiemi di A ha cardinalità 2&#9553;A&#9553;.
to:
* %red%il prodotto cartesiano A × B ha una cardinalità data dal prodotto delle cardinalità degli insiemi A e B, cioè &#9553;A × B&#9553; = &#9553;A&#9553; · &#9553;B&#9553;;%%
*
l'insieme delle funzioni f: A &#8594; B ha una cardinalità esponenziale data da &#9553;B&#9553;&#9553;A&#9553;;
*%red%l'insieme di tutti i sottoinsiemi di A ha cardinalità 2&#9553;A&#9553;.
Changed lines 120-122 from:
# Leggi di De Morgan:\\
A &#8745; B = A U B --- A U B = A &#8745; B
to:
# %red%Leggi di De Morgan:\\
http://doppioclic.altervista.org/wiki/local/tetty/deMorgan.jpg
Added lines 2-3:
[[Torna alla pagina di Tetty -> Tetty]]
----
Changed lines 150-153 from:
Attraverso l'utilizzo dei termini sarà possibile scrivere formule in cui ciascuna variabile può essere sostituita da una qualsiasi delle istanze. Usando dei quantificatori è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Esistono due tipi di quantificatori, quello esistenziale &#8707; (“esiste”) e quello universale &#8704; (“per ogni”), applicabili alle sole variabili libere di una formula.
to:
Attraverso l'utilizzo dei termini sarà possibile scrivere formule in cui ciascuna variabile può essere sostituita da una qualsiasi delle istanze. Usando dei quantificatori è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Esistono due tipi di quantificatori, quello esistenziale &#8707; (“esiste”) e quello universale &#8704; (“per ogni”), applicabili alle sole variabili libere di una formula.

----
[[Torna alla pagina di Tetty -> Tetty]]
Changed line 12 from:
3 La nozione di “algoritmo”
to:
3 La nozione di “algoritmo”\\
Changed lines 64-67 from:
* valida (o tautologia), se è vera per qualsiasi interpretazione. Es. A &#61658; &#61656; A;
* inconsistente (o contraddizione), se è falsa per ogn interpretazione. Es. A &#8743; &#61656; A;
* soddisfacibile, se e solo se esiste almeno un'interpretazione per cui essa è vera, ovvero che la soddisfa.
to:
* %red%valida (o tautologia), se è vera per qualsiasi interpretazione. Es. A &#61658; &#61656; A;
* %red%inconsistente (o contraddizione), se è falsa per ogn interpretazione. Es. A &#8743; &#61656; A;
* %red%soddisfacibile, se e solo se esiste almeno un'interpretazione per cui essa è vera, ovvero che la soddisfa.
Deleted line 68:
Changed lines 85-90 from:
##%alpha% ¬(P &#8743; Q) = ¬P &#8744; ¬Q,
## ¬(P &#8744; Q) = ¬P &#8743; ¬Q. (leggi di De Morgan)
In generale una fbf Q segue logicamente da una fbf P se e solo se ogni interpretazione che soddisfa P soddisfa anche Q. In questo caso la formula P &#8835; Q si dice teorema, dove P è l'ipotesi e Q la sua tesi. La dimostrazione di un teorema è una successione di passaggi, verificabili in modo meccanico e oggettivo, che trasformano l'ipotesi nella tesi. Scrivere programmi spesso richiede la dimostrazione di teoremi

1.2.2 Insiemistica
to:
##%alpha% %red%¬(P &#8743; Q) = ¬P &#8744; ¬Q,
## %red%¬(P &#8744; Q) = ¬P &#8743; ¬Q. (leggi di De Morgan)

%red%
In generale una fbf Q segue logicamente da una fbf P se e solo se ogni interpretazione che soddisfa P soddisfa anche Q.%% In questo caso la formula P &#8835; Q si dice teorema, dove P è l'ipotesi e Q la sua tesi. La dimostrazione di un teorema è una successione di passaggi, verificabili in modo meccanico e oggettivo, che trasformano l'ipotesi nella tesi. %red%Scrivere programmi spesso richiede la dimostrazione di teoremi.%%

!!!!
1.2.2 Insiemistica
Changed lines 102-114 from:
1.Proprietà commutativa: A U B = B U A A &#8745; B = B &#8745; A
2.Proprietà associativa: A U ( B U C) = (A U B) U C
A &#8745; ( B &#8745; C) = (A &#8745; B) &#8745; C
3.Proprietà distributiva: A U ( B &#8745; C) = (A U B) &#8745; (A U C)
A &#8745; ( B U C) = (A &#8745; B) U (A &#8745; C)
4.Idempotenza: A U A = A A &#8745; A = A
5.Identità
: A U &#61638; = A A &#8745; U = A
A &#8745; &#61638; = &#61638; A U U = U
6.Proprietà transitiva dell'inclusione: se A &#61645; B &#61645; C, allora A &#61645; C
7.Involuzione:
&#256; = A
8.Leggi di De Morgan: A &#8745; B
= A U B A U B = A &#8745; B
to:
# Proprietà commutativa:\\
A U
B = B U A --- A &#8745; B = B &#8745; A
# Proprietà associativa:\\
A
U ( B U C) = (A U B) U C \\
A &#8745; ( B &#8745; C) = (A &#8745; B) &#8745; C
# Proprietà distributiva:\\
A U ( B &#8745; C) = (A U B) &#8745; (A U C)\\
A
&#8745; ( B U C) = (A &#8745; B) U (A &#8745; C)
# Idempotenza
:\\
A U
A = A --- A &#8745; A = A
# Identità:\\
A
U &#61638; = A --- A &#8745; U = A --- A &#8745; &#61638; = &#61638; --- A U U = U
# Proprietà transitiva dell'inclusione:\\
se A &#61645; B &#61645; C, allora A &#61645; C
# Involuzione:\\
&#256; = A
# Leggi di De Morgan:\\
A &#8745; B = A U B ---
A U B = A &#8745; B
Changed lines 61-142 from:
%center%http://doppioclic.altervista.org/wiki/local/tetty/tabelle_verita.jpg
to:
%center%http://doppioclic.altervista.org/wiki/local/tetty/tabelle_verita.jpg

%red%Una fbf può essere:
* valida (o tautologia), se è vera per qualsiasi interpretazione. Es. A &#61658; &#61656; A;
* inconsistente (o contraddizione), se è falsa per ogn interpretazione. Es. A &#8743; &#61656; A;
* soddisfacibile, se e solo se esiste almeno un'interpretazione per cui essa è vera, ovvero che la soddisfa.

Esistono in logica proposizionale alcune relazioni tra proposizioni così importanti da essere considerate leggi:

# P &#8801; Q = (P &#8835; Q) &#8743; (Q &#8835; P );
# P &#8835; Q = ¬P &#8744; Q;
#
##%alpha% P &#8743; Q = Q &#8743; P ,
## P &#8744; Q = Q &#8744; P ; (leggi commutative)
#
##%alpha% P &#8743; (Q &#8743; R) = (P &#8743; Q) &#8743; R,
## P &#8744; (Q &#8744; R) = (P &#8744; Q) &#8744; R; (leggi associative)
#
##%alpha% P &#8743; (Q &#8744; R) = (P &#8743; Q) &#8744; (P &#8743; R),
## P &#8744; (Q &#8743; R) = (P &#8744; Q) &#8743; (P &#8744; R); (leggi distributive)
# P &#8743; > = P , P &#8744; &#8869; = P ;
# P &#8743; &#8869; = &#8869;, P &#8744; T = T;
# P &#8743; ¬P = &#8869;, P &#8744; ¬P = T;
# ¬(¬P ) = P ;
#
##%alpha% ¬(P &#8743; Q) = ¬P &#8744; ¬Q,
## ¬(P &#8744; Q) = ¬P &#8743; ¬Q. (leggi di De Morgan)
In generale una fbf Q segue logicamente da una fbf P se e solo se ogni interpretazione che soddisfa P soddisfa anche Q. In questo caso la formula P &#8835; Q si dice teorema, dove P è l'ipotesi e Q la sua tesi. La dimostrazione di un teorema è una successione di passaggi, verificabili in modo meccanico e oggettivo, che trasformano l'ipotesi nella tesi. Scrivere programmi spesso richiede la dimostrazione di teoremi

1.2.2 Insiemistica

Un insieme è una qualsiasi collezione di elementi.
Un elemento x che appartiene ad un insieme A si indica con la notazione x &#8712; A.
Due insiemi si dicono uguali se e solo se contengono gli stessi elementi.
Un insieme A è sottoinsieme di B se e solo se ogni elemento di A è anche elemento di B.
L'intersezione di due insiemi A &#8745; B è l'insieme di tutti gli elementi comuni ad A e B.
L'unione di due insiemi A U B è l'insieme di tutti gli elementi che appartengono ad A o a B, o ad entrambi.
Un insieme che non contiene nessun elemento si chiama insieme vuoto e si indica con &#61638;.
Il complemento di un insieme A è l'insieme di tutti gli elementi che non appartengono ad A.

Gli insiemi godono delle seguenti proprietà:

1.Proprietà commutativa: A U B = B U A A &#8745; B = B &#8745; A
2.Proprietà associativa: A U ( B U C) = (A U B) U C
A &#8745; ( B &#8745; C) = (A &#8745; B) &#8745; C
3.Proprietà distributiva: A U ( B &#8745; C) = (A U B) &#8745; (A U C)
A &#8745; ( B U C) = (A &#8745; B) U (A &#8745; C)
4.Idempotenza: A U A = A A &#8745; A = A
5.Identità: A U &#61638; = A A &#8745; U = A
A &#8745; &#61638; = &#61638; A U U = U
6.Proprietà transitiva dell'inclusione: se A &#61645; B &#61645; C, allora A &#61645; C
7.Involuzione: &#256; = A
8.Leggi di De Morgan: A &#8745; B = A U B A U B = A &#8745; B

Dati n insiemi U1, U2, ... Un, il loro prodotto cartesiano U1 X U2 X ... X Un è l'insieme di tutte le n-uple ordinate (u1 X u2 X ... X un) dove ui &#8712; Ui per i = 1, 2, ... , n.

Dati due insiemi A e B, una funzione f di dominio A e codominio B, in simboli f: A &#8594; B, è una mappa che associa ad ogni elemento a &#8712; A un elemento b = f(a) &#8712; A.

Una funzione f si dice iniettiva se e solo se x1 &#61625; x2 implica f (x1) &#61625; f (x2).
Una funzione si dice suriettiva se la sua immagine coincide con il suo codominio.
Una corrispondenza biunivoca (o funzione biiettiva) è una funzione sia iniettiva che suriettiva.

La cardinalità di un insieme A è il numero di elementi che appartengono all'insieme A, e si denota &#9553;A&#9553;. Dati due insiemi A e B:
il prodotto cartesiano A × B ha una cardinalità data dal prodotto delle cardinalità degli insiemi A e B, cioè &#9553;A × B&#9553; = &#9553;A&#9553; · &#9553;B&#9553;;
l'insieme delle funzioni f: A &#8594; B ha una cardinalità esponenziale data da &#9553;B&#9553;&#9553;A&#9553;;
l'insieme di tutti i sottoinsiemi di A ha cardinalità 2&#9553;A&#9553;.

1.2.3 Logica dei predicati

La logica dei predicati consente di aggirare alcuni limiti di quella proposizionale (soprattutto a livello di astrazione).

La logica dei predicati è costituita da:
simboli individuali (i nomi degli oggetti coinvolti nel ragionamento, chiamati istanze);
variabili (tipo x, y e z), che assumono valori dall'insieme dei simboli individuali;
simboli di funzione, utilizzati per costruire nuove istanze;
simboli di predicato, utilizzati per costruire proposizioni su particolari istanze.
I termini sono gli argomenti di un predicato nella logica dei predicati, ovvero delle entità sulle quali è possibile costruire affermazioni. Possono essere:
simboli individuali;
variabili;
se f è una funzione n-aria e t1, ... , tn sono termini, anche f(t1, ... , tn) è un termine.

Attraverso l'utilizzo dei termini sarà possibile scrivere formule in cui ciascuna variabile può essere sostituita da una qualsiasi delle istanze. Usando dei quantificatori è possibile specificare se le variabili di una data proposizione si riferiscono a tutte le loro istanze o solo ad un numero più ristretto. Esistono due tipi di quantificatori, quello esistenziale &#8707; (“esiste”) e quello universale &#8704; (“per ogni”), applicabili alle sole variabili libere di una formula.
Changed line 61 from:
%center%http://doppioclic.altervista.org/wiki/local/TettyImage/tabelleVerità.JPG
to:
%center%http://doppioclic.altervista.org/wiki/local/tetty/tabelle_verita.jpg
Added line 61:
%center%http://doppioclic.altervista.org/wiki/local/TettyImage/tabelleVerità.JPG
Changed lines 49-50 from:
!!!!1.2.1 Logica Proposizionale
to:
!!!!1.2.1 Logica Proposizionale
Changed lines 53-59 from:
Per proposizione si intende una frase di senso compiuto che può essere vera o falsa. Generalmente ad ogni proposizione viene associato un simbolo per comodità di manipolazione (ad esempio, P: “è notte”).

Le proposizioni possono essere atomiche (semplici) o composte, queste ultime ottenute collegando una o più atomiche con i connettivi logici non (&#61656;), e (&#61657;), o (&#61658;), implica (&#61641;), se e solo se (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di formule ben formate o fbf.

Il valore di verità di una fbf ci dice se questa è vera o falsa, e dipende dai valori di verità delle proposizioni che la compongono. Questi ultimi cambiano a seconda del contesto in cui li caliamo, ovvero dalla loro interpretazione (riprendendo l'esempio di prima, P è vero alle 2:00 am ma è falso alle 4:00 pm). Per interpretazione si intende un assegnamento di valori di verità ad ogni proposizione atomica.

Le tabelle di verità sono delle tabelle che indicano il valore di verità di una fbf a seconda del valore di verità delle sue “sotto-fbf”. Se una fbf è combinazione di n atomiche, la sua tabella di verità sarà formata da 2n righe. Le tabelle di verità dei connettivi logici sono:
to:
%red%Per proposizione si intende una frase di senso compiuto che può essere vera o falsa%%. Generalmente ad ogni proposizione viene associato un simbolo per comodità di manipolazione (ad esempio, P: “è notte”).

%red%Le proposizioni possono essere atomiche (semplici) o composte, queste ultime ottenute collegando una o più atomiche con i connettivi logici non (&#61656;), e (&#61657;), o (&#61658;), implica (&#61641;), se e solo se (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di formule ben formate o fbf.

Il valore di verità di una fbf ci dice se questa è vera o falsa, e dipende dai valori di verità delle proposizioni che la compongono. Questi ultimi cambiano a seconda del contesto in cui li caliamo, ovvero dalla loro interpretazione (riprendendo l'esempio di prima, P è vero alle 2:00 am ma è falso alle 4:00 pm). %red%Per interpretazione si intende un assegnamento di valori di verità ad ogni proposizione atomica.

Le tabelle di verità sono delle tabelle che indicano il valore di verità di una fbf a seconda del valore di verità delle sue “sotto-fbf”. %red%Se una fbf è combinazione di n atomiche, la sua tabella di verità sarà formata da 2n righe%%. Le tabelle di verità dei connettivi logici sono:
Added lines 1-59:
(:title Tetty Cap 1:)
[[#su]]
!Concetti di base

!!!Indice
1 [[#c11|Concetti di base]]
-> 1.1 Che cos'è la programmazione degli elaboratori
2 [[#c11|Elementi di matematica e logica per la programmazione]]
-> 2.1 Logica proposizionale
-> 2.2 Insiemistica
-> 2.3 Logica dei predicati
3 La nozione di “algoritmo”
4 I linguaggi di programmazione
-> 4.1 Definizione formale di linguaggio
-> 4.2 Grammatica
-> 4.3 Grammatiche nel formato di Backus e Naur
-> 4.4 Carte sintattiche
-> 4.5 Linguaggi di alto e basso livello
5 Fasi della programmazione
-> 5.1 Specifica
-> 5.2 Progettazione
-> 5.3 Modellazione
-> 5.4 Codifica
-> 5.5 Verifica e correzione
6 Strumenti di modellazione della programmazione
-> 6.1 Diagrammi di flusso
-> 6.2 Pseudocodice
7 Documentazione
-> 7.1 Documentazione interna
-> 7.2 Documentazione esterna

----

[[#c11]]
!!!1.1 Che cos'è la programmazione degli elaboratori

Per poter comprendere il concetto di programmazione degli elaboratori elettronici, è prima necessario chiarire cos'è un elaboratore elettronico, e quindi cosa significa programmarlo.

%red%Gli elaboratori elettronici sono delle macchine per elaborare informazioni%%, dove per macchine si intendono dispositivi - anche molto complessi - il cui scopo è sostituire o facilitare il lavoro umano nello svolgimento di compiti ripetitivi, difficili o faticosi. Una macchina in grado di compiere più compiti è meglio di una che ne sa svolgere uno solo, dal momento che con un unico dispositivo (e quindi un'unica spesa, trasporto, manuale) otterremo qualcosa che normalmente richiederebbe l'impiego di più strumenti diversi. È questo concetto di versatilità che sta alla base della programmazione.

%red%Gli elaboratori elettronici sono quindi programmabili per motivi economici%% e per versatilità.

[[#su|[-'''Torna su'''-]]]


[[#c12]]
!!!1.2 Elementi di matematica e logica per la programmazione

!!!!1.2.1 Logica Proposizionale

La logica proposizionale si occupa della verità o falsità di proposizioni, a loro volta composte sulla base della verità o falsità delle sotto-proposizioni che le compongono.

Per proposizione si intende una frase di senso compiuto che può essere vera o falsa. Generalmente ad ogni proposizione viene associato un simbolo per comodità di manipolazione (ad esempio, P: “è notte”).

Le proposizioni possono essere atomiche (semplici) o composte, queste ultime ottenute collegando una o più atomiche con i connettivi logici non (&#61656;), e (&#61657;), o (&#61658;), implica (&#61641;), se e solo se (&#8801;). Le proposizioni atomiche e quelle composte prendono anche il nome di formule ben formate o fbf.

Il valore di verità di una fbf ci dice se questa è vera o falsa, e dipende dai valori di verità delle proposizioni che la compongono. Questi ultimi cambiano a seconda del contesto in cui li caliamo, ovvero dalla loro interpretazione (riprendendo l'esempio di prima, P è vero alle 2:00 am ma è falso alle 4:00 pm). Per interpretazione si intende un assegnamento di valori di verità ad ogni proposizione atomica.

Le tabelle di verità sono delle tabelle che indicano il valore di verità di una fbf a seconda del valore di verità delle sue “sotto-fbf”. Se una fbf è combinazione di n atomiche, la sua tabella di verità sarà formata da 2n righe. Le tabelle di verità dei connettivi logici sono: