Órdenes parciales y retículos
Los conjuntos parcialmente ordenados y los retículos completos juegan un papel central en el análisis de programas. El capítulo «5» presentó lo imprescindible bajo la hipótesis de altura finita; este apéndice recoge el tratamiento general, sin esa hipótesis, junto con los resultados sobre condiciones de cadena y puntos fijos que los capítulos «8» y «21» utilizan.
A.1 Definiciones básicas
Un orden parcial es una relación ⊑ : L × L → {true, false} que es reflexiva (∀l : l ⊑ l), transitiva (∀l₁,l₂,l₃ : l₁ ⊑ l₂ ∧ l₂ ⊑ l₃ ⟹ l₁ ⊑ l₃) y antisimétrica (∀l₁,l₂ : l₁ ⊑ l₂ ∧ l₂ ⊑ l₁ ⟹ l₁ = l₂). Un conjunto parcialmente ordenado (L, ⊑) es un conjunto L dotado de un orden parcial. Escribiremos l₂ ⊒ l₁ por l₁ ⊑ l₂.
Sea Y ⊆ L. Un elemento l ∈ L es cota superior de Y si ∀l' ∈ Y : l' ⊑ l, y cota inferior si ∀l' ∈ Y : l ⊑ l'. Una menor cota superior —o supremo— l de Y es una cota superior tal que l ⊑ l₀ para cualquier otra cota superior l₀ de Y; dualmente se define la mayor cota inferior o ínfimo.
Un subconjunto Y de un conjunto parcialmente ordenado L no tiene por qué tener cotas superiores ni inferiores, y aunque las tenga no tiene por qué haber una menor ni una mayor. Pero si existen, son únicas, y se denotan ⊔Y y ⊓Y respectivamente. A ⊔ se le llama operador de unión (join) y a ⊓ operador de intersección (meet); para dos elementos se escribe l₁ ⊔ l₂ y l₁ ⊓ l₂.
Un retículo completo es un conjunto parcialmente ordenado L = (L, ⊑) en el que todos los subconjuntos tienen supremo e ínfimo. Se escribe entonces L = (L, ⊑, ⊔, ⊓, ⊥, ⊤), con
el elemento mínimo y el máximo, respectivamente.
Ejemplo. Si L = (℘(S), ⊆) para un conjunto S, entonces ⊑ es ⊆, ⊔Y es ⋃Y, ⊓Y es ⋂Y, ⊥ = ∅ y ⊤ = S. Si en cambio L = (℘(S), ⊇), entonces ⊑ es ⊇, ⊔Y es ⋂Y, ⊓Y es ⋃Y, ⊥ = S y ⊤ = ∅. Ambos son retículos completos, y la dualidad entre ellos es la que subyace a la distinción may/must del capítulo «6».
(a) (P(S), subset) (b) (P(S), superset)
{1,2,3} {}
/ | \ / | \
{1,2} {1,3} {2,3} {1} {2} {3}
| X | X | | X | X |
{1} {2} {3} {1,2} {1,3} {2,3}
\ | / \ | /
{} {1,2,3}
A.2 Familias de Moore
Una familia de Moore (Moore family) es un subconjunto Y de un retículo completo L que es cerrado bajo ínfimos:
De la definición se sigue que una familia de Moore siempre tiene elemento mínimo, ⊓Y, y elemento máximo, ⊓∅, que coincide con el ⊤ de L. En particular, una familia de Moore nunca es vacía.
Ejemplo. Sobre (℘({1,2,3}), ⊆), los conjuntos {{2},{1,2},{2,3},{1,2,3}} y {∅, {1,2,3}} son familias de Moore, mientras que {{1},{2}} y {∅,{1},{2},{1,2}} no lo son.
Las familias de Moore aparecen en el capítulo «21»: el conjunto de elementos abstractos que son imagen de una concretización, γ(L₂) ⊆ L₁, es siempre una familia de Moore cuando (α, γ) es una conexión de Galois. Recíprocamente, toda familia de Moore induce una conexión de Galois. Es la caracterización más limpia de qué subconjuntos del dominio concreto pueden servir como dominio abstracto.
A.3 Propiedades de las funciones
Sea f : L₁ → L₂ una función entre conjuntos parcialmente ordenados L₁ = (L₁, ⊑₁) y L₂ = (L₂, ⊑₂).
fes sobreyectiva (surjective, o epic) si∀l₂ ∈ L₂ ∃l₁ ∈ L₁ : f(l₁) = l₂.fes inyectiva (injective, o monic) si∀l, l' ∈ L₁ : f(l) = f(l') ⟹ l = l'.fes monótona (monotone, isotone, order-preserving) si∀l, l' ∈ L₁ : l ⊑₁ l' ⟹ f(l) ⊑₂ f(l').fes aditiva (additive, join morphism, a veces distributiva) si∀l₁, l₂ ∈ L₁ : f(l₁ ⊔₁ l₂) = f(l₁) ⊔₂ f(l₂).fes multiplicativa (multiplicative, meet morphism) si∀l₁, l₂ ∈ L₁ : f(l₁ ⊓₁ l₂) = f(l₁) ⊓₂ f(l₂).fes completamente aditiva (complete join morphism) sif(⊔₁Y) = ⊔₂{f(l') : l' ∈ Y}siempre que⊔₁Yexista; y completamente multiplicativa (complete meet morphism) dualmente.fes estricta (strict) sif(⊥₁) = ⊥₂.fes afín (affine) sif(⊔₁Y) = ⊔₂{f(l') : l' ∈ Y}siempre que⊔₁Yexista yY ≠ ∅.
Obsérvese la relación entre las tres últimas: una función es completamente aditiva si y sólo si es afín y estricta. La distinción importa: en el análisis de flujo de datos las funciones de transferencia gen/kill son afines pero no siempre estrictas, y la diferencia es exactamente el conjunto gen.
Cuando ⊔₁Y y ⊔₂Y existen siempre —es decir, cuando L₁ y L₂ son retículos completos— las definiciones anteriores requieren también que existan los ínfimos correspondientes, cosa que el lema de la «sección A.1 · Definiciones básicas» garantiza.
A.4 Construcción de retículos completos
Los retículos completos se combinan para construir otros nuevos. Además de los constructores del capítulo «5», conviene conocer los siguientes.
Producto cartesiano. Dados L₁ = (L₁, ⊑₁) y L₂ = (L₂, ⊑₂), se define L = (L, ⊑) con L = {(l₁, l₂) : l₁ ∈ L₁, l₂ ∈ L₂} y
Si L₁ y L₂ son retículos completos, L también lo es, con supremos e ínfimos calculados componente a componente.
Producto aplastado (smash product). Variante del anterior en la que se exige que todas las parejas (l₁, l₂) cumplan l₁ = ⊥₁ ⟺ l₂ = ⊥₂. Es decir, se identifican todas las parejas en las que alguna componente es ⊥ con un único ⊥ global. Es el constructor adecuado cuando ⊥ significa «inalcanzable»: si un componente es inalcanzable, todo lo es.
Espacio de funciones totales. Sea L₁ un conjunto parcialmente ordenado y S un conjunto. Se define
Es el retículo de aplicaciones del capítulo «5». Si L₁ es completo, L también, con ⊔Y = λs. ⊔₁{f(s) : f ∈ Y} y análogamente para ⊓.
Espacio de funciones monótonas. Sean L₁ y L₂ conjuntos parcialmente ordenados. Se define
También es un retículo completo si L₂ lo es. Este constructor es el que da sentido al enfoque funcional de la sensibilidad al contexto del capítulo «10»: los resúmenes de función son elementos de un espacio de funciones monótonas.
Obsérvese que el producto aplastado no preserva la condición de cadena ascendente en general, mientras que los otros tres constructores sí preservan la finitud, las condiciones de cadena y la altura.
A.5 Cadenas y condiciones de cadena
Un subconjunto Y ⊆ L es una cadena (chain) si
es decir, si está totalmente ordenado. Es una cadena finita si además es finito.
Una sucesión (lₙ)ₙ es una cadena ascendente si n ≤ m ⟹ lₙ ⊑ lm, y descendente si n ≤ m ⟹ lm ⊑ lₙ. Una sucesión se estabiliza eventualmente (eventually stabilises) si
Lsatisface la condición de cadena ascendente (Ascending Chain Condition, ACC) si todas sus cadenas ascendentes se estabilizan eventualmente.Lsatisface la condición de cadena descendente (DCC) si lo hacen las descendentes.Ltiene altura finita si todas sus cadenas son finitas; tiene altura a lo sumohsi todas contienen a lo sumoh+1elementos.
A.6 Puntos fijos
Sea f : L → L una función monótona sobre un retículo completo L.
- Un punto fijo de
fes unlconf(l) = l. El conjunto de puntos fijos se denotaFix(f) = {l : f(l) = l}. fes reductiva enlsif(l) ⊑ l; el conjunto de tales elementos se denotaRed(f) = {l : f(l) ⊑ l}. Se dice quefes reductiva siRed(f) = L.fes extensiva enlsif(l) ⊒ l; se escribeExt(f) = {l : f(l) ⊒ l}. Se dice quefes extensiva siExt(f) = L.
Como L es un retículo completo, Fix(f) tiene ínfimo y supremo, que se denotan
La situación general se resume en el siguiente diagrama, donde todas las desigualdades pueden ser estrictas:
T
|
f^n(T) conjunto Red(f)
|
meet_n f^n(T)
|
gfp(f) ---------- conjunto Fix(f)
|
lfp(f)
|
join_n f^n(_|_)
|
f^n(_|_) conjunto Ext(f)
|
_|_
_|_ <= f^n(_|_) <= join_n f^n(_|_) <= lfp(f)
<= gfp(f) <= meet_n f^n(T) <= f^n(T) <= T
En semántica denotacional es habitual iterar hasta el menor punto fijo tomando el supremo de la sucesión (fn(⊥))ₙ. Pero eso requiere una hipótesis de continuidad —f(⊔ₙ lₙ) = ⊔ₙ f(lₙ) para cadenas ascendentes— que aquí no se ha impuesto, así que en general la iteración no alcanza el punto fijo.
A.7 Notas
El capítulo «5» sigue este mismo material bajo la hipótesis de altura finita, que basta para casi todo lo que se hace con él.
Las referencias históricas son Knaster (1928) y Tarski (1955) para el teorema del punto fijo, y Kleene (1952) para la versión iterativa. Para un tratamiento completo de la teoría de órdenes conviene acudir a un texto especializado.