【问题标题】:Prolog code not workin on SWISHProlog 代码在 SWISH 上不起作用
【发布时间】:2016-08-26 11:14:14
【问题描述】:

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

程序“(A:-B)”不存在可从:
swish_trace:swish_call((开始:-canget(状态(atdoor,onfloor,atwindow,hasmeat)))) '$嗖嗖 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).

【问题讨论】:

    标签: prolog swi-prolog


    【解决方案1】:

    我不明白你到底想做什么,但是......

    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).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2015-10-14
      相关资源
      最近更新 更多