【问题标题】:Prolog: How to create all possible permutations with repetition give a list of objectsProlog:如何通过重复创建所有可能的排列给出对象列表
【发布时间】:2017-03-29 19:55:21
【问题描述】:

首先,请原谅我是 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]

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

提示:我正在考虑使用 delete 谓词的一些东西...比如给出对象列表并询问 Prolog 以了解从 [0,1] 中删除对象的所有可能方法。

【问题讨论】:

  • 我有那个谓词:del(X,[X|Tail],Tail)。德尔(X,[Y|尾巴],[Y|尾巴1]):-德尔(X,尾巴,尾巴1)。我查询del(X,[0,1],_)。通过回溯返回 X = 0 X = 1 false。所以我想我们仍然需要一个带有累加器的谓词,给定一个长度,使用建议的 del 准备一个 [0,1,...,1] 列表并回溯到所有解决方案

标签: list prolog permutation


【解决方案1】:

我认为您的方法有点复杂。您可以简单地编写如下内容:

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...)

【讨论】:

  • 感谢您的帮助!我会接受这个答案,因为它比我问的更好(需要一组对象,而不仅仅是 0,1)。
  • 很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多