Introducción a la Programación Lógica -...

23
Introducción a la Programación Lógica Ingeniería Informática Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga

Transcript of Introducción a la Programación Lógica -...

Page 1: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica

Ingeniería Informática

Departamento de Lenguajes y

Ciencias de la Computación

Universidad de Málaga

Page 2: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Programming in Prolog opens the mid to a new way of looking at computing. There is a change of perspective which every Prologprogrammer experiences when first getting to know thelanguage. Declarative programming clears the mind.

David H.D. Warren

Page 3: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 3

Temario (Programación Lógica)

1. Principios de la programación lógica

2. Técnicas básicas de programación Prolog

3. Predicados extralógicos

4. Programación lógica con estructuras

5. Control en Prolog

6. Metaprogramación en Prolog

7. Técnicas avanzadas de programación Prolog

Page 4: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 4

Software (Programación Lógica)

SWI-Prolog

entorno de programación Prolog (Windows/Linux/OSX)

http://www.swi-prolog.org/

SLD-Draw

visualización de árboles SLD (Windows/Linux)

http://www.lcc.uma.es/~lopez/progdec

Page 5: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 5

Bibliografía I (Programación Lógica)

Referencias básicas:

“The Art of Prolog” (2ed)Leon Sterling y Ehud ShapiroMIT Press, 1994

“Programación en Prolog” (2ed)William F. Clocksin y Chris S. MellishGustavo Gili, 1993

“Prolog Programming for Artificial Intelligence” (3ed)Ivan BratkoAddison-Wesley, 2000

Page 6: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 6

Bibliografía II (Programación Lógica)

Libros y referencias disponibles en internet:

“Clause and Effect”William F. Clocksin

“Prolog Programming: A First Course”Paul Brna

“Logic, Programming and Prolog” (2ed)

Ulf Nilsson y Jan Maluszynski

Consultar sitio web de la asignatura:

http://www.lcc.uma.es/~lopez/progdec

Page 7: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 7

¿Qué es la Programación Lógica?

la idea fundamental de la programación lógica consiste en emplear la lógica como lenguaje de programación

Datos = términos de primer orden

Procedimiento = fórmulas bien formadas

Ejecución = Deducción controlada y constructiva

la lógica no es imperativa:

no sirve para indicar cómo resolver un problema (órdenes)

la lógica es declarativa:

sirve para especificar qué problema resolver (condiciones)

sin embargo, la programación lógica permite ambos enfoques

Page 8: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 8

El enfoque imperativo

programación imperativa (C++, Java, etc.)

• diseñar un algoritmo para resolver el problema

• computar la solución ejecutando el algoritmo

• el énfasis está en cómo resolver el problema

la programación lógica también es capaz de describir algoritmos a un nivel de abstracción alto

Page 9: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 9

El enfoque lógico

programación lógica

• especificar las condiciones que satisfacen las soluciones

• deducir las soluciones a partir de las condiciones

• el énfasis está en qué problema resolver

el problema se describe especificando qué caracteriza a sus posibles soluciones

Page 10: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 10

Ejemplo 1: ordenar tres números

Problema: ordenar tres números distintos

Entrada: conjunto XXXX = {XXXX, XXXX, XXXX}

Solución: ∃∃∃∃ A,B,C tales que:A,B y C ∈∈∈∈ XXXX ∧∧∧∧A ≠≠≠≠ B ≠≠≠≠ C ∧∧∧∧A < B ∧∧∧∧B < C

no es una solución imperativa: no es un algoritmo de ordenación

es una solución declarativa: especifica las condiciones que caracterizan a la solución

Page 11: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 11

Ejemplo 1 resuelto en Prolog

programaordenar(X,[A,B,C]) :-

member(A,X),member(B,X),member(C,X),

A =\= B, A =\= C, B =\= C,

A < B,

B < C.

ejecución?- ordenar([9,2,5],S).

S = [2,5,9];

No

Prolog deduce la solución a partir de las condiciones

Ejercicio: una de las condiciones es redundante. ¿Cuál?

Page 12: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 12

Ejemplo 2: descomponer un número

Problema: Descomponer un número en la suma de dos pares

Entrada: un natural N

Solución: ∃∃∃∃ A y B tales que:A, B ∈ NNNN ∧∧∧∧

A mod 2 = 0 ∧∧∧∧

B mod 2 = 0 ∧∧∧∧

N = A + B

Page 13: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 13

Ejemplo 2 resuelto en Prolog

programa:descomponer(N,A,B) :-

between(0,N,A), A mod 2 =:= 0,

between(0,N,B), B mod 2 =:= 0,

N =:= A + B.

ejecución:?- descomponer(6,A,B).

A=0, B=6;

A=2, B=4;

A=4, B=2;

A=6, B=0;

No

Prolog encuentra todas las soluciones: un procedimiento puede devolver varias respuestas

Page 14: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 14

Otra solución a la descomposición en pares

podemos hacer el programa más determinista: una vez seleccionado un valor para A, podemos calcular el valor exacto de B.

