Sei sulla pagina 1di 5

See

discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/263273690

Reglas Difusas en Prolog


Conference Paper January 1997

READS

15

1 author:
Alberto Pacheco
Instituto Tecnolgico de Chihuahua
34 PUBLICATIONS 24 CITATIONS
SEE PROFILE

Available from: Alberto Pacheco


Retrieved on: 01 August 2016

REGLAS DIFUSAS EN PROLOG


M.C. Alberto Pacheco Gonzlez
Divisin de Estudios de Posgrado e Investigacin
Instituto Tecnolgico de Chihuahua
Ave. Tecnolgico 2909
31310 Chihuahua, Chih., Mxico
e-mail: apacheco@itch.edu.mx

Resumen.
El presente artculo describe un shell
desarrollado para soportar la interpretacin de reglas
basadas en Lgica Difusa. La notacin de las reglas y los
mtodos de resolucin del intrprete son sencillos y
adaptables. La herramienta permite representar tanto
modelos precisos como aproximados usando reglas IFTHEN discretas y difusas.

En conclusin, segn sea la precisin de la heurstica, es el


tipo de representacin. Dado que el objetivo es desarrollar
una herramienta que proporcione las formas de representacin mencionadas, el resto del artculo describe el sistema
desarrollado (incluyendo el cdigo completo del mismo).

II. DESCRIPCION DEL SISTEMA.


I. REPRESENTACIN DEL CONOCIMIENTO.
Sean tres formas de representar el conocimiento
heurstico en un sistema experto:
1.1 Usando Lgica de Predicados, e.g. p q r. Obliga a
definir lmites estrictos y precisos. De la misma manera, las
decisiones son igual de estrictas independientemente de la
magnitud en la veracidad de los antecedentes, misma
magnitud que se ignora, i.e. prdida de informacin; adems,
los resultados contradictorios son irreconciliables, i.e. tienen
el mismo peso. Ejemplo de representacin:

2.1 FLUJO DEL PROGRAMA. Tomando como referencia


el listado del anexo y la ilustracin de la fig. 1, el sistema
inicia en el predicado main a partir de la especificacin de un
objetivo. Primero se inicializa la memoria global de trabajo
en el predicado init, 2.2 (es decir, en la nota 2.2 del listado).
Luego se evaluan todas las reglas que infieran el objetivo
provisto, predicado probe 2.3. Finalmente se calcula y
reporta el valor de salida, 2.4.

if
densidad-trafico < 20
and peatones < 5
then tiempo-verde = 10.
1.2 Usando factores de certidumbre. Supera varias
deficiencias del mtodo anterior pero su notacin es
inflexible y puede fcilmente llegar a excluir ciertos espacios
de solucin. Por otra parte, su ajuste es tedioso, dado que
involucra cambiar la codificacin de ms de una regla.
Ejemplo de representacin:
if
densidad-trafico=baja
and peatones=pocos
then tiempo-verde=reducido cnf 75.
1.3 Usando Lgica Difusa. Permite expresar y ajustar con
mayor naturalidad y simplicidad la incertidumbre,
ambigedad o imprecisin de una heurstica, cualidades muy
comunes en los sistemas reales. Ejemplo de representacin:
if
trafico
is
and peatones
is
then tiempo-verde is

reducido
casi nulo
reducido.

Fig. 1. Flujo del Programa.


2.2 CASO ILUSTRATIVO. Como ejemplo ilustrativo para
explicar la herramienta, se considera un pequeo sistema
experto para asistir en el diagnstico sobre el grado de
afinacin de un automotor similar al reportado en [1]. El
sistema de ejemplo tiene tres entradas y una salida, i.e.
niveles de concentracin de tres gases: CO, CO2 y HC, as
como el resultado del diagnstico: carburacin pobre, buena
y rica. Dicha conclusin se infiere a partir de una pequea
base de conocimiento compuesta por cuatro reglas difusas,

3.R1-R4. En [2] se detalla un sistema experto ms elaborado


