Prolog处理2D数组和未绑定变量

时间:2019-02-22 12:24:42

标签: prolog

我熟悉Java语言,但是在理解语言序言时遇到了麻烦。我想创建一个仅在M为N x N的2D数组且M中的每个单元格都包含一个未绑定变量的情况下才返回true的函数矩阵(N,M)。 另外,我不确定我也了解什么是未绑定变量,并且如果我希望每个单元格都包含特定序列,我的方法会有什么不同。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

此答案是尝试为您提供一些想法,让您入门,而不仅仅是提交完整的解决方案。

要学习Prolog,请完全不使用Java,C,C ++或任何其他命令式语言。序言是不同的。最好不要尝试将您在这些语言中了解的信息映射到Prolog。 Prolog没有功能,但是谓词。这些是描述某些事物的规则。 未绑定变量是尚未统一(或绑定)为特定值的变量。

运行Prolog并进入Prolog提示符,然后尝试一些操作以开始了解Prolog的工作方式。

例如,假设您对长度为N的列表感兴趣。 Prolog有一个谓词length/2length有2个参数):

1 ?- length([a,b,c], N).
N = 3.

列表[a,b,c]具有3个元素。我也可以使用变量:

2 ?- length([X,Y,Z], N).
N = 3.

变量XYZ是未绑定的。使length/2成为谓词而不是函数的原因是它只是描述了长度和列表之间的关系。您还可以写:

3 ?- length(L, 3).
L = [_5112, _5118, _5124].

Prolog找到长度为3的列表的解L。变量_xxxx匿名未绑定变量。

另一个例子:

4 ?- length([X,Y,Z], N), Y = 2, write([X,Y,Z]).
[_5850,2,_5862]
Y = 2,
N = 3.

在这里,我是说我想要一个列表[X,Y,Z],长度N,值Y与2不能一一对应。我将其写出来。当我写列表时,我得到[_xxxx, 2, _xxxx],所以中间值是绑定的,其他两个不是。您在这里也要小心。请注意,我没有说将2分配给Y 。这不是=所做的。 =/2是Prolog中的 unification 运算符。如果参数不可更改,它将成功。如果涉及变量,Prolog会将变量绑定到使其无法固定的值(如果可能)。在这种情况下,Y = 2Y与值2绑定以使其成功,然后继续执行下一条语句。 =/2是完全反身的,所以我也可以写2 = Y,用这种方式写绝对没有错。尽管它可能会引起误解,但我们势在必行的编程大脑似乎更愿意将其视为Y = 2

现在将其扩展到您的NxN矩阵。这是一个长度为N的列表,其元素为长度为N的列表。一个元素可以由length(Row, N)确定。如果您说matrix(N, M),那么您也知道length(M, N)应该是正确的。

要完全解决此问题,您需要枚举M的行(列表M的元素)并在该行上强制执行长度规则。您还可以查看maplist/3,它可以使此操作变得更容易。

请注意,我没有包含任何变量绑定,因此所有这些都是未绑定变量。如果您想绑定变量,那么在没有更多关于绑定特定值的规则的信息(例如,是否有完整的绑定矩阵)的情况下,我将无法提供比上述更多的输入,还是您只想绑定特定条目?等)。

如果您想要更多列表处理示例,我强烈建议仔细阅读此处给出的问题和解决方案:99 Prolog Problems