2017-11-10 34 views
7

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
+0

Bạn vẫn có thể đặt mã vào một biểu mẫu có thể đọc được không? – false

+0

có tài liệu gốc trong liên kết –

+1

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

Trả lời

7

Trong các phiên bản cũ hơn của YAP, truy vấn cho một vị từ không xác định chỉ đơn giản là không thành công. Trong trường hợp trên, nó là member/2 không được xác định trong YAP. Và vì lý do này, thử nghiệm của bạn alldif/1 luôn thành công - do đó số lượng lớn bạn nhận được.

Hành vi này được điều chỉnh bởi cờ Prolog unknown có giá trị mặc định là error. Trong YAP 6.2, mặc định là (không chính xác) fail. Điều này đã được sửa trong 6.3. Nói

:- set_prolog_flag(unknown, error). 

để nhận lỗi sạch cho các biến vị ngữ không xác định. Sau đó, bạn sẽ cần phải xác định member/2.

+2

cảm ơn bạn, vì vậy 'member' không phải là built-in ... nhưng những" prologues "(lớp tương thích, loại) âm thanh tốt. Tôi có thể làm cho thư viện lisp-to-prolog để tải nó bất cứ khi nào quá trình được khởi chạy. –

+0

hmm, nhân tiện, chỉ cần nhân bản yap 6.3.3, sau khi '.configure' nó không xây dựng vì' make: *** Không có quy tắc để tạo mục tiêu 'H/dglobals.h', cần thiết bởi 'yap '. Stop.' ... –

+0

Tự hỏi tại sao việc tiêu chuẩn hóa lại quá tệ so với cộng đồng CSP khác. Minizinc là một định dạng phổ biến trong CSP và đang thực hiện cuộc thi hàng năm. SAT có DIMACS và SMT cũng có. –

Các vấn đề liên quan