实例.lp
node(1). node(2). node(3). node(4). node(5). node(6).
edge(1,2). edge(2,1). edge(4,1). edge(2,3). edge(2,6).
edge(3,4). edge(3,5). edge(5,6). edge(6,3).
begin(4).
我有这个问题实例,带有开始节点 begin(4) 和相应边的有向图。在此图中,只能从节点 4 开始获得哈密顿循环(4->1->2->3->5->6 或 4->1->2->6->5->3)并且我的问题类只有在我给它起始节点 4 时才能解决它,并返回 2 个这样的模型:
类.lp
% generate
{path(X,Y)} :- edge(X,Y).
% define
reached(X) :- begin(X).
reached(Y) :- reached(X), path(X,Y).
% test
:- node(X), not reached(X).
:- path(X,Y), path(X,Y1), Y!=Y1.
:- path(X,Y), path(X1,Y), X!=X1.
当我用 cligo 像这样运行它时:
clingo class.lp instance.lp 0
我得到了 2 个模型(汉密尔顿循环)。
我想在不给它起点的情况下运行它,但是当我用node(X)替换begin(X ) 时:
.
.
% define
reached(X) :- node(X).
reached(Y) :- reached(X), path(X,Y).
.
.
我有 120 个模型。
我的猜测是,现在它生成了所有可能的组合,并且我添加了额外的约束来过滤出正确的解决方案。
我将如何从这个答案集中过滤两个正确的模型?