2011-02-11 15 views
6

ho fatto un po 'di codice per la creazione di una matrice di coordinate (come una scacchiera), è la seguente:Perché "..." appare nella mia risposta della matrice in 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). 

La prima volta che ho eseguito è andata bene, ma quando incrementato le dimensioni della matrice, i "punti" alla fine della matrice cominciano ad apparire incrementare una coordinata come dimensione aumenta, come in questo modo:

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

Qualcuno ha qualche indizio perché questo succede?

Grazie!

+0

la risposta dalla falsa seguente fornisce una spiegazione approfondita del puntini di sospensione (...) in una visualizzazione di default da "di primo livello" query Prolog che contenere variabili non associate La tua domanda suggerisce che l'elenco delle liste debba rappresentare un array 2D "come una scacchiera". In tal caso, troverai utile scrivere un predicato di visualizzazione personalizzato. I puntini di sospensione (...) non appariranno se si usa ** write/1 ** per visualizzare un termine Prolog, e un aspetto simile a una scacchiera può essere ottenuto separando le liste con newline. – hardmath

risposta

7

Per impostazione predefinita, il ciclo toplevel di SWI stamperà termini fino a profondità di 10. parti più profonde sono sostituiti da ... È possibile estendere tale profondità o rimuovere tale limite impostando la profondità a 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]. 

— aggiornamento: nelle versioni più recenti di SWI, un'altra bandiera deve essere cambiato:

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