代表prolog的第n个学位

时间:2014-03-29 07:46:21

标签: prolog

  matrix_add([[0,0,1],[0,1,1],[1,1,1]],[[1,0,0],[1,1,0],[1,1,1]]).

我预期的结果是

 matrix A is [0,0,1],[0,1,1],[1,1,1]
 matrix B is [1,0,0],[1,1,0],[1,1,1]
 sum is [1,0,1],[1,2,1],[2,2,2]

这个可以在n度。

例如matrix_add([[0,1],[2,3]],[[2,1],[6,4]]).是可能的。

 matrix_add([],[],[]).
 matrix_add(M1,M2,Result):-

        nl,
        write('matrix A is'),
        nl,
        writeln(M1), 

//但它不起作用。

        nl,
        write('matrix B is'),
        nl,
        writeln(M2),
        Result is (M1 + M2),
        nl,

        nl,
        write('sum is'),
        nl,
        writeln(Result).

你能告诉我如何显示这个数组数组吗?

=============================================== ====

  matrix_add([M1|M1s],[M2|M2s]):-
       write('==============='),
       nl,
       write('Matrix A is'),
       nl,
       write(M1),
       write(M1s),
       nl,
       write('==============='),
       nl,
       write('Matrix B is'),
       nl,
       write(M2),
       writeln(M2s),
       nl,
       matrix_add_aux(M1,M2,[R|Rs]),
       write('==============='),
       nl,
       write('Sum is'),
       nl,
       writeln(R),
       writeln(Rs).

我希望结果是这样的。

  matrix A is 
  [0,0,1]
  [0,1,1]
  [1,1,1]
  ...

2 个答案:

答案 0 :(得分:1)

这符合您的尝试:

%initial call
matrix_add(M1,M2):-
    write('Matrix A is'),
    writeln(M1),
    write('Matrix B is'),
    writeln(M2),
    matrix_add_aux(M1,M2,Result),
    write('Sum is'),
    writeln(Result).

%now check rows one by one

%base case
matrix_add_aux([],[],[]).

%recursive case
matrix_add_aux([X|Xs],[Y|Ys],[R|Rs]):-
    matrix_add_row(X,Y,R),
    matrix_add_aux(Xs,Ys,Rs).

%and now sum the values in the row

%base case
matrix_add_row([],[],[]).

%recursive case
matrix_add_row([X|Xs],[Y|Ys],[R|Rs]):-
    R is X + Y,
    matrix_add_row(Xs,Ys,Rs).

答案 1 :(得分:0)

吉列尔莫的答案是正确的,但这里有更多关于到达目的地的解释。

使用内置maplist进行此操作的方法非常简短。但是为了学习如何处理Prolog中的列表,这是一个分配,这里有一些关于如何处理问题的提示。

二维矩阵是一维阵列(或矢量)的一维阵列(或矢量)。数组是有序的值序列,这正是Prolog中的列表。因此,数组可以方便地用列表表示。如示例输入矩阵所示:

第一个矩阵:[[0,0,1],[0,1,1],[1,1,1]]

在此矩阵中,第一行为[0,0,1],第二行为[0,1,1],第三行为[1,1,1]

要添加两个矩阵,可以将每个行作为数组进行操作,然后将这些数组添加到一起。你如何添加两个数组?相同的过程:您浏览每个元素并将元素添加到一起。所以你知道你的解决方案会是这样的。

你知道(希望)在Prolog中,[H|T]表单代表一个列表,并为您提供列表的第一个元素H,以及列表的其余部分T。例如,如果您有:

[H|T] = [[0,0,1],[0,1,1],[1,1,1]]

然后H = [0,0,1]T = [[0,1,1],[1,1,1]]

要解决您的问题,首先,用简单的语言写出解决方案,这样您才能知道自己在做什么。 :)

空矩阵加上空矩阵是空矩阵。

matrix_add([], [], []).

现在回过头来讨论如何添加两个矩阵,并将矩阵看作一个带有头尾的列表列表:

如果向量[H1|T1][H2|T2]的总和为[H|T],则矩阵H1H2的总和为H矩阵T1T2的总和为T

matrix_add([H1|T1], [H2|T2], [H|T]) :-
    vector_add(H1, H2, H),
    matrix_add(T1, T2, T).

完成matrix_add谓词。你现在必须写vector_addvector_add谓词看起来就像matrix_add,除了向量中的每个元素只是一个数字,而不是列表,所以你可以添加它们并完成。

运行查询时:

matrix_add([[0,0,1],[0,1,1],[1,1,1]],[[1,0,0],[1,1,0],[1,1,1]], Result).

Prolog会为您显示答案:

Result = [[1,0,1],[1,2,1],[2,2,2]]

您可以使用writeln进行显示,但这是在Prolog中执行此操作的更常见方式,因为它在参数中提供结果而不是仅将其写入显示。如果要将其写入显示,可以始终在代码中放置writeln([H1|T1])或其他内容。

<小时/> 的 EPILOGUE

以下是使用maplist的缩写解决方案:

matrix_add(M1, M2, Result) :-
    writeln('Matrix A is'),
    write_matrix(M1),
    writeln('Matrix B is'),
    write_matrix(M2),
    maplist(maplist(add), M1, M2, Result),
    writeln('Matrix A+B is'),
    write_matrix(Result).

write_matrix(M) :-
    maplist(writeln, M), nl.

add(X, Y, Z) :- Z is X + Y.

结果:

?- matrix_add([[0,0,1],[0,1,1],[1,1,1]],[[1,0,0],[1,1,0],[1,1,1]], Result).
Matrix A is
[0,0,1]
[0,1,1]
[1,1,1]

Matrix B is
[1,0,0]
[1,1,0]
[1,1,1]

Matrix A+B is
[1,0,1]
[1,2,1]
[2,2,2]

Result = [[1, 0, 1], [1, 2, 1], [2, 2, 2]].