2016-10-13 5 views
3

나는 시간을 떠나는 설정에 도착,에서와 장소에가는 버스 WTH 버스 회사를 반영 프롤로그에서이 지식 기반을 만들었습니다이 그래프 패스 파인더의 프롤로그에서 중간 단계를 어떻게 표시 할 수 있습니까?

경로 사이가있는 경우 내 지식 기반을 요청할 때마다
connection(kerkrade, heerlen, 1100, 1200). 
connection(kerkrade, bleijerheide, 1100, 1225). 
connection(heerlen, kerkrade, 1115, 1230). 
connection(heerlen, maastricht, 1230, 1330). 
connection(maastricht, heerlen, 1430, 1530). 
connection(maastricht, sittard, 1331, 1430). 
connection(maastricht, sittard, 1345, 1445). 
connection(sittard, maastricht, 1630, 1530). 
connection(sittard, denbosch, 1530, 1700). 
connection(denbosch, sittard, 1800, 1930). 
connection(denbosch, amsterdam, 1000, 1330). 

checkTime(X,Y,Z):- 
    connection(X,Y,S,_), 
    (Z =< S). 

aRoute(From, To, Time):- 
    checkTime(From,To,Time). 

testRoute(A,B,T):- 
    walk(A,B,T,[]). 


walk(A,B,Time,V) :- 
    aRoute(A,X,Time), 
    not(member(X,V)), 
    (
     B = X; 
     connection(A,X,_,S), walk(X,B,S,[A|V]) 
    ). 

두 점, 그것이 가능한지 여부를 반환합니다. true 또는 false는 :

testRoute(kerkrade, sittard, 900). 
true; (signifies that there are three routes, of which two are possible) 
true; 
false. 

그러나, 이것은 내가 원하는 것이 아니다. 최선의 경우이 같은 최상위에서 두 점 사이의 경로를 생성하는 데 사용되는 연결을 보여주고 싶은 :이 어떻게해야합니까

connection(kerkrade, heerlen, 1100, 1200) 
connection(heerlen, maastricht, 1230, 1330) 
/* and so on.. */ 

? 나는 그 값을보고 할 수 있도록같은 변수를 testRoute에 대한 호출과 함께 전달해야한다고 생각한다. 나는 그것을 배치 할 위치가 확실하지 않기 때문에 그 술어를 쓰는 데 어려움을 겪고있다. 내 생각은 walk(A,B,Time,V)에 추가 매개 변수를 추가해야하지만 그 이후에 경로의 중간 단계를보고하기 위해 내가 할 수있는 일을 알지 못합니다.

답변

3

당신은 서면에 의해 연결이 목록을 유지할 수 :

checkTime(X,Y,Z, connection(X,Y,S,W)):- 
    connection(X,Y,S,W), 
    (Z =< S). 

aRoute(From, To, Time,Head):- 
    checkTime(From,To,Time,Head). 

testRoute(A,B,T,L):- 
    walk(A,B,T,[],L). 


walk(A,B,Tijd,V,[Head|L]) :- 
    aRoute(A,X,Tijd,Head), 
    not(member(X,V)), 
    (
     B = X,L=[]; 
     connection(A,X,_,S), walk(X,B,S,[A|V],L) 
    ). 

예 :

?- testRoute(kerkrade, sittard, 900,L). 
L = [connection(kerkrade, heerlen, 1100, 1200), connection(heerlen, maastricht, 1230, 1330), connection(maastricht, sittard, 1331, 1430)] ; 
L = [connection(kerkrade, heerlen, 1100, 1200), connection(heerlen, maastricht, 1230, 1330), connection(maastricht, sittard, 1345, 1445)] ; 
false. 
+0

당신의 대답은 완벽하게 일을 다음과 같은 솔루션을 제안 경로에 대한 또 다른 변수를 전달해야 가정, 감사합니다! 'L = []'은 정확히 무엇을합니까? 빈 목록과 L 사이의 동등성을 평가합니까? – Zimano

+0

또는 L을 빈 목록과 통합합니까? – Zimano

+0

리스트의 Head를 인스턴스화하고 거기에서 끝내기 때문에 목록의 꼬리가 비어 있어야합니다 (추가 할 다른 요소가 없습니다). – coder

3

내가 두 점 [사이의 경로를 생성하는 데 사용되는 연결을 보여주고 싶은 ... .] 어떻게해야합니까? testRoute에 대한 호출과 함께 X와 같은 변수를 전달해야하므로 변수의 값을보고 할 수 있다고 생각합니다.

예 : 나는 당신이

내가

walk(Stop, Stop, _, ReverseRoute, DirectRoute):- 
    reverse(ReverseRoute, DirectRoute). 

walk(Start, Stop, TimeMin, ReverseRoute, DirectRoute) :- 
    connection(Start, Mid, TimeStart, TimeArrival), 
    TimeMin =< TimeStart, 
    not(member(Mid, ReverseRoute)), 
    walk(Mid, Stop, TimeArrival, [Mid | ReverseRoute], DirectRoute). 

testRoute(Start, Stop, TimeStart, Route) :- 
    walk(Start, Stop, TimeStart, [Start], Route).