2010-07-24 35 views
25

tôi nền tảng kiến ​​thức SWI-Prolog chứa hai sự kiện sau đây:Tại sao truy vấn prolog này là đúng và sai?

f(a,b). 
f(a,c). 

Bây giờ nếu tôi đặt ra các truy vấn

?- f(a,c). 
true. 

Nhưng

?- f(a,b). 
true ; 
false. 

Tại sao là f (a, b) cả đúng và sai? Điều này cũng xảy ra khi có ba sự kiện trong KB. Nếu tôi nối thêm f (a, d). với KB, thì f (a, d) là đúng (chỉ), nhưng f (a, b) và f (a, c) đều đúng và sai. Điều gì đang xảy ra, và tôi có thể làm gì để Prolog trả lời (chỉ) đúng với các truy vấn này?

+3

Thiệt, câu hỏi hay. –

Trả lời

24

(Lưu ý: câu trả lời này là phần nào của một đoán)

Hãy xem xét cách Prolog sẽ xác định xem f(a,c) là đúng hay không. Nó kiểm tra quy tắc đầu tiên, f(a,b) và không tìm thấy kết quả phù hợp, nhưng quy tắc thứ hai, f(a,c) đối sánh. Do đó, f(a,c) là sự thật. Hơn nữa, vì không có quy tắc nào khác cho f, không có điểm nào trong việc cho phép quay lại xảy ra - không có giải pháp khả thi nào khác.

Bây giờ hãy xem xét f(a,b). Prolog sẽ kiểm tra quy tắc đầu tiên và tìm một kết quả phù hợp. Do đó, f(a,b) là đúng sự thật. Tuy nhiên, không phải tất cả các quy tắc đều đã cạn kiệt. Do đó, Prolog sẽ cho phép tìm kiếm tiếp tục (nếu bạn nhấn ;). Khi bạn tiếp tục tìm kiếm và quay lại, nó sẽ phát hiện ra rằng các quy tắc còn lại, cụ thể là f(a,c), không khớp với f(a,b). Do đó, kết quả là sai.

+11

Câu trả lời này là chính xác. Trong Prolog, thứ tự trong đó các sự kiện của bạn là các quy tắc được viết xác định thứ tự chúng sẽ được tìm thấy bởi một truy vấn. Cụ thể hơn, tùy chọn 'quay lại' '; " về cơ bản yêu cầu công cụ truy vấn loại bỏ kết quả trả về và trả lời câu hỏi "có bất kỳ câu trả lời * khác * nào không?". Vì vậy, không phải là f (a, b) vừa đúng và sai; nhưng đúng hơn là nó đúng và nếu bạn chọn bỏ qua kết quả đó, động cơ sẽ cho bạn biết không có mục nhập thực tế nào khác (a, b). Để chứng minh điều này, hãy xem điều gì xảy ra nếu bạn thêm một thực tế thứ hai f (a, b). – Assaf

+4

Điều này cũng minh họa tại sao bạn nên chú ý đến thứ tự các đối số của bạn nếu bạn lo lắng về hiệu suất. Nếu thứ tự của các đối số trong vị ngữ 'f' bị lật, thì điều này sẽ không xảy ra vì các đối số ban đầu không còn giống nhau nữa, và do đó không để lại một điểm lựa chọn. Điều này xảy ra vì hầu hết các phần mở đầu thực hiện lập chỉ mục đối số, cho phép các biến vị ngữ có các đối số không tương thích được cắt tỉa trước từ không gian tìm kiếm. SWI Prolog chỉ lập chỉ mục đối số đầu tiên theo mặc định, nhưng điều này có thể được thay đổi. – nedned

11

Ngoài câu trả lời của Michael Williamson. Nếu bạn muốn yêu cầu Prolog ngừng tìm kiếm câu trả lời sau lần truy cập thành công đầu tiên, hãy sử dụng phần cắt (!):

?- f(a, b), !. 
true. 

?- f(a, c), !. 
true. 
Các vấn đề liên quan