Quy tắc Matching up Heap Node

Một phần của tài liệu Nghiên cứu về separation logic và ứng dụng vào hệ thống kiểm định tự động (Trang 55)

Quy tắc Matching-up Heap Node[ENT−MATCH] là dạng chứng minh có

công thức như sau:

kiểm tra xem và có cùng tên hay

không, điều này có nghĩa rằng chúng xuất phát từ cùng một loại, có thể là cùng vị từ hoặc có các thành phần là hoàn toàn giống nhau, quá trình đồng nhất hai công thức

Heap này được thực hiện bởi việc áp dụng thay thế trong Consequence.

Khi xuất hiện một Matching thì một tham số trong công thức Consequence

sẽ bị loại bỏ, thủ tục suy diễn sẽ thực hiện việc ghi lại tham số này vào biến tương ứng trong attendance, và tiếp tục thực hiện tới tham số tiếp theo trong attendance. 2.5.2 Quy tắc Unfold vị từ Shape trong Atendence

Quy tắc Unfoldcó công thức như sau:

Để minh họa cho quy tắc này, xem xét ví dụ kiểm tra suy diễn (entailment checking) sau đây:

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang56

Trong đó S là tập các trạng thái dư thừa, vị từ x::ll3(n, Bi) trong Antecedent

(vế trái)x::node(r, y)trong Consequent (vế phải)có quan hệ Matching thông qua

biến x.Vì quá trình suy diễn là thành công, đầu tiên thực hiện Unfold vị từ ll3(n, B) của Antecedent ta được:

Sau khi loại bỏ các lượng từ tồn tại, công thức được viết lại:

Thực hiện quy tắc Matched up công thức consequent ta có:

Do các công thức Separation đều thỏa mãn điều kiện well-founded, nên thao

tác Unfolding thực hiện việc tách Node thỏa mãn match up với Node trong consequent,sau đó công thức consequent sẽ bị thu gọn lại vởi việc loại bỏ tham số, quá trình này giúp cho chứng minh entailment có điểm dừng.

2.5.3 Quy tắc Fold vị từ Shape trong Consequence Định nghĩa về quy tắc Fold được đưa ra như sau: Định nghĩa về quy tắc Fold được đưa ra như sau:

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang57

Để minh họa quy tắc này, xem xét ví dụ sau:

Mối quan hệ giữa dữ liệu Node x::node(1, q) trong antecedent với vị từx::ll3(n, B)trong consequent thông qua biến x,trong ví dụ này đầu tiên sẽ thực hiện áp dụng quy tắc foldingtrongantecedent với vị từ Shape trong consequent. Sau đó, áp dụng quy tắc matching up thực hiện thao tác matching vị từ mới trong antecedent với vị từ trong consequent.

Quá trình fold có thể thực hiện đệ quy nhưng phải đảm bảo tính dừng cho những vị từ well-founded, quá trình này sẽ loại bỏ Node trong antecedent mỗi khi thủ tục đệ quy được gọi và quá trình này có điểm dừng. Quay trở lại ví dụ trên, ta có thể viết:

Trong đó n1, n2, B1, B2 là những biến được sử dụng trong quá trình fold, những biến này sau đó sẽ bị loại bỏ.Thao tác fold sẽ cho kết quả:

Từ ví dụ trên, dễ dàng nhận thấy rằngảnh hưởng thao tác fold và unfold gần như là tương tự nhau đối với vị từ trong consequent.

2.6 Tính đúng đắn của quy tắc suy diễn

Trong phần này, luận văn sẽ trình bày về tính đúng đắn cho các quy tắc Forward Verification và quy tắc kiểm tra suy diễn Entailment Checking.

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang58

2.6.1 Mô hình ngữ nghĩa

Ngữ nghĩa của các công thức Separation Heap được trình bày tương tự như ngữ nghĩa của lý thuyết Separation Logic, tuy nhiên có một sự mở rộng trong việc sử dụng vị từ Shape User-defined.

