XFL3: El lenguaje de especificación de Xfuzzy 3

Definición de funciones binarias

Las funciones binarias pueden ser asignadas al operador de conjunción (and), al operador de disyunción (or), a la función de implicación (imp) y al operador de agregación de reglas (also). La estructura de una definición de función binaria en un paquete de funciones es como sigue:

		binary identifier { blocks }                 

Los bloques que pueden aparecer en la definición de una función binaria son alias, parameter, requires, java, ansi_c, cplusplus, derivative y source.

El bloque alias se utiliza para definir nombres alternativos para identificar a la función. Cualquiera de esos identificadores puede ser usado para hacer referencia a la función. La sintaxis del bloque alias es:

		alias identifier, identifier, ... ;                    

El bloque parameter permite la definición de los parámetros de los que depende la función. El último identificador puede ir seguido de corchetes para definir una lista de parámetros. Su formato es:

		parameter identifier, identifier, ..., identifier[] ;                 

El bloque requires expresa las restricciones sobre los valores de los parámetros por medio de una expresión Booleana en Java que valida los valores de los parámetros. La estructura de este bloque es:

		requires { expression }                                  

Los bloques java, ansi_c y cplusplus describen el comportamiento de la función por medio de su descripción como el cuerpo de una función en los lenguajes de programación Java, C y C++, respectivamente. Las variables de entrada para estas funciones son 'a' y 'b'. El formato de estos bloques es el siguiente:

		java { Java_function_body } 
		ansi_c { C_function_body } 
		cplusplus { C++_function_body } 

El bloque derivative describe la derivada de la función con respecto a las variables de entrada 'a' y 'b'. Esta descripción consiste en una expresión Java de asignamiento a la variable 'deriv[]'. La derivada de la función con respecto a la variable de entrada 'a' debe ser asignada a 'deriv[0]', mientras que la derivada de la función con respecto a la variable de entrada 'b' debe ser asignada a 'deriv[1]'. La descripción de la derivada de la función permite propagar la derivada de la función de error del sistema utilizada por los algoritmos de aprendizaje supervisado basados en gradiente descendente. El formato es:

		derivative { Java_expressions }                             

El bloque source es utilizado para definir código Java que es directamente incluido en el código de la clase generada para la definición de la función. Este código nos permite definir métodos locales que pueden ser empleados dentro de otros bloques. La estructura es:

		source { Java_code }                                         

El siguiente ejemplo muestra la definición de la T-norma mínimo, también usada como función de implicación de Mamdani.

binary min {
   alias mamdani;
   java { return (a<b? a : b); }
   ansi_c { return (a<b? a : b); }
   cplusplus { return (a<b? a : b); }
   derivative {
    deriv[0] = (a<b? 1: (a==b? 0.5 : 0));
    deriv[1] = (a>b? 1: (a==b? 0.5 : 0));
   }
  }

Para comentarios, sugerencias, notificación de bugs, etc. contacte con nosotros en:   xfuzzy-team@imse-cnm.csic.es

©IMSE-CNM 2018