我正在尝试计算算术计算并将结果存储在Prolog中的新列表中。 函数原型如下:
calculation(List1, ListofLists, ResultList)
为第一个参数我提供一个列表,第二个参数是列表列表,第三个是结果列表。我使用每个列表列表计算第一个参数列表,并将结果存储在结果列表中。 那么有人可以告诉我如何将结果存储在结果(空)列表中?
答案 0 :(得分:2)
使用library lambda,您可以写:
:- use_module(library(lambda)).
:- use_module(library(clpfd)).
calculation(L1, L2, Compute, L) :-
maplist([L2,Compute] +\X^Y^call(Compute,L2, X, Y), L1, L).
% my_compute succeeds when R is the list of all the products
% of the numbers component of L with the number V
my_compute(L, V, R) :-
maplist(V +\X^Y^maplist(V +\Z^T^(T #= Z * V), X, Y), L, R).
以下是一个例子:
?- calculation([1,2,3], [[4,5],[6,7]], my_compute, Zss).
Zss = [[[4, 5], [6, 7]], [[8, 10], [12, 14]], [[12, 15], [18, 21]]].
?- Zss = [[[4,5],[6,7]],[[8,10],[12,14]],[[12,15],[18,21]]],
calculation(Xs, [[4,5],[6,7]], my_compute, Zss).
Xs = [1, 2, 3].
?- Zss = [[[4,5],[6,7]],[[8,10],[12,14]],[[12,15],[18,21]]],
calculation([1,2,3], Xss, my_compute, Zss).
Xss = [[4, 5], [6, 7]].
答案 1 :(得分:1)
calculation([], [], []). calculation([X|Xs], [Y|Ys], [Z|Zs]) :- calculate(X, Y, Z), calculation(Xs, Ys, Zs).
与:
相同calculation(X, Y, Z) :- maplist(calculate, X, Y, Z).
无论哪种方式,您都需要一个谓词calculate/3
,它接受第一个参数,列表列表作为第二个参数,并计算结果。例如,将第二个参数中的列表相加并将其乘以第一个参数:
calculate(X, Ys, Z) :- list_sum(Ys, S), Z is X * S.
答案 2 :(得分:0)
如果我理解正确,您希望对List1
和ListofLists
的每个成员进行一些计算,并获得结果列表。
您可以使用findall执行此操作:
calculation(List1, ListofLists, ResultList) :-
findall(Result, (
member(List2, ListofLists),
your_computation(List1, List2, Result)
), ResultList).
例如,如果您将your_compuation
替换为append
,则会获得:
?- calculation([a,b],[[c,d],[e,f,g],[h]],X).
X = [[a, b, c, d], [a, b, e, f, g], [a, b, h]].