.3 Bảng kết quả kiểm khử hàm merge

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu ứng dụng ngôn ngữ f trong phát triển phần mềm 002 (Trang 54 - 57)

Lượt Dữ liệu vào (lst1) Dữ liệu vào (lst2) Kết quả

1 (Join,1) (Join,1) (Join,2)

2 (Join,1) (Max,1) ; (Join,1) (Max,1) ; (Join, 2) 3 (Max,2) ; (Join, 2) (Join,1) (Max,2) ; (Join, 3)

3.2.2.4. Đồng bộ hóa các luồng song song khi kết thúc giao tác (Joint commit)

a. Mô tả thuật toán:

Đầu vào: Cho 2 chuỗi chính tắc không có phần tử chứa dấu “−”. Hàm joint commit

được viết để kết hợp 2 chuỗi chính tắc trên thành chuỗi mới theo quy tắc sau: jc(#n , #l) = #max(n,l)

jc(S'1+n#n , #l¬lS'2) = jc(S'1+(n−1)max((n' +1), (l'+l)),S'2) Đầu ra: Chuỗi chính tắc mới từ kết hợp 2 chuỗi chính tắc trên. Bước 1: Lấy lần lượt các phần tử trong chuỗi lst1, lst2 và kiểm tra:

- Nếu phần tử đầu của lst1 có dạng “+n1#n2” thì kiểm tra tiếp các phần tử trong lst2:

o Nếu phần tử đầu lst2 có dạng ¬l thì:

 Loại bỏ phần tử đầu của chuỗi lst2.

Gọi hàm chính tắcseqvới đầu vào là chuỗi lst2 sau khi thêm vào phần tử #l

(Với l là giá trị của phần tử đầu mảng lst2 được loại bỏ ở trên).

Gọi đệ quy joint commit với chuỗi lst1 = +(n − 1) và lst2 sau khi đã thực

hiện các bước trên.

o Nếu các phần tử đầu lst2 có dạng #l1¬l2 thì:

 Loại bỏ 2 phần tử đầu của lst2.

Gọi đệ quy joint commit với chuỗi lst1 = +(n−1) #(max (n2+1) (l1+l2) và lst2 sau khi đã thực hiện các bước trên.

- Nếu phần tử đầu của lst1 có dạng “+n1” thì kiểm tra tiếp các phần tử trong lst2:

o Nếu phần tử đầu lst2 có dạng ¬l thì:

 Loại bỏ phần tử đầu của chuỗi lst2.

Gọi hàm chính tắc seq lại chuỗi lst2 sau khi thêm vào phần tử #l (Với l là

giá trị của phần tử đầu mảng lst2 được loại bỏ ở trên).

Gọi đệ quy joint commit với chuỗi lst1 = +(n − 1) và lst2 sau khi đã thực

hiện các bước trên.

o Nếu các phần tử đầu lst2 có dạng #l1¬l2 thì:

 Loại bỏ 2 phần tử đầu của lst2.

Gọi hàm chính tắc seq với đầu vào là chuỗi lst2 ở trên.

Gọi đệ quy joint commit với chuỗi lst1 = +(n−1)và lst2 sau khi đã thực hiện

các bước trên.

b. Cài đặt và kiểm chứng:

Phương thức joint commit được đưa ra để có thể gộp 2 chuỗi có dấu chính tắc không bao gồm dấu“−” như sau:

1 letrec jc (lst1: TagSeq) (lst2: TagSeq) : TagSeq = 2 match lst1 with

3 | [] ->if List.isEmpty lst2 then

4 [] 5 else lst2 6 | (Tag.Plus,m1)::[] -> 7 match lst2 with 8 | [] -> lst1 9 | (Tag.Max,l1)::(Tag.Join,l2)::xs2 -> 10 if m1 > 1 then 11 jc [(Tag.Plus,m1-1)] (seq((Tag.Max,l1+l2)::xs2)) 12 else 13 (Tag.Max,l1+l2)::xs2 14 |(Tag.Join, l2)::xs2 -> 15 if m1 > 1 then

16 jc [(Tag.Plus, m1-1)] (seq ((Tag.Max, l2)::xs2)) 17 else

18 (Tag.Max, l2)::xs2

19 | otherwise -> failwith "Need attention in jc 1"

20 | (Tag.Plus,n1)::(Tag.Max,n2)::[] -> 21 match lst2 with 22 | [] -> lst1 23 | (Tag.Max,l1)::(Tag.Join,l2)::xs2 -> 24 if n1 >= 1 then 25 jc ((Tag.Plus,(n1-1))::[Tag.Max,(max (n2+1) (l1+l2))]) xs2 26 else 27 jc [Tag.Join,max (n2+1) (l1+l2)] xs2 28 | (Tag.Join, l2)::xs2-> 29 if n1 > 1 then

30 jc [(Tag.Plus, n1-1)] (seq ((Tag.Max, l2)::xs2)) 31 else

32 (Tag.Max, max (n2+1) l2)::xs2

33 | otherwise -> failwith "Need attention in jc 2"

Theo đó lần lượt đưa ra các dữ liệu đầu vào, ta có một số ví dụ minh họa cho việc kiểm chứng và có kết quả trả về đúng đắn.

Một phần của tài liệu (LUẬN văn THẠC sĩ) nghiên cứu ứng dụng ngôn ngữ f trong phát triển phần mềm 002 (Trang 54 - 57)

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

(64 trang)