Prolog 如何给图形着色

Prolog 如何给图形着色,prolog,graph-coloring,Prolog,Graph Coloring,我有一个问题描述如下: 编写一个为图形着色的prolog程序。颜色由color/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

我有一个问题描述如下:

编写一个为图形着色的prolog程序。颜色由color/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].
将谓词颜色写在下面


实际上,我刚刚开始做这个练习。所以我不知道。我认为四种颜色足以给一张图表上色。也许有人问过类似的问题。当我有了一些想法,我会很快发布

您需要知道节点的名称。 一种方法是使用setof/3:

setof(Node,X^Y^(edge(Node, X); edge(Y,Node)), LN)
X^Y表示在搜索中必须使用X和Y,但不能用于结果

现在,我们使用谓词集\u Color(节点列表,关联列表)构建了关联节点/颜色列表

空的节点列表给出了空的关联列表

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及其回溯完成了这项工作

我投票结束这个问题,因为它显然是家庭作业,显示学生没有努力,也没有询问他们现有实施中的具体问题。