Programación Lógica con PROLOG
-
Upload
daniel-cruz -
Category
Software
-
view
3.510 -
download
1
Transcript of Programación Lógica con PROLOG
Programación lógicaEjercicios PROLOG en tu móvil
ANDROID
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
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
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).
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
● 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
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”
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?
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
Crear base de conocimiento en el móvil
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).
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
Cargar base de conocimiento
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”
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
Variables en las preguntas
● Al usar variables, Prolog presenta
“TODAS LAS SOLUCIONES POSIBLES”
Interrogando la base de conocimiento
● Todas las estaciones del metro ?
punto y ↵
punto y coma
Continua hasta que se agotan todas las posibilidades
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
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?
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
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
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
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.
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
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
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
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 ;...
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,_).
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,_).
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?-
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
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
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’).
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
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 ').
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
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
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 ').
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
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
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