Модуль, необходимый для инициализации нечеткой модели из fis-файла:
## Код:
```
MODULE FuzzyFIS;

   IMPORT IniFile, TextModels, Strings;
      
   TYPE
      String = ARRAY 35 OF CHAR;
      FIS* = RECORD
         ModelType-, AndMethod-, OrMethod-,
         ImpMethod-, AggMethod-, DefuzzMethod-: String;
         InMFsParamReal-, OutMFsParamReal-: POINTER TO ARRAY OF POINTER TO ARRAY OF POINTER TO ARRAY OF REAL;
         OutRange-: POINTER TO ARRAY OF ARRAY 2 OF REAL;
         InMFsType-, OutMFsType-: POINTER TO ARRAY OF POINTER TO ARRAY OF String;
         InRuleLabel-, OutRuleLabel-: POINTER TO ARRAY OF ARRAY OF INTEGER;
         TypeImpl-: POINTER TO ARRAY OF INTEGER;
      END;
            
   PROCEDURE SpaceNum (IN str: ARRAY OF CHAR): INTEGER;
      VAR spacenum, i: INTEGER; 
   BEGIN
      spacenum := 0;
      FOR i := 0 TO LEN(str$) - 1 DO
         IF str[i] = ' ' THEN INC(spacenum) END;
      END;
      RETURN spacenum; 
   END SpaceNum; 
   
   PROCEDURE StrToRealArray(IN str: ARRAY OF CHAR; OUT ra: ARRAY OF REAL);
      VAR i, j, start, res: INTEGER;
         rl: REAL; num: String;
   BEGIN
      j := 0;
      FOR i := 0 TO LEN(ra) - 1 DO
         start := j;
         WHILE (j <= LEN(str$)) & (str[j] # ' ') DO INC(j) END;
         Strings.Extract(str, start, j - start, num);
         Strings.StringToReal(num, rl, res);
         IF (res # 1) & (res # 2)  THEN ra[i] := rl ELSE ra[i] := 0 END;
         INC(j);
      END;
   END StrToRealArray;

   PROCEDURE StrToIntArray(IN str: ARRAY OF CHAR; OUT ri: ARRAY OF INTEGER);
      VAR i, j, start, res: INTEGER;
         rl: INTEGER; num: String;
   BEGIN
      j := 0;
      FOR i := 0 TO LEN(ri) - 1 DO
         start := j;
         WHILE (j <= LEN(str$)) & (str[j] # ' ') DO INC(j) END;
         Strings.Extract(str, start, j - start, num);
         Strings.StringToInt(num, rl, res);
         IF (res # 1) & (res # 2)  THEN ri[i] := rl ELSE ri[i] := 0 END;
         INC(j);
      END;
   END StrToIntArray;
   
   PROCEDURE GetLingVarSettigs (IN SectionName: String; VAR MFsParamReal: POINTER TO ARRAY OF POINTER TO ARRAY OF REAL; VAR MFsType: POINTER TO ARRAY OF String);
      VAR NumMFs, j, strlen, start: INTEGER;
         MFName: String; SettingsString, ParamString: String; 
   BEGIN
      IniFile.ReadInteger(SectionName, 'NumMFs', NumMFs);
      NEW(MFsParamReal, NumMFs);
      NEW(MFsType, NumMFs);
      FOR j := 0 TO NumMFs - 1 DO
         Strings.IntToString(j+1, MFName);
         MFName := 'MF' + MFName;
         IniFile.ReadString(SectionName, MFName, SettingsString);
         Strings.Find(SettingsString, '[', 0, start); INC(start);
         strlen := LEN(SettingsString$) - start - 1;
         Strings.Extract(SettingsString, start, strlen, ParamString);
         NEW(MFsParamReal[j], SpaceNum(ParamString) + 1);
         StrToRealArray(ParamString, MFsParamReal[j]);
         Strings.Find(SettingsString, ':', 0, start);
         INC(start, 2);
         Strings.Find(SettingsString, ',', 0, strlen);
         DEC(strlen, start); DEC(strlen);
         Strings.Extract(SettingsString, start, strlen, MFsType[j]);
      END;
   END GetLingVarSettigs;

   PROCEDURE GetRules(VAR fis: FIS; NumRules, NumInputs, NumOutputs: INTEGER);
      VAR ParamString: String;
         start, strlen, i, res: INTEGER;
         strs: POINTER TO ARRAY OF String;
   BEGIN
      NEW(fis.InRuleLabel, NumRules, NumInputs);
      NEW(fis.OutRuleLabel, NumRules, NumOutputs);
      NEW(fis.TypeImpl, NumRules);   
      NEW(strs, NumRules);   
      IniFile.ReadSection('Rules', strs);
      FOR i := 0 TO NumRules - 1 DO
         Strings.Find(strs[i], ',', 0, start); INC(start, 2);
         Strings.Find(strs[i], '(', 0, strlen); DEC(strlen, start); DEC(strlen);
         Strings.Extract(strs[i], start, strlen, ParamString);
         StrToIntArray(ParamString, fis.OutRuleLabel[i]);
         strlen := start - 2;
         Strings.Extract(strs[i], 0, strlen, ParamString);
         StrToIntArray(ParamString, fis.InRuleLabel[i]);
         Strings.Find(strs[i], ':', 0, start); INC(start, 2); 
         strlen := LEN(strs[i]$) + 1 - start;
         Strings.Extract(strs[i], start, strlen, ParamString);
         Strings.StringToInt(ParamString, fis.TypeImpl[i], res);
      END;
   END GetRules;
   
   PROCEDURE ReadString(IN variable: ARRAY OF CHAR; OUT res: ARRAY OF CHAR);
      VAR str: String; i, j: INTEGER;
   BEGIN
      IniFile.ReadString('System', variable, str);
      j := 0;
      FOR i := 0 TO LEN(str$) - 1 DO
         IF str[i] # "'" THEN
            res[j] := str[i];
            INC(j)
         END;
      END;
   END ReadString;
      
   PROCEDURE (VAR fis: FIS) LoadFrom* (t: TextModels.Model), NEW;
      VAR i, NumInputs, NumOutputs, NumRules: INTEGER;
         SectionName, Range: String; stop: INTEGER;
         str: ARRAY 4 OF CHAR;
   BEGIN
      IniFile.ConnectTo(t);
      ReadString('Type', fis.ModelType);
      ReadString('AndMethod', fis.AndMethod);
      ReadString('OrMethod', fis.OrMethod);
      ReadString('ImpMethod', fis.ImpMethod);
      ReadString('AggMethod', fis.AggMethod);
      ReadString('DefuzzMethod', fis.DefuzzMethod);
      IniFile.ReadInteger('System', 'NumInputs', NumInputs);
      IniFile.ReadInteger('System', 'NumOutputs', NumOutputs);
      IniFile.ReadInteger('System', 'NumRules', NumRules);
      NEW(fis.InMFsParamReal, NumInputs);
      NEW(fis.InMFsType, NumInputs);
      FOR i := 0 TO NumInputs - 1 DO
         Strings.IntToString(i+1, str);
         SectionName := 'Input' + str;
         GetLingVarSettigs(SectionName, fis.InMFsParamReal[i], fis.InMFsType[i])
      END;
      NEW(fis.OutMFsParamReal, NumOutputs);
      NEW(fis.OutMFsType, NumOutputs);
      NEW(fis.OutRange, NumOutputs);
      FOR i := 0 TO NumOutputs - 1 DO
         Strings.IntToString(i+1, str);
         SectionName := 'Output' + str;
         GetLingVarSettigs(SectionName, fis.OutMFsParamReal[i], fis.OutMFsType[i]);
         IniFile.ReadString(SectionName, 'Range', Range);
         Strings.Find(Range, ']', 0, stop);
         Strings.Extract(Range, 0, stop, Range);
         StrToRealArray(Range, fis.OutRange[i]);
      END;
      GetRules(fis, NumRules, NumInputs, NumOutputs);
   END LoadFrom;

END FuzzyFIS.
```
