0

我正在尝试在 prolog 中定义一个函数,该函数接受形式为 combination(3,[a,b,c,d],L) 的参数,结果返回

L=a,b,c
L=a,b,d
L=a,c,d
L=b,c,d

我的实现如下:

combination(K,argList,L):-
unknown(X,argList,Y),
Z is select(X,argList),
length(Z,K),
L is Z,
combination(K,Z,L).

unknown(X,[X|L],L).
unknown(X,[_|L],R) :- unknown(X,L,R).

未知谓词的行为如下:![在此处输入图像描述][1]

请帮忙。

4

1 回答 1

0

使用您的定义想到的最简单的解决方案unknown/3是:

combination(0, _, []) :- 
    !.
combination(N, L, [V|R]) :-
    N > 0,
    NN is N - 1,
    unknown(V, L, Rem),
    combination(NN, Rem, R).

unknown(X,[X|L],L).
unknown(X,[_|L],R) :- 
    unknown(X,L,R).

解释:第二个子句combination/3从列表中选择一个元素L,谓词unknown/3以线性方式执行,返回余数,Rem。一旦从列表中选择的元素数量L超过N,就会触发基本情况( 的第一个子句combination/3),从而终止分支。请注意, 的定义combination/3依赖于不确定性,unknown/3其为选择替代列表元素留下了选择点。

于 2012-05-02T06:51:15.343 回答