用答案集编程解决逻辑难题



免责声明:我对creaso和answer-set编程几乎完全陌生。

我正在尝试使用cliso来解决一个网格逻辑难题。首先,我想生成所有模型,其中包括每个类别的一个实例。

例如,如果有三个人:CCD_ 1,三个房屋:CCD_ 2,和三种颜色: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).

最新更新