2011-02-11 44 views
6

tôi đã thực hiện một mã nhỏ để tạo ra một ma trận của tọa độ (giống như một bàn cờ), đó là những điều sau:Tại sao "..." xuất hiện trong câu trả lời của tôi về ma trận trong Prolog

createMatrix(N,M,R) :- creaMatriu(N,M,A), reversed(R,A). 
creaMatriu(N,0,[T]) :- creafila(N,0,T),!. 
creaMatriu(N,M,[T|C]) :- creafila(N,M,T), M1 is M-1, creaMatriu(N,M1,C). 
creafila(0,M,[[M,0]]):-!. 
creafila(N,M,[[M,N]|C]) :-N1 is N-1,creafila(N1,M,C). 
reversed(A, B) :- reversed(B, [], A). 
reversed([A|B], C, D) :- reverse(N,A),reversed(B, [N|C], D). 
reversed([], A, A). 

Lần đầu tiên tôi thực hiện nó diễn ra tốt đẹp, nhưng khi tôi tăng lên kích thước của ma trận, các "chấm" ở cuối của ma trận bắt đầu xuất hiện incrementing một phối hợp như kích thước tăng lên, như thế này:

?- createMatrix(1,1,R). 
R = [[[0, 0], [0, 1]], [[1, 0], [1, 1]]] . 

?- createMatrix(2,1,R). 
R = [[[0, 0], [0, 1], [0, 2]], [[1, 0], [1, 1], [1, 2]]] . 

?- createMatrix(2,2,R). 
R = [[[0, 0], [0, 1], [0, 2]], [[1, 0], [1, 1], [1, 2]], [[2, 0], [2, 1], [2, 2]]] . 

?- createMatrix(3,2,R). 
R = [[[0, 0], [0, 1], [0, 2], [0, 3]], [[1, 0], [1, 1], [1, 2], [1, 3]], [[2, 0], [2, 1], [2, 2], [2, 3]]] . 

?- createMatrix(3,3,R). 
R = [[[0, 0], [0, 1], [0, 2], [0, 3]], [[1, 0], [1, 1], [1, 2], [1, 3]], [[2, 0], [2, 1], [2, 2], [2, 3]], [[3, 0], [3, 1], [3, 2], [3|...]]] . 

?- createMatrix(4,3,R). 
R = [[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4]], [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4]], [[2, 0], [2, 1], [2, 2], [2, 3], [2|...]], [[3, 0], [3, 1], [3, 2], [3|...], [...|...]]] . 

?- createMatrix(4,4,R). 
R = [[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4]], [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4]], [[2, 0], [2, 1], [2, 2], [2, 3], [2|...]], [[3, 0], [3, 1], [3, 2], [3|...], [...|...]], [[4, 0], [4, 1], [4|...], [...|...]|...]] . 

bất cứ ai có bất cứ mối tại sao điều này xảy ra?

Cảm ơn bạn!

+0

Câu trả lời bởi sai dưới đây mang đến cho bạn một lời giải thích thấu đáo về ellipsis (...) trong một màn hình mặc định bằng cách "mục cấp đầu" Prolog truy vấn chứa các biến không liên kết. Câu hỏi của bạn cho thấy danh sách các danh sách là đại diện cho một mảng 2D "giống như một bàn cờ". Nếu đúng như vậy, bạn sẽ thấy hữu ích khi viết một vị từ hiển thị tùy chỉnh. Dấu ba chấm (...) sẽ không xuất hiện nếu bạn sử dụng ** write/1 ** để hiển thị một thuật ngữ Prolog, và một hình dáng giống như bàn cờ hơn có thể đạt được bằng cách tách các danh sách với các dòng mới. – hardmath

Trả lời

7

Theo mặc định, các vòng lặp mục cấp đầu của SWI in các điều khoản lên đến độ sâu 10 phần sâu hơn được thay thế bằng ... Bạn có thể mở rộng chiều sâu đó hoặc loại bỏ giới hạn đó bằng cách thiết lập độ sâu đến 0.


?- length(L,10). 
L = [_G317, _G320, _G323, _G326, _G329, _G332, _G335, _G338, _G341|...]. 

?- current_prolog_flag(toplevel_print_options,V). 
V = [quoted(true), portray(true), max_depth(10), spacing(next_argument)]. 

?- set_prolog_flag(toplevel_print_options, [quoted(true), portray(true), max_depth(0), spacing(next_argument)]). 
true. 

?- length(L,10). 
L = [_G320, _G323, _G326, _G329, _G332, _G335, _G338, _G341, _G344, _G347]. 

— update: trong các phiên bản mới hơn của SWI, cờ khác phải được thay đổi:

?- current_prolog_flag(T,V), atom_concat(_,options,T). 
T = answer_write_options, 
V = [quoted(true), portray(true), max_depth(10), spacing(next_argument)] . 

?- set_prolog_flag(answer_write_options, [quoted(true), portray(true), max_depth(0), spacing(next_argument)]). 
true. 
Các vấn đề liên quan