y completo que aplica el shell descrito aqu.
2.3 NOTACION DE LAS REGLAS DIFUSAS. Como
puede observarse las reglas son del tipo IF-THEN simple.
Esta notacin (ajena a Prolog) se logra definiendo:
a) Reglas sintcticas (1). En gran medida se reutiliza las
capacidades de cierto intrprete de Prolog en particular
(Amzi! Prolog 3.3 IDE para Windows que es de dominio
pblico, bajo ciertas restricciones y puede accesarse va
Internet en ftp://ftp.amzi.com/pub/users/amzi). En esencia, es
en 1 donde se definen los smbolos reservados para los
nuevos operadores.
b) Reglas semnticas (7). El predicado prove en 7.1-3
interpreta expresiones para los operadores and, or, is
respectivamente. El predicado getav resuelve la segunda
parte del operador is, verificando si es parte de una premisa
(7.5), o bien de una conclusin (7.4).
En [3] se propone y explica ms a detalle esta tcnica de
traduccin que permite expresar con elegancia las reglas IFTHEN en Prolog.
2.4 INTERPRETACIN DE REGLAS DIFUSAS. Implica
el clculo de los valores de membresa (2.5), la conjuncin de
los mismos para obtener el valor de cada conclusin y
finalmente la derivacin del valor de salida (2.6), i.e. mtodo
del centroide.
2.5. VALORES DE MEMBRESIA. El clculo de los
valores de membresa de cada variable se lleva a cabo
precisamente en el predicado getav (7.5) a travs del
predicado trad (8), mismo que decide si se trata de un
conjunto difuso (8.1) o discreto (8.2). Si es difuso, el predicado fz (9) obtiene:
a) Los datos del conjunto a partir de las definiciones de las
formas de los conjuntos en los predicados conj en 4.
b) De acuerdo con el tipo de curva del conjunto, ya sea lineal,
trapezoidal o triangular, se calcula en el predicado
calc_memb (10) el valor de membresa de la variable para
el valor de entrada dado sobre el conjunto a comparar.
c) Una vez obtenido su valor de membresa se inserta en una
pila global dicho valor, i.e. predicado prem.
2.6 OPERADORES DIFUSOS. Como se describi en 2.3.b
el predicado prove analiza los operadores and y or. Lugar
mismo donde se unifica el predicado calc-op de acuerdo con
el operador indicado, el cual bsicamente reduce los valores
existentes en la pila de valores de membresa de las ltimas
dos premisas analizadas. ES POSIBLE AGREGAR MAS
OPERADORES DIFUSOS en el predicado calc-op, o bien
SUSTITUIR EL TIPO DE OPERADOR and en el predicado
prove, e.g. conjuncin por productos.

2.7 COMPOSICION DEL VALOR DE SALIDA.


Conforme se ejecuta cada conclusin de regla en el predicado
getav (7.4), con su valor de membresa se calcula
acumulativamente el centroide. Posteriormente, cuando se
han probado todas las reglas y obtenido todas las
conclusiones posibles, se agota el backtracking del predicado
onegoal de 2.3 y consecuentemente se calcula el valor final
del centroide en el predicado salida (13), teniendo la
precaucin de evitar la posibilidad de efectuar una divisin
sobre cero (13.2) y finalmente se reporta el valor de la salida
(2.4).
III. RESULTADOS Y CONCLUSIONES
El shell desarrollado permite efectivamente representar el
conocimiento de un sistema experto utilizando reglas difusas
(y discretas). La notacin es simple y natural, y permite usar
reglas discretas tradicionales en dos formatos: ya sea tipo IFTHEN o tipo Prolog, i.e. p :- q. El shell es flexible, permite
modificar las especificaciones y tipos de los conjuntos, los
valores de entrada e incluso el tipo de operadores difusos, y
hasta si las restricciones de rendimiento lo exigen, llamar a
cdigo en lenguaje C en la versin profesional [4]. Por otra
parte el sistema es adaptable, dado que permite agregar ms
tipos de curvas, e.g. sigmoide, gaussiana, etc. Agregar
tambin otro mtodo de composicin, ms operadores,
conjuntos, reglas, entradas y salidas sin necesidad de alterar
la arquitectura del sistema. Finalmente, la herramienta an en
etapa experimental, se ofrece al pblico en general, y el autor
acepta cualquier crtica, comentario o mejora hecha a la
misma, con el nico propsito de mejorar y comenzar a
probar dicha herramienta contribuyendo as a la aplicacin de
tcnicas que pueden ser de utilidad en la solucin de
problemas que manejan incertidumbre y ambigedad.
Actualmente se cuentan con otros prototipos de este tipo de
herramientas en lenguaje C/C++, Matlab y Excel.
REFERENCIAS
[1] O. A. Prez, Software para el Anlisis de Gases Automotrices utilizando Lgica Difusa, Tesis Maestra, DEPI,
IT Chihuahua, 1996.
[2] A. Pacheco, Evaluacin de Horarios Escolares Aplicando
Sistemas Basados en Reglas Difusas, Proc. Electro 96,
DEPI, IT Chihuahua, 1996.
[3] D. Merrit, Building Custom Rule Engines, PC AI,
Mar/Abr. 1996, pp. 23-31.
[4] G.Weismann, Building an Expert System, Dr. Dobbs
Journal, Agosto 1996, pp. 84-87.

