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]
...
答案 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]
,则矩阵H1
和H2
的总和为H
矩阵T1
和T2
的总和为T
。
matrix_add([H1|T1], [H2|T2], [H|T]) :-
vector_add(H1, H2, H),
matrix_add(T1, T2, T).
完成matrix_add
谓词。你现在必须写vector_add
。 vector_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])
或其他内容。
以下是使用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]].