Để định nghĩa mô hình ngữ nghĩa, sử dụng các ký hiệu sau đây:

# Ký hiệu Ý nghĩa

1 Loc Tập địa chỉ, có giá trị dương.

2 Val Tập giá trị, với thể hiện giá trị null.

3 Var Tập biến bao gồm biến chương trình và các biến logic.

4 ObjVal

Tập giá trị của đối tượng được lưu trữ trong Heap.

Trong đó thể hiện giá trị của đối

tượng có kiểu dữ liệu là c và giá trị hiện tại của các

trường tương ứng là .

5

Thể hiện cho mô hình quan hệ, Stack s và Heap h thỏa

mãn điều kiện ràng buộc

Bảng4 - Ký hiệu định nghĩa mô hình Định nghĩa miền qua hệ giữa các đối tượng như sau:

Từ công thức trên có thể thấy rằng, mỗi một Heap thể hiện một phần ánh xạ hữu hạn, trong khi đó Stack thể hiện tổng số ánh xạ, điều này tương tự như lý thuyết

Separation Logic thuần túy.Hàm trả lại kết quả là miền giá trị của hàm

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang59

ánh xạ với con trỏ, còn trong lý thuyết đặc tả đã trình bày thì nó thể hiện cho dạng

thức .Mô hình quan hệ của các công thức Separation Heap được định nghĩa

như sau:

Bảng sau đây giải thích ý nghĩa của các ký hiệu ngữ nghĩa:

# Ký hiệu Ý nghĩa

1 Quan hệthể hiện rằng công thức thuần túy là luôn

đúng trong s

2 Ký hiệuthể hiện miền của , là tách biệt hay

3

Ký hiệu này thể hiện hai ý nghĩa:

- Nếu c là một dữ liệu Node được định nghĩa trong chương trình, thì h thể hiện cho mộ Heap đơn. -Nếu c là một vị từ Shape được định nghĩa trong chương trình, thì c có thể được định nghĩa đệ quy.

Ngữ nghĩa của nó thể hiện rằng có ít nhất một bộ (s, h) thỏa mãn vị từ định nghĩa.

Bảng5 -Ký hiệu ngữ nghĩa 2.6.2 Tính đúng đắn của quy tắc Verification

Tính đúng đắn của quy tắc Verification được trình bày thông qua tính đúng đắn của từng bước nhỏ khi áp dụng các quy tắc Verification, định nghĩa một trạng

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang60

Heap h, thì một bước nào đó đã được thực hiện để giảm e thành đồng thời tạo ra

một Stack mới và Heap mới . Sử dụng ký hiệu để thể hiện cho tập các

biến đổi con của các quan hệ biến đổi .

Với một ràng buộc thì Post( ) ghi lại quan hệ giữacác biến thay đổi trong

được định nghĩa như sau:

Trong đó V thể hiện tập các biến chưa thay đổi trong , minh họa bằng ví dụ sau:

Phần tiếp theo trình bày 3 định lý áp dụng cho tính đúng đắn của quy tắc Verification.

Định lý 1 (Preservation)

Nếu tồn tại quan hệ thỏa

mãn thì

(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) Định lý 2 (Progress)

Nếu tồn tại quan hệ thì e là một giá trị đồng thời tồn tại thỏa mãn

(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) Định lý 3 (Safety)

Giả sử không gian của Stack và Heap là không giới hạn và có quan hệ⊢ {true} e

{∆} khi đó biến đổi dừngvới giá trị v trong hậu điều kiện ∆ hoặc

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang61

(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) 2.6.3Tính đúng đắn của quy tắc Entailment

Các định lý dưới đây được sử dụng để chứng minh tính đúng đắn và tính dừng của các quy tắc kiểm tra suy diễn (EntailmentChecking) đã trình bày ở phần 2.4.

Định lý 1 (Soundness)

Nếu quá trình kiểm tra suy diễn ∆1⊢∆2 ∗ ∆ là thành công, thì với tất cả các trạng

