让prolog程序打印结果而不是布尔值

让prolog程序打印结果而不是布尔值,prolog,prolog-dif,clpfd,Prolog,Prolog Dif,Clpfd,想象一个包含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(yel

想象一个包含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

我做错了什么?这是错误的吗?即使我的代码成功地找到了正确的颜色配置,我如何让它打印出它的结果?

由于
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
()表示两个术语是不同的


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

< P>如果Prolog不提供DIF/2,或者您愿意更好地理解这一语言的基础,这里有可能对您的代码进行修改:

next(R1,R2) :-
    select(R1, [red, green, blue, yellow], Cs),
    member(R2, Cs).

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).
在推理计数方面,这比使用dif/2稍微有效一些

使用iso_dif/2或“旧式”版本进行更好的编辑

next(R1, R2) :- color(R1), color(R2), R1 \= R2.

当然,颜色/1来自mat的答案取决于哪个序言。你有打印命令吗?如果将其作为最后一个子句,则仅当前面的所有子句都成功时才会打印。由于
color/6
的第一个子句,您的程序当前过于通用。如果你简单地删除第一条,你就会得到你期望的解决方案(作为许多不同解决方案中的一个),我有一种感觉就是这样。我从上周开始学习这种愚蠢的语言。@mat请随意写在答案中,这样我就可以接受了。s(X):使用不同于
区域/1
的名称如何?谢谢!关于谓词名称,几乎总是有改进的余地。在本例中,我主要想强调的一点是,变量本身表示区域。没有任何间接的必要!一个更具体的名称应该是例如
regions\u,带有颜色/1
。好的。名字永远是最难的部分:)你说得对。但这是一个预先指定了项目名称的类。我无能为力。这真的比下一个(R1,R2)快吗:-颜色(R1),颜色(R2),iso_dif(R1,R2)。?(使用)。即使使用dif/2(高度优化,SWI Prolog实现中的afaik),差异也很小——计算所有192个解决方案的推论只有13333对27878。只是,我想知道dif/2实现者对iso_dif/2的看法。我觉得这个名字有点误导…计数推断不是一个可靠的性能度量:你的目标
select(R1[红、绿、蓝、黄],Cs),
颜色(R1)
一样重要。对于
iso_dif/2
,什么是误导性的?@false:只是有点误导性,如果你真的想发表建设性的评论,你可以将其添加到
iso_dif/2
的实际定义中。