2017-02-08 39 views
1

免责声明:我几乎是全新的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). 

但是,这是不是很扩展到诸多变数大难题。任何人都可以建议一个更好的方式来做到这一点?

+0

您应该更改标题。 ASP可以参考Active Server Pages,这是一个关于堆栈溢出的高度被贩卖的主题。 – Tony

+0

在'persons'和'house'中使用';',但是''''''使用''',这是非常不同的。看看'clingo --text '给你带来了什么。 –

回答

1

假设你想写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).