【问题标题】:Generate square from matrix in Prolog在 Prolog 中从矩阵生成正方形
【发布时间】:2017-10-08 12:49:37
【问题描述】:

我有一个由 6x6 数字组成的矩阵,我正在编写一个序言代码,它可以为我提供特定行、列或正方形中的数字。例如:

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

非常感谢任何cmets!

【问题讨论】:

  • 在第一种情况下也不需要使用该模式。 Prolog 有一个 nth1/3 谓词。

标签: list matrix prolog


【解决方案1】:

首先,你获取行的谓词,是不安全的:

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)

ElemList 的第Index 元素时为真。数数 从 1 开始。

如果你可以假设这个谓词存在,你可以使用:

elem(I,J,Matrix,Cell) :-
    nth1(I,Matrix,Row),
    nth1(J,Row,Cell).

其中I 是行号,J 是我们希望获取的列号。

如果它不存在,我建议将您的 row/3 谓词重命名为 nth1/3,因为它是等效的。

如果您想从 0 开始计数(问题的顶部暗示了这一点),您可以使用 nth0/3 而不是 nth1/3

【讨论】:

  • 非常感谢!所以你写的elem 谓词应该在I、J 坐标上给出一个数字,对吗?
  • @Rose:正确。但是您也可以多方向使用它。就像查询I/Js 矩阵有一个3 等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
相关资源
最近更新 更多