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
是一个人,又名。 a
、b
、c
或 d
。
因此您尝试计算 3-a
哪个 clingo 拒绝执行并删除相应的规则,引发此警告。
我是 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
是一个人,又名。 a
、b
、c
或 d
。
因此您尝试计算 3-a
哪个 clingo 拒绝执行并删除相应的规则,引发此警告。