2011-02-11 16 views
6

zrobiłem trochę kodu do tworzenia macierzy współrzędnych (jak na szachownicy), jest następujący:Dlaczego „...” pojawia się w mojej odpowiedzi matrycy w Prologu

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). 

Pierwszy raz stracony poszło dobrze, ale kiedy zwiększany wymiary matrycy, te „kropki” na końcu matrycy pojawiają się zwiększając jeden koordynować jak wzrasta wymiar, jak tak:

?- 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|...], [...|...]|...]] . 

ktoś ma jakiś trop dlaczego tak się dzieje?

Dziękujemy!

+0

odpowiedź przez fałszywe poniżej daje gruntowne wyjaśnienie wielokropkiem (...) w ekranie domyślnym przez „toplevel” Prolog że zapytaniami zawierają niezwiązane zmienne. Twoje pytanie sugeruje, że lista list ma reprezentować tablicę 2D "jak szachownica". W takim przypadku przydatne będzie pisanie niestandardowego predykatu wyświetlania. Elipsa (...) nie pojawi się, jeśli użyjesz ** write/1 **, aby wyświetlić termin Prolog, a bardziej przypominający szachownicę wygląd może zostać osiągnięty poprzez rozdzielenie list na nowe linie. – hardmath

Odpowiedz

7

Domyślnie toplevel pętli SWI drukuje warunki do głębokości 10. Głębsze części są zamieniane ... Można przedłużyć ten głębokość lub usunąć ten limit, ustawiając głębokość 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]. 

— zmiana: w nowszych wersjach SWI, inna flaga musi być zmieniony:

?- 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.