用答案集编程解决逻辑难题
Solving a Logic Puzzle with Answer Set Programming
免责声明:我对 clingo 和一般的答案集编程几乎完全陌生。
我正在尝试使用 clingo 解决 grid logic puzzle。首先,我想生成包含每个类别的一个实例的所有模型。
比如三个人:
person(a; b; c).
,
三栋房子:house(w; x; z).
,
和三种颜色:
color(r; g; y).
我想要一个潜在的稳定模型
assign(a, r, x), assign(b, g, z), assign(c, y, w)
和另一个潜在的稳定模型
assign(a, g, w), assign(b, y, z), assign(c, r, x)
,等等。也就是说,每个人只出现一次,颜色也一样。我想,一旦我有了这些模型,我就可以使用约束来消除模型,直到谜题被解决。
我尝试过使用选择规则和约束:
{assign(P, C, H)} :- person(P), color(C), house(H).
P1=P2 :- assign(P1, C, H), assign(P2, C, H).
但这对于具有许多变量的大型谜题来说不太可扩展。任何人都可以建议更好的方法吗?
假设你想写color(r;g;y).
下面的怎么样?
% assign each house exactly one person/color
1 {assign(P, C, H) : person(P), color(C) } 1 :- house(H).
% assign each person exactly one house/color
1 {assign(P, C, H) : house(H), color(C) } 1 :- person(P).
% assign each color exactly one person/house
1 {assign(P, C, H) : house(H), person(P) } 1 :- color(C).
免责声明:我对 clingo 和一般的答案集编程几乎完全陌生。
我正在尝试使用 clingo 解决 grid logic puzzle。首先,我想生成包含每个类别的一个实例的所有模型。
比如三个人:
person(a; b; c).
,
三栋房子:house(w; x; z).
,
和三种颜色:
color(r; g; y).
我想要一个潜在的稳定模型
assign(a, r, x), assign(b, g, z), assign(c, y, w)
和另一个潜在的稳定模型
assign(a, g, w), assign(b, y, z), assign(c, r, x)
,等等。也就是说,每个人只出现一次,颜色也一样。我想,一旦我有了这些模型,我就可以使用约束来消除模型,直到谜题被解决。
我尝试过使用选择规则和约束:
{assign(P, C, H)} :- person(P), color(C), house(H).
P1=P2 :- assign(P1, C, H), assign(P2, C, H).
但这对于具有许多变量的大型谜题来说不太可扩展。任何人都可以建议更好的方法吗?
假设你想写color(r;g;y).
下面的怎么样?
% assign each house exactly one person/color
1 {assign(P, C, H) : person(P), color(C) } 1 :- house(H).
% assign each person exactly one house/color
1 {assign(P, C, H) : house(H), color(C) } 1 :- person(P).
% assign each color exactly one person/house
1 {assign(P, C, H) : house(H), person(P) } 1 :- color(C).