Prolog 代码不适用于 SWISH
Prolog code not workin on SWISH
狗可以表演
以下动作:在地板上行走;爬上箱子(如果它已经在箱子里);如果站在肉正下方的盒子上,则抓住肉。但是当我 运行 下面的代码时,我得到一个错误
procedure `(A:-B)' does not exist Reachable from:
swish_trace:swish_call((start:-canget(state(atdoor,onfloor,atwindow,hasmeat))))
'$swish
wrapper'((start:-canget(state(atdoor,onfloor,atwindow,hasmeat))),A)
move(state(middle,onbox,middle,has_no_meat),state(middle,onbox,middle,has_meat)).
/*climbing the box*/
move(state(middle_floor, onfloor, middle_floor,has_no_meat), climb,
state(middle_floor,onbox, middle_floor,has_meat)).
/*pushing the box to the middle of the room*/
move(state(atwindow,onfloor,atwindow,has_box),
push(atwindow,middle_floor),
state(middle_floor,onfloor,middle_floor,has_box)).
/*dog walks from the door to the window*/
move(state(atdoor,onfloor,box,has_not), walk(atdoor,atwindow),
state(atwindow,onfloor,box,has_box)).
canget(state(_, _, _, has_meat)).
canget(State1) :- move(State1, Move, State2), canget(State2).
我不太明白你到底想做什么,但是...
1) 根据报错信息,如果我没理解错的话,你是在验证目标
canget(state(atdoor,onfloor,atwindow,hasmeat))
所以使用 hasmeat
而不是 has_meat
2) 使用 has_meat
,由于事实
,目标立即实现
canget(state(_, _, _, has_meat))
所以我想你的起始事实应该是 has_no_meat
3) 你首先 move
是 move/2
(几个状态)而不是 move/3
(状态、动作、状态);我建议添加一个动作;像
move(state(middle,onbox,middle,has_no_meat),
take_meat,
state(middle,onbox,middle,has_meat)).
4) 在下面的 canget
规则中
canget(State1) :- move(State1, Move, State2), canget(State2).
Move
是单例变量;如果你不使用它(write(Move)
?)它只是令人不安的警告的来源;我建议将其重写为
canget(State1) :-
move(State1, _, State2),
canget(State2).
狗可以表演 以下动作:在地板上行走;爬上箱子(如果它已经在箱子里);如果站在肉正下方的盒子上,则抓住肉。但是当我 运行 下面的代码时,我得到一个错误
procedure `(A:-B)' does not exist Reachable from:
swish_trace:swish_call((start:-canget(state(atdoor,onfloor,atwindow,hasmeat)))) '$swish wrapper'((start:-canget(state(atdoor,onfloor,atwindow,hasmeat))),A)
move(state(middle,onbox,middle,has_no_meat),state(middle,onbox,middle,has_meat)).
/*climbing the box*/
move(state(middle_floor, onfloor, middle_floor,has_no_meat), climb,
state(middle_floor,onbox, middle_floor,has_meat)).
/*pushing the box to the middle of the room*/
move(state(atwindow,onfloor,atwindow,has_box),
push(atwindow,middle_floor),
state(middle_floor,onfloor,middle_floor,has_box)).
/*dog walks from the door to the window*/
move(state(atdoor,onfloor,box,has_not), walk(atdoor,atwindow),
state(atwindow,onfloor,box,has_box)).
canget(state(_, _, _, has_meat)).
canget(State1) :- move(State1, Move, State2), canget(State2).
我不太明白你到底想做什么,但是...
1) 根据报错信息,如果我没理解错的话,你是在验证目标
canget(state(atdoor,onfloor,atwindow,hasmeat))
所以使用 hasmeat
而不是 has_meat
2) 使用 has_meat
,由于事实
canget(state(_, _, _, has_meat))
所以我想你的起始事实应该是 has_no_meat
3) 你首先 move
是 move/2
(几个状态)而不是 move/3
(状态、动作、状态);我建议添加一个动作;像
move(state(middle,onbox,middle,has_no_meat),
take_meat,
state(middle,onbox,middle,has_meat)).
4) 在下面的 canget
规则中
canget(State1) :- move(State1, Move, State2), canget(State2).
Move
是单例变量;如果你不使用它(write(Move)
?)它只是令人不安的警告的来源;我建议将其重写为
canget(State1) :-
move(State1, _, State2),
canget(State2).