Tema 4: Programación lógica y Prolog

Documentos relacionados
Programación declarativa ( )

Control de retroceso. Corte y negación (2010/2011)

Tema 4: Corte, negación, tipos, acumuladores y segundo orden

Programación lógica Curso Tema 2: Prolog. José A. Alonso Jiménez.

Tema 6: Representación lógica del conocimiento

Programación declarativa ( )

Tema 2: Listas, aritmética y operadores

Programación declarativa ( )

Tema 4: Redes semánticas y marcos

Tema 4: Resolución de problemas de espacios de estados

Tema 3: Introducción a Prolog

Programación lógica ( )

Tema 6: Programación lógica de segundo orden

Tema 15: Programación lógica con Prolog

Introducción a la programación lógica con Prolog

Tema 1: El sistema deductivo de Prolog

Tema 1: Revisión de Prolog

Tema 3: Sistema inicial de representación y razonamiento

Deducción automática

Tema 7: Razonamiento por defecto y razonamiento abductivo

Tema 5: Razonamiento por defecto y razonamiento explicativo

Tema 5: Otros predicados predefinidos

Tema 6: Razonamiento con información incompleta

Introducción a PROLOG

Tema 5: Procesamiento de lenguaje natural

Tema 1: Agentes inteligentes: Representación y razonamiento

Tema 3: Programación con Prolog

Tema 2: Inteligencia computacional y conocimiento

Programación lógica ( )

Tema 3: Representación del conocimiento estructurado

ANX-PR/CL/ GUÍA DE APRENDIZAJE

Programación Declarativa Curso

Tema 8: Razonamiento automático y programación

Tema DA-6: Aplicaciones de razonamiento automático

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

Fundamentos de Inteligencia Artificial

Aplicaciones de RA con OTTER

Tema 7: Razonamiento sobre programas

Programación lógica ( )

Tema 8: Procesamiento de lenguaje natural

Tema 4: Definición de funciones

Secretaría de Docencia Dirección de Estudios Profesionales

Programación Declarativa Curso Tema 3: Estructuras. José A. Alonso Jiménez Miguel A. Gutiérrez Naranjo

Tema 6: Funciones recursivas

ANX-PR/CL/ GUÍA DE APRENDIZAJE

PROYECTO DOCENTE ASIGNATURA: "Inteligencia Artificial I"

Programación Declarativa: Lógica y restricciones

Lógica y Programación

ANX-PR/CL/ GUÍA DE APRENDIZAJE. ASIGNATURA Programacion declarativa: logica y restricciones

Tema 7: Aplicaciones de PD: problemas de grafos y el problema de las reinas

Tema 3: Técnicas básicas de búsqueda para la resolución de problemas

UNIVERSIDAD POLITÉCNICA DE MADRID. E.T.S. de Ingenieros Informaticos PROCESO DE SEGUIMIENTO DE TÍTULOS OFICIALES

Semántica Operacional para la Programación en Lógica Lógica para Ciencias de la Computación

Tema 4: Definición de funciones

Lógica y Programación

Práctica II. Prolog II: Meta Intérprete Vanilla

Tema 2: Equivalencias y formas normales

Tema 13: Introducción a la Programación Lógica Inductiva

Tema 8: Formas normales.

Tema 8: Funciones de orden superior

Tema 8: Funciones de orden superior

Proyecto: Programación Declarativa: Lenguaje Prolog

Tema 11.- Reevaluación y el corte

Lógica informática-docencia en Inglés

Tema 9: Resolución de problemas con razonamiento automático

Inteligencia en Redes de Comunicaciones. Prolog. Julio Villena Román.

Implementación Prolog de un SBC basado en reglas (2011/2012)

1.- DATOS DE LA ASIGNATURA. Nombre de la asignatura: Carrera: Clave de la asignatura: (Créditos) SATCA PRESENTACIÓN

GUÍA DE APRENDIZAJE PROGRAMACIÓN DECLARATIVA GRADUADO EN INGENIERÍA DE SOFTWARE

Lógica informática ( )