thái s, h nếu s, h | = ∆1 thì s, h | = ∆2∗ ∆

(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) Định lý 2(Termination)

Thủ tục kiểm tra suy diễn ∆1⊢∆2∗ ∆ luôn có tình dừng.

(Tham khảo chứng minh định lý trong tài liệu phụ lục [14]) 2.7 Kết luận chương

Trong chương 2 luận văn tập trung tìm hiểu nền tảng xây dựng lên lý thuyết Separation Logic, trong đó nhấn mạnh vào sự kế thừa và mở rộng từ Hoare Logic. Sau đó luận văn trình bày về một kỹ thuật đặc tả chương trình dựa trên lý thuyết Separation Logic và các quy tắc ứng dụng kỹ thuật này phục vụ cho việc suy diễn kiểm định chương trình tự động, cũng như tính đúng đắn của mô hình suy diễn. Phần lý thuyết của chương 2 là nền tảng cơ sở cho việc tìm hiểu công cụ kiểm địnhchương trình tự động HIP/SLEEK sẽ được trình bày ở chương kế tiếp.

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang62

CHƯƠNG3. CÀI ĐẶT THỬ NGHIỆM CÔNG CỤ KIỂM ĐỊNH TỰ ĐỘNG ỨNG DỤNG SEPARATION LOGIC

Nội dung chương 3:

Trình bày kiến trúc và hoạt động của công cụ kiểm định tự động HIP/SLEEK ứng dụng lý thuyết suy diễn chương trình của Separation Logic.

Trình bày kiểm định một số cấu trúc dữ liệu với công cụ HIP/SLEEK và kết quả thực nghiệm ứng dụng thực tế.

3.1 Phương hướng cài đặt thử nghiệm công cụ kiểm định tự động ứng dụng Separation logic Separation logic

Để thực hiện việc cài đặt thử nghiệm lý thuyết đặc tả chương trình ứng dụng Separation Logic cho việc kiểm định đặc tả Module chương trình tự động, luận văn lựa chọn công cụ HIP/SLEEK. HIP/SLEEK là công cụ được phát triển bởi nhóm

các tác giả Wei-Ngan Chin, Cristina David, Huu Hai Nguyen, và Shengchao Qin;

đây là công cụ đầu tiên áp dụng lý thuyết đặc tả chương trình ứng dụng Separation Logic để xây dựng hệ thống kiểm định chương trình tự động. Sử dụng ngôn ngữ đặc tả chương trình đã được trình bày trong luận văn, người dùng có thể đặc tả Module chương trình dưới dạng thức Separation Logic; sau đó áp dụng công cụ HIP/SLEEK thực hiện việc kiểm định tính đúng đắn chương trình hoàn toàn tự động.

HIP/SLEEK là hệ thống kiểm tra tính đúng đắn chức năng của chương trình hoàn toàn tự động, thiết kế kiểm định ở mức thấp hệ thống (thư viện)các chương trình thao tác dữ liệu trên bộ nhớ Heap.Hệ thống HIP/SLEEK gồm hai hệ thống nhỏ là HIP và SLEEK. HIP là hệ thống thực hiện việc kiểm định Module chương trình được viết dưới dạng ngôn ngữ đặc tả dựa trên Separation Logic, ngôn ngữ đặc tả cho phép người dùng đặc tả cấu trúc dữ liệu phức tạp thông qua vị từ User-defined, đặc tả này còn có thể bao gồm các rằng buộc liên quan đến bộ nhớ Heap, và các

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang63

thuộc tính khác của cấu trúc dữ liệu như Size, Bag.HIP sẽ tự động xây dựng lên bộ các công thức cần chứng minh dưới dạng Separation Logic, sau đó sẽ được gửi tới hệ thống SLEEK. SLEEK cung cấp khả năng hoàn toàn tự động thực hiện việc chứng minh công thức Separation Logic dựa trên khả năng suy diễn Frame.

