Вы можете использовать append/ для перебора списка:
?- append(_,[X|R],[a,b,c,d]).
X = a,
R = [b, c, d] ;
X = b,
R = [c, d] ;
X = c,
R = [d] ;
X = d,
R = [] ;
false.
Затем используйте member/2, чтобы сформировать пару X-Y для каждого Y в R:
?- append(_,[X|R],[a,b,c,d]), member(Y,R), Pair=(X-Y).
X = a,
R = [b, c, d],
Y = b,
Pair = a-b ;
X = a,
R = [b, c, d],
Y = c,
Pair = a-c ;
X = a,
R = [b, c, d],
Y = d,
Pair = a-d ;
X = b,
R = [c, d],
Y = c,
Pair = b-c ;
X = b,
R = [c, d],
Y = d,
Pair = b-d ;
X = c,
R = [d],
Y = d,
Pair = c-d ;
false.
Затем используйте findall/3, чтобы собрать все пары в список:
?- findall(X-Y, (append(_,[X|R],[a,b,c,d]), member(Y,R)), Pairs).
Pairs = [a-b, a-c, a-d, b-c, b-d, c-d].
Таким образом, ваше окончательное решение может быть выражено как:
pairs(List, Pairs) :-
findall(X-Y, (append(_,[X|R],List), member(Y,R)), Pairs).
Пример использования:
?- pairs([a,b,c,d], Pairs).
Pairs = [a-b, a-c, a-d, b-c, b-d, c-d].
person
slago
schedule
25.05.2019
pairs (x:xs) = [ (x,y) | y<-xs ] ++ pairs xs ; pairs [] = []в нотации Haskell. Проще всего перевести это в предикат Пролога, который будет создавать все эти пары одну за другой при возврате, как предлагает вам ответ Мога.y<-xsсоответствуетmember(Y,XS);++соответствует дизъюнкции. - person Will Ness   schedule 02.05.2012