我熟悉Java语言,但是在理解语言序言时遇到了麻烦。我想创建一个仅在M为N x N的2D数组且M中的每个单元格都包含一个未绑定变量的情况下才返回true的函数矩阵(N,M)。 另外,我不确定我也了解什么是未绑定变量,并且如果我希望每个单元格都包含特定序列,我的方法会有什么不同。
任何帮助将不胜感激。
答案 0 :(得分:2)
此答案是尝试为您提供一些想法,让您入门,而不仅仅是提交完整的解决方案。
要学习Prolog,请完全不使用Java,C,C ++或任何其他命令式语言。序言是不同的。最好不要尝试将您在这些语言中了解的信息映射到Prolog。 Prolog没有功能,但是谓词。这些是描述某些事物的规则。 未绑定变量是尚未统一(或绑定)为特定值的变量。
运行Prolog并进入Prolog提示符,然后尝试一些操作以开始了解Prolog的工作方式。
例如,假设您对长度为N
的列表感兴趣。 Prolog有一个谓词length/2
(length
有2个参数):
1 ?- length([a,b,c], N).
N = 3.
列表[a,b,c]
具有3个元素。我也可以使用变量:
2 ?- length([X,Y,Z], N).
N = 3.
变量X
,Y
和Z
是未绑定的。使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 = 2
将Y
与值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