SWI Prolog是列表中的每个元素

时间:2015-03-22 15:31:07

标签: list prolog list-manipulation

我想写一个谓词,它将从我的列表中获取每个元素,而其他元素则不会重复。

示例:

?- predicate([2,3,5,6],X).
X = [6,10,12,15,18,30].        % expected result

?- predicate([1,6,10],X).
X = [6,10,60].                 % expected result

我正在尝试这样的事情,但我不知道如何升级此代码:

predicate([],[]).
predicate([_|[]],[]) :-
    !.
predicate([H,S|T],[V|X]) :-
    V is H*S,
    predicate([H|T],X).

1 个答案:

答案 0 :(得分:1)

以下是您描述的结果:

predicate(Xs, Ys):-
  aggregate_all(
    set(Y),
    (
      member(X1, Xs),
      member(X2, Xs),
      X1 =\= X2,
      Y is X1 * X2
    ),
    Ys
  ).

请注意,aggregate_all/3是来自library aggregate的非标准谓词。有些替代实现使用ISO谓词bagof/3