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

我可以在Prolog中限制置换列表的长度吗?,prolog,Prolog,假设我有一个字母a-G的数据库: elem(a)。 elem(b)。 ... 元素(g)。 我想做一个谓词,给出列表中这7个字母的所有可能组合,你可以这样做: findall(List, permutation([a,b,c,d,e,f,g],List), X). X将是一个包含所有combo的列表(您甚至不需要数据库) 但是,我想做的是只列出5个元素,以及7个可用字母。我怎样才能做到这一点呢?这里的工作是置换,而不是findall。因此答案是“是的,您只需要编写一个谓词composition

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

elem(a)。
elem(b)。
...
元素(g)。

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

findall(List, permutation([a,b,c,d,e,f,g],List), X).
X将是一个包含所有combo的列表(您甚至不需要数据库)


但是,我想做的是只列出5个元素,以及7个可用字母。我怎样才能做到这一点呢?

这里的工作是
置换
,而不是
findall
。因此答案是“是的,您只需要编写一个谓词
composition
,这样调用
composition([a,b,c,d,e,f,g],List,5)
将生成
[a,b,c,d,e,f,g]
的所有5元素子列表作为单独的答案”。一些Prolog系统包含谓词,这将使它变得非常简单,我认为SWI Prolog不会

允许你写作

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还提供了一种不同的模式,这使得它无法用于此问题(它有
+子集
,这意味着它不能生成
子集
,但需要知道它)。(另外,上面的实现效率很低。)因此我将把编写
组合
作为递归和算术的练习:)

这里的工作是
置换
,而不是
findall
。因此答案是“是的,您只需要编写一个谓词
composition
,这样调用
composition([a,b,c,d,e,f,g],List,5)
将生成
[a,b,c,d,e,f,g]
的所有5元素子列表作为单独的答案”。一些Prolog系统包含谓词,这将使它变得非常简单,我认为SWI Prolog不会

允许你写作

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还提供了一种不同的模式,这使得它无法用于此问题(它有
+子集
,这意味着它不能生成
子集
,但需要知道它)。(另外,上面的实现效率很低。)因此我将把编写<代码>组合<代码>作为递归和算术的练习:)

啊,我对这个问题的理解不同(限制组合的长度,而不是排列的数量)。@AlexeyRomanov我认为你的解释是正确的。我看错了问题。啊,我对问题的理解不同(限制组合的长度,而不是排列的数量)。@AlexeyRomanov我认为你的解释是正确的。我把问题看错了。可以肯定的是,这是一个好的组合吗?:
sbset([],[])。sbset([H | L],[H | SL]):-sbset(L,SL)。sbset(L,[[u124; SL]):-sbset(L,SL)。组合(子列表,列表,长度):-SBSET(子列表,列表),长度(子列表,长度).<代码>,我不认为它是好的,因为它生成所有子列表和检查每个长度(当使用已知的代码>列表< /COD>和<代码>长度和变量<代码>子目录< /代码>)。它有效,但你可以做得更好。没关系,它甚至不起作用。我总是从本地堆栈中取出…只是为了确定,这是一个好的
组合吗?:
sbset([],[])。sbset([H | L],[H | SL]):-sbset(L,SL)。sbset(L,[[u124; SL]):-sbset(L,SL)。组合(子列表,列表,长度):-SBSET(子列表,列表),长度(子列表,长度).<代码>,我不认为它是好的,因为它生成所有子列表和检查每个长度(当使用已知的代码>列表< /COD>和<代码>长度和变量<代码>子目录< /代码>)。它有效,但你可以做得更好。没关系,它甚至不起作用。我总是从本地堆栈中取出。。。