我是PROLOG的新手,正在尝试一些简单的练习来熟悉它。但是我仍然坚持在另一个中添加2x2matrix,更具体地说是列表中的列表。
这是我的代码,使用SWI-Prolog的输出是假的,我不知道为什么。任何帮助表示赞赏!
matrixAdd([X],[Y],[S]) :- S is X + Y.
matrixAdd([[H|A],[I|B]],[[J|C],[K|D]],[[S1|Sum1],[S2|Sum2]]) :-
S1 = H + J,
S2 = I + K,
matrixAdd([A,B],[C,D],[Sum1,Sum2]).
答案 0 :(得分:1)
诠:
?- A = 2 + 3.
A = 2+3.
?- A = 2 + 3, A == 5.
false.
?- A = 2 + 3, A = 5.
false.
?- A is 2 + 3, A =:= 10/2.
A = 5.
?- A is 2 + 3, A = 10/2.
false.
弄清楚为什么你会得到这些答案。
此外,请考虑您希望如何表示矩阵。它需要是一个嵌套列表吗?例如,它可能类似于matrix(dim(2,2), [1,2,3,4])
。然后,添加两个矩阵就像这样简单:
matrix_sum(matrix(D, V1), matrix(D, V2), matrix(D, Sum)) :-
maplist(add, V1, V2, Sum).
add(X, Y, Sum) :-
Sum is X + Y.
(您可以使用约束库进行add
操作。例如,使用库(clpr),您可以编写{Sum = X+Y}
并使用相同的谓词添加和< / strong>用于减法。)
这会在头部使用统一来确保两个矩阵具有相同的维度,而maplist
处理V1
和V2
的长度相同。
或者您更喜欢列表列表。然后,找出将列表列表添加到一起的一般谓词(参见另一个答案!)。现在你有一个奇怪的组合,你可以事先了解一个维度的大小,但仍然试图遍历另一个维度。正如您的代码目前一样,这是您的基本案例始终失败。它应该是:
matrixAdd([[],[]],[[],[]],[[],[]]).
(这么多名单!)并且没有任何正文。尝试在原始代码中替换它,看看会发生什么。
答案 1 :(得分:0)
您首先需要了解以下内容:
=
和is/2
[Head|Tail]
是否与[Element1,Element2]
[X]
的统一仅在您传递包含1个元素的列表时才有效。就像[[A,B],[C,D]]
只匹配2乘2矩阵一样。 (注意,在这种情况下,元素A,B,......也可以是列表) 对于你的硬编码解决方案,解决所有这些问题应该有效,但我现在想把它留给你。
matrixAddHardcode([[A1,A2],[A3,A4]],[[B1,B2],[B3,B4]],[[S1,S2],[S3,S4]]) :- S1 is A1 + B1, S2 is A2 + B2, S3 is A3 + B3, S4 is A4 + B4.
任何X by Y的解决方案
matrixAddFix([],[],[]). matrixAddFix([L1|T1],[L2|T2],[S1|TS]) :- listSum(L1,L2,S1), matrixAddFix(T1,T2,TS). listSum([],[],[]). listSum([H1|T1],[H2|T2],[S1|TS]) :- S1 is H1+H2, listSum(T1,T2,TS).