最简单的方法是maplist http://www.swi-prolog.org/pldoc/doc_for?object=maplist/4:
add(X, Y, Z) :- Z is X + Y.
op_lists(L1, L2, R) :-
maplist(maplist(add), L1, L2, R).
这使:
| ?- op_lists([[1,2,3,4],[5,6,7,8]], [[1,2,3,4],[5,6,7,8]], R).
R = [[2,4,6,8],[10,12,14,16]]
yes
| ?-
在表达式中:
maplist(maplist(add), L1, L2, R).
maplist(G, L1, L2, R)
calls G
的每个元素上L1
and L2
,导致每个元素R
。由于每个元素L1
and L2
是一个列表,那么G
在这种情况下是maplist(add)
哪个调用add
在子列表的每个元素上。
你显然可以修改add(X, Y, Z)
可以对每对元素进行任何您想要的操作。您还可以使用 CLP(FD) 使加法更加“相关”:
add(X, Y, Z) :- Z #= X + Y.
然后你还可以得到,例如:
| ?- op_lists([[1,2,3,4],[5,6,7,8]], L, [[3,6,9,12],[10,12,14,16]]).
L = [[2,4,6,8],[5,6,7,8]]
yes
| ?-
如果你想在不这样做的情况下执行此操作maplist
,你仍然可以使用add/3
并使用两层方法:
op_lists([], [], []).
op_lists([LX|LXs], [LY|LYs], [LR|LRs]) :-
op_elements(LX, LY, LR),
op_lists(LXs, LYs, LRs).
op_elements([], [], []).
op_elements([X|Xs], [Y|Ys], [R|Rs]) :-
add(X, Y, R),
op_elements(Xs, Ys, Rs).
您可以在这里看到简单的列表处理模式,其中使用maplist
为您照顾。