因此,基本上,我正在使用创建100x100网格的列表的列表。我正在下面建立一个谓词,该谓词进入网格并将一个行单元格交换为所有单元格并返回新的板。到目前为止,我所做的所有其他谓词均已按预期进行,因此我将仅介绍有问题的部分:
generationRow(L,_,0,L).
generationRow(Board,X,Y,New) :-
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,NewBoard).
当我这样执行生成行时: generationRow(Board,10,100,NewBoard) 写(Newboard)。
它返回Newboard = [],这让我大吃一惊,因为replacecell在调用时返回正确的数组。因此,我认为问题必须出在我的基本案例上。基于该算法,基本情况应为Y = 0时,X永远不会改变,并且board应该等于Newboard。我以为我做对了。
答案 0 :(得分:1)
您可能在上次通话中犯了一个错误:
generationRow(L,_,0,L).
generationRow(Board, X, Y, New) :-
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, New).
在原始代码片段中,您使用generationRow(NewBoard,X,Y1,NewBoard)
进行了呼叫,因此这意味着您正在寻找一种方法,generateRow/4
的初始板和最终板与相同,这样可以确保在生成newBoard
之后,没有递归调用可以使进一步的“进行”。
毕竟,replaceCell
(据我所知正确理解)更改了板上的一个单元格,并且您想进行递归调用以更改其余行中的单元格。
如果变量在子句中仅出现一次,则大多数Prolog解释器都会警告您。例如,在SWI Prolog中,我们得到:
Warning: /tmp/pl.pl:6:
Singleton variables: [New]
因此,这意味着您在头部定义了New
,但从未在身体中正确定义它。这至少是奇怪的。如果您真的对该变量不感兴趣,则通常使用下划线(然后解释器将不会显示此错误)。