城市间最短距离Prolog源程序

一道作业题: 

已知北京、上海、广州、昆明和西安五城市航线里程如图。分别实现:
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).
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值