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 に答える