Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/263273690
READS
15
1 author:
Alberto Pacheco
Instituto Tecnolgico de Chihuahua
34 PUBLICATIONS 24 CITATIONS
SEE PROFILE
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.
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.
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 ), !.
% 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)), !.