%%-------------------------------------------------------------------------
%%
%% 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.