Это комментарий, вставленный в ответ, потому что он слишком велик для комментария.
Это частичный ответ, чтобы заставить ОП писать лучшие примеры в своем вопросе.Я не понимаю параметр U и, как я отметил в комментариях, у меня может быть действительно простое решение его проблемы, но, вероятно, он не будет в чем-то, что он понимает.Поскольку я не могу понять весь вопрос, вот ответ, который он, вероятно, не сможет понять.И да, я могу написать отличные ответы и отличные вопросы .
Так что, если ОП может объяснить параметр U, чтобы я мог его понять, то я могу видеть,моя идея работает, и если так, отправьте ответ и объясните это здесь.Но если ОП не помогает мне помочь ему, то ответ может быть сметен в песках времени.
Для первой части
comb(0,_,[]).
comb(N,[X|T],[X|Comb]) :-
N>0,
N1 is N-1,
comb(N1,T,Comb).
comb(N,[_|T],Comb) :-
N>0,
comb(N,T,Comb).
когда пробег вернется
?- comb(3,[1,2,3,4,5],C).
C = [1, 2, 3] ;
C = [1, 2, 4] ;
C = [1, 2, 5] ;
C = [1, 3, 4] ;
C = [1, 3, 5] ;
C = [1, 4, 5] ;
C = [2, 3, 4] ;
C = [2, 3, 5] ;
C = [2, 4, 5] ;
C = [3, 4, 5] ;
false.