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