Está en la página 1de 7

Sistemas expertos en

Prolog
Introduccin
Un sistema experto emula la capacidad de toma de decisiones de
un experto humano .

Prolog es muy adecuado para la implementacin de sistemas expertos debido


a varias razones:

Prolog en s puede ser considerado como un motor de


inferencia simple o probador de teorema que deriva conclusiones de las
reglas conocidas. Se pueden implementar sistemas expertos muy
sencillos basndose en los mecanismos integrados de bsqueda y
retroceso de Prolog .
Prolog estructuras de datos nos permiten de forma flexible y
convenientemente representamos a los sistemas basados en reglas que
necesitan funciones adicionales tales como el razonamiento
probabilstico.
Podemos escribir fcilmente meta-intrpretes en Prolog para
implementar estrategias de evaluacin personalizada de reglas.

Ejemplo: Identificacin de animales


Nuestro objetivo es escribir un sistema experto que nos ayude a identificar
animales .

Supongamos que ya hemos obtenido los siguientes conocimientos acerca de


los animales, que son reglas de inferencia:

Si tiene una piel y dice trama , entonces el animal es un perro .


Si tiene una piel y dice maullido , entonces el animal es un gato .
Si tiene plumas y dice curandero , entonces el animal es un pato .

Estas reglas no son exhaustivas, pero sirven como un ejemplo corriente para
ilustrar algunos puntos acerca de los sistemas expertos.
La idea clave de un sistema experto es obtener informacin nueva til basada
en la entrada proporcionada por el usuario. A continuacin, vemos varias
maneras de hacerlo en Prolog.

Implementacin directa de Prolog


Ahora consideramos una implementacin que usa las reglas de
Prolog directamente para implementar las reglas de inferencia mencionadas.

Esto es sencillo, usando is_true / 1 para emitir una pregunta y slo proceder
con la clusula actual si la entrada del usuario es el tomo yes :
animal (perro): - is_true ('tiene piel'), is_true ('dice woof').
animal (gato): - is_true ('tiene piel'), is_true ('dice meow').
animal (pato): - is_true ('tiene plumas'), is_true ('dice charlatn').

is_true (Q): -
formato ("~ w? \ n", [Q]),
lea (s).

Existe un claro inconveniente de este enfoque, que se muestra en la siguiente


interaccin de ejemplo:
\ alpha - animal (A).
tiene piel
s
dice trama
|: no.
tiene piel
s
dice maullido
s

A = gato.

El sistema ha hecho una pregunta redundante : Idealmente, el hecho de que el


animal lo hace tener una piel tendra que ser declarado como mximo una
vez por el usuario.

Cmo podemos implementar mejor esto? Es tentador meterse con la base de


datos global de alguna manera para almacenar la entrada del usuario a travs
de retroceso. Sin embargo, el cambio de un estado global destruye muchas
propiedades elementales que esperamos de las relaciones lgicas puras y es
generalmente una idea muy mala, as que no lo hacemos de esta manera.

Uso de un lenguaje especfico de dominio


