Jason Agent信念中数值计数器无法更新的问题求助
Jason 3.1 ASL代码数值递增失败的问题修复
我编写了一个用于统计动作执行次数的Jason智能体,ASL代码如下:
last_time(0). !start. /* Plans */ +!start : true <- ?last_time(X); new_t = X + 1; .print("take train " , X); -+last_time(new_t); !start.
运行时出现错误,错误信息:
[test] No failure event was generated for +!start[code((new_t = 1)),code_line(5),code_src("file:src/asl/test.asl"),error(constraint_failed),error_msg("Constraint (new_t = (X+1)); .print("take train ",X); -+last_time(new_t); !start was not satisfied (file:src/asl/test.asl:5) un={X=0}"),source(self)] intention 1: +!start[source(self)] <- ... (new_t = (X+1)); .print("take train ",X); -+last_time(new_t); !start / {X=0}
注释掉第5行new_t = X + 1;后代码可正常运行,但无法实现数值递增,使用的是Jason 3.1版本。
问题原因
Jason的ASL语言中,直接写new_t = X + 1会被当作统一化约束,而非赋值操作。统一化要求两侧的项完全匹配,new_t是变量,X+1是算术表达式,无法完成匹配,因此触发constraint_failed错误。要完成数值计算并赋值给变量,必须使用Jason内置的.assign内部动作。
修正后的代码
last_time(0). !start. /* Plans */ +!start : true <- ?last_time(X); .assign(new_t, X + 1); // 用.assign完成数值计算与赋值 .print("take train ", X); -+last_time(new_t); !start.
修改说明
- 将原来的
new_t = X + 1;替换为.assign(new_t, X + 1);,该内部动作会计算右侧算术表达式X+1的结果,并将值赋值给变量new_t。 - 其余逻辑保持不变,现在智能体可以正确更新
last_time的数值,实现动作执行次数的统计。
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

