(*~\Глагол\Отделы\Иное\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                             ОТДЕЛ оБуквы;
(*============================================================================*)
(* НАЗНАЧЕНИЕ:                                                                *)
(*  обработка букв в допустимых азбуках - распознавание и преобразование букв *)
(*============================================================================*)

ПОСТ
                                                   (* номера допустимых азбук *)
  русскаяАзбука       = 0;
  украинскаяАзбука    = 1;
  белорусскаяАзбука   = 2;
  дореформеннаяАзбука = 3;
  латинскаяАзбука     = 4;

        (* "Известные Буквы" - буквы из азбучных цепочек в допустимых азбуках *)

(* 0 *)русскиеЗаглавные       = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
       русскиеСтрочные        = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
(* 1 *)украинскиеЗаглавные    = "АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯʼ";   
       украинскиеСтрочные     = "абвгґдеєжзиіїйклмнопрстуфхцчшщьюя’";   
(* 2 *)белорусскиеЗаглавные   = "АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШЫЬЭЮЯʼ";  
       белорусскиеСтрочные    = "абвгдеёжзійклмнопрстуўфхцчшыьэюя’";  
(* 3 *)дореформенныеЗаглавные = "АБВГДЕЁЖЗИІЙКЛМНОПРСТУФХЦЧШЩЪЫЬѢЭЮЯ#0472#0474";
                                                      (* &#1122;Ѣ"Ять" *)
       дореформенныеСтрочные  = "абвгдеёжзиійклмнопрстуфхцчшщъыьѣэюя#0473#0475";
                                                      (* &#1123;ѣ"ять" *)
(* 4 *)латинскиеЗаглавные     = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";    
       латинскиеСтрочные      = "abcdefghijklmnopqrstuvwxyz";    

           (*--- сюда ещё бы добавить греческую азбуку! ---*)

ВИД   (* 
         Предмет оБуквы.Вид = вид-НАБОР
                   "ПризнакиИзвестнойБуквы" - набор параметров принадлежности
                  переменной вида ЗНАК к одной из допустимых азбучных цепочек
       *)
  Вид- = НАБОР
       азбуки:МНОЖ;(* множество допустимых азбук с этой буквой: {0}/{1}/{2}/{3}/{4} *)
    заглавная,
     строчная:ЗНАК;                          (* пара букв из азбучных цепочек *)
  КОН;

     (* локальные переменные для задач отдела оБуквы.отд,
                                                  не видимые в других отделах *)
ПЕР        (*
               ряд из Предметов - наборов-признаков буквы из допустимых азбук
            *)
  рПризнаки_Известной_Буквы:РЯД 128 ИЗ оБуквы.Вид;
           (*
               сколько занято букв в ряду Предметов <рПризнаки_Известной_Буквы>
            *)
  всегоБукв:ЦЕЛ;
           (*
               ряд из номеров букв в ряду Предметов <рПризнаки_Известной_Буквы>
            *)
<*ЕСЛИ НЕ ЗАДАНО("МПГ") ТО*>

  рНомеров_всех_Известных_Букв:РЯД 10000H ИЗ ЯЧЦЕЛ; (* Уникоды Известных Букв *)
                 (* номерБуквы:РЯД 10000H ИЗ ЯЧЦЕЛ;*) (*    для каждого знака *)

<*ИНАЧЕ*>                    (* Малый ПГ*)

  рНомеров_всех_Известных_Букв:РЯД 10000H ИЗ   ЦЕЛ; (* Уникоды Известных Букв *)
                 (* номерБуквы:РЯД 10000H ИЗ   ЦЕЛ;*) (*    для каждого знака *)
<*КОН*>


(*-оооооооооооооо- опережающие определения/заготовки задач -ооооооооооооооооо-*)


(*-------------------------------------Общедоступные ЗАДАЧИ-------------------*)
ЗАДАЧА^
        Известная-(этойБуквы:ЗНАК):КЛЮЧ;    (* ВКЛ, если <этойБуквы> является "Известной Буквой" *)
ЗАДАЧА^
        Русская-(этойБуквы:ЗНАК):КЛЮЧ;      (* ВКЛ, если <этойБуквы> является русской буквой *) 
ЗАДАЧА^
        Украинская-(этойБуквы:ЗНАК):КЛЮЧ;   (* ВКЛ, если <этойБуквы> является украинской буквой *) 
ЗАДАЧА^
        Белорусская-(этойБуквы:ЗНАК):КЛЮЧ;  (* ВКЛ, если <этойБуквы> является белорусской буквой *) 
ЗАДАЧА^
        Дореформенная-(этойБуквы:ЗНАК):КЛЮЧ;(* ВКЛ, если <этойБуквы> является русской дореформенной буквой *) 
ЗАДАЧА^
        Латинская-(этойБуквы:ЗНАК):КЛЮЧ;    (* ВКЛ, если <этойБуквы> является латинской буквой *)
ЗАДАЧА^
        Заглавная-(буква:ЗНАК):КЛЮЧ;        (* ВКЛ, если <буква> является заглавной буквой *)
ЗАДАЧА^
        ВЗаглавную-(буква:ЗНАК):ЗНАК;  (* Переводит <буква> в заглавную букву *)
ЗАДАЧА^
        ВСтрочную-(буква:ЗНАК):ЗНАК;   (* Переводит <буква> в  строчную букву *)


(*=рррррррррррррррррррррррр= реализация задач =рррррррррррррррррррррррррррррр=*)


(*---------------------ряд Предметов -     локальная ЗАДАЧА-------------------*)
ЗАДАЧА 
       Азбуки(знак:ЗНАК):МНОЖ;
(*
 * Принадлежность <знак> к множеству допустимых азбук: {0},{1},{2},{3},{4}
 *)
УКАЗ
  ВОЗВРАТ рПризнаки_Известной_Буквы[
      рНомеров_всех_Известных_Букв[ВЦЕЛ(знак)]
                                   ].азбуки
КОН Азбуки;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       Известная-(этойБуквы:ЗНАК):КЛЮЧ;    (* ВКЛ, если <этойБуквы> является "Известной Буквой" *)
УКАЗ 
  ВОЗВРАТ  Азбуки(этойБуквы) # {}     (* не пустого множества *)
КОН Известная;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       Русская-(этойБуквы:ЗНАК):КЛЮЧ;      (* ВКЛ, если <этойБуквы> является русской буквой *) 
УКАЗ 
  ВОЗВРАТ русскаяАзбука В Азбуки(этойБуквы) 
КОН Русская; 

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       Украинская-(этойБуквы:ЗНАК):КЛЮЧ;   (* ВКЛ, если <этойБуквы> является украинской буквой *) 
УКАЗ 
  ВОЗВРАТ украинскаяАзбука В Азбуки(этойБуквы) 
КОН Украинская; 

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       Белорусская-(этойБуквы:ЗНАК):КЛЮЧ;  (* ВКЛ, если <этойБуквы> является белорусской буквой *) 
УКАЗ 
  ВОЗВРАТ белорусскаяАзбука В Азбуки(этойБуквы) 
КОН Белорусская; 

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       Дореформенная-(этойБуквы:ЗНАК):КЛЮЧ;(* ВКЛ, если <этойБуквы> является русской дореформенной буквой *) 
УКАЗ 
  ВОЗВРАТ дореформеннаяАзбука В Азбуки(этойБуквы) 
КОН Дореформенная;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       Латинская-(этойБуквы:ЗНАК):КЛЮЧ;    (* ВКЛ, если <этойБуквы> является латинской буквой *)
УКАЗ 
  ВОЗВРАТ латинскаяАзбука В Азбуки(этойБуквы) 
КОН Латинская;

(*~~~~~~~~~~~~~~~~~~~~~ряд Предметов - общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       Заглавная-(буква:ЗНАК):КЛЮЧ;        (* ВКЛ, если <буква> является заглавной буквой *)
УКАЗ
  ВОЗВРАТ буква = рПризнаки_Известной_Буквы[
              рНомеров_всех_Известных_Букв[ВЦЕЛ(буква)]
                                           ].заглавная 
КОН Заглавная;

(*~~~~~~~~~~~~~~~~~~~~~ряд Предметов - общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       ВЗаглавную-(буква:ЗНАК):ЗНАК;   (* Переводит <буква> в заглавную букву *)
ПЕР
  номер:ЦЕЛ;     (* номер в ряду <рПризнаки_Известной_Буквы> (из 128 наборов) *)
УКАЗ
       номер:=рНомеров_всех_Известных_Букв[ВЦЕЛ(буква)];
  ЕСЛИ
       номер = 0
  ТО
    ВОЗВРАТ буква
  КОН;
    ВОЗВРАТ рПризнаки_Известной_Буквы[номер].заглавная 
КОН ВЗаглавную;

(*~~~~~~~~~~~~~~~~~~~~~ряд Предметов - общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА 
       ВСтрочную-(буква:ЗНАК):ЗНАК;     (* Переводит <буква> в строчную букву *)
ПЕР
  номер:ЦЕЛ;     (* номер в ряду <рПризнаки_Известной_Буквы> (из 128 наборов) *)
УКАЗ
       номер:=рНомеров_всех_Известных_Букв[ВЦЕЛ(буква)];
  ЕСЛИ
       номер = 0
  ТО
    ВОЗВРАТ буква
  КОН;
    ВОЗВРАТ рПризнаки_Известной_Буквы[номер].строчная
КОН ВСтрочную;

(*---------------------ряд Предметов -     локальная ЗАДАЧА-------------------*)
ЗАДАЧА ПодготовитьАзбуки;
(*
 * Подготовить ряд Предметов <рПризнаки_Известной_Буквы>
 *)

 (*....................................................подЗадача........*)
  ЗАДАЧА ДобавитьАзбуку(рЗаглавные-,
                         рСтрочные-:ЦЕПЬ; номерАзбуки:ЦЕЛ);
  (*
     Добавляет в ряд <рПризнаки_Известной_Буквы> из <рЗаглавные> и <рСтрочные>
                  все знаки из азбучной цепочки и <номерАзбуки>              
     Добавляет в ряд <рНомеров_всех_Известных_Букв> новый <номер>=<всегоБукв>                  
   *)
  ПЕР
    место:ЦЕЛ; (* <место> в азбучной цепочке <рЗаглавные> и <рСтрочные> *)

   (*..................................................подподЗадача.....*)
    ЗАДАЧА ДобавитьБукву(заглавнаяБуква,
                          строчнаяБуква:ЗНАК; номерАзбуки:ЦЕЛ);
    ПЕР
      номер:ЦЕЛ;(* номер в ряду <рПризнаки_Известной_Буквы> (из 128 наборов) *)
    УКАЗ
           номер:=1;
      ПОКА
           номер < всегоБукв
      ВЫП
        ЕСЛИ
             рПризнаки_Известной_Буквы[номер].заглавная = заглавнаяБуква
        ТО                                    (* такая буква уже есть в других азбуках *)
    (* пополняем множество азбук с этой буквой *)
          рПризнаки_Известной_Буквы[номер].азбуки:=
          рПризнаки_Известной_Буквы[номер].азбуки+{номерАзбуки};
          ВОЗВРАТ 
        КОН;
        УВЕЛИЧИТЬ(номер)
      КОН;
    (* новая буква в ряду <рПризнаки_Известной_Буквы>,
                                                т.е. номер >= всегоБукв *)
      рПризнаки_Известной_Буквы[номер].азбуки:={номерАзбуки};
      рПризнаки_Известной_Буквы[номер].заглавная:=заглавнаяБуква;
      рПризнаки_Известной_Буквы[номер].строчная :=строчнаяБуква;

<*ЕСЛИ НЕ ЗАДАНО("МПГ") ТО*>
      рНомеров_всех_Известных_Букв[ВЦЕЛ(заглавнаяБуква)]:=УЗК(УЗК(номер));
      рНомеров_всех_Известных_Букв[ВЦЕЛ(строчнаяБуква)] :=УЗК(УЗК(номер));

<*ИНАЧЕ*>                    (* Малый ПГ*)

      рНомеров_всех_Известных_Букв[ВЦЕЛ(заглавнаяБуква)]:=номер;
      рНомеров_всех_Известных_Букв[ВЦЕЛ(строчнаяБуква)] :=номер;
<*КОН*>


      УВЕЛИЧИТЬ(всегоБукв)
    КОН ДобавитьБукву;

(*-zzzzzzzzzzzzzzzzzzzzzzzzzz ДобавитьАзбуку() zzzzzzzzzzzzzzzzzzzzzzzz-*)
  УКАЗ
    ОТ место:=0 ДО РАЗМЕР(рЗаглавные)-2 ВЫП
      ДобавитьБукву(рЗаглавные[место],рСтрочные[место],номерАзбуки)
    КОН
  КОН ДобавитьАзбуку;

(*-ssssssssssssssssssssssssss ПодготовитьАзбуки() sssssssssssssssssssss-*)
УКАЗ
                (* 0-я буква - пустышка *)
  всегоБукв:=1;                        (* в начале одна буква *)
                (* азбучные цепочки     *)                   (* <номерАзбуки> *)
  ДобавитьАзбуку(русскиеЗаглавные,      русскиеСтрочные,      русскаяАзбука);
  ДобавитьАзбуку(украинскиеЗаглавные,   украинскиеСтрочные,   украинскаяАзбука);
  ДобавитьАзбуку(белорусскиеЗаглавные,  белорусскиеСтрочные,  белорусскаяАзбука);
  ДобавитьАзбуку(дореформенныеЗаглавные,дореформенныеСтрочные,дореформеннаяАзбука);
  ДобавитьАзбуку(латинскиеЗаглавные,    латинскиеСтрочные,    латинскаяАзбука);

КОН ПодготовитьАзбуки;

(*-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-*)
УКАЗ
  ПодготовитьАзбуки
КОН оБуквы.