3.2 Kiến trúc của HIP/SLEEK

Tổng quan kiến trúc về hệ thống HIP/SLEEK được mô tả như hình dưới đây:

Hình 5- Tổng quan kiến trúc HIP/SLEEK

Kiến trúc hệ thống HIP/SLEEK gồm hai thành phần chính: Front-End và Back-End.Phần Front-End của hệ thống (HIP), chương trình người dùng sẽ được đặc tả dưới dạng ngôn ngữ đặc tả dựa trên Separation Logic, trong đó người dùng sẽ định nghĩa các vị từ dưới dạng công thức Separation để đặc tả cấu trúc dữ liệu dạng Shape và các thuộc tính cơ bản của nó như Size, Bag. Các thủ tục chương trình và vòng lặp chương trình bắt buộc viết dưới dạng chú thíchmột hoặc nhiều đặc tả tiền điều kiện/hậu điều kiện (Pre/Post Conditions) trước khi thực hiện việc kiểm định tính đúng đắn chương trình.HIP thực hiện việc biến đổi các suy diễn đặc tảdưới dạng công thức thuần túy mà có thể được chứng minhtính đúng đắn bởi SLEEK.

Phần Back-End của hệ thống (SLEEK), hay nói cách khác HIP làm việc dựa trên các chứng minh của SLEEK hoặc HIP thực hiện việc gọi SLEEK hoàn toàn trong suốt với người dùng.SLEEK thực hiện việc chứng minh hoàn toàn tự động cho Separation Logic bởi khả năng suy diễn Frame.SLEEK làm việc với dữ liệu đầu

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang64

vào là hai trạng thái Heap được biểu diễn dưới dạng thức Separation, sau đó thực hiện việc kiểm tra một công thức (Antecedent) là suy diễn ra công thức còn lại (Consequent).Công thức Antecedent có thể bao hàm nhiều hơn trạng thái Heap của công thức Consequent, chính vì vậy phần trạng thái Heap dư thừa này là thể hiện cho các điều kiện Frame và là kết quả trả lại của quá trình chứng minh.

3.3 Hoạt động của HIP/SLEEK

Trong phần trước đã trình bày về kiến trúc hệ thống HIP/SLEEK, do đó để khai thác được hệ thống này chủ yếu quan tâm đến cách thức làm việc của HIP (Front-End) vì trong quá trình thực hiện kiểm tra suy diễn HIP tự động thực hiện việc gọi đến SLEEK và sử dụng các kết quả trả về để thực hiện công việc kiểm định.

Người dùng muốn làm việc với HIP đầu tiên sẽ thực hiện việc đặc tả mã nguồn chương trình dưới dạng thức mà HIP có thể hiểu được (HIP Input Format), sau đó hệ thống thực hiện việc kiểm định tính đúng đắn của đặc tả và trả lại kết quả của kiểm định, quá trình này được thực hiện hoàn toàn tự động. Kết quả trả lại của hệ thống HIP/SLEEK có thể bao gồm các suy diễn Frame mà hệ thống đã thực hiện trong quá trình kiểm chứng tính đúng đắn của đặc tả.

3.3.1 File đầu vào

Dạng thức dữ liệu đầu vào của HIP (HIP Input Format) những thành phần chính như sau:

-Khai báo kiểu dữ liệu

-Khai báo vị từ Shape và các thuộc tính của nó

-Khai báo các thủ tục và các vòng lặpdưới dạng tiền điều kiện/hậu điều kiện (Pre/Post)

- Thực hiện đặc tả cho các thủ tục của chương trình dưới dạng ngôn ngữ đã trình bày ở chương 2 (ngôn ngữ lập trình mục tiêu).

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang65

Như đã trình bày trong phần ngôn ngữ lập trình trong chương 2, ngôn ngữ lập trình mục tiêu thể trong luận văn được đề cập tới là ngôn ngữ hướng đối tượngtương tự như các loại ngôn ngữ phổ biến C/C++, Java hay C#... Luận văn thực hiện việc kiểm định cho các File đầu vào sử dụng ngôn ngữ khai báo này để thực hiện đặc tả chương trình.

