想象一个带有6个区域R1-R6的2d地图。每个区域应使用4种颜色中的1种进行着色,但相邻区域不能是相同的颜色。
这是我的代码:
% #1 initial facts
next(red,green).
next(red,blue).
next(red,yellow).
next(green,red).
next(green,blue).
next(green,yellow).
next(blue,green).
next(blue,yellow).
next(blue,red).
next(yellow,red).
next(yellow,blue).
next(yellow,green).
% #1 actual program
color(R1,R2,R3,R4,R5,R6).
color(R1,R2,R3,R4,R5,R6):-
% region adjacency relations
next(R1,R2),
next(R1,R3),
next(R1,R4),
next(R2,R4),
next(R2,R5),
next(R3,R4),
next(R3,R6),
next(R4,R5),
next(R4,R6).
预期产出:
R1= red, R2= blue, R3= blue, R4= green, R5= red, R6= red
我的输出:
true
我做错了什么?这甚至是错的吗?即使我的代码成功找到了正确的颜色配置,我如何才能打印出它的结果呢?
答案 0 :(得分:3)
由于color/6
的第一个条款,您的程序目前过于笼统。如果您只是删除第一个子句,那么您将获得您期望的解决方案(作为众多不同解决方案中的一个)。
还有一种更美妙的方式来编写程序:
regions(Rs):-
Rs = [R1,R2,R3,R4,R5,R6],
% neighbouring regions have different colors
dif(R1, R2),
dif(R1, R3),
dif(R1, R4),
dif(R2, R4),
dif(R2, R5),
dif(R3, R4),
dif(R3, R6),
dif(R4, R5),
dif(R4, R6),
maplist(color, Rs).
color(red).
color(green).
color(blue).
color(yellow).
示例查询和示例解决方案:
?- regions(Rs).
Rs = [red, green, green, blue, red, red] ;
Rs = [red, green, green, blue, red, yellow] ;
Rs = [red, green, green, blue, yellow, red] ;
etc.
请注意使用dif/2
(prolog-dif)表示两个术语不同。
对于更严重的地图着色任务,请考虑使用clpfd约束。