Disclaimer: Đây là Xonix 'giải pháp. Nếu bạn thích nó, hãy bỏ phiếu số anh ta. Nhưng vì nó đã cho tôi một số đầu gãi để tìm ra những gì đang xảy ra, tôi nghĩ rằng tôi cũng có thể cung cấp ý kiến của tôi để những người khác có thể được hưởng lợi.
Lúc đầu, đây là giải pháp của mình như là một điều khoản thích hợp:
criminal(K):-
member(K,[a,b,c,d]),
(K\=a -> A=1;A=0),
(K=d -> B=1;B=0),
(K=b -> C=1;C=0),
(K\=d -> D=1;D=0),
A+B+C+D=:=1.
Và nó đi như thế này:
Lúc đầu, ông chạy qua danh sách các cá nhân (phải là trường hợp thấp hơn, vì vậy chúng không phải là biến). K
được khởi tạo cho từng người trong số họ lần lượt.
Với mỗi giá trị có thể có của K
, anh ta chạy qua phần còn lại của mệnh đề. K
có thể được hiểu là giả thuyết là tội phạm. 4 dòng tiếp theo là cung cấp các ràng buộc cho mỗi biến A, B, C và D. Bạn có thể đọc chúng như thế này: Theo giả định rằng a
không phải là hình sự, một cách trung thực nếu không thì không. Theo giả định rằng d
là tội phạm, b là trung thực nếu không thì không. Asf. Đó là, các biến A, B, ... nắm bắt được tính trung thực của cá nhân điều chỉnh, đưa ra một tội phạm cụ thể.
Như một ràng buộc đã biết là thực tế chỉ có một trong số đó là trung thực, tổng giá trị chân lý của chúng phải là 1. Trên backtracking, Prolog tạo liên kết tiếp theo cho K và chạy lại nó. Hóa ra ràng buộc chỉ thỏa mãn nếu a
là tội phạm (và d
là nói sự thật, nếu tôi không nhầm). Dễ thương.
Ý của tôi nhận được rằng đúng: một là một tên tội phạm, nhưng ba là kẻ nói dối ?! – ThomasH