3.3.2 Kiểu dữ liệu cơ bản

Hệ thống hỗ trợ kiểu dữ liệu cơ bản số int và bool. 3.3.3 Cấu trúc dữ liệu

Cấu trúc dữ liệu được định nghĩa bởi người dùng tùy thuộc vào mức độ phức tạp của dữ liệu người dùng định nghĩa. Ví dụ, để minh họa cho cấu trúc dữ liệu Node với trường dữ liệu kiểu int và một con trỏ trỏ tới Node kế tiếp ta có thể định nghĩa:

data node { int val ; node next }

Dựa trên các thuộc tính của cấu trúc dữ liệu cần mô tả mà người dùng có thể thực hiện việc thể hiện cấu trúc dữ liệu thông qua định nghĩa vị từ Shape với các thuộc tính mong muốn, có thể có thêm các mô tả Size và Bag. Phần tiếp theo sẽ trình bày về cấu trúc công thức vị từ của định dạng HIP.

3.3.4 Định dạng công thức khẳng định

Các công thức khẳng định sử dụng chú thích Separation Logic và được đưa ra dưới dạng thức rời rạc thông thường. Mỗi dạng thức rời rạc gồm có hai phần: công thức Heap (Heap part) và công thức thuần túy (Pure Part). Xem xét ví dụ sau, một Heap Node cơ bản được định nghĩa như sau:

v::node_type<list_of_arguments>

Trong đó v là một con trỏ được trỏ tới Heap Node và list_of_arguments là nội dung của Heap Node. Sử dụng định dạng này có thể khai báo cho những vị từ

Học viên thực hiện: Nguyễn Đức Cường – Lớp 11BCNTT Trang66

của đoạn cấu trúc dữ liệu, ví dụ sau thể hiện vị từ là một dang sách độ dài n, khai báo trong HIP có dạng:

list<n> == self=null & n=0 or self::node<_,r> * r::list<n-1> inv n>=0 Công thức trên cho biết danh sách rỗng với n=0 hoặc danh sách được tạo bởi một Node liên kết với một danh sách kích thước n-1. Mỗi vị từ có một công thức mô tả tính bất biến thuần túy của nó, trong vị từ trên công thức thuần túy (Không chứa mô tả Heap) là n>=0. Thông thường bất biến thuần túy được giả định là luôn đúng, thành phần biến tự do hoặc biến không xác định trong một công thức Separation giả định được lượng hóa.

Tiền điều kiện/hậu điều kiện (Pre/Post) được chú thích bởi hai từ khóa "requires" và "ensures". Ví dụ sau thể hiện đặc tả cho thủ tục ghép hai danh sách đơn được trỏ bởi các con trỏ x và y:

node append(node x, node y) requires x::list<n> * y::list<m> ensures res::list<n+m>

Hậu điều kiện phải đảm bảo rằng kết quả trả về là một danh sách đơn có độ dài n+m, trong đó n và m lần lượt là độ dài của dang sách đầu vào x và y. Người dùng hoàn toàn có thể mô tả nhiều cặp tiền điều kiện/hậu điều kiện của các thủ tục được gọi trong chương trình.

3.3.5 Một vài tính năng đặc biệt khác Đặc tả cho cấu trúc Case: Đặc tả cho cấu trúc Case:

HIP cho phép làm việc với đặc tả được xây dựng với cấu trúc Case trong quá trình thực hiện kiểm định. Minh họa cho tính năng này, xem xét ví dụ viết lại thủ tục ghép danh sách khi xem xét với tình huống đặc biệt x có thể null:

Một phần của tài liệu Nghiên cứu về separation logic và ứng dụng vào hệ thống kiểm định tự động (Trang 55)

Tải bản đầy đủ (PDF)

(94 trang)