【问题标题】:Combinations with repetition in prolog that satisfy certain criteria序言中满足某些标准的重复组合
【发布时间】:2015-05-21 11:11:56
【问题描述】:

我正在尝试制作一个 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)
.

【问题讨论】:

    标签: list prolog combinations combinatorics


    【解决方案1】:

    您可以将项目(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).
    

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

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

    【讨论】:

    • 或者您可以简单地添加排序约束,例如member(X1,L), member(X2,L), X2 &gt;= X1, member(X3,L), X3 &gt;= X2, member(X4,L), X4 &gt;= X3, ... 并删除msort(...),它应该会更快,因为您可以尽早避免不必要的计算
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多