Cualquier forma de recursión o iteración en la programación es en realidad un punto fijo. Por ejemplo, un while
bucle se caracteriza por la ecuación
while b do c done ≡ if b then (c ; while b do c done)
lo que quiere decir que while b do c done
es una solución W
de la ecuación
W ≡ Φ(W)
donde Φ(x) ≡ if b then (c ; x)
. Pero, ¿y si Φ
tiene muchos puntos fijos? ¿Cuál corresponde al while
bucle? Una de las ideas básicas de la semántica de programación es que es el punto menos fijo.
Tomemos un ejemplo simple, esta vez recurrencia. Usaré Haskell. La función recursiva f
definida por
f :: a -> a
f x = f x
es la función indefinida en todas partes, porque solo se ejecuta para siempre. Podemos reescribir esta definición de una manera más inusual (pero aún funciona en Haskell) como
f :: a -> a
f = f
Entonces, f
es un punto fijo de la función de identidad:
f ≡ id f
Pero cada función es un punto fijo de id
. Bajo el ordenamiento teórico de dominio habitual, "indefinido" es el elemento mínimo. Y de hecho, nuestra función f
es la función indefinida en todas partes.
Agregado a pedido: en los comentarios, OP preguntó sobre el orden parcial de los while
bucles semánticos (suponía que era una red, pero no es necesario que lo sea). Una pregunta más general es cuál es la interpretación teórica de dominio de un lenguaje de procedimiento que puede manipular variables y tiene las estructuras de control básicas (condicionales y bucles). Hay varias formas de hacer esto, dependiendo de qué es exactamente lo que desea capturar, pero para simplificar las cosas, supongamos que tenemos un número fijo de variables globalesnx1,…,xnque el programa puede leer y actualizar, y nada más (sin E / S ni excepciones, o asignación de nuevas variables). En ese caso, un programa puede verse como una transformación del estado inicial de las variables al estado final, o el valor indefinido si el programa realiza un ciclo. Entonces, si cada variable contiene un elemento de un conjunto , un programa corresponderá a un mapeo : para cada configuración inicial de las variables, el programa divergerá y producirá , o terminará y producirá el estado final, que es un elemento de . El conjunto de todos los mapas es un dominio:VVn→Vn∪{⊥}(v1,…,vn)∈Vn⊥VnVn→Vn∪{⊥}
- usamos el orden plano en que tiene en la parte inferior y todos los elementos de "plano" encima, y luego se ordena puntualmente,Vn∪{⊥}⊥VnVn→Vn∪{⊥}
- el elemento mínimo es la función que siempre se asigna a , correspondiente al programa (y muchos otros),⊥
while true do skip done
- cada secuencia creciente tiene un supremum
Solo para darle una idea de cómo funciona esto, la semántica del programa
x_1 := e
sería la función que toma como entrada , calcula el valor de la expresión en estado y devuelve .v e ( v 1 , … , v n ) ( v e , v 2 , … , v n )(v1,…,vn)∈Vnvee
(v1,…,vn)(ve,v2,…,vn)