我有一个问题如下:
编写一个为图表着色的prolog程序。颜色由颜色/ 1谓词定义,图形由子句edge / 2定义。您必须编写谓词着色(着色),以查找图形的节点node_1,...,node_n的着色。着色是列表 [node_1 / color_1,...,node_n / color_m]其中color_1,...,color_m是颜色,满足每条边的节点具有不同颜色的属性。
让我们看一个例子。让颜色和边缘成为下面的谓词。
% 2 colors
color(blue).
color(red).
% the edges
edge(1,2).
edge(1,3).
edge(2,4).
edge(5,2).
对于该数据,满足着色(C)。一个解决方案是
C = [ 1/blue, 2/red, 3/red, 4/blue, 5/blue].
在下面写下谓词颜色。
实际上,我刚开始做这个练习。所以我不知道。我认为四种颜色足以为图形着色。也许有人问了类似的问题。当我有一些想法时,我会很快发布。
答案 0 :(得分:2)
您需要知道节点的名称。 一种方法是使用setof / 3:
setof(Node,X^Y^(edge(Node, X); edge(Y,Node)), LN)
X ^ Y表示必须在搜索中使用X和Y,但不能用于结果。
现在我们使用谓词set_color(List_of_nodes,List_of_association)构建节点/颜色关联列表。
一个空的节点列表给出了一个空的关联列表!
set_color([], [])
现在,过程:
% we work with the current element of the list of nodes
set_color([H | T], [H/C | TC]) :-
% we create the association for the rest of the list
set_color(T, TC),
% we choose the color
color(C),
% we check that two adjacent nodes of different colors
forall(member(Node/Color, TC),
( (edge(Node, H) -> Color \= C; true),
( edge(H, Node) -> Color \= C; true))).
所以你得到:
% 2 colors
color(blue).
color(red).
% the edges
edge(1,2).
edge(1,3).
edge(2,4).
edge(5,2).
coloring(L) :-
setof(Node,X^Y^(edge(Node, X); edge(Y,Node)), LN),
set_color(LN, L).
set_color([], []).
set_color([H | T], [H/C | TC]) :-
set_color(T, TC),
color(C),
forall(member(Node/Color, TC),
( (edge(Node, H) -> Color \= C; true),
( edge(H, Node) -> Color \= C; true))).
我忘了说Prolog带有它的回溯功能!