Пример #1
0
 public static Конус AddLocal(Конус word)
 {
     //Пробуем вычислить морфизм как функтор
     if (Функтор.ЭтоФунктор(word))
     {
         //TODO: определить условия вычисления функтора: если он был ранее вычислен, нужно ли его вычислять заново?
         //Вероятно нужно определить функторы, которые зависят от области и кообласти - их вычислять надо всегда.
         //Остальные функторы вычислять можно один раз.
         Dictionary <string, Конус> результат = Функтор.ВычислитьФунктор(word);
         foreach (string key in результат.Keys)
         {
             Storage.AddLocal(результат[key]);
         }
         word.ДобавитьВКообласть(результат.Values);
         Local[word.Имя] = word;
     }
     if (!Local.ContainsKey(word.Имя))
     {
         Local[word.Имя] = word;
     }
     return(Local[word.Имя]);
 }
Пример #2
0
        private static Dictionary <string, Конус> ВычислитьКопредел(Dictionary <string, Конус> list)
        {
            Dictionary <string, Конус> результат = new Dictionary <string, Конус>();
            Dictionary <string, Конус> область   = new Dictionary <string, Конус>(list);
            int приращение;

            do
            {
                приращение = 0;
                область    = Функтор.ВычислитьОбласть(область);
                foreach (string key in область.Keys)
                {
                    if (!результат.ContainsKey(key))
                    {
                        //Если здесь добавить  результат.Add(m), то будет не предел, а фильтр - все элементы будут включены в список результатов
                        приращение++; //количество добавленных в итерации элементов конуса
                    }
                }
                результат = область;
            } while (приращение > 0);
            return(результат);
        }
Пример #3
0
 //Функция сравнения с шаблоном слова возвращает истину если:
 // - шаблон w - это символ '_' ("любой");
 // - все элементы шаблона совпадают кроме '_'.
 public bool СоответствуетШаблону(Конус w)
 {
     if (Функтор.ЭтоФунктор(w))
     {
         Dictionary <string, Конус> шаблоны = Функтор.ВычислитьФунктор(w);
         return(СоответствуетШаблону(шаблоны.Values));
     }
     else
     {
         if (w.Имя == ЛюбойСимвол)
         {
             return(true);                        //для символа шаблона "любой" функция возвращает истину
         }
         if (Элементы.Length != w.Элементы.Length)
         {
             return(false);                                       // Если количество элементов в словах не равно, то слова не равны
         }
         if (Имя == w.Имя)
         {
             return(true);                     //слова равны, если их строковые представления равны
         }
         if (Элементы.Length == 0)
         {
             return(false);                      //если слово односложное и имена не равны, то слова не равны
         }
         // Поэлементное сравнение
         for (int i = 0; i < Элементы.Length; i++)
         {
             if (!Элементы[i].СоответствуетШаблону(w.Элементы[i]))
             {
                 return(false);
             }
         }
         return(true);    //Поэлементное сравнение дало положительный ответ
     }
 }