List Prolog-返回矩阵的第n行

List Prolog-返回矩阵的第n行,list,matrix,prolog,counter,swi-prolog,List,Matrix,Prolog,Counter,Swi Prolog,我试图编写谓词rowN/3,它返回矩阵的第n个元素(在本例中为行)。 例如: 我正在与柜台搏斗。我试图找到一些非常相似的例子,但没有成功。到目前为止,我已经成功地写下: 代码: 这句话没有多大意义: rowN(L,[],[]). 因为第二个参数是一个整数(如果我理解正确的话),您使用的是一个列表。你几乎所有的论点都是这样。此外,在递归调用中使用RowI 解决方案 解决方案是首先指定第一行(I=1)等于矩阵头: rowN([H|_],1,H). 接下来,您需要找到一种迭代方法来枚举整个矩阵。因

我试图编写谓词
rowN/3
,它返回矩阵的第n个元素(在本例中为行)。 例如:

我正在与柜台搏斗。我试图找到一些非常相似的例子,但没有成功。到目前为止,我已经成功地写下:

代码:


这句话没有多大意义:

rowN(L,[],[]).
因为第二个参数是一个整数(如果我理解正确的话),您使用的是一个列表。你几乎所有的论点都是这样。此外,在递归调用中使用
RowI

解决方案 解决方案是首先指定第一行(
I=1
)等于矩阵头:

rowN([H|_],1,H).
接下来,您需要找到一种迭代方法来枚举整个矩阵。因此,标题肯定是某种形式:

rowN([H|T],I,X) :-
#   ...
现在我们假设
I
不等于
1
(我们将在后面讨论此主题)。在这种情况下,我们需要进一步遍历矩阵,因此我们将取尾部并将计数器
I
设置回一个。这可以通过以下方式实现:

rowN([_|T],I,X) :-
    I1 is I-1,
    rowN(T,I1,X).
我们的谓词是:

rowN([H|_],1,H).
rowN([_|T],I,X) :-
    I1 is I-1,
    rowN(T,I1,X).
现在,如果使用此谓词,它将给出正确的结果:

?- rowN([[1,2],[3,4],[5,6]], 2, R).
R = [3, 4] ;
false.
问题是谓词为什么不生成其他结果:在显示第一个结果后,对于
rowN([[1,2],[3,4],[5,6]],2,R):-rowN([[3,4],[5,6]],1,[3,4])。
,它可以尝试找到替代方法。它通过使用第二个子句来实现这一点,但是它最终会耗尽所有行,并调用
rowN([],\uu,u)
谓词,因为没有一个子句匹配,它将失败

这个解决方案并不完美:它不能在所有方向上正确工作,这在Prolog中通常很难实现。这就是优秀的Prolog程序员编写库的原因

使用的内置
nth1/3
您可以在swi prolog中使用谓词,而不是重新发明轮子。尽管参数是交换的-您需要像调用
nth1(2,[[1,2],[3,4],[5,6]],R那样调用它。
-它的优点是,它可以在更多方向上工作,而大多数人可以在快速解决方案中找到它,它几乎肯定是无错误的(因为使用谓词的所有Prolog程序都对它进行了数十亿次测试)其中一些构建器在C++中实现,有时会更快。例如:

?- nth1(2, [[1,2],[3,4],[5,6]], R).
R = [3, 4].

?- nth1(I, [[1,2],[3,4],[5,6]], [5,6]).
I = 3.

?- nth1(I, [[1,2],[3,4],[5,6]], R).
I = 1,
R = [1, 2] ;
I = 2,
R = [3, 4] ;
I = 3,
R = [5, 6].

?- nth1(I,M,[2,3]).
I = 1,
M = [[2, 3]|_G23] ;
I = 2,
M = [_G22, [2, 3]|_G26] ;
I = 3,
M = [_G22, _G25, [2, 3]|_G29] ;
I = 4,
M = [_G22, _G25, _G28, [2, 3]|_G32] .

因此,您可以询问第二行是什么,询问行
[5,6]
位于何处,通过回答索引
I
和行
R
的元组,使查询更加通用,并在某处生成一个矩阵
[2,3]

这个答案非常深刻!谢谢@CommuSoft
?- rowN([[1,2],[3,4],[5,6]], 2, R).
R = [3, 4] ;
false.
?- nth1(2, [[1,2],[3,4],[5,6]], R).
R = [3, 4].

?- nth1(I, [[1,2],[3,4],[5,6]], [5,6]).
I = 3.

?- nth1(I, [[1,2],[3,4],[5,6]], R).
I = 1,
R = [1, 2] ;
I = 2,
R = [3, 4] ;
I = 3,
R = [5, 6].

?- nth1(I,M,[2,3]).
I = 1,
M = [[2, 3]|_G23] ;
I = 2,
M = [_G22, [2, 3]|_G26] ;
I = 3,
M = [_G22, _G25, [2, 3]|_G29] ;
I = 4,
M = [_G22, _G25, _G28, [2, 3]|_G32] .