XFL3: El lenguaje de especificación de Xfuzzy 3

Definición de funciones no difusas

Las funciones no difusas se utilizan para describir operaciones matemáticas entre variables con valores no difusos. Estas funciones pueden ser asignadas a bloques no difusos que pueden incluirse en la definición de la jerarquía modular de los sistemas difusos. La estructura de la definición de una función no difusa es como sigue:

		crisp identifier { blocks }                     

Los bloques que pueden aparecer en la definición de una función no difusa son: alias, parameter, requires, inputs, java, ansi_c, cplusplus 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 }                     

El bloque inputs define el número de variables de entrada de la función no difusa por medio de una expresión Java que devuelve un valor entero. La sintaxis de este bloque es:

		inputs { Java_function_body }                     

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. La variable 'x[]' contiene los valores de la variable de entrada. El formato de estos bloques es el siguiente:

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

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 una función que suma N variables de entrada.

 crisp addN {
    parameter N;
    requires { N>0 }
    inputs { return (int) N; }
    java { 
     double a = 0;
     for(int i=0; i<N; i++) a+=x[i];
     return a;
    }
    ansi_c { 
     int i;
     double a = 0;
     for(i=0; i<N; i++) a+=x[i];
     return a;
    }
    cplusplus { 
     double a = 0;
     for(int i=0; i<N; i++) a+=x[i];
     return a;
    }
   } 

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

©IMSE-CNM 2018