Tema 3: Demostraciones proposicionales

Tema 2: Representación de problemas como espacios de estados

PROTOCOLO. Fechas Mes/año Clave Semestre 8 a 10

Temas de Programación lógica e I.A. José A. Alonso Jiménez

INSTITUTO POLITÉCNICO NACIONAL SECRETARÍA ACADÉMICA DIRECCIÓN DE EDUCACION SUPERIOR PROGRAMA SINTÉTICO

Tema 3. Listas Recursión sobre datos

Lógica y Programación

Tema 4: Tableros semánticos

Tema 10: Evaluación perezosa

Tema 4: Resolución de primer orden

Razonamiento automático

Tema 9: Procesamiento de lenguaje natural

Programación declarativa ( )

Tema 2: Introducción a la programación con Haskell

Tema 2: Introducción a la programación con Haskell

Tema 2: Deducción natural proposicional

Inteligencia Artificial II Prolog I

Tema 3: Tipos y clases

Tema 3: Tipos y clases

PROGRAMACIÓN LÓGICA. David Felipe Rico Hernandez Gabriel Esteban Bejarano Delgado

Tema 2: Introducción a la programación con Haskell

Metodología de Programación I Presentación del curso.

Tema 9: Modelos de Herbrand

Tema 2: Introducción a la programación con Haskell

Lógica informática ( )

Transcripción:

Razonamiento Automático Curso 999 2000 Tema 4: Programación lógica y Prolog José A. Alonso Jiménez Miguel A. Gutiérrez Naranjo Dpto. de Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla RA 99 00 CcIa Programación lógica y Prolog 4.

Resolución SLD Ejemplo de resolución SLD: Programa: nieto(x,z) :- hijo(x,y), hijo(y,z). hijo(x,y) :- madre(y,x). hijo(x,y) :- padre(y,x). padre(a,b). madre(b,c). Pregunta: :- nieto(c,x). Resolución SLD: :- nieto(c,x0). nieto(x,z) :- hijo(x,y), hijo(y,z). {X/c, Z/X0} :- hijo(c,y), hijo(y, X0). hijo(x2,y2) :- madre(y2,x2). {X2/c, Y2/Y} :- madre(y,c), hijo(y,x0). madre(b,c). {Y/b} :- hijo(c,x0). hijo(x3,y3) :- padre(y3,x3). {X3/b, Y3/X0} :- padre(x0,b). padre(a,b). {X0/a} :-. Respuesta: {X/a} RA 99 00 CcIa Programación lógica y Prolog 4.2

Resolución SLD Siglas SLD: S: regla de Selección L: resolución Lineal D: cláusulas Definidas Reglas de selección de Prolog: Selección de objetivos: De izquierda a derecha Selección de reglas: Como en el programa Arbol SLD: alumno(a,p) :- estudia(a,c), ense~na(p,c). estudia(ana,ia). estudia(ana,pl). estudia(eva,ra). ense~na(jose_a,ia). ense~na(jose_a,ra). ense~na(rafael,pl). :- alumno(a,jose_a). :- estudia(a,c), ense~na(jose_a,c). / \ :- ense~na(jose_a,ia). :- ense~na(jose_a,ra). :- ense~na(jose_a,pl). :-. :-. R = {A/ana} Fallo R = {A/eva} RA 99 00 CcIa Programación lógica y Prolog 4.3

Resolución SLD Sesión?- alumno(a,jose_a). A = ana ; A = eva ;?- trace.?- alumno(a,jose_a). Call: ( 7) alumno(_g78, jose_a)? Call: ( 8) estudia(_g78, _L30)? Exit: ( 8) estudia(ana, ia)? Call: ( 8) ense~na(jose_a, ia)? Exit: ( 8) ense~na(jose_a, ia)? Exit: ( 7) alumno(ana, jose_a)? A = ana ; Redo: ( 8) ense~na(jose_a, ia)? Fail: ( 8) ense~na(jose_a, ia)? Redo: ( 8) estudia(_g78, _L30)? Exit: ( 8) estudia(ana, pl)? Call: ( 8) ense~na(jose_a, pl)? Fail: ( 8) ense~na(jose_a, pl)? Redo: ( 8) estudia(_g78, _L30)? Exit: ( 8) estudia(eva, ra)? Call: ( 8) ense~na(jose_a, ra)? Exit: ( 8) ense~na(jose_a, ra)? Exit: ( 7) alumno(eva, jose_a)? A = eva ; RA 99 00 CcIa Programación lógica y Prolog 4.4

