Rõ ràng đối với các chƣơng trình không đệ qui thì không nhất thiết phải dùng đến phép biến đổi ma tập, tuy nhiên các thảo luận phép biến đổi ma tập trên lớp chƣơng trình này chỉ nhằm nêu lên tính hiệu quả tƣơng đối của phƣơng pháp. Do phƣơng pháp ma tập sử dụng một chiến lƣợc truyền thông tin sang ngang để biến đổi chƣơng trình ban đầu, vì vậy nếu trong chƣơng trình có sự lặp lại các vị từ trong thân quy tắc thì khi áp dụng phép biến đổi ma tập, luôn luôn dẫn tới chƣơng trình đệ qui.
V dụ 3.5 Xem chƣơng trình Datalog P gồm các quy tắc sau:
r1: ongba(X, Z) p(X, Y) p(Y, Z) r2: p(X, Y) bome(X, Y)
Chƣơng trình này là không đệ qui, áp dụng phép biến đổi ma tập đối với chƣơng trình P ta nhận đƣợc chƣơng trình Mag_Pad
nhƣ sau:
mar1: ongba(X, Z) mag_ongbabf(X) p(X, Y) p(Y, Z) mar2: p(X, Y) mag_pbf(X) bome(X, Y)
mar3: mag_pbf(X) mag_ongbabf(X)
mar4: mag_pbf(Y) mag_ongbabf(X) pbf (X, Y) Câu truy vấn: (Q): ?ongba(a, Z)
Chƣơng trình này là đệ qui do đồ thị phụ thuộc có chu trình p mag_p p. Phép biến đổi ma tập đƣa vào vị từ magic để truyền thông tin sang ngang. Từ đồ thị phụ thuộc của một chƣơng trình Datalog, ta có thể kết hợp với một chiến lƣợc truyền thông tin sang ngang để xây dựng nên một đồ thị khác mà ta gọi là đồ thị phụ thuộc mở rộng. Có thể xem đồ thị phụ thuộc mở rộng là sự mở rộng của đồ thị phụ thuộc bằng cách thêm vào đồ thị phụ thuộc một chiến lƣợc truyền thông tin sang ngang.
Đồ thị phụ thuộc mở rộng của một chƣơng trình Datalog P, ký hiệu EDG(P),
là một đồ thị có hƣớng đƣợc gán nhãn, nhận đƣợc bằng cách mở rộng đồ thị phụ thuộc DG(P) của chƣơng trình Datalog P. Đồ thị EDG(P) đƣợc xây dựng nhƣ sau:
Đối với mỗi vị từ p trong chƣơng trình P, tạo ra một nút đƣợc gán nhãn là p. Đối với mỗi vị từ IDB p trong chƣơng trình P, tạo ra một nút thông tin đƣợc gán nhãn m_p.
Đồ thị EDG(P) có hai loại cạnh: cạnh phụ thuộc (ký hiệu bởi ) và các cạnh thông tin (ký hiệu bởi ). Với mỗi quy tắc có dạng:
r: p q1 q2 … qn
các cạnh của đồ thị EDG(P) nhận đƣợc nhƣ sau: - Cạnh phụ thuộc qi p với mọi i = 1, …, n
- Cạnh thông tin m_p m_qj, trong đó qj là đích con IDB đầu tiên trong quy tắc r.
- Gọi qi là đích con trong quy tắc r, qj là đích con IDB đầu tiên (nếu có) sau đích con qi. Cạnh thông tin qi mqj nhận đƣợc từ mọi đích con qi.
- Cạnh thông tin m_p p nhận đƣợc từ mọi quy tắc có dang: p q1 q2 … qn
Đồ thị phụ thuộc mở rộng đƣợc cho bởi các hình vẽ sau:
Hình 3.1 Đồ thị mở rộng của chƣơng trình trong ví dụ 3.5
Trong đồ thị phụ thuộc mở rộng, các cạnh biểu diễn một chiến lƣợc truyền thông tin sang ngang giữa các đích con trong quy tắc và sự lan truyền các trị buộc từ đầu quy tắc tới thân quy tắc. Đây chính là cách thức mà phép biến đổi ma tập đã sử dụng để biến đổi chƣơng trình ban đầu. Nhƣ vậy, ta có thể liên kết một nút thông tin m_p trong đồ thị phụ thuộc mở rộng EDG(P) của chƣơng trình P với một vị từ mag_p
trong chƣơng trình đƣợc viết lại bởi phép biến đổi ma tập. Lúc đó các đƣờng đi trong EDG(P) biểu diễn các đƣờng đi trong đồ thị phụ thuộc của chƣơng trình viết lại.
Định lý viết lại sau đây cho thấy mối liên hệ giữa đồ thị phụ thuộc của chƣơng trình viết lại bởi phép biến đổi ma tập và đồ thị EDG(P):
Định lý 3.3 [5] Cho P là chƣơng trình Datalog, gọi Mag_P là chƣơng trình viết lại bởi
phép biến đổi ma tập. Lúc đó Mag_P là đệ qui khi và chỉ khi đồ thị phụ thuộc mở rộng EDG(P) có chu trình.
Chứng minh:
Điều kiện cần: Để ý các đồ thị EDG(P) và DG(Mag_P) có sự tƣơng ứng 1 -1 giữa các
nút của chúng. Mặt khác theo phép biến đổi ma tập thì mỗi quy tắc r trong P có đầu là p đƣợc sửa đổi thành một quy tắc trong Mag_P bằng cách thêm vị từ mag_p vào thân
ongba m_ongba
p bome
của nó, vì vậy có một cạnh từ mag_p đến p, chính là cạnh thông tin trong EDG(P). Với mỗi quy tắc r trong P có đầu là p và ứng với mỗi vị từ IDB qi trong thân của nó, Mag_P đƣợc thêm vào các quy tắc: đầu của quy tắc này là mag_qi và thân bao gồm vị từ
mag_p cùng với các đích con đứng trƣớc qi trong quy tắc r. Điều này suy ra trong đồ thị DG(Mag_P) có các cạnh từ mag_p đến mag_q với q là các đích con IDB trong quy tắc r định nghĩa p và từ q đến mag_p với q là đích con đứng trƣớc p trong quy tắc r trong P. Theo định nghĩa của đồ thị EDG(P) thì các cạnh này tƣơng ứng với các đƣờng đi trong EDG(P). Tóm lại, mọi cạnh trong DG(Mag_P) đều tƣơng ứng các đƣờng đi trong EDG(P). Do đó nếu DG(Mag_P) có chu trình thì EDG(P) cũng có chu trình.
Điều kiện đủ: Bởi vì mỗi cạnh trong EDG(P) cũng tƣơng ứng với một cạnh trong
DG(Mag_P) nên mỗi đƣờng đi trong đồ thị EDG(P) sẽ có một đƣờng đi trong DG(Mag_P). Do đó nếu EDG(P) có chu trình thì DG(Mag_P) cũng có chu trình.[]
Phƣơng pháp ma tập trên chƣơng trình Datalog không đệ qui: Các vị từ lặp lại
nguyên nhân sinh ra chƣơng trình đệ qui sau khi áp dụng phép biến đổi ma tập. Vì vậy để loại bỏ việc lặp lại các vị từ trùng nhau trong thân các quy tắc của một chƣơng trình không đệ qui ta có thể thực hiện nhƣ sau: đối với sự xuất hiện k lần của vị từ p trong thân các quy tắc thì ta tạo ra bản sao của vị từ p bởi các vị từ p1, p2, …, pk và khi thay thế mọi sự xuất hiện của p trong chƣơng trình bởi p1, p2, …, pk, kết quả ta thu đƣợc các quy tắc tƣơng đƣơng mà không lặp lại các đích con trong thân các qui tắc. Từ đó đồ thị phụ thuộc mở rộng EDG(P) của chƣơng trình này không có chu trình, vì vậy phép biến đổi ma tập đối với P sẽ tạo ra một chƣơng trình không đệ qui. Ta có thuật toán sau:
Thuật toán 3.2 [5]
Vào: Chƣơng trình Datalog P không đệ qui, câu truy vấn q.
Ra: Chƣơng trình Mag_P’ không đệ qui.
1. Nếu đích con p có mặt k lần ở các quy tắc (k>1) của P thì tạo ra bản sao của vị từ p bởi p1, p2, …, pk và thay thế mọi sự xuất hiện của đích con p trong các quy tắc bởi p1, p2, …, pk.
2. Gọi P’ là chƣơng trình mới nhận đƣợc.Áp dụng phép biến đổi ma tập vào chƣơng trình P’ và câu truy vấn q ta nhận đƣợc chƣơng trình Mag_P’, Mag_P’ là chƣơng trình không đệ qui.
Định lý 3.4 [5] Thuật toán 3.2 là đúng đắn.
Chứng minh: Rõ ràng đồ thị phụ thuộc mở rộng EDG(P’) không có chu trình, vì vậy
theo định lý 3.3 thì đồ thị phụ thuộc DG(Mag_P’) cũng không có chu trình. Chƣơng trình P’ tƣơng đƣơng P, vì vậy việc định giá trên chƣơng trình Mag_P’ sẽ cho ra kết quả của câu truy vấn q theo thuật toán ma tập.[]
Ví dụ 3.6 Xét chƣơng trình Datalog P đã cho trong ví dụ 3.5
r1: ongba(X, Z) p(X, Y) P(Y, Z) r2: p(X, Y) bome(X, Y)
Câu truy vấn: (Q) ? ongba(a, Z)
Do vị từ p xuất hiện 2 lần trong quy tắc r1 nên ta tạo ra hai bản sao p1 và p2 của p. Chƣơng trình P’ nhận đƣợc từ P là:
r1: ongba(X, Z) p1(X, Y) p2(Y, Z) r2: p1(X, Y) bome(X, Y)
r3: p2(X, Y) bome(X, Y) Câu truy vấn: (Q) ? ongba(a, Z)
Phép biến đổi ma tập trên P’ tạo ra chƣơng trình không đệ qui.