Prolog谓词选择组合不是1000种组合

时间:2018-03-28 12:34:26

标签: prolog clpfd

我有这个特定的问题,但我无法用Prolog语法表达。我很新。

我的有限域名:  来自70个球的所有10球组合

请求的解决方案:  10球组合

约束: 我有一个20个球的列表:set1,set2 .. setN

所选组合不是set1,set2 ... setn的所有10球组合的成员(20球的10球组合)

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

这是我对问题的解决方案。

我不知道这是否是最佳选择。

我在具有3000个交叉点的VPS上运行代码。 (部分代码下方只有7个交集)

我不知道PROLOG是否能够解决它?

%use_module(library(clpfd)).


solve_frkeno(B1,B2,B3,B4,B5,B6,B7,B8,B9,B10) :-

     between(1, 13, B1),
     between(4, 21, B2),
     between(8, 29, B3),
     between(14, 37, B4),
     between(18, 41, B5),
     between(27, 50, B6),
     between(35, 57, B7),
     between(42, 63, B8),
     between(50, 68, B9),
     between(58, 70, B10),

     all_different([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10]),

    intersection([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10],[5,6,13,16,19,20,22,30,31,34,35,39,40,51,52,56,59,61,65,69],I1),
    length(I1,N1),
    between(0,6,N1),
    intersection([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10],[5,8,9,13,14,16,21,24,29,33,35,47,49,52,54,58,59,64,65,68],I2),
    length(I2,N2),
    between(0,6,N2),
    intersection([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10],[1,3,6,12,16,21,23,25,28,37,39,40,42,44,48,49,50,58,63,69],I3),
    length(I3,N3),
    between(0,6,N3),
    intersection([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10],[4,8,9,14,21,24,26,28,36,45,46,52,54,57,59,60,61,62,63,67],I4),
    length(I4,N4),
    between(0,6,N4),
    intersection([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10],[9,11,13,16,19,20,25,27,28,29,34,39,41,48,49,50,53,63,64,65],I5),
    length(I5,N5),
    between(0,6,N5),
    intersection([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10],[4,5,9,12,19,29,30,32,33,34,35,38,42,45,49,57,58,60,62,70],I6),
    length(I6,N6),
    between(0,6,N6),
    intersection([B1,B2,B3,B4,B5,B6,B7,B8,B9,B10],[2,3,6,12,13,15,16,19,26,29,30,40,43,51,52,53,58,64,67,69],I7),
    length(I7,N7),
    between(0,6,N7),