Chương trình mẫu liệt kê và đếm số giải pháp 8-nữ hoàng. (. Xin lỗi nếu mã là khó đọc, đây là máy tạo ra từ một S-biểu Mã ban đầu là https://www.cpp.edu/~jrfisher/www/prolog_tutorial/2_11.html)Các kết quả khác nhau trong swi-prolog và yap
quy tắc:
[user].
(perm([X|Y],Z) :- (perm(Y,W),takeout(X,Z,W))).
perm([],[]).
takeout(X,[X|R],R).
(takeout(X,[F|R],[F|S]) :- (takeout(X,R,S))).
(solve(P) :- (perm([1,2,3,4,5,6,7,8],P),combine([1,2,3,4,5,6,7,8],P,S,D),alldiff(S),alldiff(D))).
(combine([X1|X],[Y1|Y],[S1|S],[D1|D]) :- (is(S1,+(X1,Y1)),is(D1,-(X1,Y1)),combine(X,Y,S,D))).
combine([],[],[],[]).
(alldiff([X|Y]) :- (\+ member(X,Y),alldiff(Y))).
alldiff([X]).
end_of_file.
truy vấn:
(setof(P,solve(P),Set),length(Set,L),write(L),write('\n'),fail).
swipl trả lại 92; trong khi yap trả về 40320. Ngoài ra, khi tôi truy vấn solve(P)
, swipl chỉ trả về hai giải pháp (cũng mâu thuẫn với 92); yap trả về nhiều hơn (có thể là 40320 trong số đó). Vậy tại sao sự khác biệt? Có vấn đề tương thích nghiêm trọng như vậy không?
phiên bản:
- YAP 6.2.2 (x86_64-linux): Sat 17 tháng 9 13:59:03 UTC 2016
- SWI-Prolog phiên bản 7.2.3 cho amd64
Bạn vẫn có thể đặt mã vào một biểu mẫu có thể đọc được không? – false
có tài liệu gốc trong liên kết –
Lần tới, vui lòng đưa vào đây phiên bản có thể đọc được. Đó là cách SO hoạt động. – false