Download - Programación Lógica con PROLOG
![Page 1: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/1.jpg)
Programación lógicaEjercicios PROLOG en tu móvil
ANDROID
![Page 2: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/2.jpg)
Descargar de Play Store● Jekejeke Prolog Runtime de XLOG Technologies
○ Es el intérprete del lenguaje, ver video que viene con la descarga
○ Emplearemos frecuentemente las opciones de su menu; Close, New y Load
● Gestor de Archivos HD de Cheetah Mobile○ Es un administrador de archivos, nos ayudará a
crear bases de conocimiento en archivos de texto
![Page 3: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/3.jpg)
Ejemplo líneas del Metro
● Modelo de la CD de México recortado a primer cuadro
● 4 líneas● 25 estaciones● 6 correspondencias● En Prolog haremos una
base de conocimiento● Responderá a preguntas
sobre posibles rutas origen-destino
![Page 4: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/4.jpg)
Declaraciones afirmativas
● La programación lógica permite formalizar hechos, ejemplo:
“Hidalgo es una estación del metro”“Allende es una estación de la línea azul del metro”
● En Prolog estas afirmaciones se representan:estacion_metro(hidalgo).
linea(azul,allende).
![Page 5: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/5.jpg)
Requisitos de sintaxis de las declaraciones
● No se utilizan mayúsculas● Las declaraciones tienen dos partes
○ Predicado del lado izquierdo○ Argumentos del lado derecho entre paréntesis
● Cada afirmación termina con un punto● El nombre de un predicado compuesto puede usar el
símbolo de subrayado, no se permiten espacios ni guiones
![Page 6: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/6.jpg)
● La programación lógica también formaliza reglas o restricciones, ejemplo:
“Una correspondencia se da entre dos líneas; la estación común tiene el mismo nombre en ambas líneas"
En Prolog esta aseveración se representa:correspondencia(E,L1,L2) :- linea(L1,E), linea(L2,E).
Planteamiento de reglas
![Page 7: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/7.jpg)
Observaciones de la sintaxis● Las reglas requieren de variables L1,L2,E● Las variables se representan en mayúsculas● Las mismas variables deben aparecer en ambos lados
de la regla● Las dos partes de la regla se separan por :- que es el
símbolo de inferencia● La regla debe terminar con punto● La coma , significa “Y”
![Page 8: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/8.jpg)
Base de conocimiento
● Es un conjunto de afirmaciones y reglas● Se almacenan en archivos de texto ● El intérprete Prolog consulta la base de conocimiento
para responder a preguntas concretas, ejemplo:
? - linea(verde, allende). ↵No
¿Allende es una estación de la línea verde del metro?
![Page 9: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/9.jpg)
Crear base de conocimiento en el móvil
● Ejecutar el gestor de archivos File Manager● Crear un directorio de trabajo de preferencia en la
tarjeta SD● En el directorio de trabajo crear un archivo de texto con
la extensión .pl● Escribir las afirmaciones de la base de conocimiento● % al inicio de cada línea se tomará como un comentario● No olvidar el punto al final de cada declaración● Guardar el archivo de texto
![Page 10: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/10.jpg)
Crear base de conocimiento en el móvil
![Page 11: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/11.jpg)
Base de conocimiento, archivo metro.pl
● A nuestras afirmaciones les damos la forma:
linea(color, nombre_estacion, numero_estacion).
linea(azul,revolucion,1).linea(azul,hidalgo,2)....linea(verde,hidalgo,1).linea(verde,juarez,2).….linea(rosa,cuauhtemoc,1).linea(rosa,balderas,2).….linea(gris,chabacano,6).
![Page 12: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/12.jpg)
Cargar base conocimiento en Prolog
● Ejecutar Jekejeke Prolog● Tomar la opción Load… ● Localizar directorio de trabajo y la base de
conocimiento, archivo .pl● Si no hay mensaje de error, iniciar interrogatorio● En caso de error ir a File Manager, abrir el archivo .pl,
corregirlo y guardarlo● Volver a cargar con la opción Load…● La opción New… da una nueva pantalla
![Page 13: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/13.jpg)
Cargar base de conocimiento
![Page 14: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/14.jpg)
Interrogando la base de conocimiento
● allende es una estación de la línea verde?
?- linea(verde,allende,_). ↵NO?-
● Las preguntas se escriben en el mismo formato que las afirmaciones
● Las respuestas son solo “SI” o “NO”● Argumentos en minúsculas son constantes● El símbolo _ en la pregunta, es una variable
en blanco, su significado en esta pregunta es; “no me interesa el número de estación”
![Page 15: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/15.jpg)
Interrogando la base de conocimiento
● Todas las estaciones de la línea verde??- linea(verde,ESTACION,_). ↵ESTACION = hidalgo ;ESTACION = juarez ;ESTACION = balderas ;ESTACION = ninos_heroes ;ESTACION = hospital_general ;?-
● Argumentos con mayúscula inicial son variables
● Con “verde” estamos afirmando una parte● Cuando se emplean variables como
ESTACION, no se está pidiendo a Prolog que confirme o niegue sino que encuentre información
● El intérprete debe encontrar un valor para ESTACION que haga verdadera la pregunta
● Si existe más de un valor se teclea ; para solicitar otra solución
![Page 16: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/16.jpg)
Variables en las preguntas
● Al usar variables, Prolog presenta
“TODAS LAS SOLUCIONES POSIBLES”
![Page 17: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/17.jpg)
Interrogando la base de conocimiento
● Todas las estaciones del metro ?
punto y ↵
punto y coma
Continua hasta que se agotan todas las posibilidades
![Page 18: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/18.jpg)
Interrogando la base de conocimiento
● Con el uso de variables Prolog busca soluciones● Lo anterior es posible porque la base de conocimiento
tiene afirmaciones reales que permiten generar soluciones
● En la base de conocimiento se busca de “arriba a abajo”, en el orden en que se escribieron las declaraciones
![Page 19: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/19.jpg)
Ejercicio-> Todos los pares origen-destino?
?- linea(Lo,Eo,_), linea(Ld,Ed,_). ↵Lo = azul,Eo = revolucion,Ld = azul,Ed = revolucion ;Lo = azul,Eo = revolucion,Ld = azul,Ed = hidalgo ;
…
● La , coma significa “Y”, esto quiere decir que ambas afirmaciones tienen que cumplirse
● Prolog buscará todas los posibles valores de Lo, Eo, Ld y Ed que hagan verdadera la expresión
● El símbolo _ significa que para esta pregunta, no importan los números de estación
● Cómo le indicamos a Prolog que los pares origen-destino no sean la misma estación?
![Page 20: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/20.jpg)
Ejercicio-> Todos los pares origen-destino?
● Evitando pares origen-destino misma estación
?- linea(Lo,Eo,_), linea(Ld,Ed,_), Eo \= Ed. ↵Lo = azul,Eo = revolucion,Ld = azul,Ed = hidalgo ;…
● Los símbolos \= significan distinto que● Eo \= Ed evita las soluciones del tipo:
Lo = azul,Eo = revolucion,Ld = azul,Ed = revolucion
![Page 21: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/21.jpg)
Ejercicio-> Todos los pares origen-destino?
● Pares origen-destino en la misma línea
?- linea(Lo,Eo,_), linea(Ld,Ed,_), Eo \= Ed, Lo == Ld. ↵Lo = azul,Eo = revolucion,Ld = azul,Ed = hidalgo ;...
● Los símbolos == significan igual que● Lo == Ld sólo presentará las soluciones
origen-destino de la misma línea ● Lo==Ld, no presenta las soluciones
Lo = azul,Eo = revolucion,Ld = verde,Ed = juarez
![Page 22: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/22.jpg)
Ejercicio-> Todos los pares origen-destino?
● Pares origen-destino en la misma línea e indicando el número de estaciones entre el origen y el destino
?- linea(Lo,Eo,No), linea(Ld,Ed,Nd), Eo \= Ed, Lo == Ld, Ne is Nd-No. ↵Lo = azul,Eo = revolucion,No = 1,Ld = azul,Ed = hidalgo,Nd = 2,Ne = 1 ;
● “is” es el operador de asignación● En lenguaje natural Ne is Nd-No,
equivale a Ne=Nd-No● “Ne” es el número de estaciones entre el
origen y el destino
![Page 23: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/23.jpg)
Ejercicio-> Todas las correspondencias?
● Una correspondencia es una estación común entre dos líneas
?- linea(L1,E,_), linea(L2,E,_), L1 \= L2. ↵L1 = azul,E = hidalgo,L2 = verde ;L1 = azul,E = bellas_artes,L2 = gris ;...
● L1 \= L2 equivale a decir líneas distintas● Una correspondencia sólo se da entre 2 líneas distintas
y E es la estación común. ● Es equivalente la expresión:
linea(L1,E1,_), linea(L2,E2,_),E1==E2,L1\=L2.
![Page 24: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/24.jpg)
Ejercicio-> Direcciones
● En pares origen-destino de una misma línea es importante conocer el sentido
?- linea(L,E1,N1), linea(L,E2,N2), N2 > N1. ↵L = azul,E1 = revolucion,N1 = 1,E2 = hidalgo,N2 = 2 ;...
● La numeración de las estaciones nos da la dirección ● N2 > N1 presenta soluciones ascendentes● Y según la numeración de las estaciones en la base de
conocimiento, para la línea azul N2 > N1, significa de revolucion a chabacano
![Page 25: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/25.jpg)
Ejercicio-> Direcciones
● Afirmaciones en sentido inverso, descendente
?- linea(L,E1,N1), linea(L,E2,N2), N2 < N1. ↵L = azul,E1 = hidalgo,N1 = 2,E2 = revolucion,N2 = 1 ;...
● Para indicar el sentido no basta decir ascendente o descendente
● El sentido se señala en base a las estaciones terminales, ejemplo linea azul:
Dirección revolucion va hacia el nor-ponienteDirección chabacano va hacia el sur-oriente
![Page 26: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/26.jpg)
Implementando direcciones
● Agregar a nuestra base de conocimiento las siguientes afirmaciones
terminales(azul,revolucion,chabacano).terminales(verde,hidalgo,hospital_general).
terminales(rosa,cuauhtemoc,merced).terminales(gris,bellas_artes,chabacano).
● Agregar las afirmaciones, al final del archivo metro.pl
![Page 27: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/27.jpg)
Ejercicio-> Direcciones
● Las afirmaciones quedan:
?- linea(L,E1,N1), linea(L,E2,N2), N2 > N1, terminales(L,_,S). ↵L = azul,E1 = revolucion,N1 = 1,E2 = hidalgo,N2 = 2,S = chabacano ;...
?- linea(L,E1,N1), linea(L,E2,N2), N2 < N1, terminales(L,S,_). ↵L = azul,E1 = hidalgo,N1 = 2,E2 = revolucion,N2 = 1,S = revolucion ;...
![Page 28: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/28.jpg)
Definiendo reglas
● Con las afirmaciones de la base de conocimiento podemos establecer reglas
● En la base de conocimiento, las reglas se van definiendo enseguida de las afirmaciones
● Agregar las siguientes reglas al final del archivo metro.pl y guardarlo
correspondencia(E,L1,L2) :- linea(L1,E,_), linea(L2,E,_), L1\=L2.direccion(L,E1,E2,N,S) :- linea(L,E1,N1), linea(L,E2,N2),
N2>N1, N is N2 - N1, terminales(L,_,S).direccion(L,E1,E2,N,S) :- linea(L,E1,N1), linea(L,E2,N2),
N1>N2, N is N1 - N2, terminales(L,S,_).
![Page 29: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/29.jpg)
Conjunción y disyunción
● Las expresiones del tipo “linea(L1,E,_), linea(L2,E,_), L1\=L2” separadas por , forman una conjunción lógica “Y”, cuyo valor es verdad si todas las afirmaciones son verdaderas
● Una disyunción “O”, puede escribirse usando el operador ; pero en su lugar se emplea la definición de varias cláusulas para el mismo predicado, ejemplo:
direccion(L,E1,E2,N,S) :- linea(L,E1,N1), linea(L,E2,N2), N2>N1, N is N2 - N1, terminales(L,_,S).
Odireccion(L,E1,E2,N,S) :- linea(L,E1,N1), linea(L,E2,N2), N1>N2, N is N1 - N2,
terminales(L,S,_).
![Page 30: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/30.jpg)
Probando reglas
● Entrar al interprete de Prolog y cargar el archivo metro.pl (Load...)● Afirmar y preguntar a la base de conocimiento:
Estoy en la estación Allende de la línea azul, mi destino es San Antonio Abad. Cuantas estaciones son y en qué dirección debo ir ?
?- direccion(azul,allende,san_antonio_abad,N_ESTACIONES,DIRECCION). ↵N_ESTACIONES = 3,DIRECCION = chabacano ;NO?-
![Page 31: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/31.jpg)
Programación interactiva con Prolog
● Los programas interactivos llevan a cabo un diálogo con el usuario● Prolog cuenta con el predicado “write”● “write“ toma un término como su argumento y hace que dicho término se
escriba en la terminal del usuario
?- linea(L,allende,_), write(L), write(‘\n’). ↵azulL = azul?-
● “write” usa solo un argumento● Este puede ser una constante o una variable● Acepta cadenas de texto● \n es salto de línea
![Page 32: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/32.jpg)
Definiendo rutas del metro
● Se tienen los elementos para que Prolog nos de las posibles rutas entre un par origen-destino
● Existen 3 posibilidades
○ Par origen-destino en la misma línea, por ejemplo juarez-ninos_heroes ambas estaciones en la línea verde
○ Par origen-destino con una correspondencia, por ejemplo zocalo-obrera en las líneas azul y gris respectivamente, su correspondencia es la estación bellas_artes
○ Par origen-destino con dos correspondencias, por ejemplo doctores-juarez en las lineas gris y verde respectivamente, no hay correspondencia directa, pero la línea gris y la línea verde tienen correspondencia con la línea azul en bellas_artes e hidalgo, además tienen correspondencia con la línea rosa en isabel_la_catolica y balderas
![Page 33: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/33.jpg)
Regla misma línea origen-destino
● Agregar al final de la base de conocimiento la regla
ruta(DESDE,HASTA) :- direccion(LINEA,DESDE,HASTA,ESTAC,DIREC), write(‘ Por la linea ‘), write(LINEA),
write(‘ partir de la estacion ‘), write(DESDE), write(‘ hacia ‘), write(DIREC), write(‘,en ‘), write(ESTAC), write(‘ estaciones ‘), write(‘ llegara a la estacion ‘), write(HASTA),
write(‘ de la linea ‘), write(LINEA), write(‘\n’).
![Page 34: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/34.jpg)
Probando regla misma línea origen-destino
?- ruta(allende,juarez). ↵NO?- ruta(balderas,merced). ↵ Por la linea rosa partir de la estacion balderas hacia merced, en 4 estaciones llegara a la estacion merced de la linea rosaSI?- ruta(obrera,san_juan_letran). ↵ Por la linea gris partir de la estacion obrera hacia bellas_artes, en 3 estaciones llegara a la estacion san_juan_letran de la linea grisSI?-
● No hay solución, son estaciones de líneas distintas
![Page 35: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/35.jpg)
Regla origen-destino con correspondencia
● Agregar al final de la base de conocimiento la regla
ruta(DESDE,HASTA) :- linea(L1,DESDE,_), linea(L2,HASTA,_), L1\=L2, DESDE\=HASTA, correspondencia(C,L1,L2), DESDE\=C, C\=HASTA, direccion(L1,DESDE,C,EST1,DIR1), direccion(L2,C,HASTA,EST2,DIR2), TOTAL is EST1 + EST2,
write(' Por la linea '), write(L1), write(' partir de la estacion '), write(DESDE), write(' hacia '), write(DIR1), write(', en '), write(EST1), write(' estaciones '), write('llegara a la correspondencia '), write(C),
write(' para tomar la linea '), write(L2), write(' hacia '), write(DIR2),write(', en '), write(EST2), write(' estaciones '), write('llegara a la estacion '), write(HASTA), write(', TOTAL ESTACIONES '), write(TOTAL), write('. \n ').
![Page 36: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/36.jpg)
Regla origen-destino con correspondencia
● Comentarios
❏ L1\=L2, la línea de la estación origen debe ser distinta a la línea de la estación destino❏ DESDE\=HASTA, la estación origen y destino no deben ser la misma ❏ DESDE\=C, C\=HASTA, la estación de correspondencia C, entre L1 y L2, no debe ser
el origen, ni el destino ❏ DIR1 y EST1, se evalúan en la regla direccion con DESDE y C como origen-destino ❏ DIR2 y EST2, se evalúan en la regla direccion con C y HASTA como origen-destino ❏ Se podría decir que TOTAL es el valor del recorrido en estaciones❏ Las sentencias “write” con los textos y las variables, pueden acomodarse en el orden
que se desee
![Page 37: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/37.jpg)
Probando regla con una correspondencia ?- ruta(balderas,bellas_artes). ↵ Por la linea verde partir de la estacion balderas hacia hidalgo, en 2 estaciones llegara a la correspondencia hidalgo para tomar la linea azul hacia chabacano, en 1 estaciones llegara a la estacion bellas_artes, TOTAL ESTACIONES 3.SI ; Por la linea rosa partir de la estacion balderas hacia merced, en 3 estaciones llegara a la correspondencia pino_suarez para tomar la linea azul hacia revolucion, en 3 estaciones llegara a la estacion bellas_artes, TOTAL ESTACIONES 6.SI ;Por la linea rosa partir de la estacion balderas hacia merced, en 1 estaciones llegara a la correspondencia salto_del_agua para tomar la linea gris hacia bellas artes, en 2 estaciones llegara a la estacion bellas_artes, TOTAL ESTACIONES 3.
● Tres soluciones distintas. El punto y coma ; solicita la siguiente solución válida
![Page 38: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/38.jpg)
Regla origen-destino con 2 correspondenciasruta(DESDE,HASTA) :- linea(L1,DESDE,_), linea(L2,HASTA,_), L1\=L2, DESDE\=HASTA,
correspondencia(C1,L1,X), correspondencia(C2,L2,X), DESDE\=C1, C1\=HASTA, DESDE\=C2, C2\=HASTA,
direccion(L1,DESDE,C1,EST1,DIR1), direccion(X,C1,C2,ESTi,DIRi), direccion(L2,C2,HASTA,EST2,DIR2), TOTAL is EST1 + EST2 + ESTi, write(' Por la linea '), write(L1), write(' partir de la estacion '), write(DESDE), write(' hacia '), write(DIR1), write(', en '), write(EST1), write(' estaciones '),
write('llegara a la correspondencia '), write(C1), write(' para tomar la linea '),write(X), write(' hacia '), write(DIRi), write(', en '), write(ESTi), write(' estaciones '), write('llegara a la correspondencia '), write(C2),
write(' para tomar la linea '), write(L2), write(' hacia '), write(DIR2),write(', en '), write(EST2), write(' estaciones '), write('llegara a la estacion '),write(HASTA), write(', TOTAL ESTACIONES '), write(TOTAL), write('. \n ').
![Page 39: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/39.jpg)
Regla origen-destino con 2 correspondencias
● Comentarios
❏ “correspondencia(C1,L1,X), correspondencia(C2,L2,X)”, busca una tercer línea X común para la línea origen L1 y la línea destino L2, además de las correspondencias C1 y C2
❏ Las correspondencias, el origen y el destino no deben ser la misma estación DESDE\=HASTA, DESDE\=C1, C1\=HASTA, DESDE\=C2, C2\=HASTA
❏ Se necesitan ahora tres direcciones y el número de estaciones entre; DESDE a C1, C1 a C2 y C2 a HASTA
❏ TOTAL es la suma de las tres anteriores❏ La respuesta en algunos casos será de más de 3 rutas posibles
![Page 40: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/40.jpg)
Conclusiones
● Demostramos como se puede aplicar Prolog a un proceso específico, un caso práctico
● Como se habrán dado cuenta, en Prolog no existen instrucciones de control
● Su ejecución se basa en dos conceptos: la unificación y el backtracking
● Con la unificación, cada objetivo determina un subconjunto de cláusulas susceptibles de ser ejecutadas, cada una de ellas se denomina punto de elección
![Page 41: Programación Lógica con PROLOG](https://reader034.vdocuments.pub/reader034/viewer/2022050613/58757b9d1a28ab78498b60d5/html5/thumbnails/41.jpg)
Conclusiones
● Prolog selecciona el primer punto de elección y sigue ejecutando el programa hasta determinar si el objetivo es verdadero o falso
● En caso de ser falso entra en juego el backtracking, que consiste en deshacer todo lo ejecutado situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de elección
● Entonces se toma el siguiente punto de elección que estaba pendiente y se repite de nuevo el proceso