2014-12-13 2 views
0

У меня есть этот код, где я хочу печатать плату в консоли. Код работает как ожидалось с точки зрения его печати, но в конце этого он возвращает «нет», а не «да». Как я могу вернуть эту рекурсию true?Рекурсия Prolog всегда заканчивается на

Главный код:

printLine(_,Size,Size). 
printLine([H1,H2|R],Size,Indice) :- 
     write(H1), write(' '), write(H2), write(' '), 
     IndiceNovo is Indice+1, 
     printLine(R,Size,IndiceNovo). 

printTops([]). 
printTops([H|T]) :- write(H),write(' '),printTops(T). 

printBoard(_,_,Size,Size*2,_):- nl,nl, write('end'). 
printBoard(Numeros,Topos,Size,Indice,BarrelIndex):- 
     calculateDiv(Size,D), nl, 
     writeDiv(D), nl, 

     TopoIndex1 is (1+BarrelIndex*Size), 
     TopoIndex2 is (Size + BarrelIndex*Size), 

     slice(Topos,TopoIndex1,TopoIndex2,TopsTemp), 
     write(' '), printTops(TopsTemp),nl, 

     Indice2 is Indice+1, 

     Index1 is (1+Indice*Size*2), Index2 is (Size*2 + (Indice*Size*2)), 
     slice(Numeros,Index1,Index2,Linha), 
     printLine(Linha,Size,0),nl, 
     Index21 is (1+(Indice2*Size*2)), Index22 is (Size*2 + (Indice2*Size*2)), 
     slice(Numeros,Index21,Index22,Linha2), 
     printLine(Linha2,Size,0),nl, 

     IndiceNovo is Indice+2, NovoBarrelIndex is BarrelIndex+1, 
     printBoard(Numeros,Topos,Size,IndiceNovo,NovoBarrelIndex). 

printBoard(Board,Topos):- 
     length(Topos,Size), 
     Size1 is truncate(sqrt(Size)), 
     printBoard(Board,Topos,Size1,0,0). 

Код проверки:

p:- 
     B= [1,2,3,4,5,6,7,8,3,4,1,5,7,8,2,6,2,1,4,3,6,7,8,5,5,7,6,8,1,3,4,2,4,6,8,7,3,2,5,1,7,8,2,1,4,5,6,3,6,3,5,2,8,4,1,7,8,5,7,6,2,1,3,4], 
     T= [10,13,26,23,15,21,17,19,25,18,14,90,22,20,64,84], 
     printBoard(B,T). 

Мой выход:

enter image description here

ответ

1

вам нужно оценить арифметику с является/2.

printBoard(_,_,Size,Size2,_):- Size2 is Size*2, nl,nl, write('end'). 
+0

Простой и эффективный. Большое спасибо! –

Смежные вопросы