我可以限制Prolog中的置换列表的长度吗?

时间:2017-10-02 16:14:37

标签: prolog

假设我有一个带字母A-G的数据库:

elem(a). elem(b). ... elem(g).

我想创建一个谓词,它给出了列表中这7个字母的所有可能组合,你可以这样做:

findall(List, permutation([a,b,c,d,e,f,g],List), X).

和X将是一个包含所有组合的列表(您甚至不需要数据库)。

但是,我想要的是只列出5个元素,包含7个可用字母。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

permutation在这里开展工作,而不是findall。所以答案是"是的,您只需要编写谓词combination,这样调用combination([a,b,c,d,e,f,g], List, 5)将生成[a,b,c,d,e,f,g]的所有5元素子列表作为单独的答案"。一些Prolog系统包含的谓词很容易,我不认为SWI-Prolog会这么做。

E.g。 http://eclipseclp.org/doc/bips/lib/lists/subset-2.html允许你写

combination(SubList, List, Length) :- 
  subset(SubList, List),
  length(SubList, Length).

然后

?- findall(List, combination([a,b,c,d,e,f,g],List,5), X).

请注意,SWI-Prolog还提供了subset/2,但是在不同的模式下,它无法解决此问题(它有+SubSet,这意味着它无法生成SubSet ,但需要知道)。 (另外,上面的实现是非常低效的。)所以我将写combination作为递归和算术的练习:)