我很难理解逻辑编程的概念。我试图将重复的所有排列变成一个给定列表。
我可以把我拥有的东西,但我不知道我在做什么!
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....
我理解第一个列表似乎没用,我可以用列表长度来做,但实际上我需要它用于我的代码的其余部分,所以我试图在我需要之后对其进行建模。一旦我通过这一部分,我将增加额外的逻辑,这将限制可以在第一个列表中替换的字母,但不要担心该部分!
答案 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]).