我有一个6x6数字的矩阵,我正在编写一个prolog代码,它给出了某个行,列或方形的数字。例如:
0n 1n 2n 3n 4n 5n
0n [[1,2,3,4,5,6]
1n [2,3,4,5,6,1]
2n [3,4,5,6,1,2]
3n [4,5,6,1,2,3]
4n [5,6,1,2,3,4]
5n [6,1,2,3,4,5]]
我已经有行和列的代码,类似于:
row(1,[A|_],A).
row(Y,[_|B],X) :-
Y-1 is Y1,
row(Y1,B,X).
但现在我仍然坚持如何生成一个3x3的方格。我想使用坐标,所以第一个参数应该是(1,3),它将给出行1n和列3n的平方,然后矩阵作为第二个,而正方形中的数字作为第三个参数。 有人有任何提示吗?我以为我可能不得不再次使用头尾模式;获取给定行/列的前三个数字,然后执行此操作三次,但我不知道这是否可行且有效。
非常感谢任何评论!
答案 0 :(得分:0)
首先,你获取行的谓词是不安全的:
row(1,[A|_],A).
row(Y,[_|B],X) :-
Y-1 is Y1,
row(Y1,B,X).
如果我查询row(0,[1,4,2,5],X).
,它会立即陷入无限循环,如果我使用row(2,[1,4,2,5]).
它将首先给我正确的结果,但随后进入无限循环时寻找更多答案。
更好的方法是:
row(1,[A|_],A).
row(Y,[_|B],X) :-
Y > 1,
Y-1 is Y1,
row(Y1,B,X).
从现在起Y > 1
保护了Y
小于或等于1时不会执行递归的事实。
话虽如此,你不需要自己构造这个谓词:大多数Prolog解释器已经有这样一个谓词:nth1/3
:
nth1(?Index, ?List, ?Elem)
当
Elem
是Index
的{{1}}'元素时,属实。数数 从1开始。
如果您可以假设此谓词存在,则可以使用:
List
其中elem(I,J,Matrix,Cell) :-
nth1(I,Matrix,Row),
nth1(J,Row,Cell).
是行号,I
是我们希望获取的列号。
如果它不存在,我建议您将J
谓词重命名为row/3
,因为它是等效的。
如果你想从0开始计算(问题的顶部是建议的),你可以使用nth1/3
代替nth0/3
。