Resolución SLD tas: Ramas de éxito y de fallo Búsqueda en profundidad Ramas infinitas en Prolog por predicados simétricos: Programa ej-.pl hermano(x,y) :- hermano(y,x). hermano(b,a). Sesión:?- [ej-].?- hermano(a,x). [WARNING: Out of local stack] Execution Aborted Arbol: :- hermano(a,x). :- hermano(x,a). / \ :- hermano(a,x). :-. :- hermano(x,a). / \... :-. RA 99 00 CcIa Programación lógica y Prolog 4.5

Resolución SLD Programa ej-2.pl hermano(b,a). hermano(x,y) :- hermano(y,x). Sesión:?- [ej-2].?- hermano(a,x). X = b ; X = b ; Arbol: :- hermano(a,x). :- hermano(x,a). / \ :-. :- hermano(a,x). :- hermano(x,a). / \ :-.... RA 99 00 CcIa Programación lógica y Prolog 4.6

Resolución SLD Ramas infinitas en Prolog por predicados transitivos: Programa hermano(a,b). hermano(b,c). hermano(x,y) :- hermano(x,z), hermano(z,y). Pregunta?- hermano(a,x). X = b ; X = c ; [WARNING: Out of local stack] Exception: (42407) hermano(c, _L508920)? a Execution Aborted RA 99 00 CcIa Programación lógica y Prolog 4.7

Resolución SLD Arbol SLD :- h(a,x0). / \ :-. :- h(a,z), X0=b h(z,x0). / \ :- h(b,x0) \ :-. :- h(b,z3), X0=c h(z3,x0). \ :- h(c,x0). :- h(c,z5), h(z5,x0). :- h(c,z6), h(z6,z5), h(z5,x0).... RA 99 00 CcIa Programación lógica y Prolog 4.8

Todas las soluciones bagof(var,condicion,lista) Programa edad(pedro,7). edad(ana,5). edad(juan,8). edad(maria,5). Sesión?- bagof(_x,edad(_x,5),l). L = [ana, maria] ;?- bagof(_x,edad(_x,edad),l). Edad = 7 L = [pedro] ; Edad = 8 L = [juan] ; Edad = 5 L = [ana, maria] ;?- bagof(_x,_e^edad(_x,_e),l). L = [pedro, ana, juan, maria] ;?- bagof(_x,edad(_x,6),l). RA 99 00 CcIa Programación lógica y Prolog 4.9

Todas las soluciones setof(var,condicion,lista) Similar a bagof salvo que Lista de X está ordenada y sin elementos duplicados. Sesión?- setof(_x,_e^edad(_x,_e),lista_ni~nos), setof(_e,_x^edad(_x,_e),lista_edades). Lista_ni~nos = [ana, juan, maria, pedro] Lista_edades = [5, 7, 8] ;?- setof(_e-_x,_e^edad(_x,_e),l). L = [5-ana, 5-maria, 7-pedro, 8-juan] ;?- setof(_e,(edad(ana,_e),edad(maria,_e)),l). L = [5] ;?- setof(_x,edad(_x,6),l). RA 99 00 CcIa Programación lógica y Prolog 4.0

Todas las soluciones findall(var,condicion,lista) Similar a bagof pero su comportamiento cambia cuando en la condición hay variables libres o si no hay soluciones. Sesión?- findall(_x,edad(_x,_e),l). L = [pedro, ana, juan, maria] ;?- findall(_x,edad(_x,6),l). L = [] ; RA 99 00 CcIa Programación lógica y Prolog 4.

