:- use_module(library(lists), [member/2]). station(Station) :- setof(Distance-City,good_city(City,Distance),[_-Station|_]). good_city(City,Distance) :- small_city(City), setof(big_city(Distance,BigCity,OutRail), reachable_big_city(City,BigCity,Distance,OutRail),BigCities), BigCities = [big_city(Distance,City1,OutRail1)|Rest], Rest = [big_city(Distance,City2,OutRail2)|_], City1 \== City2, OutRail1 \== OutRail2. reachable_big_city(City,BigCity,Distance,OutRail) :- rail_c(City,OutRail), Visited = [City], reachable(OutRail,BigCity,Visited,Distance), big_city(BigCity). reachable(City,City,Visited,Distance) :- length(Visited,Distance). reachable(City,TargetCity,Visited,Distance) :- rail_c(City,City1), \+ member(City1,Visited), reachable(City1,TargetCity,[City|Visited],Distance). big_city(City) :- rail_c(City,CityA), rail_c(City,CityB), rail_c(City,CityC), CityA \== CityB, CityA \== CityC, CityB \== CityC. small_city(City) :- rail_c(City,_), \+ big_city(City). rail_c(From,To) :- rail(From,To). rail_c(From,To) :- rail(To,From).