2016-11-20 5 views
2

프롤로그에 상당히 익숙하며 "route(Startpoint,Endpoint,Route)"술어가있는 경로를 요청할 수있는 프로그램을 만들고 싶습니다.방향 그래프의 프롤로그 경로

내 코드는 지금까지 있습니다 :

% facts 

connection(s1,s2). 
connection(s2,s3). 
connection(s3,s4). 
connection(s4,s5). 
connection(s5,s6). 
connection(s6,s7). 
connection(s7,s1). 

% predicates 

route1(X,Y,[X,Y]) :- connection(X,Y). 
route1(X,Y,R) :- connection(X,Z), route1(Z,Y,RZ), R=[X|RZ]. 

route2(X,Y,[X,Y]) :- connection(Y,X). 
route2(X,Y,R) :- connection(Z,X), route2(Z,Y,RZ), R=[X|RZ]. 

route(X,Y,R) :- route1(X,Y,R); route2(X,Y,R). 

내 코드는 어떤 경로 작동하지만 (위의 사실에서처럼)주기에 제공하지 않을 때. Prolog에서 스테이션이 경로에서 여러 번 방문하는 것을 방지하려면 어떻게해야합니까? 예를 들어

나는 "?- route1(s1,s4,R).는"프롤로그가 먼저 나에게 올바른 길 "[s1,s2,s3,s4]"를 제공 요구, 그러나 또한 나에게 "[s1, s2, s3, s4, s5, s6, s7, s1, s2, s3, s4]", "[s1, s2, s3, s4, s5, s6, s7, s1, s2, s3, s4, s5, s6, s7, s1, s2, s3, s4]"등등과 같은 다른 경로를 제공합니다.

미리 감사드립니다.

답변

2

당신은 쓸 수 :

route1(X,Y,[X,Y]) :- connection(X,Y). 
route1(X,Y,R) :- connection(X,Z), route1(Z,Y,RZ),R=[X|RZ],  
       sort(R,R1),length(R,N),length(R1,N1), 
       (N>N1->!,fail ;true). 

sort/2 중복 제거는 중복을 정렬 된 목록과 같은 길이가 있어야 출력 목록을하지 않는 솔루션을 원한다면. 이 작업을 수행하는

?- route1(s1,s4,R). 
R = [s1, s2, s3, s4] ; 
false. 

또 다른 방법은 다음과 같습니다

route1(X,Y,R):-route1(X,Y,[],R). 

route1(X,Y,_,[X,Y]) :- connection(X,Y). 
route1(X,Y,L,R) :- connection(X,Z),\+member(Z,L), 
        route1(Z,Y,[Z|L],RZ),R=[X|RZ]. 

예 : 내가 아닌 다른 경로를 요청할 때 무한 루프에 관해서

?- route1(s1,s4,R). 
R = [s1, s2, s3, s4] ; 
false. 
+0

[S1, S2, S3, s4]. :/ – zer0kai

+0

답변 편집 죄송합니다. – coder

+0

감사합니다 !! 프롤로그가 정렬 술어와 관련하여 어떤 역할을하는지 조금 더 자세히 설명해 주시겠습니까? – zer0kai