Вы находитесь на странице: 1из 22

9 SI STEMAS EXPERTOS

En este captulo abordaremos uno de los productos tpicos de la Inteligencia Articial:


los Sistemas Expertos. Normalmente, usamos herramientas de desarrollo conocidas
con shells para construir este tipo de sistemas, pero si necesitamos congurar un shell
para una aplicacin en particular, es necesario conocer como es que un sistema experto
se construye desde cero. El captulo constituye el segundo ejemplo del uso de Prolog
para resolver problemas tpicos de la Inteligencia Articial.
Los sistemas expertos (SE) son aplicaciones de cmputo que involucran experien-
cia no algortmica, para resolver cierto tipo de problema. Por ejemplo, los sistemas
expertos se usan para el diagnstico al servicio de humanos y mquinas. Existen SE
que juegan ajedrez, que planean decisiones nancieras, que conguran computadoras,
que supervisan sistemas de tiempo real, que deciden polticas de seguros, y llevan a
cabo dems 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 gura 26. Los componentes ms importantes son:
Base de conocimientos. La representacin declarativa de la experiencia, muchas
veces en forma de reglas IF-THEN.
Almacn de trabajo. Los datos especcos al problema que se est resolviendo.
Mquina de inferencia. El cdigo central del SE que deriva recomendaciones
con base en la base de conocimientos y los datos especcos del problema.
Interfaz del usuario. El cdigo que controla el dilogo entre el usuario y el SE.
Para entender un SE es necesario entender tambin el rol de los usuarios que inter-
accionan con el sistema:
Experto del Dominio. El o los individuos que son los expertos en resolver el
problema que el SE intentar resolver.
Ingeniero de Conocimiento. El individuo que codica el conocimiento de los
expertos en forma declarativa, para que pueda ser usado por el SE.
Usuario. El individuo que consultar el SE para obtener los consejos que espera-
ra de un experto del dominio.
Muchos SE se producen en ambientes de desarrollo conocidos como shells. Un shell
es un sistema que contiene la interfaz del usuario, un formato de conocimiento de-
clarativo para la base de conocimientos y una mquina de inferencia. El ingeniero de
conocimiento usa el shell para construir un SE que resuelve problemas en un dominio
particular.
Si el sistema se construye desde cero, o utilizando shells congurados para cierto
tipo de aplicaciones, otro individuo entra en escena:
89
90
Experto en
el Dominio
Ingeniero del
Conocimieno
Usuario
Ingeniero en
Sistemas
Interface con
el Usuario
Mquina de
Inferencia
Base de
Conocimiento
Almacn de
Trabajo
Experiencia
Figura 26: Componentes de un sistema experto e interfases humanas
Ingeniero de Sistemas. La persona que construye la interfaz del usuario, disea
el formato declarativo de la base de conocimientos, e implementa la mquina
de inferencia adivinan cual es su rol?
En realidad eso depende de la talla del proyecto: El ingeniero de conocimiento y
el ingeniero del sistema, pueden ser la misma persona. El diseo del formato de la
base de conocimientos y su codicacin estn ntimamente relacionados. Al proceso
de codicar el conocimiento de los expertos, se le conoce como ingeniera del conoci-
miento. Siendo sta una tarea complicada, se espera el uso de los shells haga posible
la reutilizacin del conocimiento codicado. En estas sesiones nos concentraremos en
la programacin en Prolog de los SE al margen del uso de las shells.
.
Los SE poseen las siguientes caractersticas, en menor o mayor grado:
Razonamiento guiado por las metas y encadenamiento hacia atrs. Una tcnica
de inferencia que usa las reglas IF-THEN para descomponer las metas en sub-
metas ms fciles de probar.
Manejo de incertidumbre. La habilidad del SE para trabajar con reglas y datos
que no son conocidos con precisin.
Razonamiento guiado por los datos y encadenamiento hacia adelante. Una tc-
nica de inferencia que usa las reglas IF-THEN para deducir soluciones a un
problema a partir de los datos iniciales disponibles.
Representacin de datos. La forma en que los datos especcos a un problema
dado, son almacenados y accesados por el SE.
Interfaz del usuario. La parte del SE que se usa para una interaccin ms ami-
gable con el usuario.
. 91
Explicacin. La habilidad del SE para explicar sus procesos de razonamiento y
su uso en el cmputo de recomendaciones.
.. Razonamiento basado en metas
El encadenamiento hacia adelante, o razonamiento basado en metas, es una forma
eciente de resolver problemas que pueden ser modelados como casos de seleccin
estructurada; donde la meta del SE es elegir la mejor opcin de entre varias po-
sibilidades enumeradas. Por ejemplo, los problemas de identicacin caen en esta
categora. Los problemas de diagnstico tambien caben aqu, pues se trata de elegir
el diagnstico adecuado.
El conocimiento se codica en reglas que describen como es que cada caso posible
podra ser seleccionado. La regla rompe el problema en sub-problemas. Por ejemplo,
las siguientes reglas formaran parte de un SE para identicar aves:
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:
1 IF
2 orden es tubonasales AND
3 tamao es grande AND
4 alas es grandes anguladas
5 THEN
6 familia es albatros.
.. Incertidumbre
Es muy comn en la resolucin de problemas de seleccin estructurada, que la res-
puesta nal no es conocida con total certeza. Las reglas del experto pueden ser vagas,
o el usuario puede estar inseguro sobre sus respuestas. Esto es fcilmente observable
en el diagnstico mdico. Los SE normalmente usan valores numricos para repre-
sentar certidumbre. Existen diveras maneras de denirlos y usarlos en el proceso de
razonamiento.
92
.. Razonamiento guiado por los datos
Para muchos problemas no es posible enumerar las soluciones alternativas a las pre-
guntas planteadas con antelacin. Los problemas de conguracin caen en esta cate-
gora. El encadenamiento hacia adelante, o razonamiento guiado por los datos, usa
reglas IF-THEN para explorar el estado actual en la solucin del problema y moverse
a estados ms cercanos a la solucin.
Un SE para acomodar el mobiliario puede tener reglas para la ubicacin de un
mueble en particular. Una vez que un mueble ha sido colocado, se puede proceder
con los dems. La regla para colocar la TV enfrente del sof es como sigue:
1 IF
2 no
_
colocada tv AND
3 sof 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 televisin no situada y regresa un
estado nuevo, donde la televisin ya ha sido colocada. Puesto que la televisin ya ha
sido colocada en su lugar, esta regla no volver a ser disparada por el SE. Otras reglas
sern usadas para colocar el resto de los muebles hasta terminar.
.
Como pueden haber adivinado, Prolog posee una mquina de inferencia por enca-
denamiento haca atrs. Esta mquina puede usarse parcialmente para implementar
algunos SE. Las reglas de Prolog sern usadas para representar conocimiento y su
mquina de inferencia ser usada para derivar conclusiones. Otras partes del sistema,
como la interfaz con el usuario debern escribirse usando Prolog.
Usaremos el problema de identicacin de aves norteamericanas para ilustrar la
construccin 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
1
. Las
reglas del SE estarn diseadas para ilustrar como se pueden representar varios tipos
de conocimiento, en vez de buscar una identicacin precisa de las aves.
.. Reglas
Las reglas de un SE normalmente toman el siguiente formato:
1 IF
2 primera premisa AND
3 segunda premisa AND
4 ...
5 THEN
6 conclusin
1 La versin extendida en lnea de este libro puede encontrarse en http://bna.birds.cornell.edu/bna/
. 93
La parte IF de la regla se conoce con el lado izquierdo de la regla (LHS), y la parte
del THEN se conoce como el lado derecho de la regla (RHS). Esto es equivalente a la
semantica de la regla Prolog:
1 conclusin :-
2 primera premisa,
3 segunda premisa,
4 ...
Esto puede ser confuso pus la regla en prolog dice ms 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
Tendramos que escribir:
1 ave(albatros
_
laysan) :-
2 familia(albatros),
3 color(blanco).
Las siguientes reglas distinguen entre dos tipos de albatros y cisne (Ver la gura
27). Todas son clusulas 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 xito al distinguir un ave, necesitamos almacenar he-
chos acerca del ave que deseamos identicar con el SE. Por ejemplo, si agregamos
estos hechos al programa:
1 familia(albatros).
2 color(obscuro).
Ahora podemos usar la pregunta siguiente:
?- ave(X).
X = albatros
_
patas
_
negras
Yes
94
Figura 27: Cisne Trompetero en ilustracin de John James Audubon (1838).
Observen que an en esta etapa temprana tenemos un SE completo, donde la ex-
perticia consiste en distinguir entre cuatro aves. La interfaz con el usuario es el REPL
de Prolog y los datos de entrada se almacenan directamente en el programa.
.. Reglas para relaciones jerrquicas
El siguiente paso ser representar la naturaleza jerrquica del sistema de clasicacin
de un ave. Esto incluir reglas para identicar la familia y el orden del ave. Conti-
nuando con el albatros y el cisne, los predicados para orden/1 y familia/1 son:
1 orden(nariz
_
tubular) :-
2 fosas(externas
_
tubulares),
3 habitat(mar),
4 pico(gancho).
5 orden(acuatico) :-
6 patas(membrana),
7 pico(plano).
8 familia(albatros) :-
9 orden(nariz
_
tubular),
10 tamao(grande),
11 alas(muy
_
largas).
12 familia(cisne) :-
13 orden(acuatico),
14 cuello(largo),
15 color(blanco),
16 vuelo(pesado).
Ahora el SE puede identicar al albatros a partir de observaciones fundamentales
sobre el ave. En la primer versin, familia/1 fue implementada como un hecho. Aho-
ra familia/1 es implementada como una regla. Los hechos del SE ahora reejan ms
datos primitivos:
. 95
1 fosas(externas
_
tubulares).
2 habitat(mar).
3 pico(gancho).
4 tamao(grande).
5 alas(muy
_
largas).
6 color(obscuro).
La consulta siguiente reporta:
?- ave(X).
X = albatros
_
patas
_
negras
Yes
.. Reglas para otras relaciones
El ganso canadiense puede usarse para agregar complejidad al sistema. Debido a
que esta ave pasa los veranos en Canad y los inviernos en los Estados Unidos, su
identicacin se ve afectada por donde ha sido vista y en que estacin. Dos reglas
sern necesarias para cubrir estas situaciones:
1 ave(ganso
_
canadiense) :-
2 familia(ganso),
3 estacion(invierno),
4 pais(estados
_
unidos),
5 cabeza(negra),
6 pecho(blanco).
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 diferente:
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]).
96
Figura 28: Pato comn del norte (Mallard) en ilustracin de John James Audubon (1838).
Otras aves necesitarn de predicados mltiples para ser identicada. Por ejemplo,
el Mallard (Anas platyrhynchos) macho, o pato comn del norte (Figura 28), tiene la
cabeza verde con un anillo blanco; la hembra tiene la cabeza caf 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 situacin del libro de las aves norte americanas puede ser ex-
presado fcilmente en Prolog. Las reglas expresadas forman la base de conocimientos
del SE. El nico punto dbil del programa es su interfaz con el usuario, que requiere
que los datos sean introducidos como hechos del programa.
.
El sistema puede mejorarse considerablemente si proveemos una interfaz para el usua-
rio, que pregunte por la informacin cuando esto sea necesario, en lugar de forzar al
usuario a introducirla como hechos del programa.
Antes de pensar en un predicado pregunta, es necesario entender la estructura de
los datos que sern preguntados. Todos los datos, manejandos hasta ahora, han sido
de la forma atributovalor. Por ejemplo, los atributos del pato del norte Mallard, son
mostrados en el Cuadro 2.
. 97
atributo valor
familia pato
voz graznido
cabeza verde
Cuadro 2: Atributos valor para el mallard
Esta es una de las representaciones ms simples usadas en los SE, pero es suciente
para muchas aplicaciones. Existen representaciones ms expresivas, como los tripletes
objetoatributovalor, o las redes semnticas, 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 denicin.
Usaremos el predicado pregunta para determinar con ayuda del usuario, cuando
un par atributovalor es verdadero. El SE debe modicarse para determinar que atri-
butos son vericables por el usuario. Esto se logra con reglas para los atributos que
llaman a pregunta:
1 fosas(X) :- pregunta(fosas,X).
2 habitat(X) :- pregunta(habitat,X).
3 pico(X) :- pregunta(pico,X).
4 tamano(X) :- pregunta(tamano,X).
5 come(X) :- pregunta(come,X).
6 pies(X) :- pregunta(pies,X).
7 alas(X) :- pregunta(alas,X).
8 cuello(X) :- pregunta(cuello,X).
9 color(X) :- pregunta(color,X).
Ahora, si el SE tiene como meta probar color(blanco), llamar a pregunta/2 en
lugar de consultar su base de conocimientos. Si pregunta(color, blanco) tiene xito,
entonces color(blanco) tambin lo tiene. La pregunta es como sigue:
1 pregunta(Atrib,Val):-
2 write(Atrib:Val),
3 write(? ),
4 read(si).
El predicado read/1 tendr xito slo si el usuario responde si y falla si el usuario
responde cualquier otra cosa. Ahora el programa puede ser ejecutado sin datos de
trabajo iniciales. La misma llamada a ave/1 inicia la consulta al SE.
?- ave(X).
fosas:externas
_
tubulares? si.
habitat:mar? si.
pico:gancho? si.
tamano:grande? si.
alas:muy
_
largas? si.
color:blanco? si.
X = albratros
_
laysan
Yes.
98
El problema con este enfoque es que si el usuario responde no a la ltima pre-
gunta, la regla para ave(albratros_laysan) falla, llevandonos a un backtracking. De
esta manera el SE nos preguntara nuevamente informacin que ya sabe. De alguna
manera deberamos implementar un predicado pregunta que recuerde lo pregunta-
do.
?- ave(X).
fosas:externas
_
tubulares? si.
habitat:mar? si.
pico:gancho? si.
tamano:grande? si.
alas:muy
_
largas? si.
color:blanco? no.
fosas:externas
_
tubulares? si.
habitat:mar? si.
pico:gancho? si.
tamano:grande? si.
alas:muy
_
largas? si.
color:obscuro? si.
X = albratros
_
patas
_
negras
Yes.
Deniremos un nuevo predicado conocido/3 que nos ayude a recordar las res-
puestas del usuario. Las respuestas no se guardarn directamente en memoria, sino
que sern guardadas dinmicamente con asserta/1 cuando pregunta provea infor-
macin nueva para el SE:
1 pregunta(A,V) :- conocido(si,A,V), !.
2
3 pregunta(A,V) :- conocido(
_
,A,V), !, fail.
4
5 pregunta(A,V) :-
6 write(A:V),
7 write? : ),
8 read(Resp),
9 asserta(conocido(Resp,A,V)),
10 Resp == si.
Tambin es posible utilizar menues contextuales para el caso de atributos multi-
variados. La idea es que para atributos de un solo valor, la interfaz por el usuario
pregunte una sola vez:
1 pregunta(A,V) :-
2 not(multivariado(A)),
3 conocido(si,A,V2),
4 V \== V2,
5 !,
6 fail.
Una gua sobre los valores vlidos para un atributo se implementa con el predicado
menu_pregunta que trabaja de manera anloga a pregunta:
. 99
1 tamao(X) :-
2 menu
_
pregunta(tamao, X, [grande, mediano, pequeo]).
3 color(X) :-
4 menu
_
pregunta(color,X,[blanco,verde,cafe,negro]).
La denicin de menu_pregunta/3 es:
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 vlido, intente nuevamente), nl,
15 menu
_
pregunta(A,V,MenuLista).
.
El ejemplo de identicacin de aves tiene dos partes: una base de conocimientos, que
incluye la informacin especca sobre las aves; y los predicados para controlar la
interfaz con el usuario. Al separar estas dos partes, podemos crear un shell de SE. Con
ello podemos crear un nuevo SE que identique, por ejemplo, peces y reutilizar la
parte de control de la interfaz.
Un cambio mnimo es necesario para separar las dos partes de nuestro SE. Necesi-
tamos un predicado de alto nivel que inicie el proceso de identicacin. Puesto que
no sabemos de antemano lo que el SE va a identicar, el shell buscar satisfacer un
predicado llamado meta. Cada base de conocimiento deber tener denido meta/1,
por ejemplo, para el caso de identicacin de aves tendramos:
1 meta(X) :- ave(X).
como primer predicado en la base de conocimientos aves.
El shell tendr un predicado solucion/0 que llevar a cabo labores de mantenimien-
to del SE, para luego resolver la meta/1:
1 solucion :-
2 abolish(conocido,3),
3 define(conocido,3),
4 meta(X),
5 write(La respuesta es: ), write(X), nl.
6
7 solucion :-
8 write(No se encontr una respuesta.), nl.
100
El predicado Prolog abolish/2 se usa para eliminar los hechos denidos previamen-
te con conocido/3, cada vez que una consulta se va a ejecutar. Esto permite al usuario
ejecutar solucion multiples veces en una sola sesin. El predicado define/2 permite
indicarle a Prolog que conocido estar denido en el SE, de forma que no cause error
la primera utilizacin de este predicado. Este predicado puede variar dependiendo
de la versin 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 stos.
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 ? ...
.. REPL
El shell puede ser mejorado construyendo un ciclo de comandos read-eval-print loop.
Para ello deniremos el predicado se:
1 se :-
2 bienvenida,
3 repeat,
4 write(> ),
5 read(X),
6 do(X),
7 X == quit.
8
. 101
Interfaz del Usuario
se
pregunta
menu_pregunta
Mquina de inferencia
solucion
cargar
Base de Conocimientos
meta
reglas
mulivaluado
preguntado
Memoria de trabajo
conocido
Figura 29: El shell del SE.
9 bienvenida :-
10 write(Este es el shell de su SE.), nl,
11 write(Escriba: cargar, consultar, o salir en el prompt.), 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 vlido.), nl,
24 fail.
25
26 cargar
_
bd :-
27 write(Nombre del archivo: ),
28 read(F),
29 reconsult(F).
La arquitectura obtenida de esta forma se muestra en la gura 29.
.
Como hemos mencionado, el encadenamiento haca adelante resulta conveniente cuan-
do los problemas a resolver son del tipo seleccin estructurada, como en el ejemplo
de la clasicacin de aves. Sin embargo, en adems de que hemos asumido que la
informacin completa est disponible para resolver el problema, tambin hemos asu-
102
mido que no hay incertidumbre, ni el los datos provistos por el usuario, ni en las
reglas de los expertos. Por ejemplo, el albatros puede ser observado en la bruma, con
lo que sera difcil precisar si su color es blanco u obscuro. Es de esperar que un SE
que maneje incertidumbre, pueda contender con este tipo de problemas.
Desarrollaremos un shell que permita manejar reglas con incertidumbre y encade-
namiento de ellas haca atrs. Evidentemente, este SE tendr un formato de reglas
propio, diferente a las reglas de Prolog, y por lo tanto, una mquina de inferencia
propia.
.. Factores de certidumbre
La forma ms comn de trabajar con la incertidumbre consiste en asignar un factor de
certidumbre a cada pieza de informacin en el SE. La mquina de inferencia deber
mantener los factores de incertidumbre conforme el proceso de inferencia se lleve a
cabo.
Por ejemplo, asumamos que los factores de certidumbre (precedidos por cf) son
enteros entre -100 (denitivamente falso) y +100 (denitivamente verdadero). La si-
guiente base de conocimientos en formato del SE est diseada para diagnosticar un
auto que no enciende. Esto ilustra el comportamiento de los factores de certidumbre:
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
14 THEN bateria
_
mala cf 50.
15
16 RULE 4
17 IF arranca AND
18 olor
_
gasolina
19 THEN problema is fuga cf 80.
20
21 RULE 5
22 IF arranca AND
23 indicador
_
gasolina is vacio
24 THEN problema is tanque
_
vacio cf 90.
25
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)
. 103
33 PROMPT Su motor arranca? .
34
35 ASK luces
_
debiles
36 MENU (si no)
37 PROMPT Sus luces estn dbiles? .
38
39 ASK radio
_
debile
40 MENU (si no)
41 PROMPT Su radio est dbil? .
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? .
Por el momento la inferencia usara encadenamiento haca atrs, similar al que usa
Prolog. La regla GOAL indica que el proceso buscar un valor para problema. La
regla 1 causar que la sub-meta bateria_mala sea procesada, etc. Observen que las
reglas especican tambin factores de certidumbre. Las reglas 2 y 3 proveen evidencia
de que la batera est en mal estado, pero ninguna es conclusiva al respecto.
Un dilogo con este sistema sera como sigue:
1 consultar, reiniciar, cargar, listar, trazar, cmo, salida
2 : consultar
3 Su motor arranca?
4 : si
5 Huele a gasolina?
6 : si
7 Qu indica la aguja de la gasolina?
8 : vacio
9 problema-tanque-vacio-cf-90
10 problema-fuga-cf-80
11 problema resuelto
Observen que a diferencia de Prolog, el sistema no se detiene al encontrar el primer
posible valor para problema. En este caso se computan todos los valores razonables
para problema y se reporta el valor de certidumbre asociado a estas soluciones. Re-
cordemos que estos factores de certidumbre no son probabilidades, solo ponderan
de alguna manera las respuestas.
De igual manera, el usuario podra ofrecer factores de certidumbre sobre sus res-
puestas, por ejemplo:
1 : consultar
2 ...
3 Huele a gasolina?
4 si cf 50
5 ...
Existen diversas maneras de capturar el concepto de factor de certidumbre, pero
todas ellas deben de confrontar las mismas situaciones bsicas:
104
Reglas cuyas conclusiones son inciertas,
Reglas cuyas premisas son inciertas,
Datos provistos por el usuario inciertos,
Combinacin de premisas inciertas con conclusiones inciertas,
Actualizar los factores de incertidumbre en los datos almacenados en el espacio
de trabajo,
Establecer un umbral sobre el cual las premisas se consideran conocidas.
.. Factores de certidumbre la MYCIN
MYCIN [5], uno de los SE ms conocidos en IA, introduce factores de certidumbre
diseados para producir resultados intuitivos desde la perspectiva de los expertos.
Revisemos el uso de estos factores por casos. El ms simple, sera aquel donde las
premisas son totalmente ciertas:
1 arranca cf 100.
2 olor
_
gas cf 100.
disparan la regla 4 y por tanto, problema fuga cf 80 deber agregarse al almacn
de trabajo. Sin embargo, este es un caso poco probable. Normalmente no estamos
totalmente seguros de las premisas de una regla y lo normal sera tener hechos como:
1 arranca cf 80.
2 olor
_
gas cf 50.
Cuando esto sucede, la incertidumbre en las premisas de la regla debe combinarse
con las de la conclusin de la misma de la siguiente manera:
CF = CFregla mnCFpremisa/100
Dado el ejemplo, la regla 4 se activara con un cf = 50 (el mnimo de las dos
premisas) y dada la frmula anterior, agregaramos problema fuga cf 40 al almacn
de trabajo.
Para que una regla dispare, su factor de certidumbre debe superar un umbral que
normalmente se ja en 20. As que bajo la denicin anterior, la regla 4 disparara. Si
tuvisemos olor
_
gas cf 15, entonces la regla no disparara.
Ahora consideren el caso donde hay ms de una regla que da soporte a cierta
conclusin. En ese caso, cada una de las reglas que disparan contribuir al factor de
certidumbre de la conclusin. Si una regla dispara y la conclusin ya se encontraba
en el almacn de trabajo, las siguientes reglas aplican:
CF(X, Y) = X+Y(100 X)/100. Ambos X, Y > 0
CF(X, Y) = X+Y/1 mn(|X|, |Y|). Uno de X, Y < 0
CF(X, Y) = CF(X, Y). Ambos X, Y < 0
. 105
Por ejemplo, si disparamos la regla 2 (luces dbiles) con su premisa sin incerti-
dumbre, tendramos que agregar al almacn de trabajo bateria
_
mala cf 50. Luego
si disparamos la regla 3 (radio dbil), el factor de certidumbre de este hecho debe
modicarse a bateria
_
mala cf 75. Lo cual resulta intuitivo (hay ms evidencia de
que la batera tiene problemas). Lo que tambin resulta intuitivo es que necesitamos
programar nuestra propia mquina de inferencia.
.. Formato de las reglas
Como programaremos nuestra propia mquina de inferencia, podemos elegir la es-
tructura de hechos y reglas. Las reglas tendrn la estructura general:
regla(Nombre, Premisas, Conclusion).
El Nombre opera solo como un identicador de la regla. El lado izquierdo de la
misma Premisas implica al lado derecho Conclusion (conclusin). Como usaremos
encadenamiento haca atrs, cada regla ser usada para validar una pieza de informa-
cin, de manera el RHS contiene una meta con su factor de certidumbre asociado:
conclusion(Meta, CF).
mientras que las premisas toman la forma de una lista de metas:
premisas(ListaMetas).
Las metas sern representadas, para comenzar, como pares atributovalor:
av(Atributo, Valor).
cuando Atributo y Valor son tomos, 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)).
Por ejemplo, la regla 5 quedara representada como:
1 regla(5,
2 premisas([av(arranca,si), av(indicador
_
gasolina,vacio)]),
3 conclusion(av(problema,fuga), 80)).
Estas reglas no son fciles de leer, pero tienen una estructura adecuada para ser
procesadas por Prolog. Otras herramientas de Prolog como las gramticas de clusula
denitivas (DCG) o la denicin de operadores, puede ayudarnos a simplicar esta
representacin.
106
.. La mquina de inferencia
Dado el formato de las reglas del SE deseamos que la inferencia tome en cuenta los
siguientes aspectos:
Combine los factores de certidumbre como se indico anteriormente.
Mantenga el espacio de trabajo con la informacin actualizada con las nuevas
evidencias obtenidas.
Encontrar toda la informacin acerca de un atributo en particular cuando se
pregunte por l, y poner esa informacin en el espacio de trabajo.
Primero, los hechos sern almacenados en la memoria de trabajo de Prolog, con el
siguiente formato:
1 hecho(av(A,V),CF).
De forma que un predicado meta/2 hara la llamada para resolver un problema
dado en estos trminos. Por ejemplo, en el caso del arranque del auto, tendramos
como meta:
1 ?- meta(av(problema,X),CF).
El predicado meta/2 debe de contender con tres casos:
El atributovalor se conoce de antemano;
Existen reglas para deducir el atributovalor;
Se debe preguntar al usuario.
El sistema puede disearse para preguntar al usuario automticamente por el valor
de un atributo, ante la ausencia de reglas; o bien, se puede declarar que atributos
pueden ser preguntados al usuario. Este ltimo enfoque hace que el manejo de la
base de conocimientos sea ms explcito y provee mayor control sobre los dilogos
usuario SE. Podemos denir un predicado pregunta/2 para declarar el atributo a
preguntar y la frase para ello:
1 pregunta(pais
_
residencia,En qu pas vive? ).
Veamos ahora los tres casos para meta/2. El primero de ellos ocurre cuando la
informacin ya est en la memoria de trabajo:
1 meta(av(Atr,Val),CF) :-
2 hecho( av(Atr,Val), CF),
3 !.
El segundo caso se da cuando el valor del atributo no se encuentra en la memoria
de trabajo, pero el es posible preguntar por ello al usuario:
. 107
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).
Para ello, el predicado preguntar/2 interroga al usuario. El usuario responde con
un valor para la atributo Atr y un factor de certidumbre asociado CF. El mensaje Msg
da la informacin necesaria para guiar al usuario en estas consultas:
1 preguntar(Atr,Msg) :-
2 write(Msg),
3 read(Val),
4 read(CF),
5 asserta(fact(av(Atr,Val),CF)).
El tercer caso para meta/2 es cuando el valor del atributo es desconocido, pero se
puede deducir usando las reglas denidas en el sistema, en ese caso la llamada es:
1 meta(Meta,CFactual) :-
2 buscaReglas(Meta,CFactual).
Esta llamada hace uso de la mquina de inferencia que disearemos 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 denidas en el sistema.
El predicado buscaReglas/2 se encarga de encontrar aquellas reglas cuya conclu-
sin unica con la Meta en cuestin 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, slo 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 denimos
probar/2:
1 probar(ListaPremisas, Contador) :-
2 probAux(ListaPremisas, 100, Contador).
3
4 probAux([],Contador,Contador).
108
5 probAux([Premisa1|RestoPremisas],ContadorActual,Contador) :-
6 meta(Premisa1,CF,Cont),
7 Cont >= 20,
8 probAux(RestoPremisas,Cont,Contador).
El ajuste de los factores de certidumbre se lleva a cabo de la siguiente manera:
1 ajustar(CF1, CF2, CF) :-
2 X is CF1
*
CF2 / 100,
3 int
_
redondear(X,CF).
4
5 int
_
redondear(X,I) :-
6 X >= 0,
7 I is integer(X + 0.5).
8
9 int
_
redondear(X,I) :-
10 X < 0,
11 I is integer(X - 0.5).
La actualizacin de la memoria de trabajo se lleva a cabo de la siguiente manera:
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
11 combinar(CF1, CF2, CF) :-
12 CF1 >= 0,
13 CF2 >= 0,
14 X is CF1 + CF2
*
(100 - CF1)/100,
15 int
_
redondear(X,CF).
16
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).
. 109
.. Interfaz con el usuario
La interfaz con el usuario es muy parecida a la denida en la seccin anterior. Se
incluyen predicados auxiliares necesarios en su denicin:
1 se :-
2 repeat,
3 write(consultar, cargar, salir), nl,
4 write(: ),
5 read
_
line(X),
6 ejec(X),
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
110
50 imprimeLista([]).
51 imprimeLista([X|Xs]) :-
52 write(X),
53 imprimeLista(Xs).