Predicados de segundo orden Programa: padre(andres,beatriz). padre(carlos,david). padre(ernesto,elisa). madre(maria,beatriz). madre(eva,david). madre(carmen,elisa). padres([],[]). padres([h R],[X R2]) :- padre(x,h), padres(r,r2). madres([],[]). madres([h R],[X R2]):- madre(x,h), madres(r,r2). Sesión?- padres([beatriz,david,elisa],l). L = [andres, carlos, ernesto] ;?- madres([beatriz,david,elisa],l). L = [maria, eva, carmen] ; RA 99 00 CcIa Programación lógica y Prolog 4.2

Predicados de segundo orden Abstracción : Sesión?- map(padre,[beatriz,david,elisa],l). L = [andres, eva, carmen] ;?- map(padre,[beatriz,david,elisa],l). L = [andres, eva, carmen]?- map(madre,[beatriz,david,elisa],l). L = [maria, eva, carmen] Intento de definición map(relacion,[],[]). map(relacion,[h R],[X R2]):- Relacion(X,H), map(r,r2). Prolog no admiten Relacion/2 El predicado univ =..?- padre(carlos,david)=.. L. L = [padre, carlos, david] ;?- Lit =.. [padre,carlos,david]. Lit = padre(carlos, david) RA 99 00 CcIa Programación lógica y Prolog 4.3

Predicados de segundo orden Definición de map map(_,[],[]). map(relacion,[h R],[X R2]):- Lit =.. [Relacion,X,H], Lit, map(relacion,r,r2). El predicado de segundo orden call?- call(padre,x,beatriz). X = andres?- call(madre,x,beatriz). X = maria Definición de map con call map(_,[],[]). map(relacion,[h R],[X R2]):- call(relacion,x,h), map(relacion,r,r2). El predicado predefinido maplist?- maplist(reverse,[[a,b],[,2,3]],l). L = [[b,a],[3,2,]] RA 99 00 CcIa Programación lógica y Prolog 4.4

Poda de la búsqueda mediante corte Ejemplo nota Programa sin corte nota(x,suspenso) :- X < 5. nota(x,aprobado) :- X >= 5, X < 7. nota(x,notable) :- X >= 7, X < 9. nota(x,sobresaliente) :- X >= 9. Traza?- trace.?- nota(3,y). Call: ( 7) nota(3, _G98)? Call: ( 8) 3 < 5? Exit: ( 8) 3 < 5? Exit: ( 7) nota(3, suspenso)? Y = suspenso ; Redo: ( 7) nota(3, _G98)? Call: ( 8) 3 >= 5? Fail: ( 8) 3 >= 5? Redo: ( 7) nota(3, _G98)? Call: ( 8) 3 >= 7? Fail: ( 8) 3 >= 7? Redo: ( 7) nota(3, _G98)? Call: ( 8) 3 >= 9? Fail: ( 8) 3 >= 9? Fail: ( 7) nota(3, _G98)? RA 99 00 CcIa Programación lógica y Prolog 4.5

Poda de la búsqueda mediante corte Programa con corte nota(x,suspenso) :- X < 5,!. nota(x,aprobado) :- X < 7,!. nota(x,notable) :- X < 9,!. nota(x,sobresaliente). Traza?- trace.?- nota(3,y). Call: ( 7) nota(3, _G0)? Call: ( 8) 3 < 5? Exit: ( 8) 3 < 5? Exit: ( 7) nota(3, suspenso)? Y = suspenso;?- trace.?- nota(6,y). Call: ( 7) nota(6, _G0)? Call: ( 8) 6 < 5? Fail: ( 8) 6 < 5? Redo: ( 7) nota(6, _G0)? Call: ( 8) 6 < 7? Exit: ( 8) 6 < 7? Exit: ( 7) nota(6, aprobado)? Y = aprobado; RA 99 00 CcIa Programación lógica y Prolog 4.6

