在prolog中重复的组合满足某些标准

时间:2015-05-21 11:11:57

标签: list prolog combinations combinatorics

我正在尝试制作一个prolog程序,该程序生成m个元素列表中n个元素的所有组合(重复),这些元素的总和在两个给定数字AB之间。我设法制作排列程序,但我不知道我应该为rep_combinations使用什么。

以下是排列程序:

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)
.

1 个答案:

答案 0 :(得分:2)

您可以对项目(X1,X2,X3,X4)进行排序以形成组合,然后获得一组所述组合。 E.g:

 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).

我刚刚更改了findall/3使用的模板以获取排序的排列(使用msort/2),并将findall/3更改为setof/3以删除重复项

请注意,打印结果而不是在程序中添加第四个参数来统一结果是很奇怪的(如果喜欢这样做,调用者可以打印它)。