3.3. Thuật toán sinh hệ ràng buộc Coerce và thuật toán giải hệ ràng buộc
3.3.6. Thuật toán Coerce xác định hệ ràng buộc
Ràng buộc có tác dụng trong việc cải thiện độ chính xác của phân tích. Ràng buộc (cịn gọi là quy tắc phi mâu thuẫn) là bất biến tồn cục trong
chương trình. Ví dụ, các ràng buộc trạng thái nếu nút u không được chia sẻ bởi trường n (is[n]S(u)=0) và khơng có một đường đi tới thơng qua trường n. Vì vậy, nếu có tồn tại u1≠u2 như vậy thì nS(u1, u) = nS(u2, u) = 1 là cấu trúc
không đại diện cho bất kỳ cấu trúc cụ thể hợp lệ và có thể được loại bỏ.
∃ 1: (¬ [ ]( ) ∧ ( 1, ) ∧ 1 ≠ 2) ⊳ ¬ ( 2, )
Tương tự như vậy, nếu có tồn tại u1≠u2 sao cho n(u1, u)=1 và n(u2, u)=1/2, chúng ta có thể từng bước điều chỉnh n để n(u2, u) = 0. Ví dụ, trong hình 3.8, chúng ta sử dụng ràng buộc này trên cấu trúc So1 để loại bỏ vịng lặp
vơ hạn trên chính u, và trên So2 để loại bỏ các vịng lặp vơ hạn trên chính u.1 và cạnh vơ hạn từ u.0 tới u.1.
Nói chung một ràng buộc được đưa ra với hình thức ⊳ , khi mà là một ký hiệu; gọi là thân của ràng buộc và được gọi là đầu của các
ràng buộc. Với một ràng buộc như vậy là hợp lý trên một cấu trúc S nếu cho
từng phép gán mà phần thân ( ) được đánh giá là 1 (không phải là 1/2), phần đầu cũng phải đánh giá là 1, ký hiệu: ⊨ 1 ⊳ 2. Ta nói rằng ràng buộc là
Định nghĩa 3.4: Cho cấu trúc S và một tập các ràng buộc XF, các thực thi
Coerce(S, XF) trả về cực đại S’, vì vậy ⊑ , = , và S’ không vi phạm
bất cứ ràng buộc trong XF. Coerce là không xác định nếu không tồn tại S’.
Định nghĩa 3.5: Đối với một mệnh đề Horn mở rộng φ, chúng ta xác định bao đóng của φ, biểu điễn bằng closure(φ) là tập các ràng buộc:
Bảng các ràng buộc sinh ra từ thuộc tính hàm thể hiện trong hình 3.7.
Đối với một vị từ đo p được định nghĩa bởi công thức φ các ràng buộc
sau đây được tạo ra: (i) ⊳ , (ii) ¬ ⊳ ¬ , và (iii) bao đóng của → , và
¬ → ¬ .
Hệ thống TVLA sử dụng một tinh chỉnh thứ tự của ràng buộc cho phép chúng ta có nhiều trường hợp để tính tốn Coerce bằng cách qua các ràng buộc
trên. Một ràng buộc c2 phụ thuộc vào ràng buộc c1 nếu trong khi Coerce sửa chữa c1 trên một cấu trúc mà bước đầu đáp ứng c2 có thể gây ra một vi phạm của c2.
Định nghĩa 3.6: Nếu tồn tại một cấu trúc S sao cho ⊨ 2 và
( , 1) ⊭ 2 thì ta nói rằng c2 phụ thuộc vào c1.
Chúng ta định nghĩa một đồ thị phụ thuộc bắt đầu giữa các ràng buộc, khi có một cạnh hướng từ ≡ ⊳ ( , . . . , ) đến ≡ ⊳ nếu vị
từ ( , . . . , ) xuất hiện ở dạng DNF của l2. Nó khơng khó để thấy rằng
nếu khơng có cạnh từ c1 đến c2 sau đó c2 khơng phụ thuộc vào c1. [13]
Bảng các ràng buộc được sinh ra từ các vị từ đo thể hiện trong hình 3.7 Bổ đề: Đối với một cấu trúc S sao cho