查找具有唯一 Heads 的列表排列

Find permutations of list with unique Heads

我有一个唯一元素列表,我想生成该列表的排列,但我只希望这些元素成为列表的头部一次,如下所示:

?- 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.

其中 returns 没有头部为 a 的排列,但是 returns b 和 c 各有两个排列。

也许我需要为每个元素存储一个排列,其中该元素是头部,然后在进行新排列时,检查它们的头部是否已经不是该存储列表中排列之一的头部?

关于如何完成此操作的任何想法或更简单的方法?

我认为select/3应该可以(至少这看起来符合要求的结果)

special_permutation(L, [H|R]) :-
  select(H, L, R).