Qualsiasi forma di ricorsione o iterazione nella programmazione è in realtà un punto fisso. Ad esempio, un while
ciclo è caratterizzato dall'equazione
while b do c done ≡ if b then (c ; while b do c done)
vale a dire che while b do c done
è una soluzione W
dell'equazione
W ≡ Φ(W)
dove Φ(x) ≡ if b then (c ; x)
. Ma cosa succede se Φ
ha molti punti fissi? Quale corrisponde al while
loop? Una delle intuizioni di base della semantica di programmazione è che è il punto meno fisso.
Facciamo un semplice esempio, questa volta ricorsione. Userò Haskell. La funzione ricorsiva f
definita da
f :: a -> a
f x = f x
è la funzione ovunque indefinita, perché funziona solo per sempre. Possiamo riscrivere questa definizione in un modo più insolito (ma funziona ancora in Haskell) come
f :: a -> a
f = f
Quindi f
è un punto fisso della funzione identità:
f ≡ id f
Ma ogni funzione è un punto fisso di id
. Sotto il solito ordinamento teorico-dominio, "non definito" è il minimo elemento. E in effetti, la nostra funzione f
è la funzione ovunque indefinita.
Aggiunto su richiesta: nei commenti OP ha chiesto l'ordine parziale per i while
cicli semantici (hai presunto che fosse un reticolo ma non è necessario). Una domanda più generale è qual è l'interpretazione teorica del dominio di un linguaggio procedurale che può manipolare le variabili e che ha le strutture di controllo di base (condizionali e loop). Esistono diversi modi per farlo, a seconda di cosa esattamente vuoi catturare, ma per mantenere le cose semplici, supponiamo che abbiamo un numero fisso di variabili globalinx1,…,xnche il programma può leggere e aggiornare e nient'altro (nessun I / O o eccezioni o allocazione di nuove variabili). In tal caso, un programma può essere visto come una trasformazione dello stato iniziale delle variabili allo stato finale o come valore indefinito se il programma scorre ciclicamente. Quindi, se ogni variabile contiene un elemento di un set , un programma corrisponderà a una mappatura da : per ogni configurazione iniziale delle variabili, il programma divergerà e produrrà , oppure terminerà e produrrà lo stato finale, che è un elemento di . L'insieme di tutte le mappe da è un dominio:VVn→Vn∪{⊥}(v1,…,vn)∈Vn⊥VnVn→Vn∪{⊥}
- usiamo l'ordinamento flat su che ha in basso e tutti gli elementi di "flat" sopra di esso, e quindi è ordinato in modo puntuale,Vn∪{⊥}⊥VnVn→Vn∪{⊥}
- il minimo elemento è la funzione che si associa sempre a , corrispondente al programma (e molti altri),⊥
while true do skip done
- ogni sequenza crescente ha un supremum
Solo per darti un'idea di come funziona, la semantica del programma
x_1 := e
sarebbe la funzione che assume come input , calcola il valore dell'espressione nello stato e restituisce .v e ( v 1 , … , v n ) ( v e , v 2 , … , v n )(v1,…,vn)∈Vnvee
(v1,…,vn)(ve,v2,…,vn)