Prolog 序言丢弃置换

Prolog 序言丢弃置换,prolog,Prolog,我无法放弃重复排列。例如,我想 ?-permutation([1,2,1],L). L = [1, 2, 1] ; L = [1, 1, 2] ; L = [2, 1, 1] ; 。 但是我越来越 ?-permutation([1,2,1],L). L = [1, 2, 1] ; L = [1, 1, 2] ; L = [2, 1, 1] ; L = [2, 1, 1] ; L = [1, 1, 2] ; L = [1, 2, 1] ; .我认为更简单的方法是 perm_no_rep(L,

我无法放弃重复排列。例如,我想

?-permutation([1,2,1],L).
L = [1, 2, 1] ;
L = [1, 1, 2] ;
L = [2, 1, 1] ;
。 但是我越来越

?-permutation([1,2,1],L).
L = [1, 2, 1] ;
L = [1, 1, 2] ;
L = [2, 1, 1] ;
L = [2, 1, 1] ;
L = [1, 1, 2] ;
L = [1, 2, 1] ;

.

我认为更简单的方法是

perm_no_rep(L, P) :-
  setof(P, permutation(L, P), Ps),
  member(P, Ps).
几乎可以:

?- perm_no_rep([1,2,1],P).
P = [1, 1, 2] ;
P = [1, 2, 1] ;
P = [2, 1, 1].
请注意,这将是
阶乘(Num\u Distinct\u Elements\u in\u L)=长度(Ps)
,即可能是非常大的列表