mạnh [7]
Các thuật toán ngây thơ và nửa ngây thơ thƣờng đƣợc sử dụng để xác định mô hình nhỏ nhất của chƣơng trình Datalog theo các bƣớc lặp. Quá trình lặp sẽ kết thúc khi không còn sự kiện mới nào đƣợc phát sinh. Việc tính toán theo cách này có nhƣợc điểm là phải xem xét đến tất cả các quy tắc trong chƣơng trình ở mỗi bƣớc lặp. Chúng ta có thể cải tiến bằng cách phân rã quá trình tính toán thành một dãy các tính toán nhỏ
hơn, trong đó việc tính toán đƣợc thực hiện theo từng mức của chƣơng trình. Ta có một số định nghĩa sau:
Định nghĩa 2.7 Gọi DG(P) = (V, E) là đồ thị phụ thuộc của chƣơng trình Datalog P.
(i) Thành phần liên thông mạnh (SCC – Strongly Connected Component ) của đồ thị phụ thuộc DG(P) = (V, E) là tập lớn nhất C V sao cho với mỗi cặp đỉnh u, v C có một đƣờng đi từ u tới v và ngƣợc lại. Có hai kiểu SCC:
SCC tầm thƣờng là SCC mà tập các cạnh của nó là rỗng. SCC tầm thƣờng chỉ có một nút. Các SCC tầm thƣờng tƣơng ứng với các vị từ không đệ qui trong chƣơng trình.
SCC không tầm thƣờng là SCC mà tập các cạnh của nó khác rỗng.
(ii) Đồ thị phụ thuộc thu gọn của chƣơng trình Datalog P là một đồ thị có hƣớng G’= (V’, E’), trong đó tập đỉnh V’ chính là tập các thành phần liên thông mạnh {S1, S2, …, Sk} của G. Tập cạnh E’={(Si, Sj)| i j và p Si, q Sj: (p, q) E}.
Rõ ràng đồ thị phụ thuộc thu gọn G’ là một đồ thị có hƣớng phi chu trình. Ta có tính chất sau:
Ví dụ 2.5 Xem chƣơng trình Datalog P (để đơn giản ta bỏ qua các đối) gồm các quy tắc:
P = {q r; q s; r u s; u r t} Đồ thị phụ thuộc thu gọn của P nhƣ hình vẽ sau:
Hình 2.4 Đồ thị phụ thuộc của chƣơng trình trong ví dụ 2.5
s t
r q
Lúc đó ta có đồ thị phụ thuộc thu gọn của P nhƣ hình vẽ sau:
Hình 2.5 Đồ thị phụ thuộc thu gọn của chƣơng trình trong ví dụ 2.5
Định nghĩa 2.8 Một sắp xếp tuyến tính trên đồ thị phụ thuộc thu gọn G’ là một sự chỉ
định thứ tự các đỉnh của G’ sao cho nếu có một cạnh từ đỉnh i đến đỉnh j của G’ thi i<j. Với đồ thị phụ thuộc thu gọn G’ ở ví dụ trên, gồm các đỉnh S1 = {s}, S2 = {t}, S3 = {r, u}, S4 = {q}, ta có S1, S2, S3, S4 là một thứ tự tuyến tính của G’.
Định nghĩa 2.9 (Đánh số hiệu của mức cho các đồ thị của đồ thị phụ thuộc thu gọn) Mỗi đỉnh của đồ thị phụ thuộc thu gọn G’ = (V’, E’) đƣợc gán một số hiệu các mức, các vị từ EDB thuộc mức 0, đỉnh thuộc Si đƣợc gọi là có mức thấp hơn đỉnh Sj nếu có một đƣờng đi từ Si đến Sj trong G’, các vị từ trong cùng một đỉnh đƣợc gán bởi số hiệu mức của đỉnh đó.
Trong ví dụ 2.5 thì S1 = {s}, S2 = {t} thuộc mức 0, S3 = {r, u} thuộc mức 1, S4 = {q} thuộc mức 2.
Thuật toán 2.1 [7]
Vào: Chƣơng trình Datalog P, DB là CSDL EDB đã cho.
Ra: Mô hình nhỏ nhất của P
Phƣơng pháp: Thực hiện các bƣớc sau:
1. Xây dựng các thành phần liên thông mạnh của chƣơng trình Datalog P và sắp xếp chúng theo một thứ tự tuyến tính.
2. Gọi S1, …, Sk là các đỉnh của đồ thị phụ thuộc thu gọn của P, thực hiện việc đánh số hiệu mức cho các đỉnh Si, i=1, …,k.
s t
r, u q
3. Gọi Pi là tập các quy tắc trong P định nghĩa các vị từ thuộc mức i. Quá trình tính toán đƣợc thực hiện theo mỗi mức. Dữ liệu vào của mỗi mức là lời giải của chƣơng trình ở mức trƣớc đó. Gọi
i
P
EVAL (DB) là lời giải việc định giá chƣơng trình Pi theo thuật toán nửa ngây thơ với CSDL EDB là DB đã cho. Bƣớc 3 đƣợc viết theo ngôn ngữ tựa Pascal nhƣ sau:
I := ;
For i := 1 to h do /* h là số mức cỉa chƣơng trình */ I :=
i
P
EVAL (DB I)
Output I;
Định lý 2.2 [7] Thuật toán trên là đúng đắn và có độ phức tạp tính toán với thời gian đa
thức.
Chứng minh:
Tính đúng đắn: Do S1, …, Sk là các đỉnh của đồ thị phụ thuộc thu gọn và đã đƣợc sắp xếp theo các mức nên vị từ trong các chƣơng trình Pj với j<i xem nhƣ là các vị từ EDB cho chƣơng trình Pi. Mặt khác, các quy tắc có đầu thuộc Pi thì không chứa các vị từ thuộc Pi+1, từ đó có thể tính các quan hệ tƣơng ứng với các vị từ của Pi. Nhƣ vậy việc xác định mô hình nhỏ nhất của P có thể tiến hành theo từng Pi, dữ liệu vào của mỗi Pi là lời giải của mức trƣớc đó. Tính hội tụ của thuật toán đƣợc suy từ tính hội tụ của thuật toán nửa ngây thơ đƣợc áp dụng cho từng bƣớc. Vì vậy kết thúc thuật toán ta nhận đƣợc mô hình nhỏ nhất của P.
Độ phức tạp: Bởi vì thuật toán xây dựng các thành phần liên thông mạnh của đồ thị phụ thuộc DG(P) là tuyến tính theo kích thƣớc của đồ thị và thuật toán nửa ngây thơ đƣợc thực hiện với thời gian đa thức nên độ phức tạp của thuật toán ở trên cũng đƣợc thực hiện với thời gian đa thức theo kích thƣớc của chƣơng trình.[]
Chú ý: Việc phân nhỏ tính toán theo các mức có những thuận lợi sau đây:
- Không phải tất cả các nguyên tố trong thân quy tắc đều phải tính trên mỗi bƣớc lặp.
- Các chƣơng trình Datalog con trong mỗi mức có thể có những tính chất đặc biệt nào đó, chẳng hạn chƣơng trình tuyến tính. Trong trƣờng hợp này định giá chƣơng trình sẽ đơn giản hơn nhiều.
Ví dụ 2.6 Xét chƣơng trình Datalog sau đây:
p1(X, Y) e1(X, Y)
p1(X, Y) e1(X, Z) p1(Z, Y) p2(X, Y) e2(X, Y)
p2(X, Y) e2(X, Z) p2(Z, Y) p(X, Y) p1(X, Z) p2(Z, Y)
trong đó e1, e2 là các vị từ EDB, p1, p2, p là các vị từ IDB, X, Y, Z là các biến. Gọi P1, P2, P là các quan hệ IDB tƣơng ứng với các vị từ IDB p1, p2, p và Q1, Q2 là các quan hệ EDB tƣơng ứng với các vị từ EDB e1, e2. Giả sử các quan hệ Q1, Q2 đƣợc cho bởi:
Q1 = {(a, b), (b, c), (c, d)} Q2 = {(d, f), (f, g), (g, h)}
Đồ thị phụ thuộc DG(P) nhƣ hình vẽ sau đây:
Hình 2.6 Đồ thị phụ thuộc của chƣơng trình trong ví dụ 2.6
p
p1 p2
Đồ thị phụ thuộc thu gọn G’ gồm các đỉnh S1 = {e1}, S2 = {e2}, S3 = {p1}, S4 = {p2}, S5 = {p} ta có S1, S2, S3, S4, S5 là một thứ tự tuyến tính của G’ và S1, S2 thuộc mức 0, S3, S4 thuộc mức 1. S5 thuộc mức 2.
Chƣơng trình con P(1): Gồm các quy tắc sau: p1(X, Y) e1(X, Y)
p1(X, Y) e1(X, Z) p1(Z, Y) p2(X, Y) e2(X, Y)
p2(X, Y) e2(X, Z) p2(Z, Y)
Sử dụng thuật toán nửa ngây thơ, ta nhận đƣợc quan hệ đối với vị từ p1 là: P1 = {(a,b), (b,c), (c,d), (a, c), (b,d), (a,d)}
và quan hệ đối với vị từ p2 là:
P2 = {(d,f), (f,g), (g,h), (d,g), (f,h), (d,h)}
Chƣơng trình con P(2)
chỉ gồm một quy tắc: p(X, Y) p1(X, Z) p2(Z, Y)
Với các quan hệ đối với các vị từ p1 và p2 đã tính ở mức 1, ta tính đƣợc quan hệ đối với vị từ p là P = {(a,h), (a,g), (a,f), (b,h), (b,g), (b,f), (c,h), (c,g), (c,f)}.