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.Имя]); }
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(результат); }
//Функция сравнения с шаблоном слова возвращает истину если: // - шаблон 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); //Поэлементное сравнение дало положительный ответ } }