top of page
Buscar

Distancia entre ciudades usando SWI Prolog

Foto del escritor: Alfredo Reyes HernándezAlfredo Reyes Hernández

Actualizado: 27 ene 2018

Dado el siguiente mapa con carreteras (ficticias) entre ciudades de México.


Objetivos:

  1. Calcular la distancia entre cada par de ciudades.

  2. Encontrar una ruta entre un par de ciudades.

  3. 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).


Mira el código en acción



Descargar código completo.

1072 visualizaciones0 comentarios

Entradas recientes

Ver todo

Commentaires


bottom of page