Para solucionar el defecto explicado anteriormente, ahora cambiaremos la
representacin de nuestras reglas de las clusulas de Prolog a un lenguaje
personalizado que escribiremos e interpretaremos un poco diferente al Prolog
puro. Un lenguaje que se adapta a un dominio de aplicacin especfico se
llama adecuadamente un lenguaje especfico de dominio (DSL).
Utilizaremos la siguiente representacin para representar el conocimiento:
animales ([animal (perro, [is_true ('tiene piel'), is_true ('dice
woof')]),
animal (cat, [is_true ('tiene piel'), is_true ('dice
meow')]),
animal (pato, [is_true ('tiene plumas'), is_true ('dice
quack')])]).

Las reglas de inferencia ahora estn representadas por trminos de la


forma animal (A, Condiciones) , por lo que queremos decir que A se
identifica si todas las condiciones son verdaderas. Tenga en cuenta
especialmente que el uso de una lista es una representacin limpia de las
condiciones.

Es un ejercicio directo para implementar un intrprete para esta nueva


representacin. Por ejemplo, el siguiente fragmento se comporta como el
sistema experto que vimos en la seccin anterior, suponiendo que is_true /
1 se define como antes:
animal (A): -
animales (As),
miembro (animal (A, Cs), As),
maplist (llamada, Cs).

En particular, esto por supuesto tambin comparte la desventaja mencionada:


\ alpha - animal (A).
tiene piel
s
dice trama
|: no.
tiene piel

Ahora el punto: podemos interpretar estas reglas de


manera diferente simplemente cambiando el intrprete, dejando las reglas sin
cambios. Por ejemplo, vamos a equipar este sistema experto con
una memoria que registra los hechos que ya se conocen porque ya fueron
introducidos por el usuario en algn momento durante la interaccin.

Implementamos esta memoria de una manera pura , mediante el subproceso a


travs de argumentos adicionales que describen la relacin entre
los estados de la memoria antes y despus de que el usuario es consultado por
hechos adicionales. Por conveniencia, estamos usando la notacin DCG para
llevar alrededor del estadoimplcitamente .

Esta es una implementacin que hace esto:


animal (A): -
animales (Animales),
Conocido0 = [],
frase (any_animal (Animals, A), [Conocido0], _).

any_animal ([Animales | Animales], A) ->


any_animal_ (Animal, Animales, A).
cualquier animal (animal (A0, []), Animales, A) ->
({A0 = A}
; any_animal (Animales, A)
).
cualquier animal (animal (A0, [C | Cs]), Animales, A) ->
state0_state (Conocido0, Conocido),
{condition_truth (C, T, Conocido0, Conocido)},
next_animal (T, animal (A0, Cs), Animales, A).

next_animal (s, Animales, Animales, A) -> any_animal ([Animal |


Animales], A).
next_animal (no, _, Animals, A) -> any_animal (Animales, A).

state0_state (S0, S), [S] -> [S0].

Slo se deja para definir condition_truth / 4 : Dependiendo de lo que ya


se conoce , este predicado utiliza el conocimiento existente o consulta al
usuario para obtener ms informacin.

Para distinguir estos dos casos de manera pura, usamos el meta-predicado if_
/ 3:
condition_truth (is_true (Q), Answer, Conocido0, Conocido): -
if_ (conocido_ (Q, Respuesta, Conocido0),
Conocido0 = Conocido,
(formato ("~ w? \ n", [Q]),
lee (Respuesta),
Conocido = [conocido (Q, Respuesta) | Conocido0])).

known_ (Qu, Respuesta, Conocido, Verdad): -


if_ (memberd_t (conocido (qu, s), conocido),
(Respuesta = s, Verdad = verdad),
if_ (memberd_t (conocido (qu, no), conocido),
(Respuesta = no, Verdad = verdadero),
Verdad = falso)).

Y as, por fin, la pregunta ya no aparece redundante:


\ alpha - animal (A).
tiene piel
s
dice trama
|: no.
dice maullido
s

A = gato.

La separacin de la base de conocimiento de la forma en que se interpreta nos


ha permitido agregar caractersticas, dejando las reglas de inferencia sin
cambios.

Uso de una DSL diferente


Considere ahora otra forma de resolver exactamente el mismo
problema. Veamos la tarea de identificacin de animales como interpretacin
del siguiente diagrama de decisin , donde las lneas punteadas indican
que no , y las lneas planas indican que s :
En este caso, el diagrama es de hecho un rbol binario completo que puede
ser representado naturalmente usando trminos Prolog. Por ejemplo,
representemos el rbol de decisin de la siguiente manera, usando un trmino
de la forma if_then_else / 3 para cada nodo interno, y animal / 1 y false /
0 para las hojas:
rbol (if_then_else ('tiene piel',
if_then_else ('dice woof',
animal (perro),
if_then_else ('dice maullido',
animal (gato),
falso)),
if_then_else ('tiene plumas',
if_then_else ('dice charlatn',
animal (pato),
falso),
falso))).

Otros tipos de diagramas de decisin tambin se pueden representar


eficientemente con los trminos de Prolog.

Estos rboles se pueden interpretar de una manera directa, utilizando de nuevo


la definicin de is_true / 1 para consultar al usuario:
animal (A): -
rbol (T),
rbol_animal (T, A).

rbol_animal (animal (A), A).


tree_animal (if_then_else (Cond, Then, Else), A): -
(is_true (Cond) ->
tree_animal (Then, A)
; tree_animal (Else, A)
).

Nota : Este fragmento utiliza la construccin impura if-then-else. Esto es


lgicamente slido slo si la condicin es suficientemente instanciada, de
modo que su verdad puede determinarse sin prematuramente comprometerse a
una rama.

Dado que cada pregunta aparece como mucho una vez en cada camino desde
la raz a una hoja, es que no es necesario hacer un seguimiento de qu
preguntas ya han sido contestadas:
\ alpha - animal (A).
tiene piel
s
dice trama
|: no.
dice maullido
s
A = gato.

Comparacin de enfoques
Ahora hemos visto tres maneras diferentes de implementar un sistema experto
en Prolog:

implementacin directa de Prolog


idear e interpretar un lenguaje especfico del dominio
utilizando un lenguaje completamente diferente del dominio especfico.

Cada uno de estos enfoques era bastante fcil de implementar en Prolog, y hay
varios otros DSLs que tambin seran adecuados. La pregunta se plantea as:
Qu DSL, si es que hay alguno, debemos elegir implementar sistemas
expertos en Prolog? Consideremos brevemente los puntos principales que
hemos visto:

1. El uso de Prolog directamente es sencillo. Sin embargo, una


implementacin ingenua tiene algunos inconvenientes. En nuestro caso,
la misma pregunta se hizo innecesariamente repetidamente.
2. El uso de un lenguaje especfico de dominio nos permite separar
claramente la lgica principal del sistema experto de otras funciones,
como el seguimiento de las preguntas ya contestadas.
3. Una DSL basada en diagramas de decisin es muy fcil de interpretar y
evita automticamente las preguntas redundantes.

De estos puntos solo, la opcin (3) parece muy atractiva. Sin embargo,
tambin plantea algunas preguntas importantes: En primer lugar, cmo fue
incluso el diagrama de decisin obtenido , y lo hace fielmente modelar las
condiciones que queremos expresar? Es bastante fcil hacerlo a mano en este
ejemplo, pero cmo lo hara en casos ms complejos? En segundo lugar,
cun costosa es la transformacin de una base de hechos bastante directa-
como en la opcin (2) a usar diagramas de decisin en su lugar? En tercer
lugar, es realmente un buen diagrama, y qu queremos decir con
el bien ? Hay rdenes de nodos que nos permitan reducirel nmero de
preguntas? En el peor de los casos, en promedio, en el mejor de los casos? En
cuarto lugar, cun extensible es el lenguaje de los diagramas de decisin? Por
ejemplo, pueden modelarse todas las tareas de identificacin de animales de
esta manera? etc.

Estas preguntas muestran que la mejor opcin depende de muchos factores.


Ms sobre Prolog

pgina principal

También podría gustarte