Prolog代码不适用于SWISH

时间:2016-08-26 11:14:15

标签: prolog swi-prolog

狗可以表演 以下行动:走在地板上;爬上盒子(如果它已经在盒子里);如果站在肉的正下方的盒子上,抓住肉。但是当我运行下面的代码,但我得到一个错误

  程序`(A:-B)'不存在可来自:   swish_trace:swish_call((开始:-canget(状态(atdoor,onfloor,atwindow,hasmeat))))       ' $沙沙   包装'((开始:-canget(状态(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 个答案:

答案 0 :(得分:0)

我不确切地说你想做什么但是...

1)根据错误信息,如果我理解正确,您正在尝试验证目标

canget(state(atdoor,onfloor,atwindow,hasmeat))

所以使用hasmeat代替has_meat

2)使用has_meat,由于事实

,目标立即成立
canget(state(_, _, _, has_meat))

所以我认为你的开始事实应该是has_no_meat

3)您首先movemove/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).