一道作業題: 已知北京、上海、廣州、昆明和西安五城市航線裡程如圖。分別實現: 1)找到北京到昆明的最短路徑。 2)找到北京到昆明,必須途徑上海的路徑。 3)找到北京到昆明,必須途徑上海,但不能去廣州的路徑。
|
|
北京 |
上海 |
廣州 |
昆明 |
西安 |
|
北京 |
|
|
|
|
|
|
上海 |
1462 |
|
|
|
|
|
廣州 |
2107 |
1811 |
|
|
|
| 昆明 |
3179 |
2677 |
2216 |
|
|
| 西安 |
1165 |
1511 |
2129 |
1942 |
|
Visual Prolog來源程式: domains
city=symbol
citylist=city*
distance=integer
predicates
nondeterm road(city,city,distance)
nondeterm connected(city,city,distance)
nondeterm route(city,city,citylist,citylist,distance)
member(city,citylist)
showAllRoutes(city,city)
shorterRouteExist(city,city,distance)
showShortestRoute(city,city)
showMustPassRoutes(city,city,city)
showMustNotPassRoutes(city,city,city,city)
writeRoute(city,citylist,distance)
reverse_list(citylist,citylist,citylist)
clauses
road(beijing,shanghai,1462).road(beijing,guangzhou,2107).
road(beijing,kunming,3179).road(beijing,xi_an,1165).
road(shanghai,guangzhou,1811).road(shanghai,kunmig,2677).
road(shanghai,xi_an,1511).road(guangzhou,kunming,2216).
road(guangzhou,xi_an,2129).road(kunming,xi_an,1942).
connected(City1,City2,Distance):-road(City1,City2,Distance).
connected(City1,City2,Distance):-road(City2,City1,Distance).
member(X,[X|_]):-!.
member(X,[_|L]):-member(X,L).
route(City,City,VisitedCities,VisitedCities,0):-!.
route(City1,City2,VisitedCities,ResultVisitedCities,Distance):-
connected(City1,X,Distance1),
not(member(X,VisitedCities)),
route(X,City2,[X|VisitedCities],ResultVisitedCities,Distance2),
Distance=Distance1+Distance2.
showAllRoutes(City1,City2):-
write("All routes between ",City1," and ",City2," are:/n"),
route(City1,City2,[City1],VisitedCities,Distance),
writeRoute(City1,VisitedCities,Distance),nl,
fail.
showAllRoutes(_,_).
showMustPassRoutes(City1,City2,City3):-
write("All routes between ",City1," and ",City2," must pass ",City3," are:/n/n"),
route(City1,City2,[City1],VisitedCities,Distance),
member(City3,VisitedCities),
writeRoute(City1,VisitedCities,Distance),nl,
fail.
showMustPassRoutes(_,_,_).
showMustNotPassRoutes(City1,City2,City3,City4):-
write("All routes between ",City1," and ",City2," must pass ",City3," but does'nt pass ",City4," are:/n/n"),
route(City1,City2,[City1],VisitedCities,Distance),
member(City3,VisitedCities),
not(member(City4,VisitedCities)),
writeRoute(City1,VisitedCities,Distance),nl,
fail.
showMustNotPassRoutes(_,_,_,_).
shorterRouteExist(City1,City2,Distance):-
route(City1,City2,[City1],_,Distance1),
Distance1<Distance,!.
showShortestRoute(City1,City2):-
write("Shortest route between ",City1," and ",City2," is:/n/n"),
route(City1,City2,[City1],VisitedCities,Distance),
not(shorterRouteExist(City1,City2,Distance)),
writeRoute(City1,VisitedCities,Distance),nl,
fail.
showShortestRoute(_,_).
writeRoute(City1,[City1|VisitedCities],Distance):-
!,
Cities=[City1|VisitedCities],
write(" ",Cities," the distance is ",Distance),nl.
writeRoute(_,VisitedCities,Distance):-
reverse_list(VisitedCities,[],VisitedCities_Reversed),
write(" ",VisitedCities_Reversed," the distance is ",Distance),nl.
reverse_List([],LIST,LIST):-!.
reverse_List([H|SeenListReset],Interm,SeenList):-
reverse_List(SeenListReset,[H|Interm],SeenList). goal
showShortestRoute(beijing,kunming),
showMustPassRoutes(beijing,kunming,shanghai),
showMustNotPassRoutes(beijing,kunming,shanghai,guangzhou).