查找具有唯一 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).
我有一个唯一元素列表,我想生成该列表的排列,但我只希望这些元素成为列表的头部一次,如下所示:
?- 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).