0

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

例子:

?- 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).
4

1 回答 1

1

以下给出了您描述的结果:

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

请注意,这是来自libraryaggregate_all/3的非标准谓词。有使用 ISO 谓词的替代实现。aggregatebagof/3

于 2015-03-22T15:41:43.200 回答