Datalog hay chương trình viết trên Datalog được xem là một cơ sở dữ liệu suy diễn. Tuy ngôn ngữ Datalog không phải Prolog, người ta vẫn quen lấy ví dụ trong Prolog làm ví dụ trong Datalog và xem Datalog hoạt động như Prolog. Ngôn ngữ Datalog được xem xét trên nền ngôn ngữ Prolog.
1.4.1. Chương trình Datalog
Định nghĩa 1.11 Một chương trình Datalog là tập hữu hạn khác rỗng các mệnh đề xác định:
1 n ( 0)
p q q n (1)
Trong đó các vị từ p, qi (i=0,…,n) là các nguyên tố có các đối là hằng hoặc biến.
Khi n=1, (1) còn được goi là quy tắc (rule), vị từ p được goi là đầu của quy tắc, q1 ∧ … ∧ qn là thân của quy tắc, q1 ,…, qn là các đích con. Ngữ nghĩa của
quy tắc (1) là với mọi phép thay thế các biến bởi các hằng trong chương trình làm cho thân quy tắc đúng thì đầu quy tắc cũng đúng.
Khi n=0, (1) trở thành mệnh đề đơn vị: p←, và ngữ nghĩa của mệnh đề đơn vị là với mọi phép thay thế các biến bởi các hằng trong chương trình vào nguyên tố p thì p luôn luôn đúng.
Với định nghĩa trên, rõ ràng chương trình Datalog chính là chương trình logic không chứa ký hiệu hàm.
Trong chương trình Datalog, các vị từ chỉ xuất hiện trong thân các quy tắc được gọi là vị từ ngoại diên (hoặc vị từ EDB - Extensional Databases predicate), các vị từ xuất hiện ở đầu quy tắc được gọi là các vị từ nội hàm (hoặc vị từ IDB – Intensional Databases predicate), các vị từ nội hàm cũng có thể xuất hiện trong thân quy tắc. Từ đây về sau ta sẽ gọi vị từ ngoại diên là EDB và vị từ nội hàm là
Ngoài các vị từ EDB và vị từ IDB, các quy tắc của chương trình Datalog có thể chứa thêm các vị từ xây dựng trong (built-in), đó là vị từ so sánh số học thuộc tập , , , , , . Nếu θ là một vị từ xây dựng trong thì ta viết XθY thay cho cách viết θ(X,Y).
Ví dụ 1.9 Cho chương trình Datalog P r1(a,b) ←, r1(b,c) ←, r1(b,d) ←, r2(b,f) ←, r2(b,g) ←, r2(g,h) ←, p1(X,Y) ← r1(X,Y), p1(X,Y) ← r1(X,Z) ∧ p1(Z,Y), p2(X,Y) ← r2(X,Y), p2(X,Y) ← r2(X,Z) ∧ p2(Z,Y), q(X,Y) ← p1(X,Z) ∧ p2(Z,Y).
Trong ví dụ 1.9 thì r1, r2 là vị từ EDB, các vị từ p1, p2, q là các vị từ IDB.
Định nghĩa 1.12 Cho P là chương trình Datalog. Lúc đó: 1. Vũ trụ Herbrand Up là tập tất cả các hằng của P.
2. Cơ sở Herbrand Bp là tập tất cả các nguyên tố nền của P. Mỗi phần tử thuộc Bp được gọi là một trực kiện (facts).
- Nếu trực kiện AI, ta nói rằng A đúng (có giá trị true) trong I và ký hiệu I ⊨ A.
- Nếu A B P nhưng AI, ta nói rằng A sai (có giá trị false) trong I và ký hiệu I ⊭ A.
Ví dụ 1.10 Xét chương trình Datalog P như sau:
q(a,b) ←, q(b,c) ←,
p(X,Y) ← q(X,Y),
p(X,Y) ← p(X,Z) ∧ p(Z,Y).
Vũ trụ Herbrand của P là UP a b c, , và cơ sở Herbrand của P là:
BP = {p(a,a), p(a,b), p(a,c), p(b,a), p(b,b), p(b,c), p(c,a), p(c,b), p(c,c), q(a,a), q(a,b), q(a,c), q(b,a), q(b,b), q(b,c), q(c,a), q(c,b), q(c,c)}.
Định nghĩa 1.13 Cho P là chương trình Datalog. Đồ thị phụ thuộc (dependen- cy graph) của P là một đồ thị có hướng DG(P)=<V, E>, trong đó V là tập các đỉnh gồm các ký hiệu vị từ trong P, E là tập các cạnh được xác định như sau: một cạnh từ đỉnh q đến đỉnh p nếu P có chứa một quy tắc với vị từ p là đầu và q
là đích con trong thân.
Chương trình Datalog P được gọi là đệ quy nếu đồ thị phụ thuộc DG(P)
có ít nhất một chu trình, ngược lại P được gọi là không đệ quy. Vị từ nằm trong một chu trình nào đó của đồ thị DG(P) gọi là vị từ đệ quy, ngược lại gọi là vị từ không đệ quy.
Ví dụ 1.11 Xét chương trình Datalog P gồm các quy tắc như sau:
p1(X,Y,Z) ← q1(X,Y), q2(X,Z), q3(Y,Z), p2(A,B) ← p1(A,B), q4(B,A),
Đồ thị phụ thuộc của chương trình Datalog P có dạng như hình 1.4
Hình 1.4. Đồ thị không có chu trình
Ví dụ 1.12 Xét chương trình Datalog P gồm các quy tắc như sau:
p1(A,B,C) ← q1(A,B), p2(B,C), p2(X,Y) ← q2(X), p1(X,Y,Z), Hỏi(A,B) ← p1(A,B,C), p2(B,C).
Đồ thị phụ thuộc của chương trình Datalog P có dạng như hình 1.5
Hình 1.5. Đồ thị có chu trình
Trong ví dụ 1.12 thì p1, p2, q1 là các vị từ đệ quy, các vị từ Hỏi, q2 là các
vị từ không đệ quy. Hỏi p2 p1 q1 q2 Hỏi p3 p2 q4 p1 q3 q1 q2