/**

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.