Вы, вероятно, допустили ошибку в своем последнем звонке:
generationRow(L,_,0,L).
generationRow(Board, X, Y, <b>New</b>) :-
Y > 0,
X1 is X-1, % account for 0 indexed array
Y1 is Y-1,
replaceCell(Board,X1,Y1,1, NewBoard),
generationRow(NewBoard, X, Y1, <b>New</b>).
В исходном фрагменте кода вы сделали вызов с generationRow(NewBoard,X,Y1,NewBoard)
, это означает, что вы искали способ к generateRow/4
, где начальная и конечная доски - это одинаковые , так что это гарантирует, что ни один рекурсивный вызов не сможет сделать дальнейшую «прогрессию» после того, как вы сгенерировали newBoard
.
В конце концов, replaceCell
(хорошо, если я правильно понял) меняет одну ячейку доски, и вы хотите сделать рекурсивный вызов, чтобы изменить ячейки в оставшихся строках.
Большинство интерпретаторов Пролога предупреждают вас, если переменная встречается только один раз в предложении. Например, в SWI Prolog мы получаем:
Warning: /tmp/pl.pl:6:
<b>Singleton variables</b>: [New]
Таким образом, это означает, что вы определили New
в голове, но никогда в теле не связали его должным образом. Это как минимум странно. Если вы действительно не интересуетесь этой переменной, вы обычно используете подчеркивание (тогда интерпретатор не покажет эту ошибку).