一道作业题:
已知北京、上海、广州、昆明和西安五城市航线里程如图。分别实现:
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).
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).
showShortestRoute(beijing,kunming),
showMustPassRoutes(beijing,kunming,shanghai),
showMustNotPassRoutes(beijing,kunming,shanghai,guangzhou).