我有一个独特元素的列表,我想生成该列表的排列,但我只希望元素一次成为列表的头部,如下所示:
?- special_permutation([a,b,c], X).
X = [a,b,c] ;
X = [b,a,c] ;
X = [c,a,b] ;
false.
?- special_permutation([a,b,c,d,e], X).
X = [a, b, c, d, e] ;
X = [b, a, c, d, e] ;
X = [c, a, b, d, e] ;
X = [d, a, b, c, e] ;
X = [e, a, b, c, d] ;
false.
(尾部元素的顺序对我来说并不重要)
我到目前为止所做的是:
test([Head|Tail], [AltHead|AltTail]) :-
permutation([Head|Tail], [AltHead|AltTail]),
Head \= AltHead.
返回头部为a的排列,但返回b和c的两个排列。
也许我需要为每个元素存储一个排列,其中元素是头部,然后在进行新的排列时,检查它们的头部是否已经是该存储列表中某个排列的头部?
关于如何实现这一目标的任何想法,或更简单的方法?