Programación Lógica 1 Introducción al lenguaje PROLOG 1.0 Lenguaje Procedural vs Lenguaje Declarativo •
•
El Lenguaje procedural permite al programador decirle a la computadora lo que tiene que hacer, paso a paso, procedimiento por procedimiento, hasta alcanzar una conclusión o ejecutar una función. Ejemplo: Ingreso de Clientes Prolog es declarativo, se declara la situación con la que quiere trabajar y a donde quiere ir. El propio lenguaje realiza el trabajo de decidir como alcanzar dicho objetivo. Ejemplo: Quien es el abuelo de Carlos?
1.1 Generalidades Prolog es un lenguaje de programación que se utiliza para resolver problemas que existen entre objetos y relaciones. La programación en Prolog consiste simplemente en: • declarar hechos sobre los objetos y sus relaciones, • definir reglas sobre dichos objetos y relaciones, y • hacer preguntas. Prolog es un lenguaje de programación declarativa (coloquial), lo cual quiere decir que el computador y el programador sostienen una especie de conversación. Prolog espera a que se ingrese hechos y las reglas que definen el problema a resolver. Una recomendación, Prolog es diferente a cualquier otro lenguaje de bajo o alto nivel, por tanto, nunca resolver un problema en otro lenguaje para luego traducirlo a Prolog. Objetos y Relaciones Un objeto puede ser cualquier cosa que pueda representarse simbólicamente en una computadora: león tigre puma papa
1 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica camote lechuga oro plata Y las relaciones son: animal vegetal mineral
1.2 Los Hechos Un hecho es una relación entre objetos. Sintaxis:
relacion (objeto, objeto, ...) La relación se conoce como el predicado y los objetos como los argumentos. Los siguientes puntos son importantes: Los nombres de las relaciones deben comenzar con una letra minúscula. • • Los objetos se escriben separados por comas y encerrados entre paréntesis. Al final del hecho debe de ir un punto. • Por ejemplo: animal(leon). vegetal(papa). mineral(oro).
1.3 Las Reglas Cuando la verdad de un hecho depende de la verdad de otro hecho o de un grupo de hechos se usa una regla. Una regla consiste en una cabeza y un cuerpo. El cuerpo puede estar formado por varios hechos u objetivos.
2 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica Sintaxis:
cabeza :‐ objetivo 1, objetivo 2, ..., objetivo n. Los objetivos van separados por comas, especificando conjunción y al final debe de ir un punto. Por ejemplo, una regla es
Mayor_de_edad(X) :‐ persona(X,E), E>18. 1.4 Las variables Las variables se utilizan para describir hechos y reglas generales. Los nombres de las variables deben comenzar con letra mayúscula o con el carácter (Edad, E).
1.5 La estructura de un programa en PROLOG La mayoría de los programas en Prolog están organizados en cuatro secciones principales: • domains predicates • • clauses • goal
Sección de constantes En la sección de constantes podemos declarar constantes simbólicas que pueden usarse en el cuerpo del programa. La utilidad de las constantes en Visual Prolog es similar a la que estos elementos tienen en otros lenguajes de programación, normalmente, sirven para facilitar el uso de diversas cantidades, expresiones y símbolos. La definición de la sección de constantes se encabeza con la palabra reservada CONSTANTS, y cada línea de definición es de la forma = . Por ejemplo, el siguiente fragmento de programa:
3 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica CONSTANTS numero = 1 expresion = 1+1 GOAL A=numero, B=expresion, write(A), write(B), nl. Resultado 12 A=1, B=2 1 Solution Las restricciones que se imponen en el uso de constantes se exponen a continuación: El sistema no distingue entre mayúsculas y minúsculas. La definición de una constante no puede referirse a sí misma, es decir, no es posible construir definiciones recursivas de constantes. Puede haber varias secciones CONSTANTS a lo largo del programa, y toda constante debe ser definida antes de ser utilizada. Las constantes declaradas son efectivas desde el punto en que son declaradas hasta el final del fichero fuente donde han sido definidas y en algunos ficheros incluidos tras la declaración. Las constantes sólo se pueden declarar una vez. • •
•
•
•
Sección de dominios En la sección DOMAINS se pueden definir dominios no especificados por defecto por Visual Prolog. Por ejemplo, el dominio integer es estándar para el compilador, no así el dominio sinónimo ENTERO o dominios complejos. En estos últimos casos, el programador debe definirlo en esta sección. Dominios Stántard • char, carácter encerrado entre apostrofes (comillas simples) ('a', 'b', 'c') • Integer, Enteros desde ‐2147483648 hasta 2147483647 • Real, Número con punto flotante equivalente al doublé. El rango permitido es 1*10^‐307 hasta 1*10^+308
4 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica • •
String, Referidos a una secuencia de caracteres escritos entre comillas. Ejemplo: “Pedro Arce”. Symbol similar al String
Cada sección de dominios debe comenzar con la palabra DOMAINS. Ejemplo: DOMAINS ENTERO = INTEGER Es posible usar 5 formatos de declaraciones para dominios definidos por el usuario. Dominios de Objetos Compuestos El formato es como sigue:
dominio = [reference] [align {byte|word|dword}] declaracion1;[declaracion2];... • •
•
•
dominio: nombre dado al dominio especificado por el usuario. declaracion1; [declaracion2]: declaración de objetos compuestos alternativos que tienen que tener la forma siguiente: functor([sub_1 [, sub_2, ...] ]) donde functor es el nombre del objeto compuesto alternativo. o sub_1 [,sub_2, ...] son subcomponentes del objeto compuesto que deben o tener su correspondiente nombre y dominio. Este último puede ser estándar o definido por el usuario. reference: indica la declaración de un dominio de referencia. En este tipo de dominios los argumentos de entrada pueden ser variables libres. align: indica el tipo de distribución de memoria que se va a usar.
En predicates se declaran todos los predicados no predefinidos que se utilizarán en la sección clauses. Los hechos y las reglas se escriben en la sección clauses. Como nuestro Prolog puede usarse de forma interactiva, es frecuente ejecutar un programa y luego esperar a que se nos pregunte el objetivo. La sección goal nos permite ejecutar los programas de una forma no interactiva, y por tanto, buscará la solución deseada tan pronto como se ejecute el programa. goal write("Hola"),nl, write("Lenguaje: Prolog"), nl.
5 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica 1.6 Ejercicios 1.6.1 Ejercicio01
Test Goal Mode
Es el resultado de ejecutar el programa.
Añadir 5 alumnos y ejecutar 1.6.2 Ejercicio02 predicates le_gusta(symbol,symbol) ‐ nondeterm(o,o) clauses le_gusta(alexander,natacion). le_gusta(tatiana,tenis). le_gusta(franz,tenis). le_gusta(jahayra,natacion). le_gusta(maria_del_pilar,esgrima). le_gusta(rudy_fritz,ajedrez).
6 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica le_gusta(katty,natacion). le_gusta(katiuska,natacion). le_gusta(harry,ajedrez). Le_gusta(cristobal,Deporte) if
goal write("Listado del programa"),nl, % le gusta a Tatiana el tenis? le_gusta(tatiana,tenis). % a que persona le gusta un deporte % le_gusta(Persona,Deporte). %que deporte le gusta a tatiana %write("A Tatiana le gusta el"),nl,le_gusta(tatiana,Deporte). %que deportes les gusta a tatiana y harry %write("tatiana y harry practican"),nl, %le_gusta(tatiana,Deporte) or le_gusta(harry,Deporte). %a quienes les gusta el tenis o el ajedrez %le_gusta(Persona,tenis) or le_gusta(Persona,ajedrez). 1.6.3 Ejercicio03 predicates numero_telefonico(symbol,symbol) ‐ nondeterm (i,o) clauses numero_telefonico("Alberto","9555‐3665"). numero_telefonico("Betty","9755‐5233"). numero_telefonico("Karola","9941‐1010"). numero_telefonico("Damian","9954‐8400"). goal numero_telefonico("Karola",Number).
7 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica 1.6.4 Ejercicio04 predicates es_una_letra(char) ‐ nondeterm (i) clauses es_una_letra(Ch):‐ 'a' <= Ch, Ch <= 'z'. es_una_letra(Ch):‐ 'A' <= Ch, Ch <= 'Z'. goal es_una_letra('a').
1.7 Ejercicios propuestos 1.7.1. Cuando ejecutes el programa, verás aparecer la ventana de diálogo; observa el mensaje goal y pregunta los siguientes objetivos: (i) >El murciélago es animal? (ii) >El murciélago es vegetal? (iii) >El murciélago es vegetal y animal? (iv) >El murciélago es vegetal o animal? (v) Escribe todos los animales. 1.7.2 Una agencia matrimonial Una agencia matrimonial tiene una lista de candidatos al matrimonio organizado según las declaraciones siguientes: hombre(N,A,C,E) mujer(N,A,C,E)
8 Ing. Saúl Pérez Vega
PRACTICA 01
Programación Lógica donde: N es el nombre de un hombre o una mujer, A su altura (alta, media, baja), C el color de su cabello (rubio, castaño, pelirrojo, negro) y E su edad (joven, adulta, madura). gusta(N,M,L,S) indica que a la persona N le gusta el género de música M (clásica, pop, jazz), el género de literatura L (aventura, ciencia ficción, policíaca ), y practica el deporte D (tenis, natación, jogging). busca(N,A,C,E) expresa que la persona N busca una pareja de altura A, con cabello de color C y edad E. Se considera que dos personas X e Y de sexos diferentes son adecuadas si X conviene a Y e Y conviene a X. Se dice que X conviene a Y, si X conviene físicamente a Y (la altura, edad, y cabello de X son las que busca Y), y si además, los gustos de X e Y en música, literatura y deporte coinciden. (i) Escribe un conjunto de declaraciones que representen el listado de candidatos. (ii) Escribe las reglas: • conviene_fisicamente(X,Y) • tiene_igual_gusto(X,Y) (iii) Listar las parejas que son adecuadas por afinidad. 1.7.3 Una agencia de viajes Una agencia de viajes propone a sus clientes viajes de una semana a Roma, Londres o Alemania. El catalogo de la agencia contiene, para cada destino, el precio del transporte y el precio de una semana de estancia que varía según el destino y el nivel de comodidad elegidos: hotel, hostal o camping. (i) Escribe el conjunto de declaraciones que describen este catalogo (los precios se dejan a tu elección). (ii) Expresa la relación viaje(c,s,h,p) que se interpreta como: el viaje a la ciudad c durante s semanas con estancia en h cuesta d dolares. (iii) Completa con viaje economico(c,s,h,p,p max) que expresa que el costo p es menor que p max dolares.
9 Ing. Saúl Pérez Vega
PRACTICA 01