Prolog:如何通过重复创建所有可能的排列,给出一个对象列表

时间:2017-03-29 19:55:22

标签: list prolog permutation

首先,请原谅我是Prolog的菜鸟。 我想要实现的就是 创建一个谓词   - 对象[0,1]   - 给定所需长度(例如3)   - 查找给定长度的所有可能的排列(重复)(0可以多次添加,1可以多次添加,如果我有相同对象的列表,例如......没问题)

示例:

? myPermutation(3, [0,1], L).
L = [0,0,0]
next->
L = [0,0,1]
next->
L = [0,1,0]
next->
L = [0,1,1]
....
next->
L = [1,1,1]

有人 可以帮助我吗? 非常感谢...

提示:我正在考虑使用删除谓词...有点像给出对象列表和问题Prolog的所有可能的方法从[0,1]中删除对象。

1 个答案:

答案 0 :(得分:2)

我认为你的方法有点复杂。你可以简单地写一下:

eval([],_).
eval([H|T],Set):-member(H,Set),eval(T,Set).

myPermutation(N, Set, L):-length(L,N), eval(L,Set).

上述解决方案使用length/2谓词来设置输出列表的长度,并调用eval/2谓词,它只是递归迭代列表并强制列表的每个元素成为给定集合的成员。 例如:

?- myPermutation(3, [0,1], L).
L = [0, 0, 0] ;
L = [0, 0, 1] ;
L = [0, 1, 0] ;
L = [0, 1, 1] ;
L = [1, 0, 0] ;
L = [1, 0, 1] ;
L = [1, 1, 0] ;
L = [1, 1, 1].

您还可以进行更常见的查询,例如:

?- myPermutation(3, S, [0,0,1]).
S = [0, 1|_G3426] ;
S = [0, _G3425, 1|_G3429] ;
S = [0, _G3425, _G3428, 1|_G3432] ;
S = [0, _G3425, _G3428, _G3431, 1|_G3435] ;
S = [0, _G3425, _G3428, _G3431, _G3434, 1|_G3438] .
(and goes on...)