下面看看 Prolog 如何解决实际问题。
我们知道,地图的相邻区域不能使用同一种颜色。现在有三种颜色:红、绿、蓝。请问如何为上面这幅地图着色?
首先,定义三种颜色。
代码语言:javascript复制color(red).
color(green).
color(blue).
然后,定义着色规则。
代码语言:javascript复制
colorify(A,B,C,D,E) :-
color(A), color(B), color(C), color(D), color(E),
A=B, A=C, A=D, A=E,
B=C, C=D, D=E.
上面代码中,colorify(A,B,C,D,E)
是一个对 ABCDE 五个变量求值的表达式。该表达式为true
的条件是,这五个变量各自为一种颜色,则相邻的变量不相等。
最后,这两段代码合在一起,组成一个脚本map.pl
,再加载这个脚本。
代码语言:javascript复制
?- [map].
true.
执行表达式colorify(A,B,C,D,E)
,SWI-Prolog 就会将三种颜色依次赋值给变量,测试哪些组合是可能的结果。
代码语言:javascript复制
?- colorify(A,B,C,D,E).
A = red,
B = D, D = green,
C = E, E = blue;
A = red,
B = D, D = blue,
C = E, E = green ;
A = green,
B = D, D = red,
C = E, E = blue ;
A = green,
B = D, D = blue,
C = E, E = red ;
A = blue,
B = D, D = red,
C = E, E = green ;
A = blue,
B = D, D = green,
C = E, E = red ;
可以看到,计算机给出了6组解,即有6种可行的地图着色方法。