2015-03-22 7 views
0

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

Примеры:

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

Я понимаю, что у вашего списка нет дубликатов? Как '[2,2,3]'? – lurker

ответ

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.