在Prolog中从矩阵生成平方

时间:2017-10-08 12:49:37

标签: list matrix prolog

我有一个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的平方,然后矩阵作为第二个,而正方形中的数字作为第三个参数。 有人有任何提示吗?我以为我可能不得不再次使用头尾模式;获取给定行/列的前三个数字,然后执行此操作三次,但我不知道这是否可行且有效。

非常感谢任何评论!

1 个答案:

答案 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)
     

ElemIndex的{​​{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