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

List Prolog返回空列表,递归谓词的基本情况有问题,list,recursion,prolog,predicate,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, replac

因此,基本上我正在使用一个列表列表,创建一个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).
执行生成行时,如下所示: 新一代世界银行(董事会,10100,新董事会) 写(新黑板)


它返回Newboard=[],这让我非常震惊,因为replacecell在调用时返回正确的数组。因此,我认为问题必须与我的基本情况有关。根据算法,基本情况应该是Y=0,X永远不会改变,board应该等于Newboard。我认为我做得对。

您上次打电话时可能犯了一个错误:

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).

因此,这意味着您在头部定义了
New
,但在身体中从未正确链接它。这至少有些奇怪。如果您真的对该变量不感兴趣,通常会使用下划线(那么解释器将不会显示此错误)。

非常感谢,我想我的误解是,我认为我必须将该参数设置为新板,以便prolog知道将最终值分配给什么?如果我们从不告诉它New=Newboard,它如何确定“New”是什么?或者我的基本大小写说明了这一点吗?@DevG:no,您在谓词的开头定义了
New
,因此您将其与子句开头部分的参数链接起来。每个子句都有自己的变量范围。
Warning: /tmp/pl.pl:6:
    Singleton variables: [New]