Programación Lógica con PROLOG

41
Programación lógica Ejercicios PROLOG en tu móvil ANDROID

Transcript of Programación Lógica con PROLOG

Page 1: Programación Lógica con PROLOG

Programación lógicaEjercicios PROLOG en tu móvil

ANDROID

Page 2: Programación Lógica con PROLOG

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

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

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

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

● 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

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

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

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

Crear base de conocimiento en el móvil

Page 11: Programación Lógica con PROLOG

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

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

Cargar base de conocimiento

Page 14: Programación Lógica con PROLOG

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

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

Variables en las preguntas

● Al usar variables, Prolog presenta

“TODAS LAS SOLUCIONES POSIBLES”

Page 17: Programación Lógica con PROLOG

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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