In primo luogo, per dissipare una possibile dissonanza cognitiva: il ragionamento su strutture infinite non è un problema, lo facciamo sempre. Finché la struttura è finitamente descrivibile, non è un problema. Ecco alcuni tipi comuni di strutture infinite:
- lingue (serie di stringhe sopra un po 'di alfabeto, che può essere finito);
- lingue degli alberi (gruppi di alberi sopra un po 'di alfabeto);
- tracce di esecuzione di un sistema non deterministico;
- numeri reali;
- insiemi di numeri interi;
- insiemi di funzioni da numeri interi a numeri interi; ...
Coinduttività come il più grande punto fisso
Laddove le definizioni induttive costruiscono una struttura a partire da blocchi elementari, le definizioni coinduttive modellano le strutture da come possono essere decostruite. Ad esempio, il tipo di elenchi i cui elementi sono in un set A
è definito come segue in Coq:
Inductive list (A:Set) : Set :=
| nil : list A
| cons : A -> list A -> list A.
Informalmente, il list
tipo è il tipo più piccolo che contiene tutti i valori dai costruttori nil
e cons
, con l'assioma che . Al contrario, possiamo definire il tipo più grande che contiene tutti i valori costruiti da questi costruttori, mantenendo l'assioma della discriminazione:∀xy,nil≠consxy
CoInductive colist (A:Set) : Set :=
| conil : colist A
| cocons : A -> colist A -> colist A.
list
è isomorfo in un sottoinsieme di colist
. Inoltre, colist
contiene elenchi infiniti: elenchi con cocons
su cocons
.
CoFixpoint flipflop : colist ℕ := cocons 1 (cocons 2 flipflop).
CoFixpoint from (n:ℕ) : colist ℕ := cocons n (from (1 + n)).
flipflop
è l'infinito (elenco circolare) ; è l'elenco infinito di numeri naturali .1::2::1::2::…from 0
0::1::2::…
Una definizione ricorsiva è ben formata se il risultato è costruito da blocchi più piccoli: le chiamate ricorsive devono funzionare su input più piccoli. Una definizione corecursive è ben formata se il risultato crea oggetti più grandi. L'induzione guarda ai costruttori, la coinduzione guarda ai distruttori. Nota come la dualità non solo cambi da più piccola a più grande, ma anche input per output. Ad esempio, il motivo per cui le definizioni flipflop
e from
sopra sono ben formate è che la chiamata corecursive è protetta da una chiamata al cocons
costruttore in entrambi i casi.
Laddove le dichiarazioni sugli oggetti induttivi hanno prove induttive, le dichiarazioni sugli oggetti induttivi hanno prove induttive. Ad esempio, definiamo il predicato infinito sui colisti; intuitivamente, le infinite coliste sono quelle che non finiscono conil
.
CoInductive Infinite A : colist A -> Prop :=
| Inf : forall x l, Infinite l -> Infinite (cocons x l).
Per dimostrare che le coliste della forma from n
sono infinite, possiamo ragionare per coinduzione. from n
è uguale a cocons n (from (1 + n))
. Ciò dimostra che from n
è più grande di from (1 + n)
, che è infinito dall'ipotesi della coinduzione, quindi from n
è infinito.
Bisimilarità, una proprietà coinduttiva
La coinduzione come tecnica di prova si applica anche agli oggetti finitari. In termini intuitivi, le prove induttive su un oggetto si basano su come l'oggetto è costruito. Le prove coinduttive si basano su come l'oggetto può essere decomposto.
Quando si studiano i sistemi deterministici, è comune definire l'equivalenza attraverso regole induttive: due sistemi sono equivalenti se si può ottenere l'uno dall'altro mediante una serie di trasformazioni. Tali definizioni tendono a non riuscire a cogliere i diversi modi in cui i sistemi non deterministici possono finire per avere lo stesso comportamento (osservabile) nonostante abbiano una struttura interna diversa. (La coinduzione è anche utile per descrivere i sistemi non terminanti, anche quando sono deterministici, ma questo non è ciò su cui mi concentrerò qui.)
I sistemi non deterministici come i sistemi concorrenti sono spesso modellati da sistemi di transizione etichettati . Un LTS è un grafico diretto in cui i bordi sono etichettati. Ogni fronte rappresenta una possibile transizione del sistema. Una traccia di un LTS è la sequenza delle etichette dei bordi su un percorso nel grafico.
Due LTS possono comportarsi in modo identico, in quanto hanno le stesse possibili tracce, anche se la loro struttura interna è diversa. L'isomorfismo grafico è troppo forte per definirne l'equivalenza. Invece, si dice che un LTS simuli un altro LTS se ogni transizione del secondo LTS ammette una transizione corrispondente nella prima. Formalmente, sia l'unione disgiunta degli stati dei due LTS, l'insieme (comune) di etichette e la relazione di transizione. La relazione è una simulazione if
ABSL→R⊆S×S
∀(p,q)∈R, if p→αp′ then ∃q′,q→αq′ and (p′,q′)∈R
A simula se esiste una simulazione in cui tutti gli stati di sono correlati a uno stato in . Se è una simulazione in entrambe le direzioni, si chiama bisimulazione . La simulazione è una proprietà coinduttiva: qualsiasi osservazione da una parte deve avere una corrispondenza dall'altra parte.BBAR
Ci sono potenzialmente molte bisimulazioni in un LTS. Bisimulazioni diverse potrebbero identificare stati diversi. Date due bisimulazioni e , la relazione data prendendo l'unione dei grafici di relazione è essa stessa una bisimulazione, poiché gli stati correlati generano stati correlati per entrambe le relazioni. (Ciò vale anche per le unioni infinite. La relazione vuota è una bisimulazione continua, così come la relazione di identità.) In particolare, l'unione di tutte le bisimulazioni è essa stessa una bisimulazione, chiamata bisimilarità. La bisimilarità è il modo più grossolano di osservare un sistema che non distingue tra stati distinti.R1R2R1∪R2
La bisimilarità è una proprietà coinduttiva. Può essere definito come il più grande punto fisso di un operatore: è la più grande relazione che, se estesa per identificare stati equivalenti, rimane la stessa.
Riferimenti