Prolog排列与重复

时间:2011-04-22 20:35:59

标签: list prolog permutation

我很难理解逻辑编程的概念。我试图将重复的所有排列变成一个给定列表。

我可以把我拥有的东西,但我不知道我在做什么!

perms_R(List,[]).
perms_R([X|Xt],[Y|Yt],Out) :- perms_R([Y|Xt],Yt),perms_R(Xt,[Y|Yt])

想法是浏览第二个列表中的每个元素并将其放在我的第一个列表中。我想弄清楚这一点,但我被困住了。

我需要调用perms_R([a,b,c,d],[1,2,3,4])。得到:

1,1,1,1
1,1,1,2
1,1,1,3
1,1,1,4
1,1,2,1
etc....

我理解第一个列表似乎没用,我可以用列表长度来做,但实际上我需要它用于我的代码的其余部分,所以我试图在我需要之后对其进行建模。一旦我通过这一部分,我将增加额外的逻辑,这将限制可以在第一个列表中替换的字母,但不要担心该部分!

1 个答案:

答案 0 :(得分:2)

您正在寻找的不是排列。您希望使用给定集合中的项目创建给定大小的列表。

您可以使用此代码段执行此操作:

perms_R([], _).
perms_R([Item|NList], List):-
  member(Item, List),
  perms_R(NList, List).

您需要传递半实例化列表和源项:

perms_R([A,B,C,D],[1,2,3,4]).