编程中任何形式的递归或迭代实际上都是一个固定点。例如,while循环的方程式为
while b do c done ≡ if b then (c ; while b do c done)
这是说,while b do c done是一个解决方案W的方程的
W ≡ Φ(W)
在哪里Φ(x) ≡ if b then (c ; x)。但是,如果Φ有很多固定点怎么办?哪一个对应于while循环?编程语义学的基本见解之一是它是最不固定的点。
让我们举一个简单的例子,这次是递归。我将使用Haskell。递归函数f定义为
f :: a -> a
f x = f x
是无处不在的函数,因为它永远运行。我们可以用一种更不寻常的方式来重写该定义(但它仍然可以在Haskell中使用):
f :: a -> a
f = f
所以f是身份功能的固定点:
f ≡ id f
但是每个功能都是的固定点id。在通常的域理论顺序下,“未定义”是最小的元素。实际上,我们的功能f是无处不在的功能。
whilenx1,…,xnVVn→Vn∪{⊥}(v1,…,vn)∈Vn⊥VnVn→Vn∪{⊥}
- Vn∪{⊥}⊥VnVn→Vn∪{⊥}
- ⊥
while true do skip done
- 每个递增的序列都有一个极值
只是为了让您了解它的工作原理,程序的语义
x_1 := e
(v1,…,vn)∈Vnvee(v1,…,vn)(ve,v2,…,vn)