Map Coloring Prolog



我写了这段代码来解决地图着色问题,使用prolog:

coloring([A,B,C,D,E,F]):-
maplist(==(A),[B,C,D,E]),
maplist(==(B),[C,D,F]),
C==D,
maplist(==(D),[E,F]),
E==F.

我尝试使用查询得到解决方案:

?- coloring(Cs), Cs ins [1,2,3,4], Cs = [1|_].

但是我总是得到错误&"参数没有充分实例化&";如何解决这个问题?

使用#=/2代替==/2,并在ins/2中固定域:

:- use_module(library(clpfd)).
coloring([A,B,C,D,E,F]):-
maplist(#=(A),[B,C,D,E]),
maplist(#=(B),[C,D,F]),
C#=D,
maplist(#=(D),[E,F]),
E#=F.

样本:

?- coloring(Cs), Cs ins 1..4, Cs=[1|_].
Cs = [1, _A, _B, _C, _D, _E],
_A in 2..4,
_A#=_E,
_A#=_C,
_A#=_B,
_B in 2..4,
_B#=_C,
_C in 2..4,
_C#=_E,
_C#=_D,
_D in 2..4,
_D#=_E,
_E in 1..4.

与标记:

?- coloring(Cs), Cs ins 1..4, Cs=[1|_], label(Cs).
Cs = [1, 2, 3, 4, 2, 1] ;
Cs = [1, 2, 3, 4, 2, 3] ;
Cs = [1, 2, 3, 4, 3, 1] ;
Cs = [1, 2, 4, 3, 2, 1] ;
Cs = [1, 2, 4, 3, 2, 4] ;
...

最新更新