Le espressioni regolari sono un modo di descrivere particolari stringhe di caratteri, per la precisione quelle stringhe di caratteri che sono riconoscibili da automi a stati finiti.
Espressione |
significato |
esempi |
[…] |
Classe
di caratteri |
|
(…) |
Raggruppamento |
|
| |
Alternativa |
|
\ |
Escape
per introdurre caratteri del linguaggio |
|
^ |
Inizio
stringa |
^/* |
. |
Punto.
Qualsiasi carattere (tranne newline) |
a
b c …. |
* |
Zero
o più ripetizioni dell'espressione regolare precedente |
.*
= '', 'a', 'abcs', x* = '', 'x', 'xx…' |
+ |
Una
o più ripetizioni dell'espressione regolare precedente |
.+
= 'a', 'aaabb', x+ = 'x', 'xx…' |
? |
Zero
o una ripetizione dell'espressione regolare precedente |
[+|-]?
= +,-, (nulla) |
In genere il risultato dei raggruppamenti vanno in variabili ($1 ... in Perl)
La macchina virtuale con una sola istruzione è formata da celle contigue, nelle prime celle sono contenuti:
§ PC il Program Counter
§ R0, R1 celle di lavoro o registri
§ Input buffer dei dati di input
§ Output buffer dei dati di output
§ Uno la costante 1
§ A, B,… celle di lavoro
Seguono le istruzioni della macchina, ognuna è di tre celle C1, C2, C3, l'esecuzione del programma è:
C1 = C1 – C2
PC = PC – C3 se C1 < 0 altrimenti PC = PC + 3
Il test χ2 è utilizzato per stimare l'affidabilità di certe ipotesi su campioni statistici. Nell'esempio di codice Fortran (v. par. 2.28 ), lo si è utilizzato per stimare la bontà di un semplice generatore di numeri pseudocasuali[1]. Nell'esempio sono stati simulati dei lanci di dado, la formula che fornisce il valore del test χ2 è:
dove r è il numero dei risultati possibili, 6 nell'esempio del lancio dei dadi; n è il numero totale di lanci, ni è il numero di volte in cui è comparsa la faccia i del dado con pi la probabilità teorica, nel nostro caso 1/6. Esistono delle tabelle che contengono i valori limite relativi alla probabilità che le ipotesi non siano corrette; queste tabelle sono in funzione dei gradi di libertà dei risultati, nel nostro caso i gradi di libertà sono r – 1 = 5 perché, conoscendo il numero di lanci totale e i risultati relativi a 5 valori ottenuti, il sesto valore lo si può ricavare. Il valore limite del test χ2 per 5 gradi di libertà, con probabilità di errore < 0,05 è 11,1.
L'idea di base della codifica di Hamming[2], è di avere m bit di informazione più altri k bit, ognuno dei quali è la parità di un'opportuno sottoinsieme degli m bit di informazione. Per individuare se è presente un errore si calcola un numero di controllo (checking number) c a partire da k, e precisamente per ogni bit di k, se esso verifica la parità (quindi non c'e' un errore), il corrispondente bit di c vale 0, altrimenti vale 1. Se c vale 0, non ci sono errori, altrimenti c contiene un valore che, per come sono stati scelti i sottoinsiemi di bit per il calcolo della parità, indica quale bit è errato. Quindi la dimensione di k deve essere tale da contenere i numeri da 1 a m + k[3].
La determinazione dei k sottoinsiemi è immediata: il sottoinsieme βi contiene tutti i bit nel cui numero binario la posizione i-esima è 1, ad esempio β1 = {b1,b3,…,b2n+1…} in quanto nei numeri dispari il primo bit vale sempre 1.
La tabella sottostante, relativa a 7 bit, di cui 3 di parità, esemplifica la scelta dei sottonsiemi:
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
|
1 |
1 |
1 |
1 |
0 |
0 |
0 |
β3
= {b4,b5,b6,b7} |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
β2
= {b2,b3,b6,b7} |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
β1
= {b1,b3,b5,b7} |
Figura
38
Si supponga che un errore nei dati, sia rilevato dagli insiemi β1 e β3, quindi il checking number è (101)2 = (5)10, che indica nel bit b5 il bit errato.
L'ultimo problema è quello di scegliere la posizione dei k bit di parità: si sceglieranno le posizioni il cui numero contiene un solo bit 1, cioè 1, 2, 4, …2n, … , in tal modo tutti i bit di controllo saranno indipendenti fra di loro.
Il sistema descritto permette di scoprire e correggere un errore; se ci sono due errori, il sistema corregge in modo errato (vedere nell'esempio se, per ipotesi, sono errati b4 e b5). Per correggere un errore o individuare la presenza di due errori, occorre aggiungere un ulteriore bit di parità su tutti i bit (parità generale). Trascurando il caso di tre o più errori, evento con probabilità molto bassa, si possono avere tre casi:
· nessun errore: tutte le parità sono soddisfatte,
· un solo errore: la parità generale non è soddisfatta, se il checking number è zero, l'errore è sulla parità generale, altrimenti è sul bit indicato dal checking number,
· due errori: la parità generale è soddisfatta, il checking number è diverso da zero.
Una scelta accettabile, che bilancia ridondanza e maneggevolezza è l'utilizzo di 16 bit (due bytes), in cui 11 sono di informazione, 4 di controllo ed 1 di parità generale.
Questo è un semplice sistema per criptare informazioni, lo schema di funzionamento è il seguente:
sia A il mittente e B il ricevente
La funzione da applicare deve essere facilmente invertibile, ad esempio si può rimescolare il testo secondo la formula: j = i*p mod q dove i è la posizione attuale del carattere e j la posizione che esso assumerà, p e q sono due numeri primi maggiori della lunghezza del testo, con q, per motivi pratici, pari al primo numero primo maggiore o uguale alla lunghezza del testo. Qui la chiave segreta è essenzialmente il numero p.
Nella logica la deduzione è
l’operazione per cui da un insieme di premesse vere si ottiene, una
conclusione vera applicando opportune regole. Si è visto che certe
proposizioni, i Teoremi o Tautologie, sono sempre vere; esistono degli
insiemi di teoremi, detti base assiomatica, che, con le regole di
deduzione, permettono di dedurre tutti e soli i teoremi. Una delle regole di
deduzione si basa sull’operatore implica: la formula (α
> β) può essere
letta: se (è vero) α allora (è vero) β.
La frase, comprese le parti fra parentesi, rappresenta il modo comune di
intendere l’operatore implica; in realtà nella logica la formula risulta vera
anche quando α è falso e β indifferentemente vero o falso. Di fatto questi due casi non hanno quasi
importanza pratica[4].
La
seconda regola permette di sostituire in una formula tutte le occorrenze di una
variabile proposizionale con un teorema. Per essere più formali sarà indicato
come sistema PM[5]
l'insieme di assiomi e regole che permettono la deduzione:
Base
assiomatica
A1.
(p v p)
> p
A2.
p > (p v
q)
A3.
(p v q) > (q v p)
A4.
(q > r) >
((p v q) > (p v r))
Regole
TR1.
Regola di sostituzione: é possibile sostituire
in una formula tutte le occorrenze di una variabile proposizionale con un
teorema.
TR2. Modus ponens (MP) o separazione: se α è vera e (α > β) è vera, allora β è vera.
Dato un insieme di formule e
variabili proposizionali Φ ={α1,α2,…a1,a2,…
}, in cui ogni componente di Φ è vera per ipotesi[6],
diciamo che β è una deduzione, se β è deducibile da Φ perché o è una formula o è una
variabile proposizionale appartenente a Φ, o è ricavabile applicando le
regole.
Un semplice esempio è:
Φ = {"piove" , "piove > strada bagnata"}
β = "strada bagnata"
Un esempio un po' più complesso è il seguente, in cui occorre verificare se la variabile proposizionale b è derivabile dall'insieme Φ:
1.
a > b
2.
c > b
3. a v c
I passi successivi mostrano la deduzione di b, con l'indicazione, a destra, dell'assioma o delle formule implicate nel Modus Ponens:
4.
(a > b) > ((c v a) > (c v b)
A4
5.
((c v a) > (c v b)
MP 1, 4
6.
(c v b)
MP 3, 5
7.
(c v b) > b
A1
8. b MP 6, 7
La procedura di deduzione può essere automatizzata, ma al crescere delle formule coinvolte, il tempo necessario a trovare la soluzione cresce rapidamente. La procedura può essere migliorata con accorgimenti euristici, analoghi a quelli utilizzati da un uomo che voglia ottenere la soluzione. Una procedura, facilmente implementabile su calcolatore, è quella che realizza il metodo reductio. Il metodo sostanzialmente verifica che la negazione di β falsifica almeno una delle formule appartenente a Φ, in questo caso β è deducibile, poichè per ipotesi tutte le formule appartenenti a Φ sono vere; se la negazione di β non falsifica Φ, β non è deducibile da Φ. Per una realizzazione del metodo reductio occorre:
1. trasformare Φ e β in forma normale congiuntiva, cioè in and di or: Φ = φ1 ● φ2 ● … ● φj …, e β = β1 ● β2 ● … ● βi …
2. per ogni βi appartenente a β occorre verificare se βi è deducibile da Φ; ciò viene provato se, supposta falsa βi, almeno una φj risulta falsa, contraddicendo le ipotesi. βi è falsa imponendo opportunamente il valore Vero o Falso (V o F) ad ogni sua variabile.
3. I valori assegnati alle variabili in βi sono assegnati anche, alle stesse variabili in Φ.
4. Ogni φj può essere:
4.1 Falsa poiché tutte le variabili presenti sono valorizzate a falso, βi può essere deducibile da Φ.
4.2 Vera, se almeno una variabile presente ha valore vero, in tal caso occorre esaminare φj+1.
4.3 Indefinita, se ci sono ancora variabili non valorizzate (oltre ad eventuali variabili con valore falso). In questo caso occorre valorizzare le variabili in modo che rendano vera la formula: se le variabili in φj sono n, occorrono 2n-1 valorizzazioni. I valori assegnati alle variabili in φj vengono assegnati alle stesse varibili presenti nelle formule φk successive (k > j).
4.3.1 La verifica prosegue sulle formule successive a φj. Se per ogni assegnazione non si trova un φk falso, β non è deducibile.
Dall'esempio precedente:
1 Φ = (¬a v b) ● (¬c v b) ● (a v c); β = b
2 Affinchè β sia falso b deve valere F.
3 Φ = (¬a v F) ● (¬c v F) ● (a v c)
4 φ1 = ¬a v F è indefinito
4.3 Alla variabile a viene imposto il valore F, perché ¬a; le formule successive diventano: (¬c v F) ● (F v c)
4 φ2 = ¬c v F è indefinito
4.3 Alla variabile c viene imposto il valore F, perché ¬c; la formula successiva diventa: (F v F)
4 φ3 = F v F φ3, contro le ipotesi, risulta falso, quindi β è derivabile da Φ.
Se Φ è inconsistente, perchè ad esempio contiene una
formula e la sua negazione, sia β che ¬β sono derivabili.
Le equazioni di un’ellisse centrata ortogonale, di assi a e b, in funzione dell’angolo formato dall’asse x e dalla retta che contiene l’origine ed un punto generico (x,y) dell’ellisse, sono (equazioni parametriche):
x = a*cos(φ), y = b*sen(φ)
Se a = b la figura geometrica è un cerchio. La relazione fra le coordinate di un’ellisse generica con assi ortogonali che si incontrano nel punto (xc, yc), inclinata di in angolo α e la stessa con gli assi coincidenti con gli assi cartesiani è:
X = xc + x*cos(α) – y*sen(α)
Y = yc + x*sen(α) + y*cos(α)
Valore di
pi greco
3,141592653589793238462643383279502884197169399375105820974944592307816...
pi greco = 4(1/1
- 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - 1/15...)
pi greco circa
355/113 3.141592(92035398)
[1]
Dato un numero iniziale, ad esempio di 8 cifre, se ne
calcola il quadrato e si prendono le cifre centrali, questo è un numero
pseudocasuale, che è utilizzato per generare in modo analogo i numeri
successivi. Il metodo non è affidabile.
[2] R.W. Hamming, Error Detecting and Error Correcting Codes The Bell
System Technical Journal Vol. XXVI April 1950 No. 2
[3]
Deve valere 2k ≥
m + k +1 oppure k = int(log2(m + k))+1)
[4] Le clausole di Horn sono facilmente interpretabili nella logica modale prescrittiva: se p un enunciato ed α una azione: if p then α, corrisponde a: p > O(α) ha valore di verità "Vero", a meno di comportamento scorretto del programma, cioè, a fronte di una istruzione del tipo if p then α, con p "Vero", Oα è "Falso" perché l'azione α non viene eseguita. Il programma ha valore "Vero" anche nel caso in cui p è "Falso" e Oα è "Vero", ma ciò non corrisponde necessariamente ad un malfunzionamento, infatti α potrebbe essere stata eseguita in uno stato precedente.
[5]da
Principia Mathematica di A. N. Whitehead e B. A. W. Russell 1910.
[6]
Ciò significa che esiste almeno un insieme di valori che attribuiti alle
variabili presenti in Φ rendono tutte le componenti vere.