编程中任何形式的递归或迭代实际上都是一个固定点。例如,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
是无处不在的功能。
while
nx1,…,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)