Cây SLD (SLD-tree)

Một phần của tài liệu Nghiên cứu một số khía cạnh lý thuyết của lập trình Logic và lập trình Logic Modal (Trang 28)

Định nghĩa: (Cây SLD [10])

Gọi p là một chương trình hữu hạn, G là một đích hữu hạn. Một cây SLD của p u {G} là một cày thỏa mãn:

+ Gốc câv là đích G

+ Moi nút cùa cây lờ một đích hữu hạn (có thê là rong)

+ Gọi <- A/...An„ .... Ak (k > 0) ỉà một nút trong cây và giả sử Am là một

nguyên tố được chọn, thì với mỗi câu vào A <— Bị...Bq sao cho Am và A hợp nhất

được với mgu 9, ta có một nút con của <- A I, A/n, À/i là 4—Aị, Am.f, Bị,

Bq, Am+I, Aị.

+ Các nút cỏ đích ron% không có con.

Mồi nhánh của cây là một dẫn xuất của P u {G}. Các nhánh ứng với dẫn xuất thành công gọi là nhánh thành công, các nhánh ứng với dẫn xuất vô hạn gọi là nhảnh vô hạn, nhánh ứng với dẫn xuất thất bại gọi là nhánh thất bại.

Định lý: Gọi p là một chương trình hữu hạn, G là một đích hữu hạn và R là một hàm chọn. Giả sử p u {G} không thỏa mãn, khi đó cây SLD của p u ỊG} với

hàm chọn R có ít nhất một nhánh thành công.

Nếu P u {G} không thỏa mãn, dù áp dụng hàm chọn nào, cây SLD tương ứng luôn luôn chửa một nhánh thành cône. Tuy nhiên, vấn đề đặt ra là: một hệ lập trình logic với chiến lược tìm kiếm trước tiên theo chiều sâu (depth - first - search) đùng một trật tự nhất định các câu và hàm chọn bất kỳ, có đàm bảo luôn tìm ra nhánh thành công không? Và câu trá lời không may là không. Bởi iẽ, với tìm kiếm trước tiên theo chiều sâu, khi nhánh bên trái nhất của cây SLD là vô hạn thì chiến lược tìm kiếm này sẽ sa vào nhánh vô hạn đó mà không thoát ra được.

Như vậy, thứ tự các câu trong chương trinh là rất quan trọng. Chúng ta mong muốn thiết lập một trật tự bình đảng giữa các câu sao cho mồi nhánh thành công cùa cây SLD dù thế nào cũng được tim ra. Có thể sừ dụng tìm kiếm rộng đầu tiên để phần nào đảm bảo thứ tự bình đẳng giữa các câu. Tuy nhiên, hiệu quà cài đặt chiến lược này là thấp. Hiện nay, các hệ lập trình logic Prolog chuẩn luôn dùng tìm kiếm trước tiên theo chiều sâu và các câu viết trước luôn được thử trước.

Ví dụ minh họa: Xét chương trình p sau: (1) P(X, Z) q(X. Y). P(Y. Z) (2) q(X, Z) <- p(X, Y), q(Y, Z) (3) p(X, Y) <- p (Y , X) (4) q(X, Y) <- q(Y, X) (5) p(b, c) (6) q(a, b) (7) q(a, c) Và đích G là <-p(a, c) Ở đây: p(), q() là các vị từ; X, Y, z là các biến; a, b, c là các hằng

p(Xi. Yi). q(Yi. Zi). p(Yo íữì q (Y ,.x ,) . p(Yo. £ o ) P (D ^0) Ọ{Q. i^ ì Falun

q(X2. Y ’ 1 n íY . 7 A n<Y, 7A n(Y0, z3)

V ỗ hạn

Ta xây dựng cây SLD cho P u Ị G } như sau: Với cây SLD vừa nhận được, ta thấy:

+ Nhánh bên trái nhất là nhánh vô hạn,

Hay diễn aiải theo SLD - refutation là: p(a. c) -> q(X0, Yo), p(Y0? Zo) -> p(b, Zo) —> □ với các luật tương ứng được áp dụne là ( 1 ), (6), (5) và các phép thể biến lẩn lượt là: 01 = {Xo / a, z 0/ c}, 02 = {Xo / a. Y0/ b}, 03 = {Zo/ c}. Cuối cùng phép thế là 0 = 0102Ỡ3 - {Xo / a, Vo / b, Z(|/ c}.

Như vậy, nếu áp dùng chiến lược tìm kiếm trước tiên theo chiều sâu, ta không thể tìm được nhánh thành công. Bởi lẽ, xuất phát từ câu đích p(a, c) theo trật tự các luật trong chương trình, chiến lược này sẽ thừ luật (1) được câu đích mới (nếu các luật bình đảng về trật tự thì có thể áp dụng được các luật (1), (3), (5)). Trong câu đích mới nhận được, nguyên tố q(U. V) đứng bên trái nhất, do vậy, bước thử tiếp theo là áp dụng luật (2) được câu đích mới (nếu các luật bình đẳng có thề áp dụng được các luật (2), (4), (6), (7)). Trong câu đích vừa nhận được, nguyên tố p(U, V) đứng bên trái nhất, do vậy, bước thừ tiếp theo là luật (1)... cứ như vậy, các luật (1) và (2) luân phiên được thừ còn các luật khác không bao giờ được áp dụng. Và thuật toán sa vào nhánh vô hạn.

Nếu trật tự các câu trong p được sắp xếp khác trật tự trên (Có thể sắp xếp các câu theo trật tự: (1). (6). (5). (2). (3). (4). (7)) thì tìm kiếm trước tiên theo chiều sâu sẽ tìm ra nhánh thành công (câu trả lời).

Một phần của tài liệu Nghiên cứu một số khía cạnh lý thuyết của lập trình Logic và lập trình Logic Modal (Trang 28)