2014-11-20 8 views
1

체스 보드에 놓여 있고 킹 캔처럼 움직일 수있는 로봇이 있다고 가정 해 봅시다.Prolog : 미로에서 길 찾기

보드의 좌표는 [1,1]에서 [8,8]까지입니다.

시작 위치는 [1,1]이며 마지막은 [8,8]입니다. 예를 들어 [[1,4], [2,5], [5,6]]과 같은 장애물의 좌표 목록이 포함 된 목록 X가 있습니다. 문제는 로봇이 시작 위치에서 최종 위치로 이동할 수있는 방법인지 여부입니다.

path([A,B],_):- A is 8, B is 8. 
path([A,B],X):- 
     possibleMoves(A,B,L), % possibleMoves returns a list of all the possible coords that 
     the robot can go to. (Example for [1,1] are [[0,1],[0,0],[2,1]...]) 

     member([Ex,Ey],L), % member generates all the possible members from the list L 
     not(member([Ex,Ey],X)), % if this member is not member of the "forbidden ones" 
     Ex<9,Ex>0,Ey<9,Ey>0, % and its coords are on the board 
     path([Ex,Ey],X). 


isTherePath(X):- possibleMoves(1,1,L), 
       member(E,L), 
       path(E,X). 

을하지만 실수가하고 값을 반환하지 않습니다

나는이 술어했다. 재귀가 멈추지 않는 이유를 찾을 수 없습니다.

+1

첫 번째 줄의 의도는 무엇입니까? 그것은 항상 A와 B에 8을 할당 할 것입니다. 당신이 할당하는 대신에 비교하기를 원합니다. –

답변

2

하나의 조건부에서 정의한 모든 유효한 제한 사항 - 보유한 모든 제한 사항 포함. 이 이름 지정 규칙에 스틱 :

step(Forbidden,[X0,Y0],[X,Y]) :- 
    possibleMoves(X0,Y0,L), % rather: possibleMove([X0,Y0],L), 
    member([X,Y],L), 
    between(1,8,X), 
    between(1,8,Y), 
    non_member([X,Y],Forbidden). 

X0 "첫 번째"값 X "마지막"값을 이제와 경로가 있습니다

..., closure0(step(Forbidden), S0,S), ... 

closure0/3 사이클을 담당합니다.

+1

고마워요.하지만 클로저를 사용할 수 없습니다. 내 자신의 술어를 만들어야합니다. 내가 지금하는 코디가 최종 코디인지 확인할 수있는 술어'스텝 '을 만들 수 없습니까? 그리고 내가 아니라면 당신이 정의한이 단계를 사용할 것입니다. – chnging

+1

다음 첫 번째 인수를 단계 (금지됨)로 바꾸십시오 ... – false