得到一个prolog程序打印出结果而不是布尔值

时间:2015-07-14 22:02:06

标签: prolog

想象一个带有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
我做错了什么?这甚至是错的吗?即使我的代码成功找到了正确的颜色配置,我如何才能打印出它的结果呢?

1 个答案:

答案 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)表示两个术语不同。

对于更严重的地图着色任务,请考虑使用约束。