Clingo:在测试规则内进行计算时操作未定义

Clingo: Operation undefined while doing computations inside the testing rules

我是 ASP 编程的新手,发现很难理解 ASP 的工作原理。我正在使用 clingo 工具进行 ASP 编码。目前,我正在处理一个座位安排问题。原始问题有点复杂,因为它涉及很多变量和约束。我从它的基本版本开始,如下所示:

横排4人,需要坐4个人。这些人之间没有约束。每个人都可以将 left/right 移动给任何其他人。最终目标很简单

“任何人都可以坐在任何可用的位置”

唯一的条件是保存关于如何实现目标的各个步骤。

为了解决这个问题,我使用了谓词

seated(A,B,Shift,Dir,t) 这表示在时间“t”A 已经将“Dir”中的“Shift”单位从 B

例子

seated(A,B,left,2,t) 表示 A 在时间 t 向 B 左侧移动了 2 个单位

我用了两个文件

init.lp描述初始位置和最终目标

person(a).

person(b).

person(c).

person(d).

init(pos(a,0)).

init(pos(b,0)).

init(pos(c,0)).

init(pos(d,0)).


goal(pos(a,1)).

goal(pos(b,2)).

goal(pos(c,3)).

goal(pos(d,4)).

rules.lp写规则的地方

#include<incmode>.

#program base.
% Define
holds(F,0) :- init(F).
%{possible_location(X,Y,1) : person(X),Y = 1..4}.
%%possible_location(X,Y,1) : person(X),Y = 1..4.



#program step(t).
% Generate any seating arrangement

1{seated(X,Z,Shift,Dir,t) : person(X),person(Z),X != Z,Shift = 1..3, Dir = (left;right)}1.


% Test
% Remove the seated predicates which the shift is not possible
:- seated(X,Z,Shift,right,t),holds(pos(Z,Pos),t-1), Shift + Pos > 4.
:- seated(X,Z,Shift,left,t),holds(pos(Z,Pos),t-1), Pos - Shift < 1.

% Remove the seated predicates if the final position after shifting is already occupied
:- seated(X,Z,Shift,right,t),holds(pos(Z,Pos),t-1), Pos >0,holds(pos(A,Shift + Pos),t-1), A !=X.
:- seated(X,Z,Shift,left,t),holds(pos(Z,Pos1),t-1),  Pos1 >0, holds(pos(A,Pos1 - Shift),t-1), A !=X.



% Define
seateded(X,t) :- seated(X,Z,Shift,Dir,t).

% Relating the current move to the current state %
holds(pos(X,Y),t) :- seated(X,Y,Shift,Dir,t).

% This is for shifting the state to the next time %
holds(pos(X,Z),t) :- holds(pos(X,Z),t-1), not seateded(X,t).

#program check(t).
% Test
:- query(t), goal(F), not holds(F,t).

% Display
#show seated/5.
#show query/1.

在运行以上文件中,报错

rule_new.lp:21:75-87: 信息:操作未定义: (Pos1-Shift)

我用谷歌搜索了一下,发现这个错误是在我没有处理任何边缘情况时出现的,例如 X/Y 并且 Y =0 没有被处理。在这种情况下,我看不到任何边缘情况。因此,我无法纠正错误。

我已经记录了规则,这样我就可以解释编写规则背后的思考过程。我花了几个小时来解决它,但仍然无法找到解决方案。如果我的思路不对,那么如果我能找到解决上述问题的其他方法,我将不胜感激。

恐怕我没能理解你的解决方案(或问题),但使用选项 --text 可以帮助你解决这个错误。 根据错误消息,问题出在这条规则中:

seated(X,Z,Shift,left,t),holds(pos(Z,Pos1),t-1),  Pos1 >0, holds(pos(A,Pos1 - Shift),t-1), A !=X.

您尝试从 Pos1 中减去 Shift。两个变量都应替换为整数以使其工作。

Shift 来自 seated 谓词,可以取 1..3 之间的值,很好。 Pos1 来自 holds(pos(_,Pos1),_) 谓词。

在您的规则中:

holds(pos(X,Y),t) :- seated(X,Y,Shift,Dir,t).

你清楚地推导出 holds 谓词,其中 Y 是一个人,又名。 abcd

因此您尝试计算 3-a 哪个 clingo 拒绝执行并删除相应的规则,引发此警告。