Datalog着色约束问题求助:同色约束致模型为空
解决你的Datalog颜色分配约束问题
我一眼就瞅出问题出在你的约束规则上!让我给你掰扯清楚:
你的原始约束:- Colored(X, C), Colored(Y, C).犯了一个Datalog新手常踩的坑——没有排除X和Y是同一个对象的情况。Datalog里变量默认是可以绑定到同一个实体的,也就是说当X和Y指向同一个对象(比如都是a)时,这条约束会直接触发:毕竟每个对象都会被分配一种颜色,比如Colored(a, red),那X=a、Y=a、C=red的组合就满足约束条件,直接否决了这个合法的着色方案。所有可能的情况都被这条过严的约束干掉了,模型自然就为空了。
你真正想表达的是「两个不同的对象不能同色」,所以必须给约束加上X和Y不相等的限定。不同Datalog实现里的不等写法可能略有差异,常见的是X != Y或者X \= Y,修正后的代码如下:
Object(a). Object(b). Colored(X,red) v Colored(X,blue) :- Object(X). % 修正后的约束:仅禁止不同对象使用相同颜色 :- Colored(X, C), Colored(Y, C), X != Y.
这样修改之后,符合你需求的合法模型就会正常生成了:
- 方案1:
Colored(a, red), Colored(b, blue) - 方案2:
Colored(a, blue), Colored(b, red)
这两种情况都满足「2个对象分配2种不同颜色」的要求,不会再被错误的约束否决啦。
内容的提问来源于stack exchange,提问作者Nooneye
相关产品推荐
相关产品推荐

