PROLOG Logic Programm - 添加2x2矩阵

时间:2016-04-26 16:55:24

标签: matrix prolog logic addition

我是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]).

2 个答案:

答案 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处理V1V2的长度相同。

或者您更喜欢列表列表。然后,找出将列表列表添加到一起的一般谓词(参见另一个答案!)。现在你有一个奇怪的组合,你可以事先了解一个维度的大小,但仍然试图遍历另一个维度。正如您的代码目前一样,这是您的基本案例始终失败。它应该是:

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).