?- set_prolog_flag(double_quotes, chars).
true.
?- List = "abcde",
bagof(X-Y, Pre^Ys^( append(Pre, [X|Ys], List), member(Y,Ys) ), XYs).
List = "abcde",
XYs = [a-b,a-c,a-d,a-e,b-c,b-d,b-e,c-d,c-e,d-e].
?- List = [A,B,C,D,E],
bagof(X-Y, Pre^Ys^( append(Pre, [X|Ys], List), member(Y,Ys) ), XYs).
List = [A,B,C,D,E],
XYs = [A-B,A-C,A-D,A-E,B-C,B-D,B-E,C-D,C-E,D-E].
Из вашего вопроса не так очевидно, что вы хотите, но кажется, что вы с удовольствием используете findall/3
. Вышеупомянутые решения используют bagof/3
, который является несколько более цивилизованной версией findall/3
. bagof/3
учитывает переменные, и, таким образом, вы получаете тот же результат с конкретными символами [a,b,c,d,e]
или со списком переменных [A,B,C,D,E]
.
Вы использовали термины foo(a,b)
, в таких ситуациях это более распространенным (и удобным) сказать a-b
.