Prolog返回空列表,递归谓词的基本情况存在问题

时间:2019-06-06 20:09:44

标签: list recursion prolog predicate

因此,基本上,我正在使用创建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。我以为我做对了。

1 个答案:

答案 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,但从未在身体中正确定义它。这至少是奇怪的。如果您真的对该变量不感兴趣,则通常使用下划线(然后解释器将不会显示此错误)。