programa:descomponer_det(N,A,B) :-

between(0,N,A), A mod 2 =:= 0,

B is N-A, B mod 2 =:= 0. % B determinado

Page 15: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 15

Ejemplo 3: partir una lista

Problema: partir una lista L en dos listas A y B de manera que el último elemento de A aparezca en B

Ejemplo: L = 1,2,3,4,3,5 A = 1,2,3 B = 4,3,5

Entrada: lista L

Solución: ∃∃∃∃ A y B tales que:

L = A concatenada con B ∧∧∧∧

A = a1,a2,...,an ∧∧∧∧

B = b1,...bm ∧∧∧∧

∃∃∃∃ j. (bj ∈∈∈∈ B ∧∧∧∧ bj=an)

Page 16: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 16

Ejemplo 3 resuelto en Prolog

programa:partir(L,A,B) :-

append(A,B,L),

last(A,Ult),

memberchk(Ult,B).

ejecución:?- partir([1,2,3,4,2,3],A,B).

A = [1, 2], B = [3, 4, 2, 3] ;

A = [1, 2, 3], B = [4, 2, 3] ;

No

Page 17: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 17

Ejemplo 4: el cruce de rebaños

Problema: Dos cabreros se encuentran en un cruce y se produce el siguiente diálogo:

- Dame una cabra, para que tengamos las mismas

- Mejor dame tú una a mí, para que tenga yo el doble que tú

¿Cuántas cabras tiene cada cabrero?...

Solución: ∃∃∃∃ A y B ∈∈∈∈ NNNN+ tales que:

B-1 = A+1 ∧∧∧∧

2*(A-1) = B+1

Page 18: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 18

Ejemplo 4 resuelto en Prolog

programa:rebaño(A,B) :-

between(1,10,A), % conjetura 1

between(1,10,B), % conjetura 2

B-1 =:= A+1,

2*(A-1) =:= B+1.

ejecución:?- rebaño(A,B).

A= 5, B= 7;

No

Page 19: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 19

Otra solución al cruce de los rebaños

De la misma forma que hay varios algoritmos para un mismo problema, es posible que haya varias especificaciones de la solución

Solución: ∃∃∃∃ A y B ∈∈∈∈ NNNN+ tales que:

B = A+2,

2*(A-1) = B+1

programa:rebaño2(A,B) :-

between(1,10,A), % conjetura 1

B is A+2, % B determinado

2*(A-1) =:= B+1.

Page 20: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 20

Un poco de historia (I)

Resolución y unificación (J. Alan Robinson, 1965)

Resolución de problemas mediante demostración automática de teoremas (Cornell Green, 1969)

El lenguaje Prolog (Alain Colmerauer, 1972)

Interpretación procedimental de las cláusulas de Horn(Robert Kowalski, 1973)

Compilador de Prolog para DEC-10 (David H.D. Warren, 1977)

Máquina abstracta de Warren (David H.D. Warren, 1983)

Page 21: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 21

Un poco de historia (y II)

80’s – Primeros 90’s:

Proyecto de la Quinta Generación (Japón)

Paralelismo masivo

Programación lógica concurrente (Kernel Language)

Estándar ISO Prolog (1995)

Actualmente:

Programación con restricciones

Programación en Internet

Transferencia de tecnología a otros paradigmas

(implementación, análisis de programas,…)

Page 22: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 22

Ejercicios (I)

Para resolver estos ejercicios puedes usar las comparaciones:

X > Y, X < Y, X =< Y, X >= Y

1. Una terna pitagórica está formada por tres enteros positivos X, Y, Z tales que X2 + Y2 = Z2. Define un predicado pitagoras(N,X,Y,Z) que sea cierto cuando X, Y, Z son menores o iguales que N y forman una terna pitagórica.

2. Define un predicado raiz(N,R) que sea cierto cuando R sea la parte entera de la raíz cuadrada de N.

3. En qué año del siglo XX nació Carlos, si su edad en el año 2000 es igual a la suma de las cifras de su año de nacimiento.

4. Mi hijo es ahora tres veces más joven que yo, pero hace 5 años era cuatro veces más joven. ¿Qué edad tienen padre e hijo?

Page 23: Introducción a la Programación Lógica - lcc.uma.eslopez/progdec/prolog/apuntes/00-introduccion/intro... · Introducción a la Programación Lógica 3 Temario (Programación Lógica)

Introducción a la Programación Lógica 23

Ejercicios (y II)

5. Entre un preso y un carcelero se produce el siguiente diálogo:

- ¿Cuándo saldré de aquí?

- ¿Qué edad tienes?

- Veinticinco

- Yo tengo cincuenta y cuatro. Saldrás cuando te

duplique la edad.

¿Cuántos años le quedan por cumplir al preso?

6. Define un predicado partir(L,A,B,C) que parta una lista L en tres sublistas A, B y C de forma que tengan al menos un elemento en común. Ten en cuenta que append sólo recibe tres argumentos.