假设我有一个带字母A-G的数据库:
elem(a).
elem(b).
...
elem(g).
我想创建一个谓词,它给出了列表中这7个字母的所有可能组合,你可以这样做:
findall(List, permutation([a,b,c,d,e,f,g],List), X).
和X将是一个包含所有组合的列表(您甚至不需要数据库)。
但是,我想要的是只列出5个元素,包含7个可用字母。我怎么能这样做?
答案 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
作为递归和算术的练习:)