ANEXO. Listado del programa en Amzi! Prolog que soporta el uso de reglas IF-THEN difusas en Prolog.
/*
RD.PRO
ALBERTO PACHECO, DEPI, ITCH, NOV-96
Amzi! Prolog 3.3 IDE
USE: main.
*/
% 1. DEFINICION
:- op(700, xfx,
:- op(720, xfy,
:- op(740, xfy,
:- op(760, xfx,
:- op(780, fx,

DE OPERADORES
is).
and).
or).
then).
if).

% 2. INICIO-PROGRAMA
main :- % 2.1 %
init(carb), onegoal(carb).
init(Var) :- % 2.2 %
retractall(_),
assert(sum1(Var,0.0)),
assert(sum2(Var,0.0)),!.
onegoal(Var) :- % 2.3 %
prove( Var is X ),
write( Var - X ), nl,
fail.
onegoal(Var) :- % 2.4 %
nl, write('Valor de Salida'),
salida(Var,X),
nl, write(Var - X).
% 3. REGLAS DIFUSAS DEL S. EXPERTO
% R-1 %
if
co
is bajo
and
hc
is bajo
and
co2 is alto
then carb is ok.
% R-2
if
and
and
then

%
co
hc
co2
carb

is
is
is
is

alto
alto
medio
rica.

% R-3
if
and
and
then

%
co
hc
co2
carb

is
is
is
is

medio
bajo
alto
rica.

% R-4
if
and
and
or
then

%
co
hc
co2
co2
carb

is
is
is
is
is

bajo
bajo
medio
bajo
pobre.

% 4. VARIABLES-MODELO %
% 4.1 CO
conj(co,
conj(co,
conj(co,
% 4.2 CO2
conj(co2,
conj(co2,
conj(co2,

%
bajo, dt, 0.0, 1.0, 0.0, 0.0).
medio, tp, 0.3, 1.0, 1.0, 1.7).
alto, at, 1.0, 2.5, 0.0, 0.0).
%
bajo, dt, 7.0, 8.5, 0.0, 0.0).
medio, tp, 7.5, 8.5, 8.5,10).
alto, at, 8.5, 15, 0.0, 0.0).

% 4.3 HC %
conj( hc, bajo, dt, 150, 275, 0.0, 0.0).
conj( hc, alto, at, 150, 600, 0.0, 0.0).
% 5. SALIDA (SINGLETON) %
conj(carb, pobre, sg, 5, 0.0, 0.0, 0.0).
conj(carb, ok, sg, 10, 0.0, 0.0, 0.0).
conj(carb, rica, sg, 15, 0.0, 0.0, 0.0).
% 6. VALORES DE ENTRADA %
entrada( 1, co,
3.10 ).
entrada( 1, hc, 397.00 ).
entrada( 1, co2,
8.20 ).
% 7. INTERPRETE DE REGLAS %
prove(ATTR is VALUE and REST):- % 7.1 %
getav(ATTR, VALUE),
prove(REST),
calc-op(and_z).
prove(ATTR is VALUE or REST):- % 7.2 %
getav(ATTR, VALUE),
prove(REST),
calc-op(or_z).
prove(ATTR is VALUE):- % 7.3 %
getav(ATTR,VALUE).
getav(ATTR,VALUE):- % 7.4 %
if CONDITIONS then ATTR is VALUE,
prove(CONDITIONS),
retract(prem(Mx)),
centroide(ATTR,VALUE,Mx).
getav(ATTR,VALUE):- % 7.5 %
not(if _ then ATTR is _),
trad(ATTR,VALUE).
% 8. SELECTOR BOOL/FUZZY %
trad( T, Cj ) :- /* 8.1 DIFUSO */
clause(conj(T,_,_,_,_,_,_), _), !,
entrada( _, T, X ), !,
fz( T, Cj, X ).
trad( T, Cj ) :- /* 8.2 BOOLEANO */
entrada( _, T, Cj ), !,
isTrue.

