将结果存储在Prolog中的列表中

时间:2015-07-09 21:59:34

标签: prolog

我正在尝试计算算术计算并将结果存储在Prolog中的新列表中。 函数原型如下:

calculation(List1, ListofLists, ResultList)

为第一个参数我提供一个列表,第二个参数是列表列表,第三个是结果列表。我使用每个列表列表计算第一个参数列表,并将结果存储在结果列表中。 那么有人可以告诉我如何将结果存储在结果(空)列表中?

3 个答案:

答案 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)

如果我理解正确,您希望对List1ListofLists的每个成员进行一些计算,并获得结果列表。

您可以使用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]].