Poda de la búsqueda mediante corte Ventajas e inconvenientes del uso del corte Aumento de eficiencia Pérdida de sentido declarativo. Ejemplo:?- nota(6,sobresaliente). Ejemplo maximo Programa sin corte maximo_(x,y,x) :- Y =< X. maximo_(x,y,y) :- X =< Y. Programa con corte maximo_2(x,y,x) :- Y =< X,!. maximo_2(x,y,y). Sesión?- maximo_(3,5,x). X = 5 ;?- maximo_2(3,5,x). X = 5 ;?- maximo_(3,2,2).?- maximo_2(3,2,2). RA 99 00 CcIa Programación lógica y Prolog 4.7

Poda de la búsqueda mediante corte Ejemplo pertenece Programa sin corte pertenece_(x,[x _]). pertenece_(x,[_ L]) :- pertenece_(x,l). Programa con corte pertenece_2(x,[x _]) :-!. pertenece_2(x,[_ L]) :- pertenece_2(x,l). Sesión?- pertenece_(a,[a,b,a]). =>?- pertenece_(c,[a,b,a]). =>?- pertenece_(x,[a,b,a]). => X = a; X = b; X = a;?- pertenece_2(a,[a,b,a]). =>?- pertenece_2(c,[a,b,a]). =>?- pertenece_2(x,[a,b,a]). => X = a; Predicados member y memberchk RA 99 00 CcIa Programación lógica y Prolog 4.8

Negación como fallo Negación con corte Programa: q(a) :- q(b),!, q(c). q(a) :- q(d). q(d). Sesión:?- trace.?- q(a). Call: ( 7) q(a)? Call: ( 8) q(b)? Fail: ( 8) q(b)? Redo: ( 7) q(a)? Call: ( 8) q(d)? Exit: ( 8) q(d)? Exit: ( 7) q(a)? Negación como fallo Programa q(a) :- q(b), q(c). q(a) :- no(q(b)), q(d). q(d). no(p) :- P,!, fail. no(p). RA 99 00 CcIa Programación lógica y Prolog 4.9

Negación como fallo Sesión:?- q(a).?- trace.?- q(a). Call: ( 7) q(a)? Call: ( 8) q(b)? Fail: ( 8) q(b)? Redo: ( 7) q(a)? Call: ( 8) no(q(b))? Call: ( 9) q(b)? Fail: ( 9) q(b)? Redo: ( 8) no(q(b))? Exit: ( 8) no(q(b))? Call: ( 8) q(d)? Exit: ( 8) q(d)? Exit: ( 7) q(a)? Comentarios: eficiencia y claridad RA 99 00 CcIa Programación lógica y Prolog 4.20

Negación como fallo Ejemplo con fallo de la negación Programa q(a) :- no(q(b)), q(d). q(a) :- q(b). q(b). no(p) :- P,!, fail. no(p). Sesión?- trace.?- q(a). Call: ( 7) q(a)? Call: ( 8) no(q(b))? Call: ( 9) q(b)? Exit: ( 9) q(b)? Call: ( 9) fail? Fail: ( 9) fail? Fail: ( 8) no(q(b))? Redo: ( 7) q(a)? Call: ( 8) q(b)? Exit: ( 8) q(b)? Exit: ( 7) q(a)? Metapredicado primitivo: not, \+ RA 99 00 CcIa Programación lógica y Prolog 4.2

Negación como fallo Problemas con negación como fallo Programa aprobado(x) :- no(suspenso(x)), matriculado(x). matriculado(juan). matriculado(luis). suspenso(juan). no(p) :- P,!, fail. no(p). Sesión?- trace.?- aprobado(luis). Call: ( 8) aprobado(luis)? Call: ( 9) no(suspenso(luis))? Call: ( 0) suspenso(luis)? Fail: ( 0) suspenso(luis)? Redo: ( 9) no(suspenso(luis))? Exit: ( 9) no(suspenso(luis))? Call: ( 9) matriculado(luis)? Exit: ( 9) matriculado(luis)? Exit: ( 8) aprobado(luis)? RA 99 00 CcIa Programación lógica y Prolog 4.22