% 9. FUSIFICACION %
fz( N, Cj, X ) :conj( N, Cj, T, A, B, C, D ),
calc_memb( T, A, B, C, D, X, M ),
assert(prem(M)), !.
% 10.1 LINEAL DESCENDENTE (dt) %
calc_memb( dt, A, _, _, _, X, 1.0 ) :X =< A, !.
calc_memb( dt, _, B, _, _, X, 0.0 ) :X >= B, !.
calc_memb( dt, A, B, _, _, X, M ) :calc_linea( dt, A, B, X, M ), !.
% 10.2 LINEAL ASCENTENTE (at) %
calc_memb( at, A, _, _, _, X, 0.0 ) :X =< A, !.
calc_memb( at, _, B, _, _, X, 1.0 ) :X >= B, !.
calc_memb( at, A, B, _, _, X, M ) :calc_linea( at, A, B, X, M ), !.

% 12. CENTROIDE PARA SINGLETON %


centroide(Var,Sg,Memb) :conj(Var,Sg,sg,S,_,_,_),!,
P is (S*Memb),
retract(sum1(Var,Q)),
R is (P+Q),
assert(sum1(Var,R)),
retract(sum2(Var,N)),
M is (Memb+N),
assert(sum2(Var,M)),
write('Centroide: '),
write(Var - R/M), nl,!.
% 13. CALCULA VALOR FINAL %
salida(Var,X) :- % 13.1 %
retract(sum1(Var,P)),
retract(sum2(Var,Q)),
P > 0.0,
Q > 0.0,!,
X is P/Q.
salida(_,0.0) :- !. % 13.2 %
% 14. ECUACION DE LA RECTA %

% 10.3 TRAPEZOIDAL / TRIANGULAR %


calc_memb( tp, A, _, _, _, X, 0.0 ) :X =< A, !.
calc_memb( tp, A, B, _, _, X, M ) :X > A, X =< B,
calc_linea( at, A, B, X, M ), !.
calc_memb( tp, _, B, C, _, X, 1.0 ) :X > B, X < C, !.
calc_memb( tp, _, _, C, D, X, M ) :X > C, X < D,
calc_linea( dt, C, D, X, M ), !.
calc_memb( tp, _, _, _, _, _, 0.0 ).

% 14.1 DESCENDENTE %
calc_linea( dt, X1, X2, X, Y ) :Y is (X2 - X) / (X2 - X1).

% 11. OPERADORES %
calc-op( and_z ) :retract(prem(M1)), write(M1),
retract(prem(M2)), !,
write(' and '-M2), nl,
min(M1,M2,M),
assert(prem(M)), !.
calc-op( or_z ) :retract(prem(M1)),
retract(prem(M2)),!,
max(M1,M2,M),
assert(prem(M)), !.

% 15.2 FALSE %
isFalse :- assert(prem(0.0)), !.

% 14.1 ASCENDENTE %
calc_linea( at, X1, X2, X, Y ) :Y is (X - X1) / (X2 - X1).
% 15. VALORES BOOLEANOS %
% 15.1 TRUE %
isTrue :- assert(prem(1.0)), !.

% 16. PRED. P/ OPERADORES %


min( X, Y, X ) :- X < Y, !.
min( _, Y, Y ).
max( X, Y, X ) :- X > Y, !.
max( _, Y, Y ).

Potrebbero piacerti anche