You are on page 1of 5

TRUY VẤN ĐỐI VỚI CSTT BẰNG NGÔN NGỮ SWI-PROLOG

3.1. Giới thiệu SWI-Prolog


SWI-Prolog là ngôn ngữ lập trình logic cho phép trả lời câu truy vấn đối với CSTT và là
phần mềm hoàn toàn miễn phí. Từ khi bắt đầu vào năm 1987, SWI-Prolog đã được phát triển
mạnh mẽ do nhu cầu của các ứng dụng thế giới thực, được sử dụng rộng rãi trong nghiên cứu và
giáo dục cũng như các ứng dụng thương mại. SWI-Prolog hoạt động theo hệ thống đơn thể, có
giao diện trao đổi hai chiều linh hoạt.

3.2. Cài đặt SWI-Prolog


Đầu tiên vào trang Web của SWI-Prolog: http://www.swi-prolog.org/. Tải file cài đặt SWI-
Prolog cho Windows (version 7.2.3):
http://www.swi-prolog.org/download/stable
dung lượng khoảng 12.2 MB, sau đó thực hiện việc cài đặt theo hướng dẫn trên màn hình.
Đường dẫn mặc định chứa SWI-Prolog là:
C:\Program Files\swipl
Sau khi cài đặt phiên bản SWI-Prolog 7.2.3 cho Windows, rồi khởi động trình swipl-win.exe,
cửa sổ làm việc SWI-Prolog hiện ra như hình dưới đây:

Hình 3.1. Cửa sổ làm việc của SWI-Prolog


SWI-Prolog làm việc theo chế độ tương tác. Dấu nhắc lệnh SWI-Prolog là một cặp dấu
chấm hỏi và dấu gạch ngang (dấu trừ), được liệt kê thứ tự 1, 2, 3…để theo dõi quá trình làm việc
của người sử dụng, theo sau là con trỏ màn hình:
1 ?-
Để thoát khỏi SWI-Prolog, dùng lệnh File/ Exit, hoặc dùng vị từ halt:
?- halt.

3.3. Biên dịch CSTT bằng SWI-Prolog


File nhị phân để chạy SWI-Prolog là swipl-win.exe trong thư mục bin của thư mục swipl,
CSTT có phần mở rộng là pl và được soạn thảo bằng cách thực hiện lệnh File/new trong menu
chính của cửa sổ làm việc SWI-Prolog. Có thể tạo thư mục riêng để lưu CSTT. CSTT chứa khai
báo của các sự kiện cũng như các quy tắc và được mở trong SWI-Prolog bằng cách nhấn đúp vào
tên file hoặc lệnh sau đây trong cửa sổ làm việc của SWI-Prolog:
?- [swi('thư mục/tênfile')].

3.4. Truy vấn trong SWI-Prolog


Sau khi một CSTT được biên dịch và tải vào bộ nhớ, người sử dụng có thể đặt câu truy vấn
(kết thúc bởi một dấu chấm). Tùy theo câu truy vấn, Prolog trả lời Yes hoặc No và kèm theo kết
quả X = <value> nếu trong đích có chứa biến X nào đó. Trong trường hợp có nhiều câu trả lời,
ngay sau kết quả trả lời đầu tiên, người sử dụng có thể đặt một dấu chấm phẩy “;” nếu muốn tiếp
tục yêu cầu Prolog đưa ra các câu trả lời khác. Tiếp tục quá trình này, Prolog lần lượt đưa ra các
kết quả khác nhau cho đến khi, hoặc Prolog trả lời No, thì có nghĩa là không còn câu trả lời nào
nữa, hoặc Yes, nếu người sử dụng muốn dừng lại bằng cách gõ Enter (↵). Người sử dụng có thể
nhận được thông báo lỗi nếu câu truy vấn có vấn đề:
ERROR: Undefined procedure <… /…> % người sử dụng đã gõ sai tên thủ tục,
hoặc:
ERROR: Syntax error: Operator expected % người sử dụng đã gõ sai biểu thức.

