La logica è un formalismo universale alternativo al linguaggio naturale. Ha come vantaggio di non essere ambigua, e ha la possibilità di dimostrare in modo automatico delle proprietà desiderate.
In questo corso useremo la logica per specificare dei linguaggi formali, usando la logica monadica del primo e secondo ordine, e per specificare il comportamento I/O di programmi.
Consideriamo la logica del primo ordine con predicati su una sola variabile (MFO), questa consente di descrivere parole su un alfabeto
Dove il dominio delle variabili è un sottoinsieme finito di
Dati
La MFO permette di descrivere la categoria di linguaggi star-free.
Definiamo alcune relazioni:
Definiamo inoltre:
Da qui possiamo definire le seguenti abbreviazioni:
Si ha che
Definiamo il linguaggio definito da una formula come:
I linguaggi esprimibili con MFO sono chiusi per unione, intersezione e complemento, tuttavia sono strettamente meno potenti degli FSA, poiché non sono chiusi rispetto alla
La logica monadica del secondo ordine (MSO) permette di quantificare predicati del primo ordine, e quindi ammettiamo formule come
L'assegnamento di variabili del secondo ordine (insieme
Definiamo le seguenti formule utili:
Data una MSO
Per convertire da FSA a MSO seguo il seguente approccio:
La logica può essere usata come specifica per algoritmi, come algoritmo di ricerca e ordinamento. In generale sono presenti delle precondizioni (insieme di condizioni che devono essere vere prima dell'esecuzione di un programma