【问题标题】:PROLOG Logic Programm - Addition of 2x2 matrixPROLOG 逻辑程序 - 添加 2x2 矩阵
【发布时间】:2016-04-26 16:55:24
【问题描述】:

我是 PROLOG 的新手,正在尝试一些简单的练习来熟悉它。但是,我坚持将 2x2matrix 与另一个更具体的列表中的列表相加。

这是我的代码,使用 SWI-Prolog 的输出是 False,我不知道为什么。任何帮助表示赞赏!

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

【问题讨论】:

  • 你在基本情况下巧妙地使用了S is X + Y,但在第二个子句中忘记了它:你有S1 = H + J
  • @Boris 你能详细说明一下吗?

标签: matrix prolog logic addition


【解决方案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 操作使用约束库。例如,使用 library(clpr) 您可以编写 {Sum = X+Y} 并使用相同的谓词进行加法 减法。)

这在头部使用统一以确保两个矩阵具有相同的维度,而maplist 负责V1V2 的长度相同。

或者您更喜欢列表列表。然后,找出将列表列表添加在一起的一般谓词(参见另一个答案!)。现在你有一个奇怪的组合,你提前知道一个维度的大小,但仍然试图穿越另一个维度。正如您目前的代码一样,您的基本情况总是失败。应该是:

matrixAdd([[],[]],[[],[]],[[],[]]).

这么多列表!)并且没有任何正文。尝试在您的原始代码中替换它,看看会发生什么。

【讨论】:

    【解决方案2】:

    您首先需要了解以下内容:

    • =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.

    Y 对任意 X 的解

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

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多