Định nghĩa 3.2 Xét chƣơng trình Datalog P chỉ gồm một vị từ IDB p và câu truy vấn
p đƣợc tô điểm , giả sử tô điểm biểu thị k đối đầu tiên X1, …, Xk của vị từ p là bị buộc và h đối còn lại Y1, …, Yh là tự do. Chƣơng trình P đƣợc gọi là tuyến tính phải nếu:
(i) Mỗi quy tắc đệ qui của P có dạng:
p (X1, …, Xk, Y1, …, Yh) q1 … qm p (Z1, …, Zk, Y1, …, Yh) (R) Trong đó qj j=1, ..., m là các vị từ EDB và thoả mãn các điều kiện sau:
Các biến Y1, …, Yh phân biệt và xuất hiện chính xác hai lần trong quy tắc, một lần trong đầu và một lần trong đích con đệ qui theo cùng một vị trí, chúng không xuất hiện trong bất kỳ đích con q1, …, qm.
Các biến Z1, …, Zk hoặc xuất hiện trong các đối của q1, …, qm hoặc thuộc vào các biến X1, …, Xk.
(ii) Mỗi quy tắc không đệ quy của P có dạng:
p (X1, …, Xk, Y1, …, Yh) e(X1, …, Xk, Y1, …, Yh) (E)
Trong đó e là hội của các vị từ EDB. Các biến xuất hiện trong p cũng phải xuất hiện trong e.
Trên lớp chƣơng trình Datalog tuyến tính phải, phép biến đổi ma tập đƣợc thực hiện theo các bƣớc:
Bƣớc 1: Bƣớc tô điểm chƣơng trình: Biến đổi chƣơng trình P ban đầu thành chƣơng
trình có tô điểm Pad
theo chiến lƣợc Sip đƣợc chọn.
Bƣớc 2: Bƣớc biến đổi ma tập: Biến đổi chƣơng trình Pad thành chƣơng trình Mag_Pad,
đƣợc thực hiện nhƣ sau:
1. Đối với vị từ đệ qui p trong chƣơng trình Pad
(tô điểm biểu thị k đối đầu tiên của p là buộc) ta tạo ra một vị từ mag_p trong Mag_Pad.
2. Đối với mỗi quy tắc đệ qui tuyến tính phải có dạng (R) trong định nghĩa 3.2 đƣợc biến đổi thành hai quy tắc:
mar1: mag_p (Z1, …, Zk) mag_p (X1, …, Xk) q1 … qm mar2: p (X1, …, Xk, Y1, …, Yh) mag_p (X1, …, Xk) q1 …
qm p (Z1, …, Zk, Y1, …, Yh)
3. Đối với mỗi quy tắc đệ qui tuyến tính phải có dạng (E) trong định nghĩa 3.2 đƣợc biến đổi thành hai quy tắc:
mar3: p (X1, …, Xk, Y1, …, Yh) mag_p (X1, …, Xk) e(X1, …, Xk, Y1, …, Yh) 4. Câu truy vấn p (c1, …, ck, Y1, …, Yk) , với c1, …, ck là các hằng, đƣợc viết thành: mar4: mag_p (c1, …, ck)
Việc ƣớc lƣợng đối với chƣơng trình viết lại bởi phép biến đổi ma tập sẽ cho kết quả cuả câu truy vấn. Tuy nhiên, kỹ thuật ma tập này chƣa thực sự hiệu quả trên lớp chƣơng trình này, ta xem ví dụ sau:
Ví dụ 3.3 Xét chƣơng trình Datalog tuyến tính phải định nghĩa quan hệ totien:
r1: totien (X,Y) bome(X,Y)
r2: totien (X,Y) bome(X,Z) totien (Y,Z) Câu truy vấn (Q): ? totien(x0, Y)
Giả sử quan hệ của vị từ EDB bome đƣợc cho bởi tập hợp E = {(x0, x1), (x1, x2), …, (xn-1, xn)}. Chƣơng trình đƣợc viết lại bởi phép biến đổi ma tập là:
mar1: totienbf (X,Y) mag_totienbf(X) bome(X,Y)
mar2: totienbf (X,Y) mag_totienbf(X) bome(X,Z) totienbf (Y,Z) mar3: mag_totienbf(Z) mag_totienbf(X) bome(X,Z)
mar4: mag_totienbf (x0)
Sử dụng thuật toán định giá theo kiểu dƣới lên đối với chƣơng trình này, chẳng hạn thuật toán nửa ngây thơ, ta nhận đƣợc n bộ mag_totienbf(xi), với 1 i n, do đó với mỗi bộ mag_totienbf(xi), ta nhận đƣợc bộ totien(xi, xj) với 1 i<j n. Điều này có nghĩa số các bộ đƣợc tạo ra đối với vị từ tổ tiên là O(n2
).
Tuy nhiên, chỉ với những bộ phát sinh đối với vị từ mag_totien đã bao gồm tất cả các bộ cần tìm của câu truy vấn, vì vậy quy tắc mar1 có thể đƣợc áp dụng để tìm đƣợc lời giải câu truy vấn. Trong khi đó quy tắc mar2 lại tính các bộ “tổ tiên” của những tổ tiên của x0, rõ ràng điều này là thừa. Do đó quy tắc mar2 có thể loại bỏ, nhƣ vậy sẽ giảm số các bộ cần tính đối với vị từ mag_totien xuống còn O(n). Từ đó ta có cải tiến phép biến đổi ma tập sau đây:
Thuật toán 3.1 (Phép biến đổi ma tập cải tiến đối với chƣơng trình datalog tuyến tính phải) [5]
Vào: Chƣơng trình Datalog P đệ qui tuyến tính phải và câu truy vấn p(c1, …, ck, Y1, …, Yh), với c1, …, ck là các hằng.
Ra: Chƣơng trình RMag_Pad (bằng các thuật toán nhƣ ngây thơ, nửa ngây thơ, …) sẽ cho ra kết quả của câu truy vấn p .
Phƣơng pháp: Thuật toán thực hiện theo các bƣớc:
Bƣớc 1: Bƣớc tô điểm chƣơng trình: Biến đổi chƣơng trình P ban đầu thành chƣơng
trình có tô điểm Pad
theo chiến lƣợc Sip đã đƣợc chọn.
Bƣớc 2: Bƣớc biến đổi ma tập: Biến đổi chƣơng trình Pad thành chƣơng trình
RMag_Pad, đƣợc thực hiện nhƣ sau:
1. Đối với vị từ đệ qui p trong trƣơng trình Pad
ta tạo ra một vị từ mag_p trong chƣơng trình RMag_Pad
.
2. Đối với mỗi quy tắc đệ qui tuyến tính phải có dạng (R) trong định nghĩa 3.2, đƣợc biến đổi thành quy tắc:
mar1: mag_p (Z1, …, Zk) mag_p (X1, …, Xk) q1 … qm
3. Đối với mỗi quy tắc không đệ qui có dạng (E) trong định nghĩa 3.2, đƣợc biến đổi thành quy tắc:
mar2: p (X1, …, Xk, Y1, …, Yh) mag_p (X1, …, Xk) e(X1, …, Xk, Y1, …, Yh) 4. Câu truy vấn p (c1, …, ck, Y1, …, Yk) trở thành:
mar3: mag_p (c1, …, ck)
Định lý 3.2 [5] Việc định giá trên chƣơng trình RMag_Pad bằng thuật toán nửa ngây thơ sẽ sinh ra cùng kết quả với việc định giá trên chƣơng trình P, mặt khác nó hiệu quả hơn khi định giá trên chƣơng trình Mag_Pad
.
Chứng minh: Với các điều kiện trong định nghĩa 3.2, với đầu quy tắc tô điểm p thì đích con p trong thân cũng có tô điểm với một câu trả lời đối với đích con p cũng là một câu trả lời đối với đầu quy tắc bởi vì các đối tự do của p có cùng các biến nhƣ trong đầu. Mặt khác, khi một câu trả lời đối với một đích con đƣợc thay thế trong thân
của quy tắc đệ qui thì cũng không tạo ra thêm các câu trả lời nào khác đối với đầu quy tắc. Do đó quy tắc mar2 đƣợc tạo ra bởi phép biến đổi ma tập là thừa, vì vậy việc định giá trên chƣơng trình RMag_Pad
và Mag_Pad là cho cùng kết quả của câu truy vấn. Từ đó theo định lý 3.2, việc định giá này sẽ cho cùng kết quả khi định giá trên P. Thuật toán này là hiệu quả hơn thuật toán ma tập nhờ vào việc nó loại bỏ đƣợc một quy tắc đệ qui không cần thiết.[]
Ví dụ 3.4 Áp dụng phép biến đổi ma tập tuyến tính phải vào chƣơng trình ở ví dụ 3.8,
quy tắc mar2 đƣợc tạo ra bởi phép biến đổi ma tập sẽ bị loại bỏ, kết quả ta nhận đƣợc chƣơng trình:
mar1: mag_totienbf (Z) mag_totienbf(X) bome(X,Z) mar3: totienbf (X,Y) mag_totienbf(X) bome(X,Y) mar4: mag_totienbf (x0)
Chƣơng trình này sẽ tính các bộ vị từ mag_totien với thời gian là O(n), từ đó lời giải của câu truy vấn ?totien(x0, Y) gồm n bộ sẽ đƣợc tính cũng với thời gian O(n).