Separata PROLOG 01.pdf

12
Programación Lógica y Funcional Ing. Saúl Pérez Vega Manual PROLOG 1 1 Introducción al 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: leon tigre puma Ingeniería del Software

Transcript of Separata PROLOG 01.pdf

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

1

1 Introducción al 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: leon tigre puma

Ingeniería del Software

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

2

papa camote lechuga oro plata Y las relaciones son: animal vegetal mineral

1.2 Los Hechos La primera forma de combinar un objeto y una relación es usarlas para definir un hecho. 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).

Comentarios: el objeto “oro” tiene relación con mineral. La traducción al castellano es necesariamente vaga, porque la lógica de los hechos en prolog no especifica si el “oro era un mineral”, “el oro es un mineral” o “el oro parece un mineral”.

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

3

Cuando utilice el prolog, necesitara tener en cuenta lo que son las relaciones –el prolog no lo puede hacer por usted-. Sus programas tendrán sentido solo si son consientes a lo largo de un programa con el significado de una relación dada. Algunas veces ayuda usar las palabras que tengan un sentido aproximado de lo que significan. Por ejemplo, si quiere indicar el hecho que Carlos es un príncipe, podría utilizar la siguiente relación: es_un_principe(carlos)

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. 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. Ejemplos Edad Promedio

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 (dominios)

Predicates (predicados)

Clauses (clausulas)

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

4

Goal (objetivos)

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:

<Nombre Constante> = <Definición de Macro>

Por ejemplo, el siguiente fragmento de programa:

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.

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

5

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

• 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 o functor es el nombre del objeto compuesto alternativo. o sub_1 [,sub_2, ...] son subcomponentes del objeto compuesto que deben

tener su correspondiente nombre y dominio. Este último puede ser estándar o definido por el usuario.

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

6

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.

Otros ejemplos:

Domains apellido, nombres = symbol numero_cuenta, cantidad = integer saldo_cuenta, promedio = real nota1,nota2,nota3 = integer

Sección de Predicados

En la sección de Predicados son las relaciones. El término “predicado” viene de la lógica formal, la cual es uno de los fundamentos iniciales del Visual Prolog. Siempre que su programa vaya a usar un predicado particular en las clausulas, se necesita declararlo formalmente en la sección de predicados. Ejemplos:

empleado(symbol) numero(integer) alumno(string) letra(char)

Sección de Clausulas

Los hechos que construyó con los objetivos y relaciones se listan en la sección de clausulas (clauses). La sección de clausulas puede también contener reglas y otras construcciones.

Ejemplo:

empleado(“Carlos Asmat”). numero(4355) alumno(merilyn_salvatierra) letra(‘k’)

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

7

Sección de Objetivos

Esta es la sección que le dice prolog lo que ha de encontrar o lo que desea que la computadora haga con la información que se le ha suministrado en las otras secciones. Normalmente un programa tendrá al menos las secciones de predicados y clausulas, pero es posible tener un programa que tenga solo una sección objetivo.

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.

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

8

2 Lenguaje Visual PROLOG

Búsqueda de Información

El visual Prolog busca a través de sus cláusulas de arriba abajo y de izquierda a derecha.

2.0 Uso de Variables

Hay otra forma de hacer preguntas. Si se conoce la relación pero no los objetos,

puede usar variables. Cualquier palabra objeto que comienza con una letra mayúscula se considera una variable. Después de la mayúscula, puede tener cualquier número de letras (en mayúsculas o minúsculas), junto con dígitos y caracteres de subrayado. La forma más rápida de ver lo que puede hacer una variable es hacer una pregunta al programa.

El Prolog tomo el objetivo con la variable y lo compara con las clausulas. Primero

comprueba si el predicado es el mismo que el de la primera clausula. Si lo es, entonces prueba si el objetivo y el predicado tienen el mismo número de argumentos. Si alguna de esas cosas no es verdad, el prolog deja la primera clausula y realiza la prueba del objetivo con la segunda clausula, Si ambos son verdad –el mismo predicado y el mismo número de argumentos-, el prolog entonces comprueba si los argumentos son los mismos.

En este caso, el argumento objetivo es una variable y puede ser cualquier cosa. Así

el prolog instancia al valor de la cláusula; en otras palabras, el prolog asume por una que vez que tiene el valor del argumento en la cláusula.

Variables Anónimas Se describe un carácter de subrayado. La variable anónima se utiliza en el mismo

lugar que las variables estándares, pero nunca son instanciadas con ningún valor particular.

