Dado el siguiente mapa con carreteras (ficticias) entre ciudades de México.
![](https://static.wixstatic.com/media/a27d24_d0a25d4a87b449a592b1a0fc4ee08fab~mv2.jpg/v1/fill/w_857,h_603,al_c,q_85,enc_auto/a27d24_d0a25d4a87b449a592b1a0fc4ee08fab~mv2.jpg)
Objetivos:
Calcular la distancia entre cada par de ciudades.
Encontrar una ruta entre un par de ciudades.
Dar la distancia recorrida para llegar de la ciudad A a la ciudad B.
Solución:
Se definen los hechos que establecen la información de las carreteras, el hecho recibe: ciudad de origen, ciudad de destino y la cantidad en kilómetros de la distancia de la carretera que las conecta
carretera(la_paz,tijuana,1063).
carretera(tijuana,hermosillo,563).
carretera(hermosillo,chihuahua,500).
carretera(hermosillo,culiacan,588).
carretera(chihuahua,culiacan,438).
carretera(chihuahua,saltillo,625).
carretera(chihuahua,durango,533).
carretera(culiacan,durango,288).
carretera(culiacan,tepic,438).
carretera(durango,saltillo,413).
Regla que se invoca que genera una ruta y su distancia, recibe:
ciudad de origen, destino y una varible plan
plan(Origen,Destino,Plan):-planear(Destino,[0,Origen],Ruta),
invertir(Ruta,[],Plan).
Regla que encuentra la ruta o plan que hay que seguir de una ciudad Destino a
una ciudad Origen y que guarda la Distancia recorrida
planear(Destino,[Distancia,Destino|Ciudades],[Distancia,Destino|Ciudades]):-!.
planear(Destino,[DistanciaAnterior,Actual|Ciudades],Ruta):-
conectados(Actual,Siguiente,DistanciaAux),
\+member(Siguiente,Ciudades),
NuevaDistancia is DistanciaAnterior+DistanciaAux,
planear(Destino,[NuevaDistancia,Siguiente,Actual|Ciudades],Ruta).
Regla que determina si dos ciudades estan conectadas por una carretera*
conectados(Ciudad1,Ciudad2,Distancia):-carretera(Ciudad1,Ciudad2,Distancia).
conectados(Ciudad1,Ciudad2,Distancia):-carretera(Ciudad2,Ciudad1,Distancia).
Regla que invierte el contenido de una lista.
invertir([],Lista,Lista).
invertir([X|Cola],HastaAhora,Lista):-
invertir(Cola,[X|HastaAhora],Lista).
Regla que lee la ciudad de Origen
pedir_origen(Origen):-write('Dame la ciudad de origen\n'), read(Origen).
Regla que lee la ciudad Destino
pedir_destino(Destino):-write('Dame la ciudad de destino\n'), read(Destino).
Regla que imprime uno a uno los elementos de una lista
imprimir([]):-!.
imprimir([CABEZA|CUERPO]):-write(CABEZA), write('\n'),imprimir(CUERPO).
Regla Principal, inicia la interacción con el usuario para obtener la ruta desde una ciudad destino a una ciudad de origen.
iniciar():-pedir_origen(X), pedir_destino(Y), write('Usted va de '), write(X),
write(' a '), write(Y), write(' La ruta y la distancia total que debera recorrer se muestran a continuacion\n\n'),
plan(X, Y, DistanciaRuta), imprimir(DistanciaRuta).
Commentaires