Negación como fallo?- trace.?- aprobado(x). Call: ( 8) aprobado(_g2)? Call: ( 9) no(suspenso(_g2))? Call: ( 0) suspenso(_g2)? Exit: ( 0) suspenso(juan)? Call: ( 0) fail? Fail: ( 0) fail? Fail: ( 9) no(suspenso(_g2))? Fail: ( 8) aprobado(_g2)? Interpretación de cláusula aprobado(x) :- no(suspenso(x)), matriculado(x). X está aprobado si nadie está suspenso y X está matriculado Cambio del orden de literales aprobado(x) :- matriculado(x), no(suspenso(x)). matriculado(juan). matriculado(luis). suspenso(juan). no(p) :- P,!, fail. no(p). RA 99 00 CcIa Programación lógica y Prolog 4.23

Negación como fallo Sesión?- trace.?- aprobado(x). Call: ( 8) aprobado(_g2)? Call: ( 9) matriculado(_g2)? Exit: ( 9) matriculado(juan)? Call: ( 9) no(suspenso(juan))? Call: ( 0) suspenso(juan)? Exit: ( 0) suspenso(juan)? Call: ( 0) fail? Fail: ( 0) fail? Fail: ( 9) no(suspenso(juan))? Redo: ( 9) matriculado(_g2)? Exit: ( 9) matriculado(luis)? Call: ( 9) no(suspenso(luis))? Call: ( 0) suspenso(luis)? Fail: ( 0) suspenso(luis)? Redo: ( 9) no(suspenso(luis))? Exit: ( 9) no(suspenso(luis))? Exit: ( 8) aprobado(luis)? X = luis Consejo: Asegurar que + se llame con átomos básicos RA 99 00 CcIa Programación lógica y Prolog 4.24

Alternativas al corte Programa con alternativas Programa a(p) :- a(q), a(r), a(s),!, a(t). a(p) :- a(q), a(r), a(u). a(q). a(r). a(u). Sesión?- trace.?- a(p). Call: ( 8) a(p)? Call: ( 9) a(q)? Exit: ( 9) a(q)? Call: ( 9) a(r)? Exit: ( 9) a(r)? Call: ( 9) a(s)? Fail: ( 9) a(s)? Redo: ( 8) a(p)? Call: ( 9) a(q)? Exit: ( 9) a(q)? Call: ( 9) a(r)? Exit: ( 9) a(r)? Call: ( 9) a(u)? Exit: ( 9) a(u)? Exit: ( 8) a(p)? RA 99 00 CcIa Programación lógica y Prolog 4.25

Alternativas al corte Programa con if then else Programa a(p) :- a(q), a(r), if_then_else(a(s),a(t),a(u)). a(q). a(r). a(u). if_then_else(x,y,z) :- X,!, Y. if_then_else(x,y,z) :- Z. Sesión?- trace.?- a(p). Call: ( 8) a(p)? Call: ( 9) a(q)? Exit: ( 9) a(q)? Call: ( 9) a(r)? Exit: ( 9) a(r)? Call: ( 9) if_then_else(a(s), a(t), a(u))? Call: ( 0) a(s)? Fail: ( 0) a(s)? Redo: ( 9) if_then_else(a(s), a(t), a(u))? Call: ( 0) a(u)? Exit: ( 0) a(u)? Exit: ( 9) if_then_else(a(s), a(t), a(u))? Exit: ( 8) a(p)? RA 99 00 CcIa Programación lógica y Prolog 4.26

Alternativas al corte Programa con meta predicado -> Programa a(p) :- a(q), a(r), (a(s) -> a(t) ; a(u)). a(q). a(r). a(u). Sesión?- trace.?- a(p). Call: ( 8) a(p)? Call: ( 9) a(q)? Exit: ( 9) a(q)? Call: ( 9) a(r)? Exit: ( 9) a(r)? Call: ( 9) a(s)? Fail: ( 9) a(s)? Call: ( 9) a(u)? Exit: ( 9) a(u)? Exit: ( 8) a(p)? RA 99 00 CcIa Programación lógica y Prolog 4.27

