/**
Programa que permite ver el funcionamiento del baktracking de Prolog, usando como ejemplo
las rutas aereas.
Inteligencia Artificial
Gonzalo Villarreal Farah
Se ejecuta desde un Goal interno con menu.
Este programa corre en la version de Turbo Prolog 2.0 de la Borland
______________________________RUTAS AEREAS _____________________________*/
code=2000
DOMAINS
capital=symbol
distancia,n=integer
aerolinea=symbol
numero=integer
PREDICATES
tt(capital,capital)
a(capital,capital)
combinacion(capital,capital,distancia,aerolinea)
hay_vuelo(capital,capital)
vuelo_directo(capital,capital,distancia,aerolinea)
opcion(numero)
cls
menu
CLAUSES
%____________________________________________________________
/* Esta clausula es la que corresponde a la base de hechos,
puede incrementarse. */
combinacion(santiago,buenos_aires,1138,a_argentinas).
combinacion(santiago,montevideo,1366,pluna).
combinacion(santiago,la_paz,2170,lan).
combinacion(montevideo,brasilia,2500,varig).
combinacion(la_paz,brasilia,2200,varig).
combinacion(la_paz,caracas,2700,pan_am).
combinacion(la_paz,lima,715,aeroperu).
combinacion(la_paz,bogota,2200,aeroperu).
combinacion(la_paz,quito,1106,pa_nam).
combinacion(lima,quito,335,a_ecuatorianas).
combinacion(bogota,la_habana,2370,avianca).
combinacion(quito,nicaragua,4340,eastern).
combinacion(caracas,nicaragua,3134,pan_am).
combinacion(quito,salvador,2680,avianca).
%_____________________________________________________________________
/* Estas clausulas permiten ver la existencia de rutas entre dos paises
sin importar las convinaciones entre ellos */
a(M,N):-hay_vuelo(M,N),
write(" ! HAY VUELO ! "),
nl,nl,nl,nl,nl,nl,nl,nl,nl,nl,
write("presione ENTER para volver al menu"),
readln(_),menu.
a(M,N):-not(hay_vuelo(M,N)),
write(" ! NO HAY VUELO ! "),
nl,nl,nl,nl,nl,nl,nl,nl,nl,
write("presione ENTER para volver al menu"),
readln(_),menu.
hay_vuelo(X,Y):-combinacion(X,Y,_,_).
hay_vuelo(X,Y):-combinacion(X,Z,_,_),
hay_vuelo(Z,Y).
%_______________________________________________________________________
%_____________________________________________________________________
/* Estas clausulas permiten ver la existencia de una ruta
directa entre dos paises. Permite ademēs ver la distancia y
la aerolinea que une ambos paises. Estos datos se obtienen de
la base de hechos. */
tt(M,N):-vuelo_directo(M,N,L1,L2),
write("LA DISTANCIA ES:"),write(L1),nl,
write("AEROLINEA(S):"),write(L2),nl,
nl,nl,nl,nl,nl,nl,
write("presione ENTER para volver al menu"),
readln(_),menu.
tt(_,_):-write("! NO HAY VUELO DIRECTO !"),
nl,nl,nl,nl,nl,nl,nl,nl,
write("presione ENTER para volver al menu"),
readln(_),menu.
vuelo_directo(X,Y,D,C):-combinacion(X,Y,D,C).
%_______________________________________________________________________
cls:-makewindow(1,0,0," ",0,0,25,80).
opcion(1):-removewindow,
cls,makewindow(2,100,112,"CAPITALES",1,8,20,60),nl,nl,nl,
write(" SANTIAGO"),nl,
write(" BUENOS_AIRES"),nl,
write(" MONTEVIDEO"),nl,
write(" LA_PAZ"),nl,
write(" BRASILIA"),nl,
write(" CARACAS"),nl,
write(" LIMA"),nl,
write(" BOGOTA"),nl,
write(" QUITO"),nl,
write(" LA_HABANA"),nl,
write(" NICARAGUA"),nl,
write(" SALVADOR"),nl,
cursor(17,1),write("presione ENTER para volver al menu"),readln(_),menu.
opcion(2):-removewindow,cls,
makewindow(2,100,112,"CAPITALES",0,0,17,15),
write(" "),nl,
write("SANTIAGO"),nl,
write("BUENOS_AIRES"),nl,
write("MONTEVIDEO"),nl,
write("LA_PAZ"),nl,
write("BRASILIA"),nl,
write("CARACAS"),nl,
write("LIMA"),nl,
write("BOGOTA"),nl,
write("QUITO"),nl,
write("LA_HABANA"),nl,
write("NICARAGUA"),nl,
write("SALVADOR"),nl,
makewindow(3,100,112,"VERIFICACION DE VUELO",0,22,22,58),nl,nl,nl,
write("INGRESE LA CAPITAL DE PARTIDA :"),readln(M),nl,
write("INGRESE LA CAPITAL DE LLEGADA :"),readln(N),nl,nl,
a(M,N).
opcion(3):-removewindow,cls,
makewindow(2,100,112,"CAPITALES",0,0,17,15),
write(" "),nl,
write("SANTIAGO"),nl,
write("BUENOS_AIRES"),nl,
write("MONTEVIDEO"),nl,
write("LA_PAZ"),nl,
write("BRASILIA"),nl,
write("CARACAS"),nl,
write("LIMA"),nl,
write("BOGOTA"),nl,
write("QUITO"),nl,
write("LA_HABANA"),nl,
write("NICARAGUA"),nl,
write("SALVADOR"),nl,
makewindow(1,100,112,"VUELO DIRECTO ENTRE DOS
CAPITALES",0,22,22,58),nl,nl,nl,
write("INGRESE LA CAPITAL DE PARTIDA :"),readln(M),nl,nl,nl,
write("INGRESE LA CAPITAL DE LLEGADA :"),readln(N),nl,nl,nl,
tt(M,N).
opcion(5):-exit.
opcion(4):-removewindow,cls,
makewindow(1,100,112,"DIAGRAMA DE LAS CAPITALES",0,0,25,80),nl,nl,nl,
write(" MONTEVIDEO <------- SANTIAGO ------> BUENOS_AIRES "),nl,
write(" | | "),nl,
write(" | | "),nl,
write(" BRASILIA-----------| | "),nl,
write(" | | "),nl,
write(" LIMA-----|--LA_PAZ---BOGOTA----LA_HABANA "),nl,
write(" | | | "),nl,
write(" | | | "),nl,
write(" SALVADOR-------QUITO-------------------| "),nl,
write(" | | "),nl,
write(" | | "),nl,
write(" | CARACAS "),nl,
write(" | | "),nl,
write(" | | "),nl,
write(" | | "),nl,
write(" |------NICARAGUA "),nl,
cursor(22,1),write("presione ENTER para volver al menu"),readln(_),menu.
menu:-
makewindow(1,100,112,"MENU",0,0,25,80),nl,nl,
write(" 1 - CAPITALES "),nl,nl,
write(" 2 - DESEA AVERIGUAR SI HAY VUELO ENTRE DOS PAISES "),nl,nl,
write(" 3 - VUELO DIRECTO,DISTANCIA Y AEROLINEA ENTRE DOS
CAPITALES"),nl,nl,
write(" 4 - DIAGRAMA "),nl,nl,
write(" 5 - FIN "),nl,nl,nl,
write(" INGRESE SU OPCION : "),readint(W),
opcion(W).
goal
menu.