Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List prolog中满足一定条件的重复组合_List_Prolog_Combinations_Combinatorics - Fatal编程技术网

List prolog中满足一定条件的重复组合

List prolog中满足一定条件的重复组合,list,prolog,combinations,combinatorics,List,Prolog,Combinations,Combinatorics,我试图制作一个prolog程序,从m个元素的列表中生成n个元素的所有组合(重复),这些元素的总和在两个给定的数字a和B之间。我设法制作了排列程序,但我不知道我应该用什么来组合rep\u 以下是排列程序: chech(L,A,B):- findall([X1,X2,X3,X4 ], ( member(X1, L), member(X2, L), member(X3, L), member(X4, L), Sum

我试图制作一个prolog程序,从m个元素的列表中生成n个元素的所有组合(重复),这些元素的总和在两个给定的数字
a
B
之间。我设法制作了排列程序,但我不知道我应该用什么来组合
rep\u

以下是排列程序:

chech(L,A,B):-
    findall([X1,X2,X3,X4 ], (
        member(X1, L),
        member(X2, L),
        member(X3, L),
        member(X4, L),
        Sum is X1+X2+X3+X4,
        Sum > A,
        Sum < B
    ), Solutions),
    write(Solutions)
.
chech(L,A,B):-
findall([X1,X2,X3,X4](
成员(X1,L),
成员(X2,L),
成员(X3,L),
成员(X4,L),
总和为X1+X2+X3+X4,
总和>A,
总和
您可以对项目(X1、X2、X3、X4)进行排序,形成一个组合,然后获得一组所述组合。例如:

 chech2(L,A,B):-
    setof(Combination, X1^X2^X3^X4^Sum^(
        member(X1, L),
        member(X2, L),
        member(X3, L),
        member(X4, L),
        Sum is X1+X2+X3+X4,
        Sum > A,
        Sum < B,
        msort([X1,X2,X3,X4 ], Combination)
    ), Solutions),
    write(Solutions).
chech2(L,A,B):-
集合(组合,X1^X2^X3^X4^Sum^(
成员(X1,L),
成员(X2,L),
成员(X3,L),
成员(X4,L),
总和为X1+X2+X3+X4,
总和>A,
总和
我刚刚更改了作为
findall/3
的结果而使用的模板,以获得排序排列(使用
msort/2
),并将
findall/3
更改为
setof/3
,以删除重复项


请注意,打印结果而不是向过程中添加第四个参数来统一结果(然后调用方可以打印它,如果它愿意的话)。

或者您可以简单地添加排序约束,例如
成员(X1,L),成员(X2,L),X2>=X1,成员(X3,L),X3>=X2,成员(X4,L),X4>=X3,…
和remove
msort(…)
应该更快,因为您可以在最早的时候避免不必要的计算