Alternativas al corte Programa con -> múltiple Programa calificacion(x,y) :- nota(x,n), ( N < 5 -> Y=suspenso ; N < 7 -> Y=aprobado ; N < 9 -> Y=notable ; true -> Y=sobresaliente). nota(juan,6). Sesión?- trace.?- calificacion(juan,x). Call: ( 8) calificacion(juan, _G67)? Call: ( 9) nota(juan, _L28)? Exit: ( 9) nota(juan, 6)? Call: ( 9) 6 < 5? Fail: ( 9) 6 < 5? Call: ( 9) 6 < 7? Exit: ( 9) 6 < 7? Call: ( 9) _G67 = aprobado? Exit: ( 9) aprobado = aprobado? Exit: ( 8) calificacion(juan, aprobado)? X = aprobado ; RA 99 00 CcIa Programación lógica y Prolog 4.28

Acumuladores Procedimiento longitud recursivo longitud([],0). longitud([x R], N) :- longitud(r,m), N is M+. Procedimiento longitud recursivo con acumuladores longitud(l,n) :- longitud_ac(l,0,n). longitud_ac([],n,n). longitud_ac([x R],N0,N) :- N is N0+, longitud_ac(r,n,n). Comentarios: Acumuladores Ventaja de procedimientos recursivos finales Procediminento primitivo length RA 99 00 CcIa Programación lógica y Prolog 4.29

Acumuladores Procedimiento inversa inversa([],[]). inversa([x L],L2) :- inversa(l,l3), conc(l3,[x],l2). conc([],l,l). conc([x L],L2,[X L3]) :- conc(l,l2,l3). Procedimiento inversa con acumuladores inversa(l,l2) :- inversa(l,[],l2). inversa([],l,l). inversa([x L],L2,L3) :- inversa(l,[x L2],L3). RA 99 00 CcIa Programación lógica y Prolog 4.30

Acumuladores Comparación de inversa inversa sin acumuladores?- findall(_x,between(,00,_x),_l),time(inversa(_l,_l)). 5,53 inferences in 0.2 seconds (42942 Lips)?- findall(_x,between(,000,_x),_l),time(inversa(_l,_l)). 50,503 inferences in 5.89 seconds (356 Lips)?- findall(_x,between(,00,_x),_l),profile(inversa(_l,_l),plain,0). Predicate Box Entries = Calls+Redos = Exits+Fails Time ====================================================================== conc/3 5,050 = 5,050+0 = 5,050+0 76.9% inversa/2 0 = 0+0 = 0+0 7.6%?- findall(_x,between(,000,_x),_l),profile(inversa(_l,_l),plain,0). Predicate Box Entries = Calls+Redos = Exits+Fails Time ====================================================================== conc/3 500,500 = 500,500+0 = 500,500+0 99.6% inversa/2,00 =,00+0 =,00+0 0.2% RA 99 00 CcIa Programación lógica y Prolog 4.3

Acumuladores inversa con acumuladores?- findall(_x,between(,00,_x),_l),time(inversa(_l,_l)). 04 inferences in 0.00 seconds (Infinite Lips)?- findall(_x,between(,000,_x),_l),time(inversa(_l,_l)).,004 inferences in 0.0 seconds (00400 Lips)?- findall(_x,between(,0000,_x),_l),time(inversa(_l,_l)). 0,004 inferences in 0.9 seconds (52653 Lips)?- findall(_x,between(,000,_x),_l),profile(inversa(_l,_l),plain,0). Predicate Box Entries = Calls+Redos = Exits+Fails Time ====================================================================== inversa/3,00 =,00+0 =,00+0 33.3% inversa/2 = +0 = +0 0.0%?- findall(_x,between(,0000,_x),_l),profile(inversa(_l,_l),plain,0). Predicate Box Entries = Calls+Redos = Exits+Fails Time ====================================================================== inversa/3 0,00 = 0,00+0 = 0,00+0 90.4% inversa/2 = +0 = +0 0.0% RA 99 00 CcIa Programación lógica y Prolog 4.32

