BUSQUEDA.PRO



%%-------------------------------------------------------------------------
%%
%%	entre dos de ellas.
%%
%% Manera de ejecutarse:
%%        Antes de correr el programa, debe modificarse la base de datos
%%
%%   goal
%%	assertz(vuelo(nueva_york, chicago, 1000)),
%%	assertz(vuelo(chicago, denver, 1000)),
%%	etc...
%%	desde:
%%	a:
%% a lo que se debe contestar con el nombre de la ciudad que se desea y que
%% existe en la base de datos
%%-------------------------------------------------------------------------


domains
	s = symbol
	i = integer
database
	vuelo(s,s,i)
	visitado(s)
predicates	
	ruta(s,s,i)
	encontrar_optima(s,s,i)
	es_vuelo(s,s,i)
	encontrar_ruta
goal
	assertz(vuelo(nueva_york, chicago, 1000)),
	assertz(vuelo(chicago, denver, 1000)),
	assertz(vuelo(nueva_york, toronto, 800)),
	assertz(vuelo(nueva_york, denver, 1900)),
	assertz(vuelo(toronto, calgary, 1500)),
	assertz(vuelo(toronto, los_angeles, 1800)),
	assertz(vuelo(toronto, chicago, 500)),
	assertz(vuelo(denver, urbana, 1000)),
	assertz(vuelo(denver, houston, 1500)),
	assertz(vuelo(houston, los_angeles, 1500)),
	assertz(vuelo(denver, los_angeles, 1000)),
	encontrar_ruta, nl.


clauses
	encontrar_ruta:-
		write("desde: "),
		readln(A),
		write("a: "),readln(B),
		encontrar_optima(A, B, 10000).
	encontrar_ruta.
	
	encontrar_optima(A, B, Max):-
		ruta(A, B, D), D<Max,
		write("La distancia es ", D), nl,
		encontrar_optima(A, B, D).
	encontrar_optima(_,_,_).
	
	ruta(A, B, C):-
		es_vuelo(A, B, C).
	ruta(_, _, D):- !,
		nl,
		D=0, fail, !.
		
	es_vuelo(T, T2, D):-
		vuelo(T, T2, D).
	es_vuelo(T, T2, D):-
		vuelo(T, X, D2),
		X<>T2,
		es_vuelo(X, T2, D3),
		D2 + D3 = D.