2014-11-11 2 views
0

다음 정보는 내 지하 감옥의 날개를 달고 있습니다.방이 경로 사이에 연결되어 있는지 확인하는 방법

path(room1,e,room2). 
path(room2,w,room1). 
path(room2,e,room5). 
path(room5,w,room2). 
path(room5,e,room6). 
path(room6,w,room5). 
path(room2,n,room3). 
path(room3,s,room2). 
path(room3,e,room4). 
path(room4,w,room3). 
path(room4,s,room5). 
path(room5,n,room4). 
path(room5,s,room7). 
path(room7,n,room5). 
path(room7,e,room8) :- at(key, in_hand). 
path(room7,e,room8) :- write('The door appears to be locked.'), nl, fail. 
path(room8,w,room7). 
path(room2,s,room9). 
path(room9,n,room2). 
path(room9,s,room10). 
path(room10,n,room9). 
path(room10,w,room11). 
path(room11,e,room10). 
path(room11,s,room12). 
path(room12,n,room11). 

이제 하나의 방이 다른 방에 연결되어 있는지 확인한 다음 가능한 경로 중 하나를 표시할지 확인하고 싶습니다. 나는 이런 식으로하려고 시도했다. connected(X,Y):-path(X,_,Z),path(Z,_,Y). 그러나 그것은 나에게 잘못된 것을주고있다. 내가 뭘 잘못하고 있는지.

connect(Bgn,End,Path) :- % to find a path between two nodes in the graph 
    connected(Bgn,End,[],P) , % - we invoke the helper, seeding the visited list as the empty list 
    reverse(P,Path)   % - on success, since the path built has stack semantics, we need to reverse it, unifying it with the result 
    . 

connected(X,Y,V,[X,Y|V]) :- % can we get directly from X to Y? 
    path(X,_,Y)    % - if so, we succeed, marking X and Y as visited 
    .       % 
connected(X,Y,V,P) :-  % otherwise... 
    path(X,_,T) ,    % - if a path exists from X to another room (T) 
    T \= Y ,     % - such that T is not Y 
    \+ member(X,V) ,   % - and we have not yet visited X 
    connected(T,Y,[X|V],P) % - we continue on, marking X as visited. 
    . 

같은

+0

정확하게 "계속 거짓이라고 말하려는 노력"을 했습니까? 당신의 술어'connect'는 항상'false'를 리턴하지 않습니다. 예를 들어'connected (room1, Y) .'를 쿼리하면 여러 솔루션을 얻을 수 있습니다. – lurker

+0

하지만 실제로 77 개의 다른 방에 연결되어있을 때만 3 개의 결과를 제공합니다. 또한 연결된 경우 (room1, room2) 거짓일 것입니다. – russiandobby

+1

* connected *가 무엇을 의미하는지 생각해야합니다. 지금, 당신의 술어는'X'에서 다른 어떤 점 Z까지의 경로가 있고'Z'에서 점'Y' *까지의 경로가 있다면'X'가'Y'에 연결되어 있다고 말합니다. 연결된 모든 경우를 다루는 것처럼 들리는가? 중간에 연결된 방이있는 경우가 아니라면 두 개의 이웃 방의 경우를 확실히 처리하지 못합니다. 또한 단 하나의 중간 연결 실도 시행합니다. 인접한 방과 여러 개의 연결 실을 포함하도록 정의를 확장해야하며, 이는 재귀 적으로 수행 할 수 있습니다. – lurker

답변

0

시도 뭔가 당신은 전에 방을 방문하는 데에 대한 테스트를 알게 될 것이다. 그래프에 사이클이있는 경우 이전에 노드를 방문했는지 테스트하지 않은 경우 스택 오버플로가 발생할 때까지 주변을 돌아 다니며 순환합니다.

관련 문제