Требуется комбинация, за которой следует перестановка.
Для комбинации:
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(2,[1,2,3],List).
List = [1, 2] ;
List = [1, 3] ;
List = [2, 3] ;
false.
Для перестановки просто используйте SWI-Prologpermutation/2
в списках библиотек
:- use_module(library(lists)).
?- permutation([1,2],R).
R = [1, 2] ;
R = [2, 1] ;
false.
Соединение их
comb_perm(N,List,Result) :-
comb(N,List,Comb),
permutation(Comb,Result).
По вашему запросу
?- comb_perm(2,[1,2,3],R).
R = [1, 2] ;
R = [2, 1] ;
R = [1, 3] ;
R = [3, 1] ;
R = [2, 3] ;
R = [3, 2] ;
false.
Изменено для вашего предиката
permutInListN(List,N,Result) :-
comb(N,List,Comb),
permutation(Comb,Result).
Пример
?- permutInListN([1,2,3],2,R).
R = [1, 2] ;
R = [2, 1] ;
R = [1, 3] ;
R = [3, 1] ;
R = [2, 3] ;
R = [3, 2] ;
false.