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.
.
같은
정확하게 "계속 거짓이라고 말하려는 노력"을 했습니까? 당신의 술어'connect'는 항상'false'를 리턴하지 않습니다. 예를 들어'connected (room1, Y) .'를 쿼리하면 여러 솔루션을 얻을 수 있습니다. – lurker
하지만 실제로 77 개의 다른 방에 연결되어있을 때만 3 개의 결과를 제공합니다. 또한 연결된 경우 (room1, room2) 거짓일 것입니다. – russiandobby
* connected *가 무엇을 의미하는지 생각해야합니다. 지금, 당신의 술어는'X'에서 다른 어떤 점 Z까지의 경로가 있고'Z'에서 점'Y' *까지의 경로가 있다면'X'가'Y'에 연결되어 있다고 말합니다. 연결된 모든 경우를 다루는 것처럼 들리는가? 중간에 연결된 방이있는 경우가 아니라면 두 개의 이웃 방의 경우를 확실히 처리하지 못합니다. 또한 단 하나의 중간 연결 실도 시행합니다. 인접한 방과 여러 개의 연결 실을 포함하도록 정의를 확장해야하며, 이는 재귀 적으로 수행 할 수 있습니다. – lurker