Acumuladores Representaciones de [a,b,c] como listas de diferencias [a,b,c,d] - [d] [a,b,c,,2,3] - [,2,3] [a,b,c X] - [X] [a,b,c] - [] Concatenación de listas de diferencias Programa conc_ld(x-rx,y-ry,x-ry) :- RX=Y. Sesión?- conc_ld([a,b RX]-RX,[c,d RY]-RY,Z-[]). RX = [c, d] RY = [] Z = [a, b, c, d]?- conc_ld([a,b _RX]-_RX,[c,d _RY]-_RY,Z-[]). Z = [a, b, c, d] RA 99 00 CcIa Programación lógica y Prolog 4.33

Acumuladores Procedimiento inversa con listas de diferencias Programa inversa(l,l2) :- inversa_ld(l,l2-[]). inversa_ld([],l2-l2). inversa_ld([x L],L2-L3) :- inversa_ld(l,l2-[x L3]). Traza?- trace.?- inversa([a,b],l). Call: ( 8) inversa([a, b], _G49)? Call: ( 9) inversa_ld([a, b], _G49 - [])? Call: ( 0) inversa_ld([b], _G49 - [a])? Call: ( ) inversa_ld([], _G49 - [b, a])? Exit: ( ) inversa_ld([], [b, a] - [b, a])? Exit: ( 0) inversa_ld([b], [b, a] - [a])? Exit: ( 9) inversa_ld([a, b], [b, a] - [])? Exit: ( 8) inversa([a, b], [b, a])? L = [b, a] RA 99 00 CcIa Programación lógica y Prolog 4.34

Base de datos interna Base de datos interna?- assert(clase(a,vocal)).?- listing(clase). clase(a, vocal).?- assert(clase(b,consonante)).?- listing(clase). clase(a, vocal). clase(b, consonante).?- retract(clase(a,vocal)). RA 99 00 CcIa Programación lógica y Prolog 4.35

Base de datos interna?- listing(clase). clase(b, consonante).?- asserta(clase(a,vocal)).?- listing(clase). clase(a, vocal). clase(b, consonante).?- abolish(clase,2).?- listing(clase). Correct to close? n Correct to clause? n [WARNING: predicates for clase ] RA 99 00 CcIa Programación lógica y Prolog 4.36

Metodogía de programación lógica Enunciado del problema:?- ord_quicksort([3,2,,5],l). L = [, 2, 3, 5] Procedimiento quicksort: Para ordenar la lista no vacía L: Elegir un elemento X de L y dividir el resto en las dos listas Menores (que contiene los elementos de L menores que X) y Mayores (que contiene los elementos de L mayores o iguales que X) Ordenar los Menores obteniendo MenoresOrdenados Ordenar los Mayores obteniendo MayoresOrdenados La lista L ordenada es la concatenación de MenoresOrdenados y [X MayoresOrdenados] RA 99 00 CcIa Programación lógica y Prolog 4.37

Metodogía de programación lógica Programa ord_quicksort([],[]). ord_quicksort([x R],Ordenada) :- divide(x,r,menores,mayores), ord_quicksort(menores,menoresordenados), ord_quicksort(mayores,mayoresordenados), append(menoresordenados, [X MayoresOrdenados], Ordenada). divide(_,[],[],[]). divide(x,[y R],[Y Menores],Mayores) :- menor(y,x),!, divide(x,r,menores,mayores). divide(x,[y R],Menores,[Y Mayores]) :- divide(x,r,menores,mayores). RA 99 00 CcIa Programación lógica y Prolog 4.38

Bibliografía Bratko, I. Prolog Programming for Artificial Intelligence (2nd ed.) (Addison Wesley, 990) Clocksin, W.F. y Mellish, C.S. Programming in Prolog (Fourth ed.) (Springer, 994) Flach, P. Simply Logical (Intelligent Reasoning by Example) (John Wiley, 994) Cap. 3: Logic programming and Prolog. Poole, D.; Mackworth, A. y Goebel, R. Computational Intelligence (A Logical Approach) (Oxford University Press, 998) Ap. B: The Prolog programming language RA 99 00 CcIa Programación lógica y Prolog 4.39