2016-08-26 3 views
-1

개는 동작을 수행 할 수 있습니다. walk on floor; 상자에 올라 타십시오 (상자에 이미있는 경우). 고기 밑의 상자에 서 있으면 고기를 잡으십시오.
swish_trace : (: -B A)가 '에서 연결할 존재하지 않는 swish_call ((시작 : -canget (상태 (atdoor, onfloor 내가 아래의 코드를 실행하지만, 그러나 나는 오류프롤로그 코드가 SWISH에서 작동하지 않음

절차를`수 , atwindow, hasmeat)))) '$ 휙 래퍼'((시작 :))), atwindow, hasmeat을 -canget (상태 (atdoor를 onfloor, 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). 

답변

0

난 몰라 정확히 무엇을하고 싶은지에 대해 서약하지만 ...

1) 내가 제대로 이해한다면, 당신이 그렇게 has_meat 사용 has_meat

2) 대신 hasmeat를 사용하여 목표

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

을 검증하기 위해 노력하고, 오류 메시지에 따라, 목표는에 immediatly 사실 덕분입니다 사실

canget(state(_, _, _, has_meat)) 

그래서 당신의 시작 사실은 뭔가해야한다는 생각 has_no_meat

3) 먼저 move이 있으니 move/2 (두 주) 대신 move/3 (주, 행동, 주); 행동을 추가하는 것이 좋습니다. 다음 canget 규칙

canget(State1) :- move(State1, Move, State2), canget(State2). 

Move에서

move(state(middle,onbox,middle,has_no_meat), 
    take_meat, 
    state(middle,onbox,middle,has_meat)). 

4 같은)는 단일 변수; 당신이 그것을 사용하지 않는다면 (write(Move)?) 그것은 혼란스러운 경고의 유일한 원천입니다; 다시 작성 하시길 바랍니다.

canget(State1) :- 
    move(State1, _, State2), 
    canget(State2). 
관련 문제