3.5. Các quy ước trong SWI-Prolog


- Hằng số, chẳng hạn như 0, 2, 5.
- Hằng chuỗi bắt đầu bằng một chữ cái viết thường hoặc ngoài ra có thể được bao gồm
trong dấu nháy đơn, chẳng hạn an, binh,„An‟, „Binh‟ là các hằng.
- Hằng logic: true, false.
- Biến: bắt đầu bằng chữ hoa hoặc dấu gạch ngang dưới „_‟.
- Các phần tử của thân quy tắc được ngăn cách bởi dấu phẩy „,‟
- Mỗi quy tắc/sự kiện/truy vấn kết thúc bằng một dấu chấm „.‟
- Ký hiệu “” trong quy tắc được viết là “: -”
- Các chú thích bắt đầu với „%‟ (phần còn lại của dòng này sẽ được bỏ qua).
- Một CSTT được lưu trữ trong một file với phần mở rộng là pl.
3.6. Cài đặt và thực thi một số ví dụ
Ví dụ 1: Xét CSTT biểu diễn số tự nhiên.
sotunhien(0) 
sotunhien(s(X))  sotunhien(X)
Quy tắc đầu tiên nói rằng 0 là số tự nhiên, quy tắc thứ hai có ý nghĩa nếu X là số tự nhiên
thì s(s(X)) là số tự nhiên. Trong đó,s là hàm 1-ngôi và s(X) để chỉ số kế tiếp của số tự nhiên X,
nghĩa là s(X) = X + 1, X là số tự nhiên.
Cài đặt chương trình này trong SWI-Prolog, ta được chương trình như sau:
sotunhien(0).
sotunhien(s(X)) :- sotunhien(X).

Kết quả của truy vấn ? sotunhien(X) được thể hiện ở hình 3.9 dưới đây:

Hình 3.2. Kết quả của truy vấn ? sotunhien(X)


Ví dụ 2: Xét CSTT:
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)
e1(a, b), e1(b, c), e1(c, d), e2(d, f), e2(f, g), e2(g, h)
Cài đặt trong SWI-Prolog như 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).
p(X,Y) :- p1(X,Z) , p2(Z,Y).
e1(a,b). e1(b,c). e1(c,d).
e2(d,f). e2(f,g). e2(g,h).

Kết quả của truy vấn ? p(X, Y) được thể hiện ở hình 3.10 dưới đây:

Hình 3.3. Kết quả của truy vấn ? p(X,Y)


Ví dụ 3: Xét CSTT:
ong(X, Z)  bo(X, Y)bome(Y, Z)
ba(X, Z)  me(X, Y)bome(Y, Z)
bome(X, Y)  bo(X, Y)
bome(X, Y)  me(X, Y)
bo(b, c), me(a, b), bo(c, d), me(e, c)
Cài đặt trong SWI-Prolog như sau:
ong(X,Z):- bo(X,Y), bome(Y,Z).
ba(X,Z):- me(X,Y), bome(Y,Z).
bome(X,Y) :- bo(X,Y).
bome(X,Y) :- me(X,Y).
bo(b,c). me(a,b).
bo(c,d). me(e,c).
Kết quả của truy vấn ? ong(X,Y) và ? ba(a,X) được thể hiện ở hình 3.11 dưới đây:

Hình 3.4. Kết quả của truy vấn ? ong(X,Y) và ? ba(a,X)

Ví dụ 4: Xét chương trình logic:


path(X, Y)edge(X, Y)
path(X, Y)edge(X, Z)path(Z, Y)
edge(a, b), edge(a, c), edge(b, d), edge(d, e)
Cài đặt trong SWI-Prolog như sau:
path(X,Y) :- edge(X,Y).
path(X,Y) :- edge(X,Z),path(Z,Y).
edge(a,b). edge(a,c).
edge(b,d). edge(d,e).

Kết quả của truy vấn ? path(X,Y) được thể hiện ở hình 3.12 dưới đây:

Hình 3.5. Kết quả của truy vấn ?path(X,Y)

You might also like