在当地的游戏之夜,四个小伙子正在参加拼字游戏和国际象棋比赛。利亚姆在国际象棋中击败了马克,詹姆斯获得第三名,16 岁的小伙子获胜。利亚姆在拼字游戏中排名第二,15 岁获胜,詹姆斯击败 18 岁,19 岁获得第三。凯文比马克小 3 岁。在国际象棋中排名最后的人在拼字游戏中排名第三,并且只有一个小伙子在两场比赛中获得相同的位置。
我觉得我的解决方案比需要的更笨重:
:- use_module(library(clpfd)).
check(AJ, AK, AL, AM, CJ, CK, CL, CM, SJ, SK, SL, SM) :-
AJ in 15..16 \/ 18..19,
AK in 15..16 \/ 18..19,
AL in 15..16 \/ 18..19,
AK in 15..16 \/ 18..19,
all_different([AJ, AK, AL, AM]),
CJ in 1..4, CK in 1..4, CL in 1..4, CM in 1..4,
SJ in 1..4, SK in 1..4, SL in 1..4, SM in 1..4,
all_different([CJ, CK, CL, CM]),
all_different([SJ, SK, SL, SM]),
CL #< CM,
CJ #= 3,
( AJ #= 16, CJ #= 1 ;
AK #= 16, CK #= 1 ;
AL #= 16, CL #= 1 ;
AM #= 16, CM #= 1 ),
SL #= 2,
( AJ #= 15, SJ #= 1 ;
AK #= 15, SK #= 1 ;
AL #= 15, SL #= 1 ;
AM #= 15, SM #= 1 ),
AK #= AM - 3,
( CJ #= 4, SJ #= 3 ;
CK #= 4, SK #= 3 ;
CL #= 5, SL #= 3 ;
CM #= 4, SM #= 3 ),
( CJ #= SJ, CK #\= SK, CL #\= SL, CM #\= SM ;
CJ #\= SJ, CK #= SK, CL #\= SL, CM #\= SM ;
CJ #\= SJ, CK #\= SK, CL #= SL, CM #\= SM ;
CJ #\= SJ, CK #\= SK, CL #\= SL, CM #= SM ).
有没有更好的方法来表达约束?
建议后的改进版本:
:- use_module(library(clpfd)).
check(AJ, AK, AL, AM, CJ, CK, CL, CM, SJ, SK, SL, SM) :-
permutation([AJ, AK, AL, AM], [15, 16, 18, 19]),
permutation([CJ, CK, CL, CM], [1, 2, 3, 4]),
permutation([SJ, SK, SL, SM], [1, 2, 3, 4]),
CL #< CM,
CJ #= 3,
( AJ #= 16, CJ #= 1 ;
AK #= 16, CK #= 1 ;
AL #= 16, CL #= 1 ;
AM #= 16, CM #= 1 ),
SL #= 2,
( AJ #= 15, SJ #= 1 ;
AK #= 15, SK #= 1 ;
AL #= 15, SL #= 1 ;
AM #= 15, SM #= 1 ),
AK #= AM - 3,
( CJ #= 4, SJ #= 3 ;
CK #= 4, SK #= 3 ;
CL #= 5, SL #= 3 ;
CM #= 4, SM #= 3 ),
( CJ #= SJ, CK #\= SK, CL #\= SL, CM #\= SM ;
CJ #\= SJ, CK #= SK, CL #\= SL, CM #\= SM ;
CJ #\= SJ, CK #\= SK, CL #= SL, CM #\= SM ;
CJ #\= SJ, CK #\= SK, CL #\= SL, CM #= SM ).