Atom原子 (have ?a)
动作
(:operator (!pickup ?a) //名称 参数
() //状态
((clear ?a) (on-table ?a)) //删除
((holding ?a))) //添加
方法
(:method (swap ?x ?y) //名称 参数
//名字1,可省略
((have ?x) (not (have ?y))) //状态1
((!drop ?x) (!pickup ?y)) //步骤1(任务列表)
((have ?y) (not (have ?x))) //状态2
((!drop ?y) (!pickup ?x)))) //步骤2
Axioms原语 (:- (need-to-move ?x) //名称 参数, 当其任意状态为true时,原语为true
;; need to move x if x needs to go from one block to another //状态1名称,可省略
((on ?x ?y) (goal (on ?x ?z)) (not (same ?y ?z))) //状态1
;; need to move x if x needs to go from table to block
((on-table ?x) (goal (on ?x ?z)))
;; need to move x if x needs to go from block to table
((on ?x ?y) (goal (on-table ?x)))
;; need to move x if x is on y and y needs to be clear
((on ?x ?y) (goal (clear ?y)))
;; need to move x if x is on z and something else needs to be on z
((on ?x ?z) (goal (on ?y ?z)) (not (same ?x ?y)))
;; need to move x if x is on something else that needs to be moved
((on ?x ?w) (need-to-move ?w))
)
领域 (defdomain basic (
(:operator (!pickup ?a) () () ((have ?a))) //动作
(:operator (!drop ?a) ((have ?a)) ((have ?a)) ())
(:method (swap ?x ?y) //方法
((have ?x) (not (have ?y)))
((!drop ?x) (!pickup ?y))
((have ?y) (not (have ?x)))
((!drop ?y) (!pickup ?x)))))
问题 (defproblem problem basic //名称
((have kiwi)) //当前状态1
((swap banjo kiwi))) //目标任务1
计划
[ 1 ] (!drop kiwi) //动作
[ 2 ] (!pickup banjo)
任务 = 动作/方法/状态
动作 = 状态变更
状态 = 原子/原语
求解过程:
目标任务 --方法--> 任务列表 --动作--> 状态 --约束--> 满足
目标任务
|
|--方法--|
子任务 子任务
|
|--动作--|
状态(约束) 状态
|
|-满足检查-|
原子 原子