SWI Prolog множит каждый элемент списка

Я хочу написать предикат, который будет брать каждый элемент из моего списка и мультировать с другими без дубликатов.

Примеры:

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

person user3916311    schedule 22.03.2015    source источник
comment
Я так понимаю, в вашем списке нет дубликатов? Нравится [2,2,3]?   -  person lurker    schedule 22.03.2015


Ответы (1)


Следующее дает результаты, которые вы описываете:

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

Обратите внимание, что aggregate_all/3 — это нестандартный предикат из библиотеки aggregate. Существуют альтернативные реализации, использующие предикат ISO bagof/3.

person Wouter Beek    schedule 22.03.2015