回答集程序 (ASP) 教程
回答集编程(Answer Set Programming, ASP)是基于逻辑程序的稳定模型语义的声明式编程。它区别于传统的指令式编程范式,在使用 ASP 时我们只需要描述我们的目标即可。
以图着色为例:对给定的一个图以及N种颜色,给出一种着色方法使得图上的每一个顶点都被涂上颜色并且相邻的顶点颜色不能相同。图着色问题是一个经典问题,折磨过每一个计算机专业的学生,但是如果用ASP求解,问题将变得很简单。
graph LR 1 <---> 2; 1 <---> 3; 3 <---> 4; 4 <---> 1; 4 <---> 2;
以上图为例,假设我们需要用 3 种颜色对该图进行着色,使用 ASP 求解图着色问题代码如下:
% 每个节点都要被着色 color(X,Y) 代表 节点X 涂Y颜色
{ color(X,1..3) } = 1 :- node(X).
% 相邻节点颜色不同
:- edge(X,Y), color(X,C), color(Y,C).
% 定义节点,共有4个节点
node(1..4).
% 定义(无向)边
edge(1,(2;3;4)). edge(2,(1;4)). edge(3,(1;4)).
edge(4,(1;2)).
% 显示着色方案
#show color/2.
上述代码经过 ASP 求解器计算,可以获得全部染色方案,当前尚未介绍 ASP 求解器的使用,读者可以访问 https://potassco.org/clingo/run/ 在线运行。下面列举了 ASP 求解器枚举出的全部着色方案。
Answer: 1
color(2,1) color(1,3) color(3,1) color(4,2)
Answer: 2
color(2,2) color(1,3) color(3,2) color(4,1)
Answer: 3
color(2,1) color(1,2) color(3,1) color(4,3)
Answer: 4
color(1,2) color(2,3) color(3,3) color(4,1)
Answer: 5
color(1,1) color(2,2) color(3,2) color(4,3)
Answer: 6
color(1,1) color(2,3) color(3,3) color(4,2)
可以看到,ASP 解决问题是如此清爽而简洁。我们使用传统方法需要编辑几十行代码的困难问题,如果使用 ASP 则仅用不到十行就能求解,并且还能求解全部答案。 希望大家保持这份热情,在后续章节中,我们将从基础知识、ASP 求解器安装 、ASP 语法以及 ASP 求解器原理等详细学习ASP相关知识。