le_gusta(tatiana,_). % a Tatiana le gusta algún deporte? Le_gusta(_,_). % ¿?

Siempre el resultado será true o false.

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

9

2.1 Aridad La aridad de un predicado, consiste en el número de argumentos que tiene.

% Programa con hechos de aridad cero - predicates uno dos tres cinco siete clauses uno. dos. tres. cinco. siete. goal cinco, write("Encontrado"),nl.

Ejemplo con aridad 1

% Programa con hechos de aridad uno - predicates alumno(symbol) clauses alumno(juan). goal write("Resultado Aridad Uno: "),alumno(X),nl.

Hacer ejemplos con aridad 2,3,4, …..

2.2 Uso del domain

domains marca = symbol kilometraje = long antiguedad = integer color = symbol precio = long predicates carro(marca,kilometraje,antiguedad,color,precio) camion(marca,kilometraje,antiguedad,color,precio) vehiculo(marca,kilometraje,antiguedad,color,precio)

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

10

clauses carro(chrysler,130000,7,rojo,8500). carro(ford,90000,4,azul,14000). carro(datsun,8000,15,blanco,500). carro(honda,15000,4,rojo,8500). carro(nissan,90000,12,azul,25000). carro(datsun,8000,1,blanco,30000). camion(ford,80000,6,blanco,28000). camion(fiat,50000,5,negro,15000). camion(toyota,25000,4,negro,25000). camion(scania,80000,8,amarillo,85000). camion(mercedes,50000,5,anaranjado,82000). camion(volvo,25000,4,blanco,25000). %vehiculo(Marca,Kilometraje,Antiguedad,Color,Precio):- goal %%Listar todos los carros %%Listar todos los camiones %%Listar los carros y camiones con una antiguedad mayor a 5 o menor a 10 %%Listar los vehículos con Antigüedad mayor a 2 años y de color negro.

Ejercicio para usar variables y formulas

DOMAINS precio = integer % Para definir el dominio en cada uno de los parametros de nombre = symbol % cada hecho o regla (definidos en los predicates) PREDICATES % Se definen todos aquellos hechos o reglas, que serán utilizados en las clauses, con sus parametros

entrada(nombre,precio) segundo(nombre,precio) postre(nombre,precio) refresco(nombre,precio) menu(nombre,nombre,nombre,nombre,precio) CLAUSES % Declaracion de hechos %declaracion de reglas menu(E,PF,P,R,PT):……………..

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

11

goal

Realizar las siguientes operaciones:

Ingresar 4 platos de cada tipo.

Listar las entradas, segundos

¿Cuánto cuesta el tacu tacu?

¿Existe algún menú con lomo_saltado y palta_rellena?

¿Cuánto cuesta el ceviche?

¿Existe algún menú con rocoto_relleno y tacu_tacu?

Listar todos los postres y su precio

Listar todos los menus con sus platos y el precio del menu

Ejercicios Propuestos Ejercicio 1. Los invitados a una fiesta se representan con los predicados hombre y mujer

que determinan su sexo. Por ejemplo: hombre(alfredo). hombre(felipe). hombre(francisco). mujer(sonia). mujer(eva). mujer(carmen).

Además, conocemos las bebidas preferidas de cada invitado definidas por el predicado bebe: bebe(alfredo, whisky). bebe(alfredo, ron_cola). bebe(felipe, cerveza). bebe(francisco, vino). bebe(sonia, inka_kola). ...

Añade tus propios invitados a la fiesta y sus bebidas favoritas y define un predicado pareja(X,Y) que tenga éxito cuando X es un hombre e Y una mujer y tengan al menos una bebida favorita en común. Define también el predicado pareja(X,Y) que se satisface cuando X e Y tienen al menos dos bebidas favoritas en común. Ejercicio 2. Modifica el ejercicio anterior para reflejar los siguientes hábitos de bebida: Pepe bebe cualquier cosa que beba Alfredo Elena bebe cualquier cosa que beban Sonia o Felipe Juan bebe cualquier bebida

Programación Lógica y Funcional

Ing. Saúl Pérez Vega Manual PROLOG

12

Ejercicio 3. Queremos viajar por las provincias del departamento de Lima usando un auto, por ello, decidimos que sólo podemos plantearnos un viaje de la provincia X a la provincia Y si éstas son fronterizas o si para llegar a ellas basta con atravesar una provincia.

Figura 1: Mapa de Lima.

Define un predicado viaje(X,Y) que se satisface cuando es posible viajar de la provincia X a la provincia Y.