首先,请原谅我是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]中删除对象。
答案 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...)