Académique Documents
Professionnel Documents
Culture Documents
Metodologas de Programacion I
Programacion Logica
5 de noviembre de 2009
1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1. Breve historia de la programacion logica. . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Una breve introduccion a Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.1. Hechos y relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2.2. Reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.3. Definicion de reglas recursivas . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3. Como computa Prolog una solucion? . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4. Organizacion del curso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Parte I Formalismos
4. Principio de Resolucion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2. Que es un procedimiento de prueba? . . . . . . . . . . . . . . . . . . . . . . . . . . 44
V
VI Indice general
5. Negacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.2. La complecion de un programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
5.3. Resolucion SLDNF para programas definitivos . . . . . . . . . . . . . . . . . . 62
5.4. Programas Logicos Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.5. Resolucion SLDNF para programas generales . . . . . . . . . . . . . . . . . . . 67
6. Corte y Aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.1. Corte: podando el arbol-SLD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.2. Aritmetica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Parte II Prolog
7. Introduccion a Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9. Sistemas Expertos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
9.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
9.2. Caractersticas de los SE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
9.2.1. Razonamiento basado en metas . . . . . . . . . . . . . . . . . . . . . . . . 101
9.2.2. Incertidumbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.2.3. Razonamiento guiado por los datos . . . . . . . . . . . . . . . . . . . . . 102
9.3. Usando la maquina de inferencia de Prolog . . . . . . . . . . . . . . . . . . . . . 103
9.3.1. Reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
9.3.2. Reglas para relaciones jerarquicas . . . . . . . . . . . . . . . . . . . . . . 104
9.3.3. Reglas para otras relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
9.4. Interfaz del usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
9.5. Un Shell simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
9.5.1. REPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
9.6. Encadenamiento haca atras con incertidumbre . . . . . . . . . . . . . . . . . . 111
9.6.1. Factores de certidumbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
9.6.2. Factores de certidumbre a la MYCIN . . . . . . . . . . . . . . . . . . . 114
9.6.3. Formato de las reglas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
9.6.4. La maquina de inferencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
9.6.5. Interfaz con el usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Indice general VII
Implicacion material
CWA Suposicion del mundo cerrado (Closed World Assumption).
fbf Formula bien formada (wff - well formed formula).
FOL Logica de primer orden (First-Order Logic).
FOPC Calculo de predicados en primer orden (First-Order Predicate Calculus).
IA Inteligencia Artificial.
LFOL El lenguaje de la logica de primer orden.
MGU Unificador mas general (Most General Unifier).
NAF Negacion por fallo finito (Negation as Finite Failure).
R Funcion de seleccion en la resolucion-SLD.
ssi Si y solo si.
WAM Maquina abstracta de Warren (Warren Abstract Machine).
U Universo de discurso. En ciertas ocasiones se presentara como D (domi-
nio).
IX
Captulo 1
Introduccion
1
2 1 Introduccion
La figura 1.1 muestra una relacion familiar, donde las flechas X Y indican
que X es progenitor Y . El hecho de que Tom sea progenitor de Bob 1 se escribe en
Prolog: progenitor(tom,bob).
pam tom
bob liz
ann pat
jim
Hemos escogido progenitor como el nombre de una relacion que tiene a tom
y bob como argumentos. Por razones que explicaremos mas adelante, escribimos
los nombres como tom con minuscula inicial. Para indicar que esta relacion tiene
dos argumentos escribimos progenitor/2 y decimos que progenitor tiene aridad 2.
El arbol familiar completo puede definirse como un programa en Prolog:
1 progenitor(pam,bob).
2 progenitor(tom,bob).
3 progenitor(tom,liz).
4 progenitor(bob,ann).
5 progenitor(bob,pat).
6 progenitor(pat,jim).
Este programa consta de seis clausulas. Cada una de estas clausulas declara un
hecho sobre la relacion progenitor. Por ejemplo, progenitor(tom,bob) es un
caso particular de la relacion progenitor. Una relacion esta definida por el conjunto
de todos sus casos.
Podemos editar un archivo con este programa Prolog y llamarlo clase01.pl.
Para utilizar este programa es necesario invocar a Prolog, por ejemplo, si usamos
1 Decid usar una familia gringa, porque nuestros bellos nombres como Mara del Pilar, no caben
en un grafo facil de leer. Si usted quiere llamar a Tom, Pancho; eso, como veremos, no cambia en
nada la historia que voy a contar (a condicion de que Pancho sea siempre Pancho).
1.2 Una breve introduccion a Prolog 5
> swipl
Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 5.6.64)
Copyright (c) 1990-2008 University of Amsterdam.
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free
software, and you are welcome to redistribute it under certain
conditions.
Please visit http://www.swi-prolog.org for details.
?-
?- [clase01].
% clase01 compiled 0.00 sec, 168 bytes
Yes
?-
?- progenitor(bob,pat).
Yes
a lo que Prolog respondera Yes, al encontrar que ese hecho se encuentra en nuestro
programa. Si preguntamos Es Liz progenitora de Pat? obtendremos como respuesta
No, porque nuestro programa no menciona nada (Haban escuchado el termino
supuesto del mundo cerrado?) acerca de que Liz sea progenitora de Pat:
?- progenitor(liz,pat).
No
?- progenitor(tom,ben).
No
?- progenitor(X,liz).
X = tom
Yes
6 1 Introduccion
?- progenitor(bob,X).
X = ann ;
X = pat ;
No
Prolog nos da las respuestas ann, pat y al no haber mas respuestas posibles,
responde No.
Es posible plantear preguntas mas complicadas a nuestro programa, por ejemplo
Quien es abuelo/a de Jim? Como nuestro programa no conoce directamente la rela-
cion abuelo/2, esta pregunta debe descomponerse en dos preguntas como lo muestra
la figura 1.2:
1. Quien es el progenitor de Jim? Asumamos que es alguien Y .
2. Quien es el progenitor de Y? Asumamos que es alguien X.
progenitor
Y abuelo
progenitor
jim
Figura 1.2 La relacion abuelo expresada como una composicion de dos relaciones progenitor.
?- progenitor(Y,jim), progenitor(X,Y).
Y = pat
X = bob
Yes
?- progenitor(X,Y), progenitor(Y,jim).
X = bob
Y = pat
Yes
1.2 Una breve introduccion a Prolog 7
?- progenitor(tom,X), progenitor(X,Y).
X = bob
Y = ann ;
X = bob
Y = pat ;
No
Otra pregunta interesante sera Tienen Ann y Pat progenitores en comun? Esto
puede descomponerse nuevamente en dos preguntas:
1. Quien es el progenitor X de Ann?
2. Es X (el mismo) progenitor de Pat?
?- progenitor(X,ann), progenitor(X,pat).
X = bob ;
No
?-
Resumiendo:
1.2.2. Reglas
1 mujer(pam).
2 mujer(liz).
3 mujer(pat).
4 mujer(ann).
5 hombre(tom).
6 hombre(bob).
7 hombre(jim).
1 vastago(Y,X) :- progenitor(X,Y).
?- vastago(liz,tom).
vastago(liz,tom) :- progenitor(tom,liz).
1.2 Una breve introduccion a Prolog 9
progenitor(tom,liz).
vastago(liz,tom).
?- vastago(liz,tom).
Yes
?- hermana(ann,pat).
Yes
Tras nuestra primer pregunta sobre esta relacion, podemos concluir que su defi-
nicion es correcta, pero tiene un sutil error que se revela al preguntar:
?- hermana(X,pat).
X = ann ;
X = pat ;
No
10 1 Introduccion
progenitor
mujer
X progenitor
hermana
Es correcto que Pat sea su propia hermana? Ese es el comportamiento que es-
perabamos de la definicion de hermana/2, y se debe a que no hay nada que diga que
X e Y deben ser diferentes! Esto se puede corregir definiendo hermana como:
1 hermana(X,Y) :-
2 progenitor(Z,X),
3 progenitor(Z,Y),
4 mujer(X),
5 dif(X,Y).
De forma que:
?- hermana(X,pat).
X = ann ;
No
Resumiendo:
progenitor
progenitor ancestro
X
ancestro
progenitor
progenitor
Y Y
1 ancestro(X,Z) :- progenitor(X,Z).
1 ancestro(X,Z) :-
2 progenitor(X,Z).
3 ancestro(X,Z) :-
4 progenitor(X,Y),
12 1 Introduccion
5 progenitor(Y,Z).
6 ancestro(X,Z) :-
7 progenitor(X,Y0),
8 progenitor(Y0,Y1),
9 progenitor(Y1,Z).
10 ...
Lo cual resulta en un programa largo y, peor aun, que solo funciona para un
numero limitado de ancestros, en el ejemplo: padres, abuelos y bisabuelos. Es decir,
esta definicion de ancestro/2 es correcta pero incompleta.
Existe una formulacion elegante y completa de la relacion ancestro/2, comple-
ta en el sentido que puede computar cualquier ancestro, independientemente de la
longitud de la cadena de progenitores que deba aplicarse. La idea central es definir
ancestro en terminos de si misma:
1 ancestro(X,Z) :-
2 progenitor(X,Z).
3
4 ancestro(X,Z) :-
5 progenitor(X,Y),
6 ancestro(Y,Z).
?- ancestro(pam,X).
X = bob ;
X = ann ;
X = pat ;
X = jim ;
No
?- ancestro(X,jim).
X = pat ;
X = pam ;
X = tom ;
X = bob ;
No
Resumiendo:
Las reglas recursivas definen conceptos en terminos de ellos mismos.
Estan definidas por al menos dos casos: uno terminal (no recursivo) y la llamada
recursiva.
Una relacion recursiva define intenSionalmente un concepto.
intenSional 6= intenCional.
1.3 Como computa Prolog una solucion? 13
Una pregunta a Prolog es siempre una secuencia de una o mas metas. Para res-
ponder, Prolog trata de satisfacer estas metas. Que significa satisfacer una meta?
Satisfacer una meta implica demostrar que la meta es verdadera, asumiendo que
las relaciones en el programa logico son verdaderas. Satisfacer una meta significa
entonces demostrar que la meta es una consecuencia logica de los hechos y reglas
definidas en un programa. Si la pregunta contiene variables, Prolog necesita tambien
encontrar cuales son los objetos particulares (que remplazaran a las variables) para
los cuales la meta se satisface. La asignacion de valores a variables es mostrada al
usuario. Si Prolog no puede demostrar para alguna asignacion de valores a variables,
que las metas siguen logicamente del programa, la respuesta a la pregunta sera No.
En terminos matematicos, la interpretacion de un programa en Prolog es como
sigue: Prolog acepta hechos y reglas como un conjunto de axiomas, y el usuario
plantea preguntas como un teorema; entonces Prolog trata de probar este teorema,
es decir, demostrar que el teorema se sigue logicamente de los axiomas.
Veamos un ejemplo clasico. Sean los axiomas:
Todos los hombres son falibles.
Socrates es un hombre.
Un teorema que logicamente sigue de estos dos axiomas es:
Socrates es falible.
El primer axioma puede reescribirse como: Para toda X, si X es un hombre,
entonces X es falible. El ejemplo puede entonces traducirse a Prolog como sigue:
1 falible(X) :- hombre(X).
2 hombre(socrates).
?- falible(socrates)
Yes
A este tipo de secuencias se les conoce como secuencias de prueba Como en-
cuentra Prolog una secuencia de prueba?
Prolog encuentra la secuencia de prueba en orden inverso al que acabamos de
presentar. En lugar de comenzar con los hechos simples especificados en el progra-
ma, Prolog comienza con las metas y, usando reglas, substituye la meta actual por
sub-metas, hasta que estas llegan a resolverse por hechos simples. Dada la pregunta:
?- ancestro(tom,pat).
Prolog tratara de satisfacer esta meta. Para ello, tratara de encontrar una clausula
en el programa, a partir de la cual la meta dada pueda seguirse logicamente. Obvia-
mente, las unicas reglas acerca de la relacion ancestro/2 son:
1 ancestro(X,Z) :-
2 progenitor(X,Z).
3
4 ancestro(X,Z) :-
5 progenitor(X,Y),
6 ancestro(Y,Z).
ancestro(tom, pat)
ancestro(X,Z) :- progenitor(X,Z)
progenitor(tom, pat)
Figura 1.5 El primer paso de la ejecucion. La meta de arriba es verdadera si la meta de abajo es
verdadera.
1.3 Como computa Prolog una solucion? 15
Como no hay una clausula en el programa que coincida con la nueva sub-meta
progenitor(tom,pat), la sub-meta falla. Ahora Prolog vuelve atras (back-
track) para evaluar de forma alternativa su meta original. Ahora intentara la segun-
da clausula del programa (lneas 46). Como antes, las variables de la meta toman
los valores: X/tom y Z/pat. Pero Y no toma valor alguno aun. La meta es rem-
plazada por las sub-metas: progenitor(tom,Y), ancestro(Y,pat). La
ejecucion de este nuevo paso se muestra en la figura 1.6.
ancestro(tom,pat)
ancestro(X,Z) :-
ancestro(X,Z) :- progenitor(Z,X)
progenitor(X,Y), ancestro(Y,Z)
progenitor(tom,Y)
progenitor(tom,pat)
ancestro(Y,pat)
No
1 ancestro(X,Z) :- progenitor(X,Z).
?- trace.
Yes
[trace] ?- ancestro(tom,pat).
Call: (7) ancestro(tom, pat) ? creep
Call: (8) progenitor(tom, pat) ? creep
Fail: (8) progenitor(tom, pat) ? creep
Redo: (7) ancestro(tom, pat) ? creep
Call: (8) progenitor(tom, _L345) ? creep
Exit: (8) progenitor(tom, bob) ? creep
Call: (8) ancestro(bob, pat) ? creep
16 1 Introduccion
ancestro(tom,pat)
ancestro(X,Z) :-
ancestro(X,Z) :- progenitor(Z,X)
progenitor(X,Y), ancestro(Y,Z)
progenitor(tom,Y)
progenitor(tom,pat)
ancestro(Y,pat)
No
Y = bob progenitor(tom,bob)
ancestro(bob,pat)
ancestro(X,Z) :-
progenitor(Z,X)
progenitor(bob,pat)
Yes
Yes
parte del curso con algunas consideraciones sobre el corte y la aritmetica (captulo
6).
La segunda parte inicia con una introduccion menos breve sobre el lenguaje
(captulo 7) y continua con una serie de aplicaciones de Prolog a problemas pro-
pios de la IA: busquedas en espacios de soluciones (captulo 8), sistemas expertos
(captulo 9), induccion de arboles de decision (captulo 10), y planeacion (captulo
11).
De ser posible, concluiremos el curso con algunos aspectos de meta-programacion,
programacion por restricciones y programacion de agentes.
Parte I
Formalismos
Captulo 2
Logica de Primer Orden
2.1. Introduccion
21
22 2 Logica de Primer Orden
madre de maria
luis
madre de
pedro juana
Figura 2.1 La relacion madre de es una funcion; mientras que hijo de no lo es.
1 El smbolo se usa aqu como una variable meta-logica, es decir, una variable que tiene como
referente el lenguaje del sistema formal mismo, y por lo tanto, no forma parte del lenguaje del
sistema en si. Se usaran letras griegas como variables meta-logicas.
24 2 Logica de Primer Orden
Brazo robtico
A D
B C
Mesa
Figura 2.2 El mundo de los bloques, usado para ejemplificar el calculo de predicados.
Una funcion es un tipo especial de relacion entre los objetos del dominio de
discurso. Este tipo de relaciones mapea un conjunto de objetos de entrada a un
objeto unico de salida. Por ejemplo, es posible definir la funcion parcial sombrero
que mapea un bloque al bloque que se encuentra encima de el, si tal bloque existe.
Las parejas correspondientes a esta funcion parcial, dado el escenario mostrado en la
figura 2.2 son: {(b, a), (c, d), (d, e)}. El conjunto de todas las funciones consideradas
en la conceptualizacion del mundo se conoce como base funcional.
Un segundo tipo de relacion sobre los objetos del dominio de discurso son los
predicados. Diferentes predicados pueden definirse en el mundo de los bloques, ej.,
el predicado sobre que se cumple para dos bloques, si y solo si el primero esta inme-
diatamente encima del segundo. Para la escena mostrada en la figura 2.2, sobre/2 se
define por los pares {(a, b), (d, c), (e, d)}. Otro predicado puede ser libre/1, que se
cumple para un bloque si y solo si este no tiene ningun bloque encima. Este predica-
do tiene los siguientes elementos {a, e}. El conjunto de todos los predicados usados
en la conceptuacion se conoce como base relacional.
Para universos de discurso finitos, existe un lmite superior en el numero posible
de predicados n-arios que pueden ser definidos. Para un universo de discurso de
cardinalidad b (cardinalidad es el numero de elementos de un conjunto), existen bn
distintas n-tuplas. Cualquier predicado n-ario es un subconjunto de estas bn tuplas.
n
Por lo tanto, un predicado n-ario debe corresponder a uno de maximo 2(b ) conjuntos
posibles.
Ademas de las funciones y predicados, la flexibilidad de la logica de primer
orden resulta del uso de variables y cuantificadores. Las variables, cuyos valores
2.3 El lenguaje de la logica de primer orden 25
son objetos del universo de discurso, se suelen representar por cualquier secuencia
de caracteres que inicie con una mayuscula. El cuantificador para todo () nos
permite expresar hechos acerca de todos los objetos en el universo del discurso, sin
necesidad de enumerarlos. Por ejemplo, toda madre . . . El cuantificador existe
() nos permite expresar la existencia de un objeto en el universo de discurso con
cierta propiedad en partcular, por ejemplo, X libre(X) enLaMesa(X) expresa
que hay al menos un objeto que no tiene bloques sobre el y aue se encuentra sobre
la mesa.
X tal que X es un bloque y X esta libre (no tiene otro bloque encima). Observen que
cuando usamos cuantificadores, siempre tenemos en mente el universo de discurso
en cuestion o dominio. El dominio puede especificarse en termino de conjuntos.
Luego, si el dominio D es el conjunto de constantes {a, b, c, d, e, brazo, mesa}, po-
demos decir que B D = {a, b, c, d, e} es el conjunto de bloques en D. Entonces,
es posible plantear una expresion equivalente a X bloque(X) libre(X), usando la
fbf X libre(x), si especificamos que libre/1 tiene como dominio B.
Una interpretacion del predicado libre/1 es un subconjunto de B tal que si un
bloque esta libre, pertenece a este subconjunto. Para un predicado de aridad dos,
como sobre/2 cuyo dominio son los bloques B B, podemos decir que su interpre-
tacion es un subconjunto de B B. En general, para un predicado de aridad n, su
interpretacion es un subconjunto en Dn .
aV = a
bV = b
cV = c
dV = d
eV = e
sobreV = {(a, b), (e, d), (d, c)}
enLaMesaV = {b, c}
libreV = {a, e}
porEncimaV = {(a, b), (e, d), (e, c), (d, c)}
|=V [U]
Entonces podemos escribir M |= VU () para expresar que es verdadera en
el modelo M = hD,V i cuando las variables en toman valores de acuerdo a la
asignacion U. Por ejemplo, M |= VU (sobre(X, b)) si X\a U.
En realidad, la nocion de satisfaccion vara dependiendo de la clase del enunciado
. As tenemos que una interpretacion V y una asignacion de variables U satisfacen
una ecuacion, si y solo si la correspondiente asignacion de terminos TVU mapea los
terminos igualados a un mismo objeto. Cuando este es el caso, los terminos se dicen
correferenciados:
el par ordenado (a, b) es miembro del conjunto que interpreta la relacion sobre, en-
tonces es el caso que |=V sobre(a, b)[U], por lo cual podemos decir que sobre(a, b)
es verdadera en esa intepretacion.
Evidentemente:
( E)
Eliminacion de cuantificador universal. Esta regla expresa que siempre que
una fbf de la forma X pertenezca a las premisas o sea concluida a partir de
ellas, una nueva fbf puede ser concluida al remplazar todas las ocurrencias libres
de X en por algun termino t que es libre con respecto a X (todas las variables
en t quedan libres al substituir X por t. La regla se presenta como sigue:
X(X)
(E)
(t)
Introduccion de conjuncion. Cuando las fbf y pertenezcan a las premisas
o sean concluidas a partir de ellas, podemos inferir :
(I)
La correctez de estas reglas puede ser demostrada directamente a partir de la
definicion de la semantica de las fbf en LFOL . El uso de las reglas de inferencia
puede ilustrarse con el ejemplo formalizado. Las premisas son:
1. XY madre(X) hi jo de(Y, X) ama(X,Y )
2. madre( julia) hi jo de(luis, julia)
Al aplicar la eliminacion de cuantificador universal (E) a (1) obtenemos:
3. Y (madre( julia) hi jo de(Y, julia) ama( julia,Y )
2.6. Substituciones
Definicion 10 (Aplicacion) Sea una substitucion {X1 /t1 , . . . , Xn /tn } y una fbf.
La aplicacion es la fbf obtenida al remplazar simultaneamente ti por toda ocu-
rrencia de Xi en (1 i n). se conoce como un caso (instance) de .
Ejemplos:
p( f (X, Z), f (Y, a)) {X/a,Y /Z,W /b} = p( f (a, Z), f (Z, a))
p(X,Y ) {X/ f (Y ),Y /b} = p( f (Y ), b)
32 2 Logica de Primer Orden
33
34 3 Clausulas y Programas Definitivos
0 1 n (n 0)
Los bloques de construccion i de estas fbf, se conocen como literales.
0 1 n (n 0)
lo cual es equivalente a la forma general de fbf que nos interesaba:
0 1 n (n 0)
Si n = 0 tenemos por definicion que la literal 0 sera una literal positiva, por
lo que la clausula definitiva toma la forma de un hecho. El cuerpo vaco puede
representarse por el conectivo nulo , que es verdadero en toda interpretacion (por
simetra tambien se asume un conectivo nulo 2, que es falso en toda interpretacion).
Si n > 0 la clausula definitiva toma la forma de una regla, donde 0 se conoce como
cabeza de la regla; y la conjuncion 1 n se conoce como cuerpo de la regla.
El ejemplo de la relacion nieto de/2 y la regla que lo define, muestra que las
clausulas definitivas usan una forma restringida de cuantificacion existencial, las
variables que ocurren solo en el cuerpo de la clausula estan cuantificadas existen-
cialmente en el cuerpo de la clausula (el mismo ejemplo muestra que esto equivale
a que tales variables esten cuantificadas universalmente sobre toda la fbf).
Definicion 18 (Meta definitiva) Una clausula sin literales positivas es una meta
definitiva.
1 n (n 1)
Definicion 19 (Clausula de Horn) Una clausula de Horn es una clausula definitva
o una meta definitiva.
X1 . . . Xm (1 n )
donde las Xi son todas variables que ocurren en la meta. Esto es equivalente a:
X1 . . . Xm (1 n )
Esto puede verse como una pregunta existencial que el sistema tratara de negar,
mediante la construccion de un contra ejemplo. Esto es, el sistema tratara de encon-
trar terminos ti . . .tm tales que las fbf obtenidas a partir de 1 m al remplazar
la variable Xi por ti (1 i m) son verdaderas en todo modelo del programa. Es
decir, el sistema construira una consecuencia logica del programa que es un caso de
la conjuncion de todas las submetas de la meta.
Al dar una meta definitiva, el usuario selecciona un conjunto de conclusiones
a ser construdas. Este conjunto puede ser finito o infinito. El problema de como
construir tal conjunto lo veremos al tratar la resolucion SLD.
Ejemplo 1 Tomando en cuenta los hechos y reglas sobre una familia presentados
al principio de esta sesion, el usuario podra estar interesado en las siguientes
consultas (se muestra tambien la meta definitiva correspondiente):
Consulta Meta definitiva
Es Ana hija de Antonio? hi jo(ana, antonio)
Quien es nieto de Ana? nieto(X, ana)
De quien es nieto Antonio? nieto(antonio, X)
Quien es nieto de quien? nieto(X,Y )
Las respuestas obtenidas seran:
Puesto que la primer meta no contiene variables, la respuesta sera Si (Yes).
Puesto que el programa no contiene informacion sobre los nietos de Ana, la
respueta a la segunda consulta es No (o ninguno).
Puesto que Antonio es nieto de Marcos, la respuesta obtenida sera X = marcos.
La consulta final obtiene tres respuestas: X = antonio Y = alicia, X = alicia Y =
marcos, X = ana Y = juan.
Es posible hacer consultas mas elaboradas como Hay alguna persona cuyos
nietos son Antonio y Alicia?
nieto(antonio, X) nieto(alicia, X)
cuya respuesta esperada es X = marcos.
3.3 El modelo mnimo de Herbrand 37
Los programas definitivos solo pueden expresar conocimiento positivo, tanto los
hechos, como las reglas, nos dicen que elementos de una estructura estan en una
relacion, pero no nos dicen cuales no. Por lo tanto, al usar el lenguaje de los pro-
gramas definitivos, no es posible construir descripciones contradictorias, es decir,
conjuntos de fbf no satisfacibles. En otras palabras, todo programa definitivo tiene
un modelo. Recordemos que una interpretacion que hace verdadera una fbf es su
modelo:
Ejemplo 3 Consideren este otro programa = {p(a), q(a, f (b), q(X, X) p(X)}.
Sea L es lenguaje de primer orden dado por los smbolos en . El Universo de
Herbrand UL es el conjunto infinito:
BL = {p(a), p(b), q(a, b), p( f (a)), p( f (b)), q(a, f (a)), q(a, f (b)), . . . }
0 1 , . . . , n (n 0)
que no es verdera en V . Esto mplica que V contiene a 1 , . . . n , pero no a 0 .
Luego, 1 , . . . , n son miembros de toda interpretacion en la familia M. Mas impor-
tante aun, debe existir un modelo Vi M tal que 0 6 Vi , de forma que la clausula
0 1 , . . . , n (n 0) no es verdadera en ese Vi . Por lo tanto Vi no es un modelo
del programa , lo que contradice nuestro supuesto.
Al tomar la interseccion de todos los modelos de Herbrand (se sabe que todo
programa definitivo tiene un modelo de Herbrand BL ) de un programa definitivo,
obtenemos el modelo mnimo de Herbrand el programa.
Ejemplo 6 Sea el programa definitivo {masculino(adan), f emenino(eva)} con
su interpretacion obvia. tiene los siguientes modelos de Herbrand:
{masculino(adan), f emenino(eva)}
{masculino(adan), masculino(eva), f emenino(eva)}
3.3 El modelo mnimo de Herbrand 41
T (V ) = {0 | 0 1 , . . . , n ground( ) {1 , . . . , n } V }
Para los programas definitivos, se puede mostrar que existe una interpretacion
mnima V tal que T (V ) = V y que V es identica al modelo mnimo de Herbrand
de . Mas aun, el modelo mnimo de Herbrand es el limite de la creciente, posible-
mente infinita, secuencia de iteraciones:
/ T (0),
0, / T (T (0)),
/ ...
Existe una notacion estandar para denotar a los miembros de esta secuencia de
interpretaciones construdas a partir de :
T 0 = 0/
T (i + 1) = T (T i)
[
T n = T i
i=0
T 0 = 0/
T 1 = {impar(s(0))}
T 2 = {impar(s(0)), impar(s(s(s(0))))}
..
.
T m = {impar(sn (0)) | n {1, 3, 5, . . . }}
4.1. Introduccion
43
44 4 Principio de Resolucion
,
donde la lnea superior expresa las premisas y la lnea inferior la conclusion.
Es posible ligar varias aplicaciones del modus ponens para construir una prueba.
Por ejemplo, si tenemos el programa logico = {p(a), q(b) p(a), r(b) q(b)}
es posible derivar la fbf r(b) como sigue:
0 1 , . . . , n (n 0)
donde 0 , . . . , n son fbfs atomicas y 0 puede estar ausente (para representar
clausulas meta). Consideren el siguiente programa definitivo que describe un
mundo donde los padres de un recien nacido estan orgullosos, Juan es el padre de
Marta y Marta es una recien nacida:
46 4 Principio de Resolucion
orgulloso(Z).
que es una abreviatura de Zorgulloso(Z) (una clausula definitiva sin cabeza), que
a su vez es equivalente de:
Z orgulloso(Z).
cuya lectura es Nadie esta orgulloso, esto es, la respuesta negativa a la consulta
original Quien esta orgulloso? La meta ahora es probar que este enunciado es
falso en todo modelo del programa y en particular, es falso en el modelo previsto
para , puesto que esto es una forma de probar que |= Z orgulloso(Z). En ge-
neral para todo conjunto de fbf cerradas y una fbf cerrada , tenemos que |=
si {} es no satisfacerle (no tiene modelo).
Por lo tanto, nuestro objetivo es encontrar una substitucion tal que el con-
junto {orgulloso(Z) } sea no satisfacerle, o de manera equivalente, |=
Z orgulloso(Z) .
El punto inicial de nuestro razonamiento es asumir la meta G0 Para cualquier
Z, Z no esta orgulloso. La inspeccion del programa revela que una regla describe
una condicion para que alguien este orgulloso:
padre(X,Y ) papa(X,Y ).
que es equivalente a:
(padre(X,Y ) papa(X,Y ))
por lo que G1 se reduce a:
recien nacido(marta).
pero el programa contiene el hecho:
recien nacido(marta).
equivalente a recien nacido(marta) f lo que conduce a una refutacion.
Este razonamiento puede resumirse de la siguiente manera: para probar la exis-
tencia de algo, suponer lo contrario y usar modus ponens y la regla de eliminacion
del cuantificador universal, para encontrar un contra ejemplo al supuesto.
Observen que la meta definitiva fue convertida en un conjunto de atomos a ser
probados. Para ello, se selecciono una fbf atomica de la meta p(s1 , . . . , sn ) y una
48 4 Principio de Resolucion
(A1 , . . . Am )1 . . . k
es una instancia que no puede satisfacerse. De manera equivalente, que:
|= (A1 Am )1 . . . k
Observen que generalmente, la computacion de estos pasos de razonamiento no
es determinista: cualquier atomo de la meta puede ser seleccionado y pueden haber
varias clausulas del programa que unifiquen con el atomo seleccionado. Otra fuente
de indeterminismo es la existencia de unificadores alternativos para dos atomos. Es-
to sugiere que es posible construir muchas soluciones (algunas veces, una cantidad
infinita de ellas).
Por otra parte, es posible tambien que el atomo seleccionado no unifique con
ninguna clausula en el programa. Esto indica que no es posible construir un contra
ejemplo para la meta definida inicial. Finalmente, la computacion puede caer en un
ciclo y de esta manera no producir solucion alguna.
4.4. Substitucion
Una substitucion remplaza variables por terminos, por ejemplo, podemos rem-
plazar la variable X por el termino f (a) en la clausula p(X) q(X), y as obtener la
nueva clausula p( f (a))q( f (a)). Si asumimos que las clausulas estan cuantificadas
universalmente, decimos que esta substitucion hace a la clausula original, menos
general. Mientras que la clausula original dice que V (p(X)) = t y que V (q(X)) = t
para cualquier X en el dominio, la segunda clausula dice que esto solo es cierto
cuando cuando V (X) = f (a). Observen que la segunda clausula es consecuencia
logia de la primera: p(X) q(X) |= p( f (a)) q( f (a))
Definicion 26 (Substitucion) Una substitucion es un conjunto finito de la forma:
donde las Xi son variables, distintas entre si, y los ti son terminos. Decimos que
ti substituye a Xi . La forma Xi /ti se conoce como ligadura de Xi . La substitucion
se dice se dice de base (grounded) si cada termino ti es un termino base (no incluye
variables)..
4.5. Unificacion
Algoritmo 1 Unifica(E)
1: function U NIFICA(E) . E es un conjunto de ecuaciones
2: repeat
3: (s = t) seleccionar(E)
4: if f (s1 , . . . , sn ) = f (t1 , . . . ,tn ) (n 0) then
5: remplazar (s = t) por s1 = t1 , . . . , sn = tn
6: else if f (s1 , . . . , sm ) = g(t1 , . . . ,tn ) ( f /m 6= g/n) then
7: return(fallo)
8: else if X = X then
9: remover la X = X
10: else if t = X then
11: remplazar t = X por X = t
12: else if X = t then
13: if subtermino(X,t) then
14: return(fallo)
15: else remplazar todo X por t
16: end if
17: end if
18: until No hay accion posible para E
19: end function
Ejemplo 13 El conjunto { f (X, g(Y )) = f (g(Z), Z)} tiene una forma resuelta, pues-
to que:
{X = g(Z), g(Y ) = Z}
{X = g(Z), Z = g(Y )}
{X = g(g(Y )), Z = g(Y )}
52 4 Principio de Resolucion
Ejemplo 14 El conjunto { f (X, g(X), b) = f (a, g(Z), Z)} no tiene forma resuelta,
puesto que:
{X = a, g(X) = g(Z), b = Z}
{X = a, g(a) = g(Z), b = Z}
{X = a, a = Z, b = Z}
{X = a, Z = a, b = Z}
{X = a, Z = a, b = a}
f allo
Ejemplo 15 El conjunto { f (X, g(X)) = f (Z, Z)} no tiene forma resuelta, puesto
que:
{X = Z, g(X) = Z}
{X = Z, g(Z) = Z}
{X = Z, Z = g(Z)}
f allo
Este algoritmo termina y regresa una forma resuelta equivalente al conjunto
de ecuaciones de su entrada; o bien regresa fallo si la forma resuelta no existe.
Sin embargo, el computar subtermino(X,t) (verificacion de ocurrencia) hace que
el algoritmo sea altamente ineficiente. Los sistemas Prolog resuelven este proble-
ma haciendo caso omiso de la verificacion de ocurrencia. El standard ISO Prolog
(1995) declara que el resultado de la unificacion es no decidible. Al eliminar la ve-
rificacion de ocurrencia es posible que al intentar resolver X = f (X) obtengamos
X = f ( f (X)) = f ( f ( f . . . )). En la practica los sistemas Prolog no caen en este
ciclo, pero realizan la siguiente substitucion {X/ f ()}. Si bien esto parece resolver
el problema de eficiencia, generaliza el concepto de termino, substitucion y unifica-
cion al caso del infinito, no considerado en la logica de primer orden, introduciendo
a su vez inconsistencia.
4.6. Resolucion-SLD
(1 i1 i i+1 m ) (0 1 n )
(1 i1 1 n i+1 m )
o, de manera equivalente, usando la notacion de los programas definitivos:
4.6 Resolucion-SLD 53
1 , . . . , i1 , i , i+1 , . . . , m 0 1 , . . . , n
(1 , . . . , i1 , 1 , . . . , n , . . . , m )
donde:
1. 1 , . . . , m son fbf atomicas.
2. 0 1 , . . . , n es una clausula definitiva en el programa (n 0).
3. MGU(i , 0 ) = .
La regla tiene dos premisas: una meta y una clausula definitivas. Observen que
cada una de ellas esta cuantificada universalmente, por lo que el alcance de los
cuantificadores es disjunto. Por otra parte, solo hay un cuantificador universal para
la conclusion, por lo que se requiere que el conjunto de variables en las premisas
sea disjunto. Puesto que todas las variables en las premisas estan cuantificadas, es
siempre posible renombrar las variables de la clausula definitiva para cumplir con
esta condicion.
La meta definida puede incluir muchas fbf atomicas que unifican con la cabeza de
alguna clausula en el programa. En este caso, es deseable contar con un mecanismo
determinista para seleccionar un atomo i a unificar. Se asume una funcion que
selecciona una submeta de la meta definida (funcion de seleccion).
La regla de inferencia presentada es la unica necesaria para procesar programas
definitivos. Esta regla es una version de la regla de inferencia conocida como prin-
cipio de resolucion, introducido por J.A. Robinson en 1965. El principio de resolu-
cion aplica a clausulas. Puesto que las clausulas definitivas son mas restringidas que
las clausulas, la forma de resolucion presentada se conoce como resolucion-SLD
(resolucion lineal para clausulas definitivas con funcion de seleccion).
El punto de partida de la aplicacion de esta regla de inferencia es una meta defi-
nida G0 :
1 , . . . , m (m 0)
De esta meta, una submeta i sera seleccionada, de preferencia por una funcion
de seleccion. Una nueva meta G1 se construye al seleccionar una clausula del pro-
grama 0 1 , . . . , n (n 0) cuya cabeza 0 unifica con i , resultando en 1 . G1
tiene la forma:
(1 , . . . , i1 , 1 , . . . , n , . . . , m )1
Ahora es posible aplicar el principio de resolucion a G1 para obtener G2 , y as su-
cesivamente. El proceso puede terminar o no. Hay dos situaciones donde no es po-
sible obtener Gi+1 a partir de Gi :
1. cuando la submeta seleccionada no puede ser resuelta (no es unificable con la
cabeza de una clausula del programa).
2. cuando Gi = 2 (meta vaca = f).
Definicion 36 (Derivacion-SLD) Sea G0 una meta definitiva, un programa defi-
nitivo y R una funcion de seleccion. Una derivacion SLD de G0 (usando y R) es
una secuencia finita o infinita de metas:
54 4 Principio de Resolucion
0 n1
G0 G1 . . . Gn1 Gn
Para manejar de manera consistente el renombrado de variables, las variables en
una clausula i seran renombradas poniendoles subndice i.
Cada derivacion SLD nos lleva a una secuencias de MGUs 1 , . . . , n . La com-
posicion
(
1 2 . . . n si n > 0
=
si n = 0
de MGUs se conoce como la substitucion computada de la derivacion.
Ejemplo 16 Consideren la meta definida orgulloso(Z) y el programa discutido
en la clase anterior.
G0 = orgulloso(Z).
0 = orgulloso(X0 ) padre(X0 ,Y0 ), recien nacido(Y0 ).
La unificacion de orgulloso(Z) y orgulloso(X0 ) nos da el MGU 1 = {X0 /Z}.
Asumamos que nuestra funcion de seleccion es tomar la submeta mas a la izquierda.
El primer paso de la derivacion nos conduce a:
0 n1
G0 G1 . . . Gn1 Gn
Por ejemplo:
orgulloso(Z)
recien nacido(marta)
5.1. Introduccion
sobre(X,Y ) en(X,Y ).
sobre(X,Y ) en(X, Z), sobre(Z,Y ).
en(c, b).
en(b, a).
{en(b, a), en(c, b), sobre(b, a), sobre(c, b), sobre(c, a)}
Observen que ni el programa, ni el modelo mnimo de Herbrand, incluyen in-
formacion negativa del tipo: a no esta sobre b, o b no esta sobre c. Sin embargo,
57
58 5 Negacion
sobre(b, c)
sobre(a, c)
En contra de lo que podra ser nuestra primera intuicion, existen problemas aso-
ciados a la CWA. El principal tiene que ver con que la no-derivabilidad para los
programas definitivos es no decidible en el caso general. Esto es, no es posible de-
terminar si la pseudo-regla asociada al CWA aplica o no. Una version mas debil de
la suposicion de mundo cerrado, se logra si asumimos que es derivable a partir
del programa si la meta tiene un arbol-SLD finito que falla. A esta regla se
le conoce como negacion como falla (finita) (NAF).
Es necesario contrastar la NAF con la CWA, que tambien puede verse como
una negacion por falla, pero infinita. Para ilustrar la diferencia entre los dos enfo-
5.2 La complecion de un programa 59
sobre(X,Y ) en(X,Y ).
sobre(X,Y ) en(X, Z), sobre(Z,Y ).
Estas reglas especifican que un objeto esta sobre un segundo objeto, si el primer
objeto esta encima del segundo (1) o si el objeto esta sobre otro objeto que a su vez
esta encima del segundo (2). Esto tambien puede escribirse como:
en(c, b).
en(b, a).
en(X1 , X2 ) X1 = c, X2 = b
en(X1 , X2 ) X1 = b, X2 = a
(t1 , . . . ,tm ) 1 , . . . , n (n 0)
por la formula:
donde las Yi son todas variables en y las Xi son variables unicas que no apa-
recen en .
2. Para cada smbolo de predicado remplazar todas las fbf:
(X1 , . . . , Xm ) 1
..
.
(X1 , . . . , Xm ) j
por la formula:
5.2 La complecion de un programa 61
X1 , . . . , Xm ( (X1 , . . . , Xm ) 1 , . . . , j si j > 0
X1 , . . . , Xm ( (X1 , . . . , Xm )) si j = 0
(X = X)
(X = Y Y = X)
(X = Y Y = Z X = Z)
(X1 = Y1 Xn = Yn f (X1 , . . . , Xn ) = f (Y1 , . . . ,Yn ))
(X1 = Y1 Xn = Yn ( (X1 , . . . , Xn ) (Y1 , . . . ,Yn ))
( f (X1 , . . . , Xn ) = f (Y1 , . . . ,Yn ) X1 = Y1 Xn = Yn )
( f (X1 , . . . , Xm ) = g(Y1 , . . . ,Yn ))(Si f /m 6= g/n)
(X = t)(Si X es un subtermino propio de t)
Estas definiciones garantizan que la igualdad (=) sea una relacion de equivalen-
cia; que sea una relacion congruente; y que formalice la nocion de unificacion. Las
primeros cinco definiciones se pueden abandonar si se especifica que = representa
la relacion de identidad .
Ejemplo 17 Consideremos la construccion de comp( ) tal y como se definio ante-
riormente. El primer paso produce:
Como sabemos, no es posible que una literal negativa pueda ser consecuencia
logica de un programa definitivo. Pero al substituir las implicaciones en por equi-
valencias en comp( ) es posible inferir informacion negativa a partir del programa
completado. Esta es la justificacion de la regla NAF, cuyas propiedades de consis-
tencia se deben a K. Clark [3]:
Teorema 5 (Consistencia de la NAF) Sea un programa definitivo y una
meta definitiva. Si tiene un arbol-SLD finito fallido, entonces comp( ) |=
().
1 , . . . n (n 0)
en(c, b)
en(b, a)
= 0 1 = {X/c,Y /b}
La primer clausula especifica que un bloque es base si esta sobre la mesa y tiene
otro bloque encima. La segunda clausula indica que cuando no es cierto que un blo-
que no esta sobre la mesa, entonces esta sobre la mesa. La tercera clausula especifica
que un bloque que esta sobre otro, no esta sobre la mesa.
Parece claro, pero la pregunta que deberamos hacernos es que tipo de sistema
de prueba queremos para los programas logicos generales y cuales seran las aproxi-
maciones logicas a las sutilezas, algunas ya discutidas, introducidas por este tipo de
lenguajes.
Observen que aunque el lenguaje fue enriquecido, no es posible de cualquier for-
ma que una literal negativa sea consecuencia logica de un programa dado. La razon
es la misma que para los programas definidos, la base de Herbrand de un programa
, B es un modelo de en el que todas las literales negativas son falsas. Al igual
que con los programas definidos, la pregunta es entonces como lograr inferencias
66 5 Negacion
2 :
1 :
no en la mesa(X) en(X,Y ).
en(c, b).
en(b, a).
Dada la meta inicial , se puede construir una derivacion . La
derivacion puede extenderse hasta una refutacion si falla finitamente. De mane-
ra alternativa, si tiene una refutacion, entonces la derivacion falla. Helas! esto
es imposible pues la meta no puede tener una refutacion y fallar finitamente al
mismo tiempo.
En lo que sigue, definiremos las nociones de derivacion-SLDNF y arbol-SLDNF,
de manera similar a la derivacion-SLD y a los arboles-SLD. La idea se concreta
en el concepto de bosque-SLDNF: un conjunto de arboles-SLDNF cuyos nodos
esta etiquetados con metas generales.
Definicion 48 (Bosque SLDNF) Sea un programa general, G0 una meta gene-
ral, y R una funcion de seleccion. El bosque SLDNF de G0 (usando y R) es el
bosque mas pequeno, tal que:
1. G0 es la raz del arbol.
2. Si G es un nodo en el bosque cuya literal seleccionada es positiva, entonces para
cada clausula tal que G0 puede ser derivada de G y (con MGU ), G tiene un
hijo etiquetado G0 . Si no existe tal clausula, entonces G tiene un hijo etiquetado
FF (falla finita);
3. Si G es un nodo del bosque cuya literal seleccionada es de la forma (G es
de la forma 1 , . . . , Li1 , i , Li+1 , . . . , n ), entonces:
El bosque contiene un arbol cuyo nodo raz es .
Si el arbol con raz tiene una hoja etiquetada como 2 con la substitucion
computada vaca , entonces G tiene un solo hijo etiquetado FF;
Si el arbol con raz es finito y tiene todas sus hojas etiquetadas FF,
entonces G tiene un solo hijo etiquetado (con substitucion asociada vaca )
como 1 , Li1 , Li+1 , . . . , n .
68 5 Negacion
termina(X) ciclo(X).
ciclo(X) ciclo(X).
base(X).
en la mesa(b). en la mesa(a).
no en la mesa(b). en la mesa(a).
FF 2
no en la mesa(b). no en la mesa(a).
en(b,Y0 ). en(a,Y0 ).
2 FF
ciclo(X).
paro(X). ciclo(X).
ciclo(X).
top(X) bloqueado(X).
bloqueado(X) en(Y, X).
en(a, b).
Es evidente que top(a) debera poder derivarse de este programa. Sin embargo, el
arbol-SLDNF de la meta top(X) no contiene refutaciones. De hecho, esta meta
se planta aun cuando bloqueado(X) tiene una refutacion. La razon de esto es
que bloqueado(X) no tiene ninguna derivacion que termine con una substitucion
computada vaca. A la meta top(X), Prolog no responde b, sino que todos
los bloques no estan en el tope de la pila! Esto se debe a la implementacion de
la mayora de los Prolog. La definicion que dimos aqu de resolucion-SLDNF es
correcta.
Teorema 8 (Correctez de la resolucion-SLDNF) Sea un programa general y
1 , . . . , n una meta general. Entonces:
Si 1 , . . . , n tiene una substitucion de respuesta computada , entonces
comp( ) |= (1 n ).
Si 1 , . . . , n tiene un arbol-SLDNF finito que falla, entonces comp( ) |=
((1 n )).
La definicion de bosque-SLDNF no debe verse como una implementacion de la
resolucion-SLDNF, solo representa el espacio ideal de computacion donde la co-
rrectez puede ser garantizada.
Captulo 6
Corte y Aritmetica
El arbol-SLD de una meta definitiva puede tener muchas ramas que conducen al
fallo de la meta y muy pocas, o una sola rama, que conducen al exito. Por ello, el pro-
gramador podra querer incluir informacion de control en sus programas, para evitar
que el interprete construya ramas fallidas. Observen que esta meta-informacion se
basa en la semantica operacional del programa, por lo que el programador debe sa-
ber como se construyen y se recorren los arboles-SLD. El predicado !/0 denota la
operacion de corte, y puede utilizarse como una literal en las metas definitivas. Su
presencia impide la construccion de ciertos sub-arboles.
Un interprete de Prolog recorre los nodos de un arbol-SLD primero en profun-
didad. El orden de las ramas corresponde al orden textual de las clausulas en el
programa. Cuando una hoja es alcanzada, el proceso de backtracking es ejecutado.
El proceso termina cuando no es posible hacer backtracking (todos los sub-arboles
de la raz del arbol han sido visitados).
Ejemplo 22 Asumamos el siguiente programa que define que el padre de una per-
sona es su antecesor hombre:
71
72 6 Corte y Aritmetica
padre(X, antonio)
padre(X, antonio)
hombre(ben).
Figura 6.2 Arbol de derivacion-SLD para la meta padre(X, antonio) con las ramas fallidas
podadas.
Observen que la version modificada con el corte, no puede usarse para computar
mas de un elemento de la relacion es padre de. El corte detendra la busqueda
despues de encontrar la primer respuesta a la meta definitiva.
A partir de la definicion del corte, se sigue que los efectos del operador son:
1. Divide el cuerpo de la meta en dos partes, separando la ejecucion de la recon-
sideracion despues de exito de !/0 , no es posible hacer backtracking haca
las literales a la izquierda del corte. Sin embargo, a la derecha del corte todo
funciona de manera usual.
2. Poda las ramas sin explorar directamente bajo origen(!). En otras palabras, no
habra mas intentos de unificar la sub-meta seleccionada de origen(!) con el resto
de las clausulas del programa.
74 6 Corte y Aritmetica
orgulloso( juan).
la respuesta sera No. Esto se debe a que la primer hija de juan en el programa
es maria. Una vez que esta respuesta se ha encontrado, no habra mas intentos de
satisfacer la meta en origen(!). No se consideraran mas hijos de juan en la solucion
computada.
El programa del ejemplo anterior se ha vuelto incompleto, algunas respuestas co-
rrectas no pueden ser computadas. Mas grave aun es el caso de las metas generales,
donde se puede llegar a resultados incorrectos, por ejemplo, orgulloso( juan)
tendra exito en la version de nuestro programa que utiliza corte.
Hasta ahora hemos distinguido dos usos del corte: eliminar ramas fallidas en el
arbol-SLD; y podar ramas exitosas. Eliminar ramas fallidas se considera una practi-
ca sin riesgo, porque no altera las respuestas producidas durante la ejecucion de un
programa. Tales cortes se conocen como cortes verdes. Sin embargo, este uso del
operador corte, esta ligado al uso particular de un programa. Como se ilustra en
6.1 Corte: podando el arbol-SLD 75
los ejemplos anteriores, para algunas metas, el operador solo eliminara ramas falli-
das; pero para otras podara ramas exitosas. Cortar ramas exitosas se considera una
practica de riesgo. Por eso, tales cortes se conocen como cortes rojos.
min(X,Y, X) X < Y, !.
min(X,Y,Y ).
min(X,Y, X) X < Y, !.
min(X,Y,Y ) X Y.
El argumento a call/1 debe ser un atomo de base, de otra forma, el computo produce
substituciones y la implementacion resulta logicamente incorrecta.
Usar cortes aleatoriamente, para intentar obtener respuestas correctas a un pro-
blema, es una de las fuentes principales de errores entre los novatos de la programa-
cion logica. Antes de intentar usar un corte, intenten escribir programas logicamente
correctos.
6.2. Aritmetica
Hemos demostrado que los programas definitivos pueden describir cualquier re-
lacion computable. Esto es, cualquier maquina de Turing puede codificarse como
un programa logico definitivo. Esto significa que, desde el punto de vista teorico, la
programacion logica es tan expresiva como otros paradigmas de programacion. La
resolucion y la busqueda exhaustiva, proveen una herramienta universal de compu-
tacion.
Desafortunadamente, desde el punto de vista practico, esta no es la mejor forma
de computar todo. Consideren las operaciones aritmeticas sobre los numeros na-
turales. Existen implementaciones en hardware extremadamente eficientes de tales
operaciones. As que es deseable que Prolog tenga acceso a las operaciones del pro-
cesador y su aritmetica de maquina. El problema es Cuando es posible hacer cosas
parecidas sin destruir la naturaleza declarativa de los programas logicos?
Observen primero que las operaciones como suma/2 y multiplicacion/2 pueden
describirse facilmente en un programa definitivo. Los numeros naturales pueden
describirse mediante terminos de base. Una forma estandar de hacer esto es utilizar
la constante 0 para representar el cero, y el functor unario s/1 para representar el
sucesor de un numero. Los numeros naturales consecutivos estan representados por:
0, s(0), s(s(0)), . . .
Las operaciones de adicion y multiplicacion son funciones binarias sobre los
numeros naturales. Los programas logicos proveen unicamente un formalismo para
representar relaciones. Sin embargo, una funcion binaria puede verse como una re-
lacion ternaria consistente en todas las tripletas hX,Y, Zi tal que Z es el resultado de
aplicar la funcion a X e Y .
Ahora, es bien sabido que las operaciones de adicion y multiplicacion se carac-
terizan por los axiomas de Peano:
6.2 Aritmetica 77
0+X = X
s(X) +Y = s(X +Y )
0X = 0
s(X) Y = (X Y ) +Y
suma(0, X, X).
suma(s(X),Y, s(Z)) suma(X,Y, Z).
mult(0, X, 0).
mult(s(X),Y, Z) mult(X,Y,W ), suma(W,Y, Z).
suma(s(s(0)), s(s(s(0))), X)
Por lo tanto, una persona que gana 130000 dolares debera obtener para la meta
impuesto(130000, 25000) una respuesta de Si. Pero estas reglas no pueden
usarse para encontrar una refutacion a la meta, ya que ninguna cabeza de regla
unifica con la sub-meta de la meta. La razon es que la unificacion estandar es muy
debil, como para darse cuenta que 25000 y 0.25*(130000-30000) son equivalentes.
Por lo tanto, la equivalencia debe describirse mediante axiomas de igualdad para
la aritmetica, los cuales no han sido incluidos en el programa anterior.
De esta discusion se sigue que es necesaria una extension al concepto de pro-
grama logico. Para nuestro ejemplo, el programa debera consistir de dos partes: un
conjunto de clausulas definitivas P, y un conjunto de axiomas de igualdad E, descri-
biendo la equivalencia entre los terminos. Este tipo de programas ha sido estudiado
en la literatura, donde el resultado mas importante es el concepto de unificacion ge-
neralizada, asociada a una teora de igualdad E y llamada E-unificacion. Lo que
sigue es una breve introduccion a este tema.
Una teora de igualdad en clausulas definitivas es un conjunto (posiblemente
infinito) de clausulas definitivas, donde cada atomo es de la forma s = t y s y t son
terminos. Algunas veces, la forma de las clausulas se restringe a hechos.
Un programa definitivo con igualdad es un par P, E donde P es un programa
definitivo, que no contiene ocurrencias del predicado = /2 y E es una teora de
igualdad en clausulas definitivas.
Sea E una teora de igualdad en clausulas definitivas. Una substitucion es un
E-unificador de los terminos s y t, si y solo si s = t es una consecuencia logica
de E.
Ejemplo 27 Sea E una teora de igualdad que expresa las equivalencias propias
de las expresiones aritmeticas. Consideren las expresiones:
t1 := (2 X) + 1
t2 := Y + 2
Asumamos ahora que una teora de igualdad E describe todas las funciones ex-
ternas, incluidas las operaciones aritmeticas, usadas en un programa logico. Esto
significa que para cualquier par de terminos de base s y t, cuyos functores principa-
les denoten funciones externas, la formula s = t es una consecuencia logica de E, si
y solo si, la invocacion de s regresa el mismo resultado que la invocacion de t. Para
terminos base, la E-unificacion es decidible. Esto puede ser explotado de la siguiente
manera: cuando una llamada a una funcion externa es encontrada como termino a E-
unificar, es invocada y su forma reducida es unificada por el procedimiento normal.
Observen que las funciones externas solo pueden ser invocadas sobre argumentos de
base. Si algunas variables de la funcion externa no tienen valores, la llamada externa
provocara un error y no se encontrara un E-unificador.
Esta idea es incorporada en el ISO Prolog. Los enteros son representados por
numerales como 0, 1, 2006, etc. Tambien existe un soporte limitado para numeros
reales como 3.14, 0.333, etc. Logicamente, los numerales son constantes. Un nume-
ro limitado de functores con notacion infija estan predefinidos en Prolog: +, -, *, /
(division en reales), // (division entera), mod, etc.
Dos predicados predefinidos se ocupan de la E-unificacion. El predicado =:= /2
checa si dos terminos de base son E-unificables. Por ejemplo, la meta 2 3 =:=
2 + 4 responde Si con la substitucion vaca computada. Si los argumentos no son
terminos de base, Prolog aborta la ejecucion del programa con un mensaje de error.
El predicado is/2 unifica el primer argumento con la forma reducida del segun-
do. Por ejemplo X is 2 + 2 responde Si con la substitucion {X/4}. El primer
argumento puede no ser una variable, en lo que constituye un caso especial de la
E-unificacion =:= /2. Por ejemplo, X + 1 is 2 + 3 falla aunque exista un E-
unificador {X/4}.
Otros predicados estandar incluyen = \ = /2 que checa cuando dos terminos no
son E-unificables. El lenguaje tambien provee predicados para comparar numeros,
como >,<, y .
Parte II
Prolog
Captulo 7
Introduccion a Prolog
83
Captulo 8
Estrategias basicas de resolucion de problemas
8.1. Introduccion
C A
?
A B
B C
85
86 8 Estrategias basicas de resolucion de problemas
cial del problema y un nodo representando la solucion final, un nodo meta. Como
podemos representar tal grafo en Prolog?
El espacio de estados sera representado por una relacion s(X,Y ) que sera verda-
dera si existe un movimiento valido en el espacio de estados del nodo X al nodo
Y . El nodo Y recibe el nombre de sucesor de X. Si existe un costo asociado a las
acciones esto puede representarse por un tercer argumento de s, s(X,Y,Costo).
Esta relacion puede ser especificada extensionalmente por un conjunto de hechos.
Sin embargo, para cualquier problema interesante, esto es irrealizable. La relacion
s es normalmente definida intensionalmente mediante un conjunto de reglas que
computan el sucesor de un nodo dado.
Otro detalle importante tiene que ver con la representacion de los estados del pro-
blema, los nodos. La representacion debe de ser compacta y permitir la computacion
eficiente de los nodos sucesores; y posiblemente el costo asociado a las acciones.
Tomemos como ejemplo el mundo de los bloques. Cada estado del problema
puede ser representado por una lista pilas. Cada pila a su vez puede ser representada
por una lista de bloques. El tope de cada pila es el primer elemento de cada lista
de bloques. La pila vaca esta representada por la lista vaca. As, el estado inicial
mostrado en la figura 8.1 es la lista: [[c,b,a],[],[]] (suponemos, que en la
mesa solo hay espacio para 3 pilas de bloques).
Una meta es cualquier arreglo con los bloques en el orden deseado. Existen tres
soluciones en este caso:
[[a,b,c],[],[]],
[[],[a,b,c],[]] o
[[],[],[a,b,c]].
La relacion sucesor puede programarse de acuerdo a la siguiente regla: el
Estado2 es sucesor de Estado1 si hay dos pilas Pila1 y Pila2 en Estado1 y el
tope de la pila Pila1 puede moverse a Pila2. Esto se traduce a Prolog como:
8.2 Busqueda primero en profundidad 87
1 ?- s([[b],[a,c],[]],[[],[b,a,c],[]]).
2 Yes
3 ?- s([[b],[a,c],[]],[[],[a,b,c],[]]).
4 No
1 meta(Estado) :-
2 member([a,b,c],Estado).
Un predicado solucion/2 se usa para plantear las metas, por ejemplo: solu-
cion([[c,a,b],[],[]],Sol). La solucion sera encontrada buscando en el espacio de esta-
dos del problema.
1 solucion(N,[N]) :-
2 meta(N).
3
4 solucion(N, [N|Sol1]) :-
5 s(N,N1),
6 solucion(N1,Sol1).
88 8 Estrategias basicas de resolucion de problemas
?- solucion([[c,b,a],[],[]],Sol).
Sol = [[[c, b, a], [], []],
[[b, a], [c], []],
[[a], [b, c], []],
[[], [a, b, c], []]]
Yes
Una primera mejora a este algoritmo, consiste en evitar que los nodos visitados
vuelvan a ser expandidos, evitando as caer en ciclos. La idea es llevar un registro
de los nodos visitados. El resultado se da del nodo final haca el estado inicial:
1 solucion2(Nodo,Sol) :-
2 primeroProfundidad([],Nodo,Sol).
3
4 primeroProfundidad(Camino, Nodo, [Nodo|Camino]) :-
5 meta(Nodo).
6
7 primeroProfundidad(Camino, Nodo, Sol) :-
8 s(Nodo,Nodo1),
9 not(member(Nodo1, Camino)),
10 primeroProfunidad([Nodo|Camino],Nodo1,Sol).
1 solucion3(Nodo,Sol,MaxProf) :-
2 primeroProfundidad2(Nodo,Sol,MaxProf).
3
4 primeroProfundidad2(Nodo,[Nodo],_) :-
5 meta(Nodo).
6
7 primeroProfundidad2(Nodo,[Nodo|Sol],MaxProf):-
8 MaxProf > 0,
9 s(Nodo,Nodo1),
10 Max1 is MaxProf-1,
11 primeroProfundidad2(Nodo1,Sol,Max1).
?- primeroEnProfundidad(Caminos,Sol).
90 8 Estrategias basicas de resolucion de problemas
Para generar las extensiones de un solo paso, dado un camino, podemos usar el
predicado predefinido bago f Veamos el programa:
4 solucion(Inicio,Sol) :-
5 primeroEnAmplitud([[Inicio]],Sol).
6
10 primeroEnAmplitud([[Nodo|Camino]|_],[Nodo|Camino]) :-
11 meta(Nodo).
12
13 primeroEnAmplitud([Camino|Caminos],Sol) :-
14 extender(Camino,NuevosCaminos),
15 append(Caminos,NuevosCaminos,Caminos1),
16 primeroEnAmplitud(Caminos1,Sol).
17
18 extender([Nodo|Camino],NuevosCaminos) :-
19 bagof([NuevoNodo,Nodo|Camino],
20 (s(Nodo,NuevoNodo), not(member(NuevoNodo, [Nodo|
Camino]))),
21 NuevosCaminos),
22 !.
23
24 %% % Si extender falla, Camino no tiene sucesores (lista vaca)
25
26 extender(Camino_,[]).
?- solucion([[c,b,a],[],[]],Sol).
Sol = [[[], [a, b, c], []], [[a], [b, c], []],
[[b, a], [c], []], [[c, b, a], [], []]]
Yes
Si queremos buscar en el espacio del grafo de la figura 8.4, codificamos los su-
cesores y las metas como sigue:
1 s(a,b).
2 s(a,c).
3 s(b,d).
4 s(b,e).
5 s(d,h).
6 s(e,i).
7 s(e,j).
8 s(c,f).
9 s(c,g).
10 s(f,k).
11
12 meta(j).
13 meta(f).
b c
d e f g
h j i k
?- solucion(a,Sol).
Sol = [f, c, a] ;
Sol = [j, e, b, a] ;
No
g(n)
n n' n''
h(n)
7
e
2
s 5
2
f 4
5 a
2
2
2 b g
4 c 2
4
2
3
t
3
3 d
Figura 8.6 Mapa entre ciudades, sus distancias por carretera, y sus distancias lneales a la meta
(cuadros).
De forma que f (e) < f (c) y ahora el proceso 2 procede al nodo f y el proceso 1
espera. Pero entonces:
f ( f ) = 7 + 4 + 11
f (c) = 10
f (c) < f ( f )
por lo que el proceso 2 es detenido y se le permite al proceso 1 continuar, pero solo
hasta el nodo d ya que f (d) = 12 > 11. El proceso 2 continua corriendo hasta llegar
a la meta t (Fig. 8.7).
f(a)=2+5=7
e a
f(e)=2+7=9 f(b)=4+4=8
b
f(c)=6+4=10
f
f(f)=7+4=11
c
f(g)=9+2=11
g d
f(t)=11+0=11
Este proceso de busqueda parte del nodo inicial (la ciudad s) y genera nuevos
nodos sucesores, expandiendose siempre en la direccion mas promisora de acuerdo
a los valores de la funcion f . Esto genera un arbol que crece hasta llegar a un nodo
meta. Este arbol sera representado en nuestro programa de busqueda primero el
mejor por terminos de dos formas:
1. l(N, F/G) representa una hoja del arbol, donde N es un nodo en el espacio de
estados, G es g(N) y F es f (N) = G + h(N).
2. t(N, F/G, Subs) representa un nodo interno del arbol, con una lista de subarboles
Subs no vacos. F es el valor f actualizado de N. El valor para f del sucesor mas
prometedor de N. La lista Subs se ordena de acuerdo al valor creciente de los
valores para f de los subarboles.
8.4 Busqueda primero el mejor 95
t(s,7/0,[l(a,7/2),l(e,9/2)]
El valor f para s es 7, esto es, el valor mas promisorio de los hijos de s (a). El
arbol crece expandiendo el nodo mas primisorio. El mas cercano competidor de a
es e con un f valor de 9. Se permite que a crezca mientras su f valor no exceda 9.
Por lo tanto los nodos b y c son generados, pero c tiene un f valor de 10, lo cual
excede el umbral de crecimiento fijado en 9. En ese momento no se permite que a
crezca mas. En ese momento el arbol es:
t(s,9/0,[l(e,9/2),t(a,10/2,[t(b,10/4,[l(c,10/6)])])])
Observen que ahora el valor f del nodo a es 10, mientras que el del nodo e es
9. Estos valores se actualizaron porque fueron generados los nodos b y c. Ahora el
nodo sucesor mas promisorio de s es s es e con un valor f de 9.
La actualizacion de los f valores es necesaria para permitir al programa reco-
nocer el subarbol mas promisorio en cada nivel del arbol de busqueda (esto es, el
subarbol que contiene la hoja mas promisoria). Esta modificacion de los estimados
de f , nos lleva a la generalizacion de la definicion de f que extiende su defincion de
nodos a arboles. Para una hoja n del arbol, mantenemos la definicion original:
f (T ) = mn f (Si )
i
1 solucion(Inicio,Sol) :-
2 expandir([],l(Inicio,0/0),9999,_,si,Sol).
1 expandir(Camino,l(Nodo,_),_,_,si,[Nodo|Camino]) :-
2 meta(Nodo).
El segundo caso corresponde a un arbol de busqueda que es una hoja, cuyo Nodo
no es una meta del espacio de estados y tiene un f -valor menor (o igual) que el
Umbral. Para ello se generan los arboles sucesores del arbol de busqueda actual
(Arboles) usando el predicado listaSucc/3. El arbol debe expandir/6 o fallar con
Solucionado = nunca.
1 expandir(Camino,l(Nodo,F/G),Umbral,Arbol1,Solucionado,Sol) :-
2 F =< Umbral,
3 (bagof(M/C, (s(Nodo,M,C), (not(member(M,P)))), Succ),
4 !,
5 listaSucc(G,Succ,Arboles),
6 mejorF(Arboles,F1),
7 expandir(Camino,t(N,F1/G,Arboles),
8 Umbral,Arbol1,Solucionado,Sol)
9 ;
10 Solucionado=nunca).
1 expandir(Camino,t(Nodo,F/G,[Arbol|Arboles]),
2 Umbral,Arbol1,Solucionado,Sol) :-
3 F =< Umbral,
4 mejorF(Arboles,MejorF),
5 min(Umbral,MejorF,Umbral1),
6 expandir([Nodo|Camino],Arbol,
7 Umbral1,Arbol1,Solucionado1,Sol),
8 continuar(Camino,t(Nodo,F/G,[Arbol1|Arboles]),
9 Umbral,Arbol1,Solucionado1,Solucionado,Sol).
El caso cuatro cubre los puntos muertos, cuando no hay solucion al problema:
1 expandir(_,t(_,_,[]),_,_,nunca,_) :- !.
1 expandir(_,Arbol,Umbral,Arbol,no,_):-
2 f(Arbol,F),F>Umbral.
1 continuar(_,_,_,_,si,si,Sol).
2
3 continuar(Camino,t(Nodo,F/G,[Arbol1|Arboles]),
4 Umbral,Arbol1,no,Solucionado,Sol) :-
5 insert(Arbol1,Arboles,NodoArboles),
6 mejorF(NodoArboles,MejorF),
7 expandir(Camino,t(Nodo,F/G,NodoArboles),
8 Umbral,Arbol1,Solucionado,Sol).
9
10 continuar(Camino,t(N,F/G,[_|Arboles]),
11 Umbral,Arbol1,nunca,Solucionado,Sol) :-
12 mejorF(Arboles,MejorF),
13 expandir(Camino,t(N,MejorF/G,Arboles),
14 Umbral,Arbol1,Solucionado,Sol).
1 listaSucc(_,[],[]).
2
10 inserta(Arbol,Arboles,[Arbol|Arboles]) :-
11 f(Arbol,F), mejorF(Arboles,F1),
12 F =< F1, !.
13
14 inserta(Arbol,[Arbol1|Arboles], [Arbol1|Arboles1]) :-
15 inserta(Arbol,Arboles,Arboles1).
16
17 f(l(_,F/_),F).
18
19 f(t(_,F/_,_),F).
20
21 mejorF([Arbol|_],F) :-
22 f(Arbol,F).
23
24 mejorF([],9999).
25
26 min(X,Y,X) :-
27 X =< Y, !.
98 8 Estrategias basicas de resolucion de problemas
28
29 min(_,Y,Y).
Captulo 9
Sistemas Expertos
9.1. Introduccion
Los sistemas expertos (SE) son aplicaciones de computo que involucran expe-
riencia no algortmica, para resolver cierto tipo de problema. Por ejemplo, los siste-
mas expertos se usan para el diagnostico al servicio de humanos y maquinas. Existen
SE que juegan ajedrez, que planean decisiones financieras, que configuran compu-
tadoras, que supervisan sistemas de tiempo real, que deciden polticas de seguros, y
llevan a cabo demas tareas que requieren de experiencia humana.
Los SE incluyen componentes del sistema en s e interfaces con individuos con
varios roles. Esto se ilustra en la figura 9.1. Los componentes mas importantes son:
Base de conocimientos. La representacion declarativa de la experiencia, muchas
veces en forma de reglas IF-THEN.
Almacen de trabajo. Los datos especficos al problema que se esta resolviendo.
Maquina de inferencia. El codigo central del SE que deriva recomendaciones con
base en la base de conocimientos y los datos especficos del problema.
Interfaz del usuario. El codigo que controla el dialogo entre el usuario y el SE.
Para entender un SE es necesario entender tambien el rol de los usuarios que
interaccionan con el sistema:
Experto del Dominio. El o los individuos que son los expertos en resolver el
problema que el SE intentara resolver.
99
100 9 Sistemas Expertos
Usuario
Experto en
el Dominio
Interface con
el Usuario
Experiencia
Mquina de Ingeniero en
Ingeniero del Inferencia Sistemas
Conocimieno
Base de Almacn de
Conocimiento Trabajo
Razonamiento guiado por las metas y encadenamiento hacia atras. Una tecnica
de inferencia que usa las reglas IF-THEN para descomponer las metas en sub-
metas mas faciles de probar.
Manejo de incertidumbre. La habilidad del SE para trabajar con reglas y datos
que no son conocidos con precision.
Razonamiento guiado por los datos y encadenamiento hacia adelante. Una tecni-
ca de inferencia que usa las reglas IF-THEN para deducir soluciones a un pro-
blema a partir de los datos iniciales disponibles.
Representacion de datos. La forma en que los datos especficos a un problema
dado, son almacenados y accesados por el SE.
Interfaz del usuario. La parte del SE que se usa para una interaccion mas amiga-
ble con el usuario.
Explicacion. La habilidad del SE para explicar sus procesos de razonamiento y
su uso en el computo de recomendaciones.
1 IF
2 familia es albatros AND
3 color es blanco
4 THEN
5 ave es albatros laysan.
6
7 IF
8 familia es albatros AND
9 color es negro
10 THEN
11 ave es albatros de pies negros.
El sistema puede usar otras reglas para resolver las sub-metas planteadas por las
reglas de alto nivel, por ejemplo:
102 9 Sistemas Expertos
1 IF
2 orden es tubonasales AND
3 tamano es grande AND
4 alas es grandes anguladas
5 THEN
6 familia es albatros.
9.2.2. Incertidumbre
1 IF
2 no_colocada tv AND
3 sofa en pared(X) AND
4 pared(Y) opuesta a pared(X)
5 THEN
6 colocar tv en pared(Y).
Esta regla toma un estado del problema con la television no situada y regresa un
estado nuevo, donde la television ya ha sido colocada. Puesto que la television ya
ha sido colocada en su lugar, esta regla no volvera a ser disparada por el SE. Otras
reglas seran usadas para colocar el resto de los muebles hasta terminar.
9.3 Usando la maquina de inferencia de Prolog 103
Como pueden haber adivinado, Prolog posee una maquina de inferencia por en-
cadenamiento haca atras. Esta maquina puede usarse parcialmente para implemen-
tar algunos SE. Las reglas de Prolog seran usadas para representar conocimiento
y su maquina de inferencia sera usada para derivar conclusiones. Otras partes del
sistema, como la interfaz con el usuario deberan escribirse usando Prolog.
Usaremos el problema de identificacion de aves norteamericanas para ilustrar la
construccion de un SE con Prolog. La experticia del SE se basa en un subconjunto de
las reglas reportadas en Birds of North America de Robbins, Bruum, Zim y Singer.
Las reglas del SE estaran disenadas para ilustrar como se pueden representar varios
tipos de conocimiento, en vez de buscar una identificacion precisa de las aves.
9.3.1. Reglas
1 IF
2 primera premisa AND
3 segunda premisa AND
4 ...
5 THEN
6 conclusion
1 conclusion :-
2 primera premisa,
3 segunda premisa,
4 ...
Esto puede ser confuso pues la regla en prolog dice mas THEN-IF que IF-THEN.
Retomemos los ejemplos anteriores, si queremos representar en Prolog la regla:
1 IF
2 familia es albatros AND
3 color es blanco
4 THEN
5 ave es albatros laysan
1 ave(albatros_laysan) :-
2 familia(albatros),
3 color(blanco).
Las siguientes reglas distinguen entre dos tipos de albatros y cisne. Todas son
clausulas del predicado ave/1:
1 ave(albatros_laysan) :-
2 familia(albatros),
3 color(blanco).
4 ave(albatros_patas_negras) :-
5 familia(albatros),
6 color(obscuro).
7 ave(cisne_silbador) :-
8 familia(cisne),
9 voz(suave_musical).
10 ave(cisne_trompetero) :-
11 famila(cisne),
12 voz(alta_trompeta).
Para que estas reglas tengan exito al distinguir un ave, necesitamos almacenar
hechos acerca del ave que deseamos identificar con el SE. Por ejemplo, si agregamos
estos hechos al programa:
1 familia(albatros).
2 color(obscuro).
1 ?- ave(X).
2 X = albatros_patas_negras
3 Yes
1 orden(nariz_tubular) :-
2 fosas(externas_tubulares),
9.3 Usando la maquina de inferencia de Prolog 105
3 habitat(mar),
4 pico(gancho).
5 orden(acuatico) :-
6 patas(membrana),
7 pico(plano).
8 familia(albatros) :-
9 orden(nariz_tubular),
10 tamano(grande),
11 alas(muy_largas).
12 familia(cisne) :-
13 orden(acuatico),
14 cuello(largo),
15 color(blanco),
16 vuelo(pesado).
1 fosas(externas_tubulares).
2 habitat(mar).
3 pico(gancho).
4 tamano(grande).
5 alas(muy_largas).
6 color(obscuro).
1 ?- ave(X).
2 X = albatros_patas_negras
3 Yes
1 ave(ganso_canadiense) :-
2 familia(ganso),
3 estacion(invierno),
4 pais(estados_unidos),
5 cabeza(negra),
6 pecho(blanco).
106 9 Sistemas Expertos
7 ave(ganso_canadiense) :-
8 familia(ganso),
9 estacion(verano),
10 pais(canada),
11 cabeza(negra),
12 pecho(blanco).
Estas metas pueden hacer referencia a otros predicados en una jerarqua diferen-
te:
1 pais(estados_unidos) :- region(oeste_medio).
2 pais(estados_unidos) :- region(sur_oeste).
3 pais(estados_unidos) :- region(nor_oeste).
4 pais(estados_unidos) :- region(atlantico_medio).
5 pais(canada) :- provincia(ontario).
6 pais(canada) :- provincia(quebec).
7
8 region(nueva_inglaterra) :-
9 estado(X),
10 member(X,[massachusetts, vermont, connecticut, maine]).
11
12 region(sur_oeste) :-
13 estado(X),
14 member(X,[florida, mississippi, alabama, nueva_orleans]).
Otras aves necesitaran de predicados multiples para ser identificada. Por ejemplo,
el Mallard (Anas platyrhynchos), o pato comun del norte, macho tiene la cabeza
verde con un anillo blanco; la hembra tiene la cabeza cafe moteada:
1 ave(mallard):-
2 familia(pato),
3 voz(graznido),
4 cabeza(verde).
5 ave(mallard) :-
6 familia(pato),
7 voz(graznido),
8 cabeza(cafe_moteada).
Basicamente, cualquier situacion del libro de las aves norte americanas puede
ser expresado facilmente en Prolog. Las reglas expresadas forman la base de cono-
cimientos del SE. El unico punto debil del programa es su interfaz con el usuario,
que requiere que los datos sean introducidos como hechos del programa.
9.4 Interfaz del usuario 107
atributo valor
familia pato
voz graznido
cabeza verde
Cuadro 9.1 Atributos valor para el mallard
Esta es una de las representaciones mas simples usadas en los SE, pero es su-
ficiente para muchas aplicaciones. Existen representaciones mas expresivas, como
los tripletes objetoatributovalor, o las redes semanticas, o los marcos.
Como estamos programando en Prolog, la riqueza del lenguaje puede usarse di-
rectamente en el SE. Por ejemplo, los pares atributovalor han sido representados
como predicados unarios de la forma atributo(valor): familia(pato), voz(graznido),
cabeza(verde). Pero en region/1 usamos la membresia en listas para su definicion.
Usaremos el predicado pregunta para determinar con ayuda del usuario, cuando
un par atributovalor es verdadero. El SE debe modificarse para determinar que
atributos son verificables por el usuario. Esto se logra con reglas para los atributos
que llaman a pregunta:
1 come(X) :- pregunta(come,X).
2 pies(X) :- pregunta(pies,X).
3 alas(X) :- pregunta(alas,X).
4 cuello(X) :- pregunta(cuello,X).
5 color(X) :- pregunta(color,X).
1 pregunta(Atrib,Val):-
2 write(Atrib:Val),
3 write(? ),
4 read(si).
108 9 Sistemas Expertos
1 ?- ave(X).
2 fosas_nasales : externas tubulares ? si.
3 habitat : mar ? si.
4 pico : ganchudo ? si.
5 tamano : grande ? si.
6 alars : largas ? si.
7 color : blanco ? si.
8 X = albatros_laysan
9 Yes.
1 pregunta(A,V) :- conocido(si,A,V), !.
2
5 pregunta(A,V) :-
6 write(A:V),
7 write? : ),
8 read(Resp),
9 asserta(conocido(Resp,A,V)),
10 Resp == si.
1 pregunta(A,V) :-
2 not(multivariado(A)),
3 conocido(si,A,V2),
4 V \== V2,
5 !,
6 fail.
Una gua sobre los valores validos para un atributo se implementa con el predi-
cado menu pregunta que trabaja de manera analoga a pregunta:
9.5 Un Shell simple 109
1 tamano(X) :-
2 menu_pregunta(tamano, X, [grande, mediano, pequeno]).
3 color(X) :-
4 menu_pregunta(color,X,[blanco,verde,cafe,negro]).
1 menu_pregunta(A,V,MenuLista) :-
2 write(Cual es el valor para ,
3 write(A), write(? ), nl,
4 write(MenuLista),nl,
5 read(Resp),
6 checar(Resp,A,V,MenuLista),
7 asserta(conocido(si,A,X)),
8 X == V.
9
10 checar(X,A,V,MenuLista) :-
11 member(X,MenuLista), !.
12
13 checar(X,A,V,MenuLista) :-
14 write(Ese valor no es valido, intente nuevamente), nl,
15 menu_pregunta(A,V,MenuLista).
1 meta(X) :- ave(X).
1 solucion :-
2 abolish(conocido,3),
110 9 Sistemas Expertos
3 define(conocido,3),
4 meta(X),
5 write(La respuesta es: ), write(X), nl.
6
7 solucion :-
8 write(No se encontro una respuesta.), nl.
El predicado Prolog abolish/2 se usa para eliminar los hechos definidos previa-
mente con conocido/3, cada vez que una consulta se va a ejecutar. Esto permite al
usuario ejecutar solucion multiples veces en una sola sesion. El predicado de f ine/2
permite indicarle a Prolog que conocido estara definido en el SE, de forma que no
cause error la primera utilizacion de este predicado. Este predicado puede variar
dependiendo de la version de Prolog utilizada.
De esta manera tenemos que el SE ha sido dividido en dos partes. Los predicados
en el shell son:
solucion,
pregunta,
menu pregunta,
los predicados auxiliares de estos.
Los predicados en la base de conocimientos son:
meta,
las reglas sobre el conocimiento del SE,
las reglas sobre los atributos provistos por el usuario,
las declaraciones de los atributos multi-variados.
Para usar este shell en Prolog, tanto el shell como la base de conocimientos deben
ser cargados:
1 ?- consult(shell).
2 yes
3 ?- consult(aves.kb).
4 yes
5 ?- solucion.
6 fosas_nasales : externas_tubulares ? ...
9.5.1. REPL
1 se :-
2 bienvenida,
9.6 Encadenamiento haca atras con incertidumbre 111
3 repeat,
4 write(> ),
5 read(X),
6 do(X),
7 X == quit.
8
9 bienvenida :-
10 write(Este es el shell de su SE.), nl,
11 write(Escriba: cargar, consultar, o salir en el promt.), nl
12
13 do(cargar) :-
14 cargar_bd, !.
15
16 do(consultar) :-
17 solucion, !.
18
19 do(salir).
20
21 do(X) :-
22 write(X),
23 write( no es un comando valido.), nl,
24 fail.
25
26 cargar_bd :-
27 write(Nombre del archivo: ),
28 read(F),
29 reconsult(F).
se
pregunta
menu_pregunta
Mquina de inferencia
solucion
cargar
meta conocido
reglas
mulivaluado
preguntado
1 GOAL problema.
2
3 RULE 1
4 IF not arranca AND
5 bateria_mala
6 THEN problema is bateria.
7
8 RULE 2
9 IF luces_debiles
10 THEN bateria_mala cf 50.
11
12 RULE 3
13 IF radio_debil
9.6 Encadenamiento haca atras con incertidumbre 113
26 RULE 6
27 IF arranca AND
28 indicador_gasolina is bajo
29 THEN problema is tanque_vacio cf 30.
30
31 ASK arranca
32 MENU (si no)
33 PROMPT Su motor arranca? .
34
35 ASK luces_debiles
36 MENU (si no)
37 PROMPT Sus luces estan debiles? .
38
39 ASK radio_debile
40 MENU (si no)
41 PROMPT Su radio esta debil? .
42
43 ASK olor_gasolina
44 MENU (si no)
45 PROMPT Huele a gasolina?.
46
47 ASK indicador_gasolina
48 MENU (vacio, medio, lleno)
49 PROMPT Que indica al aguja de gasolina? .
9 problema-tanque-vacio-cf-90
10 problema-fuga-cf-80
11 problema resuelto
1 : consultar
2 ...
3 Huele a gasolina?
4 si cf 50
5 ...
1 arranca cf 100.
2 olor_gas cf 100.
1 arranca cf 80.
2 olor_gas cf 50.
Por ejemplo, si disparamos la regla 2 (luces debiles) con su premisa sin incerti-
dumbre, tendramos que agregar al almacen de trabajo bateria mala cf 50.
Luego si disparamos la regla 3 (radio debil), el factor de certidumbre de este hecho
debe modificarse a bateria mala cf 75. Lo cual resulta intuitivo (hay mas
evidencia de que la batera tiene problemas). Lo que tambien resulta intuitivo es que
necesitamos programar nuestra propia maquina de inferencia.
regla(Nombre, Premisas,Conclusion).
El Nombre opera solo como un identificador de la regla. El lado izquierdo de
la misma Premisas implica al lado derecho Conclusion (conclusion). Como usare-
mos encadenamiento haca atras, cada regla sera usada para validar una pieza de
informacion, de manera el RHS contiene una meta con su factor de certidumbre
asociado:
116 9 Sistemas Expertos
conclusion(Meta,CF).
mientras que las premisas toman la forma de una lista de metas:
premisas(ListaMetas).
Las metas seran representadas, para comenzar, como pares atributovalor:
av(Atributo,Valor).
cuando Atributo y Valor son atomos, la estructura general de las reglas se ve
como:
1 regla(Nombre,
2 premisas( [av(A1,V1), av(A2,V2), ... ] ),
3 conclusion(av(Attr,Val), CF)).
1 regla(5,
2 premisas([av(arranca,si), av(indicador_gasolina,vacio)]),
3 conclusion(av(problema,fuga), 80)).
Estas reglas no son faciles de leer, pero tienen una estructura adecuada para ser
procesadas por Prolog. Otras herramientas de Prolog como las gramaticas de clausu-
la definitivas (DCG) o la definicion de operadores, puede ayudarnos a simplificar
esta representacion.
Dado el formato de las reglas del SE deseamos que la inferencia tome en cuenta
los siguientes aspectos:
1 hecho(av(A,V),CF).
9.6 Encadenamiento haca atras con incertidumbre 117
1 ?- meta(av(problema,X),CF).
Veamos ahora los tres casos para meta/2. El primero de ellos ocurre cuando la
informacion ya esta en la memoria de trabajo:
1 meta(av(Atr,Val),CF) :-
2 hecho( av(Atr,Val), CF),
3 !.
1 meta(av(Atr,Val), CF) :-
2 \+ hecho( av(Atr,_),_),
3 pregunta(Atr,Msg),
4 preguntar(Atr,Msg),
5 !,
6 meta(av(Atr,Val), CF).
1 preguntar(Atr,Msg) :-
2 write(Msg),
3 read(Val),
4 read(CF),
5 asserta(fact(av(Atr,Val),CF)).
118 9 Sistemas Expertos
El tercer caso para meta/2 es cuando el valor del atributo es desconocido, pero
se puede deducir usando las reglas definidas en el sistema, en ese caso la llamada
es:
1 meta(Meta,CFactual) :-
2 buscaReglas(Meta,CFactual).
Esta llamada hace uso de la maquina de inferencia que disenaremos para nuestro
SE con incertidumbre. El factor de certidumbre se etiqueta como actual, porque es
posible que cambie de valor al ir aplicando las reglas definidas en el sistema.
El predicado buscaReglas/2 se encarga de encontrar aquellas reglas cuya con-
clusion unifica con la Meta en cuestion y de actualizar el factor de certidumbre con
base en las premisas de estas reglas. Si la Meta es un hecho conocido, no hay nada
que hacer, solo regresar true:
1 buscaReglas(Meta,CFactual) :-
2 regla(N, premisas(ListaPremisas),
3 conclusion(Meta,CF)),
4 probar(ListaPremisas,Contador),
5 ajustar(CF,Contador,NuevoCF),
6 actualizar(Meta,NuevoCF,CFactual),
7 CFactual == 100,
8 !.
9
10 buscaReglas(Meta,CF) :-
11 hecho(Meta,CF).
Dada una lista de premisas pertenecientes a una regla encontrada para satisfacer
la Meta del SE, es necesario que buscaReglas/2 las pruebe. Para ello definimos
probar/2:
1 probar(ListaPremisas, Contador) :-
2 probAux(ListaPremisas, 100, Contador).
3
4 probAux([],Contador,Contador).
5 probAux([Premisa1|RestoPremisas],ContadorActual,Contador) :-
6 meta(Premisa1,CF,Cont),
7 Cont >= 20,
8 probAux(RestoPremisas,Cont,Contador).
9 int_redondear(X,I) :-
10 X < 0,
11 I is integer(X - 0.5).
1 actualizar(Meta,NuevoCF,CF) :-
2 hecho(Meta,ViejoCF),
3 combinar(NuevoCF,ViejoCF,CF),
4 retract(hecho(Meta,ViejoCF)),
5 asserta(hecho(Meta,CF)),
6 !.
7
8 actualizar(Meta,CF,CF) :-
9 asserta(hecho(Meta,CF)).
10
17
18 combinar(CF1,CF2,CF) :-
19 CF1 < 0,
20 CF2 < 0,
21 X is -( -CF1-CF2*(100+CF1)/100),
22 int_redondear(X,CF).
23
24 combinar(CF1,CF2,CF) :-
25 (CF1 < 0 ; CF2 < 0),
26 (CF1 > 0 ; CF2 > 0),
27 abs_minimum(CF1,CF2,MCF),
28 X is 100 * (CF1 + CF2) / (100 - MCF),
29 int_redondear(X,CF).
1 se :-
2 repeat,
3 write(consultar, cargar, salir), nl,
4 write(: ),
5 read_line(X),
6 ejec(X),
120 9 Sistemas Expertos
7 X == salir.
8
9 ejec(consultar) :-
10 metas_principales,
11 !.
12
13 ejec(cargar) :-
14 cargar_reglas,
15 !.
16
17 ejec(salir).
18
19 %% % Auxiliares
20
21 metas_principales :-
22 meta_principal(Atr),
23 principal(Atr),
24 imprime_meta(Atr),
25 fail.
26 metas_principales.
27
28 principal(Atr) :-
29 meta(av(Atr,Val,CF)),
30 !.
31 principal(_) :- true.
32
33 imprime_meta(Atr) :-
34 nl,
35 hecho(av(Atr,Val), CF),
36 CF >= 20,
37 salidap(av(Atr,Val),CF), nl
38 fail.
39 imprime_meta(Atr) :-
40 write (Meta: ), write(Attr), write( solucionada.),
41 nl, nl.
42
43 salidap(av(Atr,Val),CF) :-
44 output(Atr,Val,ListaImprimir),
45 write(Atr-cf-CF),
46 imprimeLista(ListaImprimir), !.
47 salidap(av(Atr,Val),CF) :-
48 write(Atr-Val-cf-CF).
49
50 imprimeLista([]).
51 imprimeLista([X|Xs]) :-
52 write(X),
53 imprimeLista(Xs).
Captulo 10
Arboles de Decision
La figura 10.1 muestra un arbol de decision tpico. Cada nodo del arbol esta con-
formado por un atributo y puede verse como la pregunta: Que valor tiene este
atributo en el caso a clasificar? Las ramas que salen de los nodos, corresponden a
los posibles valores del atributo correspondiente.
Un arbol de decision clasifica a un caso, filtrandolo de manera descendente, has-
ta encontrar una hoja, que corresponde a la clasificacion buscada. Consideren el
proceso de clasificacion del siguiente caso, que describe un da en partcular:
h cielo = soleado,temperatura = caliente, humedad = alta, viento = f uerte i
121
122 10 Arboles de Decision
Atributo
Cielo Clase
Valor
nublado
soleado lluvioso
Hmedad si Viento
no si no si
Figura 10.1 Un ejemplo de arbol de decision para el concepto buen da para jugar tenis. Los
nodos representan un atributo a ser verificado por el clasificador. Las ramas son los posibles
valores para el atributo en cuestion. Los textos en crculos, representan las clases consideradas,
i.e., los valores posibles del atributo objetivo.
Como el atributo Cielo, tiene el valor soleado en el caso, este es filtrado haca
abajo del arbol por la rama de la izquierda. Como el atributo Humedad, tiene el
valor alta, el ejemplo es filtrado nuevamente por rama de la izquierda, lo cual nos
lleva a la hoja que indica la clasificacion del caso: Buen da para jugar tenis = no.
El Algoritmo 2, define computacionalmente esta idea.
de la raz del arbol a una hoja, representa una conjuncion de tales restricciones y el
arbol mismo representa la disyuncion de esas conjunciones. Por ejemplo, el arbol
de la figura 10.1, puede expresarse como sigue:
?- partition(temperatura, Ejemplos).
Ejemplos= [[temperatura [frio 5 6 7 9]
[caliente 1 2 3 13]
[templado 4 8 10 11 12 14]]
10.3 El algoritmo basico de aprendizaje de arboles de decision 125
Si todos los ejemplos son positivos o negativos, por ejemplo, pertencen todos a
la misma clase, la entropia sera 0. Una posible interpretacion de esto, es considerar
la entropia como una medida de ruido o desorden en los ejemplos. Definimos la ga-
nancia de informacion (GI) como la reduccion de la entropa causada por particionar
un conjunto de entrenamiento S, con respecto a un atributo A:
|Sv |
Ganancia(S, A) = E(S) E(Sv )
vA |S|
Esto indica que el atributo con mayor ganancia de informacion fue cielo, de
ah que esta parte del algoritmo genera la particion de los ejemplos de entrena-
miento con respecto a este atributo. Si particionamos recursivamente los ejemplos
que tienen el atributo cielo = soleado, obtendramos:
Como los otros metodos de aprendizaje, ID3 puede concebirse como un proceso
de busqueda en un espacio de hipotesis, para encontrar aquella hipotesis que se
ajusta mejor a los datos de entrenamiento. El espacio de hipotesis explorado por
ID3 es el espacio de todos los arboles de decision posibles. El algoritmo lleva a
128 10 Arboles de Decision
cabo una busqueda de lo simple a lo complejo, comenzando por el arbol vaco, para
considerar cada vez hipotesis mas complejas. La medida ganancia de informacion
gua esta busqueda de ascenso de colina (hill-climbing), como ejemplificamos en la
seccion anterior.
Considerando ID3 en terminos de su espacio y estrategias de busqueda, es posible
analizar sus capacidades y limitaciones:
El espacio de hipotesis de ID3 es completo con respecto a las funciones de valores
discretos que pueden definirse a partir de los atributos considerados. De manera
que no existe el riesgo que la funcion objetivo no se encuentre en el espacio de
hipotesis.
ID3 mantiene solo una hipotesis mientras explora el espacio de hipotesis posi-
bles. Esto contrasta, por ejemplo, con el algoritmo eliminacion de candidatos,
que mantiene el conjunto de todas las hipotesis consistentes con el conjunto de
entrenamiento. Es por ello que ID3 es incapaz de determinar cuantos arboles de
decision diferentes son consistentes con los datos.
El algoritmo basico ID3 no ejecuta vuelta atras (backtracking) en su busqueda.
Una vez que el algoritmo selecciona un atributo, nunca reconsiderara esta elec-
cion. Por lo tanto, es suceptible a los mismos riesgos que los algoritmos estilo
ascenso de colina, por ejemplo, caer maximos o mnimos locales. Como vere-
mos, la vuelta atras puede implementarse con alguna tecnica de poda.
ID3 utiliza todos los ejemplos de entrenamiento en cada paso de su busqueda
guiada por el estadstico ganancia de informacion. Esto contrasta con los meto-
dos que usan los ejemplos incrementalmente, por ejemplo encuentra-S o elimi-
nacion de candidatos. Una ventaja de usar propiedades estadsticas de todos los
ejemplos es que la busqueda es menos sensible al ruido en los datos.
Existe una diferencia interesante entre los sesgos que exhiben ID3 y el algo-
ritmo eliminacion de candidatos, discutido en la sesion anterior. El sesgo de ID3
es producto de su estrategia de busqueda, mientras que el sesgo de eliminacion de
candidatos es resultado de la definicion del espacio de busqueda. Por lo tanto, el
sesgo de ID3 es exhibe una preferencia por ciertas hipotesis, sobre otras, por ejem-
plo, hipotesis compactas. Este tipo de sesgo, que no impone restricciones sobre
las hipotesis que seran eventualmente consideradas, recibe el nombre de sesgo por
preferencia. Por otra parte, el sesgo de eliminacion de candidatos que restringe el
conjunto de hipotesis a considerar, recibe el nombre de sesgo por restriccion o sesgo
del lenguaje.
En general, es preferible trabajar con un sesgo por preferencia, puesto que este
permite al sistema de aprendizaje explorar un espacio de hipotesis completo, ase-
gurando que la representacion del concepto objetivo se encuentra ah. Consideren
que es posible trabajar con ambos sesgos a la ves, por ejemplo, el sistema aprendiz
de damas chinas de la sesion de introduccion, introduce un sesgo por restricciones
cuando se decide que la hipotesis tiene la forma de una combinacion lineal de los
atributos del tablero, y un sesgo por preferencia cuando se introduce la busqueda
ordenada por mnimos cuadrados (LMS) en el espacio de posibles parametros wi .
1 El enunciado exacto de la navaja de Occam es: Non sunt multiplicanda entia prater necessitatem
(las entidades no deben multiplicarse mas alla de lo necesario).
130 10 Arboles de Decision
arbol en profundidad; para procesar atributos con valores contnuos; para procesar
ejemplos de entrenamiento con valores faltantes; para introducir costos diferentes
asociados a los atributos; as como para determinar una buena metrica de seleccion
de los atributos y mejorar la eficiencia computacional del algoritmo. Cabe mencio-
nar que, muchos de estos aspectos han sido incorporados en el sistema C4.5 [14].
El algoritmo basico de ID3 crece cada rama del arbol en profundidad hasta que
logra clasificar perfectamente los ejemplos de entrenamiento. Esta estrategia es ra-
zonable, pero puede introducir dificultades si los datos de entrenamiento presentan
ruido, o cuando el conjunto de entrenamiento es demasiado pequeno, como para
ofrecer un muestreo significativo del concepto objetivo. En estos casos, ID3 pue-
de producir arboles que se sobreajustan a los datos de entrenamiento. Formalmente
definimos el sobreajuste como:
Definition 10.1. Dado un espacio de hipotesis H, se dice que una hipotsis h H
esta sobreajustada a los ejemplos de entrenamiento, si existe una hipotesis alterna-
tiva h0 H, tal que h0 tiene un error de clasificacion mas pequeno que h sobre la
distribucion completa de los casos del problema.
Es comun observar que a medida que el tamano del arbol crece, en termino del
numero de nodos usado2 , su precision sobre el conjunto de entrenamiento mejora
monotonicamente, pero, sobre el conjunto de prueba primero crece y luego decae.
Como es esto posible que un arbol h que tiene mayor precision que h0 sobre el
conjunto de entrenamiento, luego tenga un desempeno menor sobre el conjunto de
prueba? Una situacion en la que esto ocurre es cuando el conjunto de entremien-
to contiene ruido, por ejemplo, elementos mal clasificados. Consideren agregar el
siguiente caso mal clasificado (clasificado como jugar-tenis? = no) al conjunto de
entrenamiento del cuadro 10.1:
1. Inducir el arbol de decision permitiendo sobre ajuste, por ejemplo, con nuestro
algoritmo basico ID3.
2. Convertir el arbol aprendido en un conjunto de reglas equivalente, esto es, una
conjuncion por cada rama del arbol que va de la raz a una hoja.
3. Podar (generalizar) cada regla, eliminando las precondiciones que resulten en
una mejora de la precision estimada.
4. Ordenar las reglas por su precision estimada, y aplicarlas en ese orden al clasificar
nuevos casos.
Cabe mencionar que el metodo aplicado por C4.5 no es estadsticamente valido,
aunque ha demostrado ser una heurstica util. En la sesion de evaluacion de hipote-
sis, estudiamos tecnicas estadsticamente robustas para estimar medias e intervalos
de confianza. Lo relevante aqu es que la conversion del arbol en reglas ayuda a dis-
tinguir los diferentes contextos en los que un atributo participa en la clasificacion, es
decir, reglas diferentes; elimina la diferencia entre nodos ubicados cerca de la raz y
aquellos ubicados cerca de las hojas; y aumenta la facilidad de comprehension por
parte del usuario.
Que valor booleano basado en un umbral debemos definir para el atributo tem-
peratura? Obviamente, necesitamos un umbral c, tal que este produzca la mayor
10.6 Consideraciones sobre el aprendizaje inductivo de arboles de decision 133
gain(S, A)
gainRatio(S, A) =
splitIn f ormatio(S, A)
Un problema practico con este enfoque es que el denominador de esta medida
puede ser 0 o muy pequeno, si |Si| |S|, lo cual hace que la medida sea indefinida
para atributos que tienen casi el mismo valor para todos los ejemplos.
134 10 Arboles de Decision
1 ejemplo(1,no,[dia=soleado,temperatura=calor,humedad=alta,viento=debil]).
2 ejemplo(2,no,[dia=soleado,temperatura=calor,humedad=alta,viento=fuerte]).
3 ejemplo(3,si,[dia=nublado,temperatura=calor,humedad=alta,viento=debil]).
4 ejemplo(4,si,[dia=lluvia,temperatura=templado,humedad=alta,viento=debil]).
5 ejemplo(5,si,[dia=lluvia,temperatura=frio,humedad=normal,viento=debil]).
6 ejemplo(6,no,[dia=lluvia,temperatura=frio,humedad=normal,viento=fuerte]).
7 ejemplo(7,si,[dia=nublado,temperatura=frio,humedad=normal,viento=fuerte]).
8 ejemplo(8,no,[dia=soleado,temperatura=templado,humedad=alta,viento=fuerte]).
9 ejemplo(9,si,[dia=soleado,temperatura=frio,humedad=normal,viento=debil]).
10 ejemplo(10,si,[dia=lluvia,temperatura=templado,humedad=normal,viento=debil]).
11 ejemplo(11,si,[dia=soleado,temperatura=nublado,humedad=normal,viento=fuerte]).
12 ejemplo(12,si,[dia=nublado,temperatura=templado,humedad=alta,viento=fuerte]).
13 ejemplo(13,si,[dia=nublado,temperatura=calor,humeda=normal,viento=debil]).
14 ejemplo(14,no,[dia=lluvia,temperatura=templado,humedad=alta,viento=fuerte]).
1 nodo(13,(dia=lluvia),raiz).
indica que al ejemplo 13 se llega desde el nodo raiz si el atributo dia tiene como
valor lluvia.
La llamada principal al algoritmo es id3/1 cuyo argumento es el mnimo numero
de casos que debe cubrir una hoja del arbol:
3 id3(Umbral) :-
4 retractall(nodo(_,_,_)),
5 findall(N,ejemplo(N,_,_),E),
6 ejemplo(_,_,L), !,
7 atributos(L,A),
8 idt(E,raiz,A,Umbral), !.
En la construccion del arbol hay varios casos que cubrir. Comencemos por los
casos terminales. Hay dos casos terminales a considerar, el primero es cuando el
numero de ejemplos disponibles es menor que el Umbral en ese caso se guarda
un nodo ho ja con la distribucion de la clase para los ejemplos como contenido. El
otro caso terminal es cuando todos los ejemplos pertenecen a la misma clase. En
ese caso la distribucion de la clase para los ejemplos tomara la forma [C] donde
C = Clase/NumE js. Estos dos casos corresponde a:
1 idt(E,Padre,_,Umbral) :-
2 length(E,Lon),
3 Lon=<Umbral,
4 distr(E, Distr),
5 assertz(nodo(hoja,Distr,Padre)), !.
6
7 idt(E,Padre,_,_) :-
8 distr(E, [C]),
9 assertz(nodo(hoja,[C],Padre)).
1 idt(Es,Padre,As,Umbral) :-
2 elige_atributo(Es,As,A,Valores,Resto), !,
3 particion(Valores,A,Es,Padre,Resto,Umbral).
1 idt(E,Padre,_,_) :- !,
2 nodo(Padre,Test,_),
3 write(Datos inconsistentes: no es posible construir
4 particion de ),
5 write(E), write( en el nodo ), writeln(Test).
10.7.1. Atributos
1 atributos([],[]) :- !.
2 atributos([A=_|T],[A|W]) :-
3 atributos(T,W).
De forma que, para el caso de jugar tenis, los atributos se pueden obtener con la
siguiente llamada:
136 10 Arboles de Decision
1 ?- ejemplo(_,_,L), !, atributos(L,A).
2 L = [dia=soleado, temperatura=calor, humedad=alta, viento=debil],
3 A = [dia, temperatura, humedad, viento].
Cual es la distribucion inicial de la clase para los ejemplos de jugar tenis? Esto
lo podemos consultar con:
1 ?- findall(E,ejemplo(E,_,_),Ejs), distr(Ejs,Dist).
2 Ejs = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
3 Dist = [no/5, si/9].
lo que indica que tenemos 5 ejemplos de la clase no y 9 de la clase si. Los ejemplos
1,2,6 y 8 son todos miembros de la clase no, por lo que:
1 ?- distr([1,2,6,8],Dist).
2 Dist = [no/4].
1 distr(S,Dist) :-
2 setof(C,XL(member(X,S),ejemplo(X,C,L)),Cs),
3 cuentac(Cs,S,Dist).
4
5 cuentac([],_,[]) :- !.
6
7 cuentac([C|L],E,[C/N|T]) :-
8 findall(X,(member(X,E),ejemplo(X,C,_)),W),
9 length(W,N), !,
10 cuentac(L,E,T).
1 elige_atributo(Es,As,A,Valores,Resto) :-
2 length(Es,LonEs),
10.7 Implementacion el Prolog 137
3 contenido_informacion(Es,LonEs,I), !,
4 findall((A-Valores)/Gain,
5 (member(A,As),
6 valores(Es,A,[],Valores),
7 separa_en_subconjs(Valores,Es,A,Ess),
8 informacion_residual(Ess,LonEs,R),
9 Gain is I - R),
10 All),
11 maximo(All,(A-Valores)/_),
12 eliminar(A,As,Resto), !.
13
14 separa_en_subconjs([],_,_,[]) :- !.
15 separa_en_subconjs([V|Vs],Es,A,[Ei|Resto]) :-
16 subconj(Es,A=V,Ei), !,
17 separa_en_subconjs(Vs,Es,A,Resto).
18
19 informacion_residual([],_,0) :- !.
20 informacion_residual([Ei|Es],Lon,Res) :-
21 length(Ei,LonEi),
22 contenido_informacion(Ei,LonEi,I), !,
23 informacion_residual(Es,Lon,R),
24 Res is R + I*LonEi/Lon.
25
26 contenido_informacion(Es,Lon,I) :-
27 setof(C,EL(member(E,Es),ejemplo(E,C,L)),Classes), !,
28 suma_terms(Classes,Es,Lon,I).
29
30 suma_terms([],_,_,0) :- !.
31 suma_terms([C|Cs],Es,Lon,Info) :-
32 findall(E,(member(E,Es),ejemplo(E,C,_)),InC),
33 length(InC,N),
34 suma_terms(Cs,Es,Lon,I),
35 Info is I - (N/Lon)*(log(N/Lon)/log(2)).
36
37 valores([],_,Valores,Valores) :- !.
38 valores([E|Es],A,Vs,Valores) :-
39 ejemplo(E,_,L),
40 member(A=V,L), !,
41 (member(V,Vs), !, valores(Es,A,Vs,Valores);
42 valores(Es,A,[V|Vs],Valores)
43 ).
44
45 subconj([],_,[]) :- !.
46 subconj([E|Es],A,[E|W]) :-
47 ejemplo(E,_,L),
48 member(A,L), !,
49 subconj(Es,A,W).
50 subconj([_|Es],A,W) :- subconj(Es,A,W).
Por ejemplo, la siguiente meta computa el mejor atributo (dia), dados los ejem-
plos E y atributos conocidos:
138 10 Arboles de Decision
?- findall(N,ejemplo(N,_,_),E), elige_atributo(E,[dia,temperatura,humedad,
viento],A,V,R).
E = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
A = dia,
V = [lluvia, nublado, soleado],
R = [temperatura, humedad, viento].
?- findall(N,ejemplo(N,_,_),E),
findall((A-Valores)/Gain,
(member(A,[dia,temperatura,humedad,viento]),
valores(E,A,[],Valores),
separa_en_subconjs(Valores,E,A,Ess),
informacion_residual(Ess,14,R),
Gain is 0.940286 - R),
All).
E = [1, 2, 3, 4, 5, 6, 7, 8, 9|...],
All = [ (dia-[lluvia, nublado, soleado])/0.24675,
(temperatura-[nublado, frio, templado, calor])/0.0760099,
(viento-[fuerte, debil])/0.151836 ].
1 particion([],_,_,_,_,_) :- !.
2 particion([V|Vs],A,Es,Padre,Resto,Umbral) :-
3 subconj(Es,A=V,Ei), !,
4 genera_nodo_id(Nodo),
5 assertz(nodo(Nodo,A=V,Padre)),
6 idt(Ei,Nodo,Resto,Umbral), !,
7 particion(Vs,A,Es,Padre,Resto,Umbral).
10.7.4. El arbol
?- nodo(I,AV,P).
I = 1,
AV = (dia=lluvia),
P = raiz ;
I = 2,
AV = (viento=fuerte),
P = 1 ;
I = hoja,
AV = [no/2],
P = 2 ;
I = 3,
AV = (viento=debil),
P = 1 ;
I = hoja,
AV = [si/3],
P = 3 ;
I = 4,
AV = (dia=nublado),
P = raiz ;
I = hoja,
AV = [si/4],
P = 4 ;
I = 5,
AV = (dia=soleado),
P = raiz ;
I = 6,
AV = (humedad=normal),
P = 5 ;
I = hoja,
AV = [si/2],
P = 6 ;
I = 7,
AV = (humedad=alta),
P = 5 ;
I = hoja,
AV = [no/3],
P = 7.
1 imprime_arbol :-
2 imprime_arbol(raiz,0).
3
4 imprime_arbol(Padre,_) :-
5 nodo(hoja,Class,Padre), !,
6 write( => ),write(Class).
7 imprime_arbol(Padre,Pos) :-
8 findall(Son,nodo(Son,_,Padre),L),
9 Pos1 is Pos+2,
10 imprime_lista(L,Pos1).
11
12 imprime_lista([],_) :- !.
13
14 imprime_lista([N|T],Pos) :-
140 10 Arboles de Decision
15 node(N,Test,_),
16 nl, tab(Pos), write(Test),
17 imprime_arbol(N,Pos),
18 imprime_lista(T,Pos).
As la sesion para construir el arbol de decision para jugar tenis es (con id3.pl
ya cargado en Prolog):
?- [test3].
% test3 compiled 0.00 sec, 3,896 bytes
true.
?- id3.
true.
?- imprime_arbol.
dia=lluvia
viento=fuerte => [no/2]
viento=debil => [si/3]
dia=nublado => [si/4]
dia=soleado
humedad=normal => [si/2]
humedad=alta => [no/3]
true.
1 genera_nodo_id(M) :-
2 retract(id(N)),
3 M is N+1,
4 assert(id(M)), !.
5
6 genera_nodo_id(1) :-
7 assert(id(1)).
8
9 eliminar(X,[X|T],T) :- !.
10
11 eliminar(X,[Y|T],[Y|Z]) :-
12 eliminar(X,T,Z).
13
14 subconjunto([],_) :- !.
15
16 subconjunto([X|T],L) :-
10.7 Implementacion el Prolog 141
17 member(X,L), !,
18 subconjunto(T,L).
19
20 maximo([X],X) :- !.
21 maximo([X/M|T],Y/N) :-
22 maximo(T,Z/K),
23 (M>K,Y/N=X/M ; Y/N=Z/K), !.
Captulo 11
Planeacion
11.1. Acciones
1 cond(Acc,Cond).
Los efectos de una accion pueden definirse de manera similar, por dos procedi-
mientos:
1 add(Acc,ListaAdd).
2 del(Acc,ListaDel).
donde ListaAdd y ListaDel corresponden a las listas definidas para agregar y borrar.
Asumamos que vamos a realizar la planeacion en el dominio del mundo de los
bloques. As que la unica accion posible sera:
143
144 11 Planeacion
1 mover(Bloque,De,A).
1 objeto( X) :-
2 lugar( X)
3 ;
4 bloque( X).
5
6 bloque( a).
7 bloque( b).
8 bloque( c).
9
10 lugar( 1).
11 lugar( 2).
12 lugar( 3).
13 lugar( 4).
14
15 estado1( [ despejado(2), despejado(4), despejado(b),
16 despejado(c), en(a,1), en(b,3), en(c,a) ] ).
17
18 metas1([en(a, b)]).
11.2 Analisis medios-fines 145
en el estado inicial tenemos que despe jado(b) y que en(a, De) para De/1; pero
no que despe jado(a), as que el planeador se concentra en esta formula como su
nueva meta.
3. Volvemos a buscar en la relacion add para encontrar una accion que satisfaga
despe jado(a). Tal accion tiene la forma mover(Bloque, a, A). La condicion para
ejecutar esta accion es:
la cual se satisface en nuestro estado inicial para Boque/c y A/2. De forma que
mover(c, a, 2) puede ejecutarse en el estado inicial, modificando el estado del
problema de la siguiente manera:
Eliminar del estado inicial las relaciones que la accion borra.
Incluir las relaciones que la accion agrega al estado inicial del problema.
esto produce la lista:
4. Ahora podemos ejecutar la accion mover(a, 1, b), con lo que la meta plantada se
satisface. El plan encontrado es:
146 11 Planeacion
1 [ mover(c,a,2), mover(a,1,b) ]
13 satisfecho( _, []).
14
15 satisfecho( Estado, [Meta | Metas]) :-
16 member( Meta, Estado),
17 satisfecho( Estado, Metas).
18
1 ?- estado1(E), plan(E,[en(a,b),en(b,c)],Plan,_).
2 E = [despejado(2), despejado(4), despejado(b),
3 despejado(c), en(a, 1), en(b, 3), en(c, a)],
4 Plan = [mover(b, 3, c),
5 mover(b, c, 3),
148 11 Planeacion
6 mover(c, a, 2),
7 mover(a, 1, b),
8 mover(a, b, 1),
9 mover(b, 3, c),
10 mover(a, 1, b)]
1 plan_metas_protegidas(EstadoInicial,Metas,Plan,EstadoFinal):-
2 plan_mp(EstadoInicial,Metas,[],Plan,EstadoFinal).
3
4 plan_mp(Estado,Metas,_,[],Estado) :-
5 satisfecho(Estado,Metas).
6
7 plan_mp(Estado,Metas,Protegido,Plan,EstadoFinal) :-
8 append( PrePlan, [Accion | PostPlan], Plan),
9 seleccionar( Estado, Metas, Meta),
10 lograr( Accion, Meta),
11.4 Aspectos procedimentales de la busqueda en amplitud 149
19 preservar(Accion,Metas) :-
20 borrar(Accion,ListaBorrar),
21 not( (member(Meta,ListaBorrar),
22 member(Meta,Metas))).
1 ?- estado1(E), plan_metas_protegidas(E,[despejado(2),
2 despejado(3)], P, _).
3 E = [despejado(2), despejado(4), despejado(b),
4 despejado(c), en(a, 1), en(b, 3), en(c, a)],
5 P = [mover(b, 3, 2), mover(b, 2, 4)]
obtenemos una solucion, aunque sigue sin ser la mejor. Un solo movimiento mover(b, 2, 4)
era necesario para cumplir con las metas planeadas.
Los planes innecesariamente largos son resultado de la estrategia de busqueda
usada por nuestro planeador.
es central en este aspecto. La variable Plan no esta instanciada cuando esta meta es
alcanzada. El predicado append/3 genera al reconsiderar, candidatos alternativos
para PrePlan en el siguiente orden:
1 PrePlan = [];
2 PrePlan = [_];
3 PrePlan = [_,_];
4 PrePlan = [_,_,_];
5 ...
150 11 Planeacion
Candidatos cortos para PrePlan son los primeros. PrePlan establece una con-
dicion para Accion. Esto permite encontrar una accion cuya condicion puede sa-
tisfacerse por un plan tan corto como sea posible (simulando busqueda primero en
amplitud). Por otra parte, la lista candidato para PostPlan esta totalmente no ins-
tanciada, y por tanto su longitud es ilimitada. Por tanto, la estrategia de busqueda
resultante es globalmente primero en profundidad, y localmente primero en ampli-
tud. Con respecto al encadenamiento haca adelante de las acciones que se agregan
al plan emergente, se trata de una busqueda primero en profundidad. Cada accion es
validada por un PrePlan, este plan es por otra parte, buscado primero en amplitud.
Una forma de minimizar la longitud de los planes es forzar al planeador, en su
parte de busqueda en amplitud, de forma que los planes cortos sean considerados
antes que los largos. Podemos imponer esta estrategia embebiendo nuestro plani-
ficador en un procedimiento que genere planes candidatos ordenados por tamano
creciente. Por ejemplo:
5
6 candidato([]).
7
8 candidato([Primero|Resto]) :-
9 candidato(Resto).
1 plan_metas_protegidas_amplitud(EstadoInicial,Metas,Plan,
2 EstadoFinal):-
3 plan_mp_amplitud(EstadoInicial,Metas,[],Plan,
4 EstadoFinal).
5
6 plan_mp_amplitud(Estado,Metas,_,[],Estado) :-
7 satisfecho(Estado,Metas).
8
9 plan_mp_amplitud(Estado,Metas,Protegido,Plan,EstadoFinal) :-
10 append(Plan,_,_),
11 append( PrePlan, [Accion | PostPlan], Plan),
12 seleccionar( Estado, Metas, Meta),
13 lograr( Accion, Meta),
14 precond( Accion, Condicion),
15 preservar(Accion,Protegido),
16 plan_mp_amplitud( Estado, Condicion, Protegido, PrePlan,
17 EstadoInter1),
18 aplicar( EstadoInter1, Accion, EstadoInter2),
19 plan_mp_amplitud( EstadoInter2, Metas, [Meta|Protegido],
20 PostPlan, EstadoFinal).
11.4 Aspectos procedimentales de la busqueda en amplitud 151
Y por tanto podemos volver a computar la meta original, encontrando esta vez el
plan mas corto:
1 ?- estado1(E),
2 plan_metas_protegidas_amplitud(E,[despejado(2),
3 despejado(3)], Plan,_).
4 E = [despejado(2), despejado(4), despejado(b),
5 despejado(c), en(a, 1), en(b, 3), en(c, a)],
6 Plan = [mover(b, 3, 4)]
1 ?- estado1(E),
2 plan_metas_protegidas_amplitud(E,[en(a,b), en(b,c)], Plan, _).
3 E = [despejado(2), despejado(4), despejado(b),
4 despejado(c), en(a, 1), en(b, 3), en(c, a)],
5 Plan = [mover(c, a, 2),
6 mover(b, 3, a),
7 mover(b, a, c),
8 mover(a, 1, b)]
sigue siendo problematica. Este resultado se obtiene con y sin proteccion de me-
tas siguiendo la estrategia primero en amplitud. El segundo movimiento del plan
parece superfluo y aparentemente no tiene sentido. Investiguemos porque se le in-
cluye en el plan y porque aun en el caso de la busqueda primero en amplitud, el plan
resultante esta lejos del optimo.
Dos preguntas son interesantes en este problema: Que razones encuentra el pla-
neador para construir este curioso plan? y Por que el planeador no encuentra el plan
optimo e incluye la accion mover(b, 3, a)? Atendamos la primer pregunta. La ultima
accion mover(a, 1, b) atiende la meta en(a, b). Los tres primeros movimientos estan
al servicio de cumplir las condiciones de esta accion, en particular la condicion
despe jado(a). El tercer movimiento despeja a y una condicion de este movimiento
es en(b, a). Esto se cumple gracias al curioso segundo movimiento mover(b, 3, a).
Esto ilustra la clase de exoticos planes que pueden emerger durante un razonamiento
medios-fines.
Con respecto a la segunda pregunta, Por que despues de mover(c, a, 2), el pla-
neador no considera inmediatamente mover(b, 3, c), lo que conduce a un plan opti-
mo? La razon es que el planeador estaba trabajando en la meta en(a, b) todo el
tiempo. La accion que nos interesa es totalmente superflua para esta meta, y por lo
tanto no es considerada. La cuarta accion logra en(a, b) y por pura suerte en(b, c)!
Este ultimo resultado no es una decision planeada de nuestro sistema.
De lo anterior se sigue, que el procedimiento medios-fines, tal y como lo he-
mos implementado es incompleto, no sugiere todas las acciones relevantes para el
proceso de planificacion. Esto se debe a la localidad con que se computan las so-
luciones. Solo se sugeriran acciones relevantes para la meta actual del sistema. La
solucion al problema esta en este enunciado: se debe permitir la interaccion entre
metas en el proceso de planificacion. Antes de pasar al siguiente tema, consideren
152 11 Planeacion
que al introducir la estrategia primero en amplitud para buscar planes mas cortos,
hemos elevando considerablemente el tiempo de computacion necesario para hallar
una solucion.
Supongan que estamos interesados en una lista de metas Metas que se cumplen
en cierto estado E. Sea el estado anterior a E, E0 y la accion ejecutada en E0 , A.
Que metas Metas0 tienen que cumplirse en E0 para que Metas se cumpla en E?
Metas0 debe tener las siguientes propiedades:
1. La accion A debe ser posible en E0 , por lo que Metas0 debe implicar la condicion
para A.
2. Para cada meta M en Metas, se cumple que:
la accion A agrega M; o
M Metas0 y A no borra M.
1 imposible(Meta,Metas).
que indica que la Meta es imposible en combinacion con las Metas. Para el caso del
mundo de los bloques la incompatibilidad entre las metas se define como:
1 imposible(en(X,X),_).
2
3 imposible(en(X,Y), Metas) :-
4 member(despejado(Y),Metas)
5 ;
6 member(en(X,Y1),Metas), Y1 \== Y
7 ;
8 member(en(X1,Y),Metas) X1 \== X.
9
10 imposible(despejado(X),Metas) :-
11 member(en(_,X),Metas).
45 agregarNuevo([Meta|_],Metas,_) :-
46 imposible(Meta,Metas),
47 !,
48 fail.
49
50 agregarNuevo([X|L1],L2,L3) :-
51 member(X,L2), !,
52 agregarNuevo(L1,L2,L3).
53
54 agregarNuevo([X|L1],L2,[X|L3]) :-
55 agregarNuevo(L1,L2,L3).
1 ?- estado1(E), plan(E,[en(a,b),en(b,c)],P).
2 E = [despejado(2), despejado(4), despejado(b),
3 despejado(c), en(a, 1), en(b, 3), en(c, a)],
4 P = [mover(c, a, 2), mover(b, 3, c), mover(a, 1, b)]
1 s(Metas1,Metas2) :-
2 member(Meta,Metas1),
3 lograr(Accion,Meta),
4 precond(Accion,Cond),
5 preservar(Accion,Metas1),
6 regresion(Metas1,Accion,Metas2).
156 11 Planeacion
1 :- op(300,xfy, ->).
2
3 s(Metas -> AccSiguiente,MetasNuevas -> Accion, 1) :-
4 member(Meta,Metas),
5 lograr(Accion,Meta),
6 precond(Accion,Cond),
7 preservar(Accion,Metas),
8 regresion(Metas,Accion,MetasNuevas).
9
1 primeroMejor(Inicio,Solucion) :-
2 expandir([],hoja(Inicio,0/0),9999,_,si,Solucion).
3
5 %% % expandir(Camino,Arbol,Umbral,Arbol1,Solucionado,Solucion)
6 %% % Camino es el recorrido entre Inicio y el nodo en Arbol
7 %% % Arbol1 es Arbol expandido bajo el Umbral
8 %% % Si la meta se encuentra, Solucion guarda el camino
solucion
9 %% % y Solucionado = si
10
46 expandir(_,arbol(_,_,[]),_,_,nunca,_) :- !.
47
51 expandir(_,Arbol,Umbral,Arbol,no,_) :-
52 f(Arbol,F), F > Umbral.
53
54 %% % continuar(Camino,Arbol,Umbral,NuevoArbol,SubarbolSolucionado,
55 %% % ArbolSolucionado,Solucion)
56
60 continuar(_,_,_,_,si,si,Sol).
61
62 continuar(Camino,arbol(Nodo,F/G,[A1|As]),Umbral,Arbol1,no,
63 Solucionado,Sol) :-
64 insertarArbol(A1,As,NAs),
65 mejorF(NAs,F1),
66 expandir(Camino,arbol(Nodo,F1/G,NAs),Umbral,Arbol1,
67 Solucionado,Sol).
68
69 continuar(Camino,arbol(Nodo,F/G,[_|As]),Umbral,Arbol1,nunca,
70 Solucionado,Sol) :-
71 mejorF(As,F1),
72 expandir(Camino,arbol(Nodo,F1/G,As),Umbral,Arbol1,
73 Solucionado,Sol).
74
75 %% % listaSuccs(G0,[Nodo1/Costo1, ...], [hoja(MejorNodo,MejorF/G),
...])
76 %% % hace una lista de arboles sucesores ordendados por F-valor
77
78 listaSuccs(_,[],[]).
79
80 listaSuccs(G0,[Nodo/C|NCs],As) :-
81 G is G0 + C,
82 h(Nodo,H), % Heuristic term h(N)
83 F is G + H,
84 listaSuccs(G0,NCs,As1),
85 insertarArbol(hoja(Nodo,F/G),As1,As).
86
89 insertarArbol(A,As,[A|As]) :-
90 f(A,F), mejorF(As,F1),
91 F =< F1, !.
92
93 insertarArbol(A,[A1|As], [A1|As1]) :-
94 insertarArbol(A,As,As1).
95
96
97 %% % Extraer f-valores
98
La accion nula stop es necesaria pues todos los nodos deben incluir una accion.
Aunque la heurstica usada es simple, el programa debe ser mas rapido que las ver-
siones anteriores. Eso si, el precio a pagar es una mayor utilizacion de la memoria,
debido a que debemos mantener el conjunto de alternativas competitivas.
1 mover(De,a,A)
1 precond(mover(De,a,A)),Cond)
160 11 Planeacion
1 mover(b,a,1)
2 mover(b,a,2)
3 mover(b,a,3)
4 mover(b,a,4)
5 mover(b,a,c)
6 mover(b,a,1)
7 mover(b,a,2)
Para hacer mas eficiente este paso del planeador, es posible permitir variables no
instanciadas en las metas. Para el ejemplo del mundo de los bloques, las condiciones
de mover seran definidas como:
1 precond(mover(Bloque,De,A),
2 [despejado(Bloque),despejado(A),en(Bloque,De)]).
1 [despejado(Bloque),despejado(A),en(Bloque,a)]
Observen que esta lista de metas puede ser satisfecha inmediatamente en la si-
tuacion inicial de nuestro ejemplo si Bloque/c y A/2. Esta mejora en eficiencia se
logra postergando la decision de como instanciar las variables, al momento en que
ya se cuenta con mas informacion para ello.
Este ejemplo ilustra el poder de la representacion con variables, pero el precio a
pagar es una mayor complejidad. Para empezar, nuestro intento por definir precond
para mover/3 es erroneo, pues permite movimientos como mover(c, a, c), que da
como resultado que !el bloque c este en el bloque c! Esto podra arreglarse si espe-
cificaramos que De y A deben ser diferentes:
1 precond(mover(Bloque,De,A),
2 [despejado(Bloque),despejado(A),en(Bloque,De),
3 diferente(Bloque,A), diferente(De,A),
4 diferente(Bloque,De)]).
donde di f erente/2 significa que los dos argumentos no denotan al mismo objeto
Prolog. Una condicion como estas, no depende del estado del problema, de forma
que no puede volverse verdadero mediante accion alguna, pero debe verificarse eva-
luando el predicado correspondiente. Una manera de manejar estas cuasi-metas es
agregar al predicado satis f echo/2 la siguiente clausula:
1 satisfecho(Estado,[Meta|Metas]) :-
2 satisface(Meta),
3 satisfecho(Estado,Metas).
11.7 Variables y planes no lineales 161
1 satisface(diferente(X,Y))
Un problema con nuestro planeador es que considera todos los posibles ordenes
de las acciones, aun cuando las acciones son completamente independientes. Con-
sideren el problema ilustrado en la figura 11.3, donde la meta es construir dos pilas
de bloques que estan de antemano bien separados. Las dos pilas puede construirse
independientemente con los siguientes planes:
1 M1 = mover(a,X,b)
2 M2 = mover(b,Y,c)
162 11 Planeacion
b e
a c f d
1 2 3 4 5 6 7 8
a d
b e
c f
1 2 3 4 5 6 7 8
No hay otra forma de resolver ambas metas, pero el orden de estas acciones es
aun indeterminado. Ahora consideren las condiciones de ambas acciones. La condi-
cion de mover(a, X, b) incluye depe jado(a), la cual no se satisface en la situacion
inicial, por lo que necesitamos una accion de la forma:
1 M3 = mover(Bloque,a,A).
que precede a M1. Ahora tenemos una restriccion en el orden de las acciones:
1 antes(M3,M1)
1 [M3,M1,M2]
2 [M3,M2,M1]
3 [M2,M3,M1]
Y de estas permutaciones, solo la del medio cumple con el requisito de ser ejecu-
table bajo la sustitucion Bloque/c, A/2, X/1,Y /3. Como se puede intuir, la comple-
jidad computacional no puede ser evitada del todo por un planeador no lineal, pero
puede ser aliviada considerablemente.
Referencias 163
Referencias
1. I. Bratko. Prolog programming for Artificial Intelligence. Addison-Wesley, 3rd edition, 2001.
2. Alonzo Church. A note on the entscheidungsproblem. Journal of Symbolic Logic, 1:4041,
1936.
3. K. Clark. Negations as failure. In H. Gallaire and J. Minker, editors, Logic and Databases,
pages 293322. Plenum Press, New York, USA, 1978.
4. A. Colmerauer and P. Roussel. The birth of Prolog. In T. H. Bergin and R. G. Gibson, editors,
History of Programming Languages, chapter The birth of Prolog, pages 331367. ACM Press
/ Addison-Wesley, 1996.
5. M.R. Genesereth and N.J. Nilsson. Logical Foundations for Artificial Intelligence. Morgan
Kauffman Publishers, Inc., Palo Alto, CA., USA, 1987.
6. R. A. Kowalski. Predicate logic as a programming language. In J. L. Rosenfeld, editor,
Information Processing, pages 569574. North-Holland, 1974.
7. Robert A. Kowalski and Donald Kuehner. Linear resolution with selection function. Artificial
Intelligence, 2(3/4):227260, 1971.
8. J. McCarthy. Programs with common sense. In Proceedings of the Symposium on the Mecha-
nization of Thought Processes, Teddington, England, 1958.
9. M. Minsky. The Society of Mind. Simon and Schuster, New York, NJ., USA, 1986.
10. T.M. Mitchell. Machine Learning. Computer Science Series. McGraw-Hill International
Editions, Singapore, 1997.
11. Shan-Hwei Nenhuys-Chen and Ronald de Wolf. Foundations of Inductive Logic Program-
ming, volume 1228 of Lecture Notes in Artificial Intelligence. Springer-Verlag, Berlin Heidel-
berg, 1997.
12. Ulf Nilsson and Jan Maluszynski. Logic, Programming and Prolog. John Wiley & Sons Ltd,
2nd edition, 2000.
13. J. R. Quinlan. Induction of decision trees. Machine Learning, 1:81106, 1986.
14. J.R. Quinlan. C4.5: Programs for Machine Learning. Morgan Kaufmann, San Mateo, CA.,
USA, 1993.
15. J. A. Robinson. A machine-oriented logic based on the resolution principle. Journal of the
ACM, 12(1):2341, 1965.
16. J. A. Robinson. Logic and logic programming. Communications of the ACM, 35(3):4065,
1992.
17. Stuart J. Russell and Peter Norvig. Artificial Intelligence, a modern approach. Prentice Hall,
New Jersey, USA, 2nd edition, 2003.
18. C. Shannon and W. Weaver. The mathematical theory of communication. The Bell System
Technical Journal, 27:623656, July, October 1948.
19. Alan M. Turing. On the computable numbers, with applications to the entscheidungsproblem.
In Proceedints of the London Mathematical Society, volume 42 of series 2, pages 230265,
1936.
20. D. H. D. Warren. An abstract Prolog instruction set. Technical Report 309, SRI, 1983.