Due proposizioni, o meglio, due espressioni logiche sono equivalenti quando assumono gli stessi valori logici al variare dei parametri che le condizionano.
"La scienza è il capitano, gli ingegneri i suoi soldati."
La seconda legge pone dei vincoli su come l’energia tende a ridistribuirsi in un sistema durante una trasformazione.
In particolare permette di:
Si dice che il problema della somma dei primi numeri naturali fu affrontato e risolto rapidamente da C.F.Gauss, famoso matematico, quando aveva l’età di soli 8 anni.
Il maestro della scuola frequentata da Gauss, per tenere impegnati gli allievi per un po’ di tempo, decise di assegnargli un compito alquanto lungo e ripetitivo: calcolare la somma dei numeri interi da 1 fino a 100.
Ma ebbe una sorpresa, quando Gauss dopo poco tempo gli diede la soluzione corretta.
Proviamo a ripercorrere il ragionamento fatto da Gauss.
Il modello ER mette a disposizione dei costrutti logici con cui rappresentare una realtà d’interesse. Per procedere alla descrizione del modello ER è necessario innanzitutto determinare quali sono questi costrutti: essi saranno poi rappresentati nel nostro schema come delle entità.
Lo studio del modello ER ci porta a concludere che i costrutti impiegati sono:
Procedendo con l’analisi, bisogna stabilire quali sono gli attributi che caratterizzano tali costrutti e quali sono le relazioni (anche dette associazioni) che legano fra loro i costrutti appena definiti.
Può esserci d’aiuto stilare un breve elenco (una descrizione esaustiva coprirebbe un capitolo di un libro), concentrandoci solo su gli aspetti fondamentali dei costrutti:
A questo punto bisogna tradurre il modello appena descritto in uno schema ER. Per far ciò si dovranno utilizzare costrutti ER per descrivere i costrutti ER appena definiti. Questo significa che si userà un linguaggio per descrivere se stesso (cioè linguaggio e metalinguaggio verranno a coincidere) bisognerà fare molta attenzione a non confondere i concetti e a non creare contraddizioni. Per ridurre le ambiguità, raccoglieremo tra doppi apici “” gli elementi che sono oggetto di descrizione.
Dall’analisi appena fatta, nel nostro schema del modello ER (ed approfondendo un po’ l’analisi) ci accorgiamo che il nostro schema dovrà rappresentare le seguenti relazioni:
Possiamo notare che le entità “entità” e “relazione”, hanno alcune caratteristiche in comune: entrambe sono identificate dall’attributo “nome” ed entrambe partecipano alla relazione “proprietà” con l’entità “attributo”. Questo suggerisce l’idea che “entità” e “relazione” siano concetti più dettagliati di un concetto più generale che raccoglie le caratteristiche in comune e che potremmo definire “costrutto semplice”.
Quindi “costrutto semplice” è identificato dal suo nome e partecipa alla relazione “proprietà” insieme ad “attributo”. Le entità “entità” e “relazione” costituiscono una specializzazione totale e disgiunta di “costrutto semplice” e ne ereditano le caratteristiche.
Le entità “entità” e “relazione” si specializzano poiché partecipano alla relazione “partecipazione” con ruoli differenti. Un’ “entità” può partecipare un numero arbitrario di volte in “partecipazione”. Stesso vale per “relazione”, con la differenza che ogni istanza di “relazione” collega almeno 2 “entità” (una relazione è al meno binaria).
Possiamo considerare che in una relazione, la cardinalità non è una proprietà che appartiene alle entità che vi partecipano, ma è una caratteristica della relazione. Quindi la relazione “partecipazione” avrà un attributo “cardinalità” il cui valore potrà essere derivato dalla partecipazione delle entità nella relazione.
Come visto nella descrizione, “attributo” non ha attributi chiave, ma può essere identificato da un attributo parziale “nome” e dalla relazione “proprietà” che lo lega alla sua entità proprietaria “costrutto semplice”.
Quindi “attributo” è un entità debole e “proprietà” è la sua relazione identificante.
Un “attributo” può specializzarsi nelle entità “attributo scalare” ed “attributo multivalore” la differenza tra queste due specializzazioni sta nel fatto che uno “scalare” è associato ad uno ed un solo dato, mentre uno “multivalore” può avere nessuno o più dati.
Salta fuori da questa osservazione una nuova entità del modello ER, sfuggita in prima analisi, che è il “dato”. Il “dato” non è un costrutto, cioè non è un concetto che viene disegnato negli schemi ER, ma è il concetto fondamentale su cui si costruiscono le basi di dati.
Per mancanza di fantasia, ho denotato le associazioni tra “dato” e “scalare” e tra “dato” e “multivalore” rispettivamente “a” e “b”.
Un’entità “attributo” può essere composta da altre entità “attributo”. Ciò è rappresentabile tramite una relazione ricorsiva, “composizione”, dell’entità “attributo” su se stessa.
Dato che non tutte le occorrenze di “attributo” sono del tipo “attributo composto” (ma ogni occorrenza di “attributo composto” è anche un occorrenza di “attributo”), è corretto rappresentare “attributo composto” come una specializzazione di “attributo”, dotata della proprietà aggiuntiva di partecipare nella relazione “composizione” con un ruolo specifico: essere composto da altri attributi.
Una generalizzazione, dato che collega due entità tramite una relazione padre/figlio, potrebbe sembrare un caso particolare (una specializzazione) di “relazione”.
Ma non è così. Una generalizzazione non può ereditare un nome, ma è identificata dalle entità che ne sono collegate.
Ne consegue logicamente una rappresentazione dell’entità “generalizzazione” come un entità debole legata a due relazioni identificanti “padre” e “figlio”.
Si può disegnare uno schema ER che rappresenta il modello ER:
I marziani hanno tre dita in una mano e solo un dito nell’altra.
I marziani maschi hanno le loro tre dita sulla mano sinistra, mentre le femmine hanno le loro tre dita sulla mano destra. Ciò rende più semplice ballare il valzer.
Come gli esseri umani ed altre specie intelligenti, i Marziani hanno incominciato a contare usando le loro dita ed avendo solo quattro dita hanno sviluppato un sistema numerico posizionale in base quattro.
Le quattro cifre che usano sono:
In un numero marziano il peso di ciascuna cifra è specificato da un suffisso. I suffissi seguono la seguente logica:
quindi, ad esempio:
∫ = 1 (foo),
∫Θ = 1*4 + 0 = 4 (fooby)
∫ΘΘ = 1*4*4 + 0*4 + 0 = 16 (foobity)
∫ΘΘΘΘΘ = 1*4*4*4*4*4 = 1024 (foobidididity)
∩Θ = 2*4 + 0 = 8 (barby)
≡∩∫ = 3*4*4 + 2*4 + 1 = 57 (basbity barby foo)
≡Θ∩∫ = 3*4*4*4 + 0*4*4 + 2*4 +1 = 201 (basbidity barby foo)
Esercizio
Come utile esercizio, si scriva una funzione che sia in grado di tradurre un numero terrestre in uno marziano e ne riporti la pronuncia.
Segue una possibile soluzione in PHP, che opportunamente inclusa in una pagina web (ad esempio questa), permette la traduzione dei numeri in marziano.
/**
* Traduce un numero terrestre in marziano
*
* @param int
* @return string
*/
function martianize($n) {
// corrispondenze tra cifre terrestri e marziane
$traduzione = array(
'0' => 'xip',
'1' => 'foo',
'2' => 'bar',
'3' => 'bas'
);
$s='';
$r=0;
$out='';
/*
* Convertiamo il numero $n in base 4
* e memorizziamo ogni cifra in una stringa $s
*/
while ($n > 3){
$r = $n % 4; //resto intero della divisione
$n = (int)($n / 4); //quoziente intero della divisione
$s = (string)$r . $s;
}
$s = (string)$n .$s;
/*
* Adesso convertiamo la stringa $s in marziano
*/
$len = strlen($s);
for ($i = 0; $i < $len; $i++ ){
$char = $s[$i];
$peso = $len-$i-1;
/* gli zeri di un numero non si pronunciano, ammeno che non sia proprio lo zero */
if ($char == '0' && $len > 1) continue;
$martian = $traduzione[$char];
/* se ilpeso è zero, allora la cifra corrisponde con la traduzione */
if ($peso == 0) $out.= $martian;
/* se il peso è 1 allora la cifra è pronunciata con il suffisso "by"*/
else if ($peso == 1) $out .= $martian . 'by';
/* se il peso è 2, il suffiso "bity",
se invece il peso è x allora il suffisso è "bi..di..di..ty"*/
else {
$di = '';
for($j=0; $j < $peso-2; $j++) $di .= 'di'; // con "di" che si ripete x-2 volte
$out.= $martian."bi{$di}ty";
}
/*separiamo la pronuncia delle cifre aggiungendo uno spazio*/
$out .= ' ';
}
return $out;
}
Alcune premesse:
1) Ho svolto questi esercizi come applicazione di quanto ho potuto appendere dalla visione
delle video lezioni (anche qui) del corso di basi di dati tenuto dal Prof. Paolo Atzeni e dal Prof. Riccardo Torlone.
2) Ho usato SQLite 3.7 come dbms per svolgere e testare questi esercizi. Un’istanza del database a scopo di esercizio è qui
3) Sono riportate le soluzioni degli esercizi così come li ho svolti,
ciò non implica che gli esercizi non possano essere svolti trovando soluzioni alternative.
4) Per semplicità si assume che l’attributo “nome” nella tabella “persone” sia sufficiente ad
identificare univocamente una persona
Dato il seguente schema di database,
CREATE TABLE maternita( madre text references persone(nome), figlio text unique references persone(nome) ); CREATE TABLE paternita( padre text references persone(nome), figlio text unique references persone(nome) ); CREATE TABLE persone( nome text primary key, eta numeric, reddito numeric );
scrivere in SQL le query necessarie a:
SELECT DISTINCT padre
FROM paternita
WHERE figlio IN (SELECT nome FROM persone WHERE reddito > 20);
SQLite ha a disposizione l’operatore di join a sinistra.
Si può anche risolvere osservando che l’insieme dei padri che hanno figli che guadagnano più di 20 può essere ottenuto sottraendo all’insieme di tutti i padri quelli che hanno almeno un figlio che ha un reddito minore o uguale a 20.
SELECT DISTINCT padre FROM paternita
EXCEPT
SELECT DISTINCT padre FROM paternita, persone
WHERE figlio = nome AND reddito <= 20;
quest’ultimo esempio mostra che pensare in termini d’insiemi può essere altrettanto efficace.
.