Bất kỳ hình thức đệ quy hoặc lặp trong lập trình thực sự là một điểm cố định. Ví dụ, một while
vòng lặp được đặc trưng bởi phương trình
while b do c done ≡ if b then (c ; while b do c done)
đó là để nói rằng đó while b do c done
là một giải pháp W
của phương trình
W ≡ Φ(W)
nơi Φ(x) ≡ if b then (c ; x)
. Nhưng nếu Φ
có nhiều điểm cố định thì sao? Cái nào tương ứng với while
vòng lặp? Một trong những hiểu biết cơ bản của ngữ nghĩa lập trình là nó là điểm cố định ít nhất .
Hãy để chúng tôi lấy một ví dụ đơn giản, lần này đệ quy. Tôi sẽ sử dụng Haskell. Hàm đệ quy f
được xác định bởi
f :: a -> a
f x = f x
là chức năng không xác định ở mọi nơi, bởi vì nó chỉ chạy mãi mãi. Chúng ta có thể viết lại định nghĩa này theo một cách khác thường hơn (nhưng nó vẫn hoạt động trong Haskell) như
f :: a -> a
f = f
Vì vậy, f
một điểm cố định của chức năng nhận dạng:
f ≡ id f
Nhưng mỗi chức năng là một điểm cố định id
. Theo thứ tự lý thuyết miền thông thường, "không xác định" là yếu tố ít nhất. Và thực sự, chức năng của chúng tôi f
là chức năng không xác định ở mọi nơi.
Đã thêm theo yêu cầu: trong các bình luận OP đã hỏi về thứ tự từng phần cho while
các vòng lặp ngữ nghĩa (bạn cho rằng đó là một mạng nhưng không cần thiết). Một câu hỏi chung hơn là giải thích lý thuyết miền của ngôn ngữ thủ tục có thể thao túng các biến và có các cấu trúc điều khiển cơ bản (điều kiện và vòng lặp). Có một số cách để thực hiện việc này, tùy thuộc vào chính xác những gì bạn muốn chụp, nhưng để đơn giản, hãy giả sử rằng chúng tôi có một số cố định của các biến toàn cầunx1,…,xnrằng chương trình có thể đọc và cập nhật, và không có gì khác (không có I / O hoặc ngoại lệ, hoặc phân bổ các biến mới). Trong trường hợp đó, một chương trình có thể được xem như là một phép biến đổi trạng thái ban đầu của các biến thành trạng thái cuối cùng hoặc giá trị không xác định nếu chương trình quay vòng. Vì vậy, nếu mỗi biến chứa một phần tử của tập , chương trình sẽ tương ứng với ánh xạ : cho mọi cấu hình ban đầu của các biến, chương trình sẽ phân kỳ và mang lại , hoặc nó sẽ chấm dứt và tạo ra trạng thái cuối cùng, là một thành phần của . Tập hợp tất cả các bản đồ là một miền:VVn→Vn∪{⊥}(v1,…,vn)∈Vn⊥VnVn→Vn∪{⊥}
- chúng tôi sử dụng thứ tự phẳng trên có ở dưới cùng và tất cả các yếu tố của "phẳng" phía trên nó, rồi được sắp xếp theo thứ tự,Vn∪{⊥}⊥VnVn→Vn∪{⊥}
- phần tử nhỏ nhất là hàm luôn ánh xạ tới , tương ứng với chương trình (và nhiều phần tử khác),⊥
while true do skip done
- mỗi chuỗi tăng có một tối cao
Chỉ để cung cấp cho bạn một ý tưởng về cách thức này hoạt động, ngữ nghĩa của chương trình
x_1 := e
sẽ là hàm lấy đầu vào , tính giá trị của biểu thức ở trạng thái và trả về .v e ( v 1 , ... , v n ) ( v e , v 2 , ... , v n )(v1,…,vn)∈Vnvee
(v1,…,vn)(ve,v2,…,vn)