Реализация сетевой модели вычислений с аксиоматической и рекурсивной формами задания функций и предикатов (бакалаврская работа), страница 5
Описание файла
PDF-файл из архива "Реализация сетевой модели вычислений с аксиоматической и рекурсивной формами задания функций и предикатов (бакалаврская работа)", который расположен в категории "". Всё это находится в предмете "дипломы и вкр" из 8 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "выпускные работы и поступление в магистратуру" в общих файлах.
Просмотр PDF-файла онлайн
Текст 5 страницы из PDF
Классы для объектов внутреннего представления НОpublic abstract class Base {public PrologView prolog = null;public abstract string GetTypeFunction();/// <summary>/// Пересчёт арности и построение прологпредставления/// </summary>/// <param name="recalc">Пересчитатьарность</param>/// <returns>true если удалость пересчиатьарность</returns>public abstract bool CalcArityLite(bool recalc =false);public virtual string Arity() {if (prolog == null) {return "No assigned";} else {return prolog.Arity.ToString();}}public virtual string FullString() {if (prolog != null)return prolog.Arity + ToString() + " = "+ prolog.ToString();elsereturn ToString();}48}public abstract class Function:Base {public RelationList Relation = newRelationList();public string Name;public Function(string Name) {//КонструкторLOGClass.Add(this.GetTypeFunction(),"Создание новой функции " + Name + " типа " +this.GetTypeFunction());this.Name = Name;if (Functions.Exists(p => (p != null) &&(p.Name == Name))) {LOGClass.Add(this.GetTypeFunction(),"Функцию нельзя добавитьв список " + Name);} elseFunctions.Add(this);}public static ListOfFunction Functions = newListOfFunction();//Попытка подстановки функции с номером input вдругие.
Функциям, которые зависят от input посылаетсякоманда пересчета арностиpublic static void Inject(int input) {Function f = input.GetFunction();LOGClass.Add(f.GetTypeFunction(),"Подстановка " + f + " в другие функции ");f.Relation.Inject(input);}//Статический конструктор - инициализацияконстантstatic Function() {LOGClass.Add("Static Function", " Созданиеконстант ");49new Constants("---", new Pair(1, 1), 1, 1);//0new Constants("-->", new Pair(1, 0), 1);//1new Constants("<--", new Pair(0, 1), 1);//2new Constants(">--", new Pair(2, 1), 1, 1,1);//3new Constants("--<", new Pair(1, 2), 1, 1,1);//4new Constants("]", new Pair(2, 0), 1, 1);//5new Constants("[", new Pair(0, 2), 1, 1);//6new Constants("><", new Pair(2, 2), 1, 2, 2,1);//7}public static implicit operator int(Function i){return Functions.IndexOf(i);}public override string ToString() {return Name;}public virtual bool AssignArity(Pair Arity) {LOGClass.Add(GetTypeFunction(), "Проверкаарности у " + this);//Если у функции задана арностьif (prolog != null) {//Если арность определения не совпадаетс арностью функииreturn prolog.Arity == Arity;} else {//Если у функции не задана арностьList<int> lstinput = Enumerable.Range(1,Arity.input).ToList();List<int> lstoutput =Enumerable.Range(Arity.input + 1,Arity.output).ToList();prolog = PrologView.Create(lstinput,lstoutput,50new List<Def>() { new Def() {name = this,input = lstinput,output = lstoutput } });LOGClass.Add(GetTypeFunction(), "Заданиеарности " + prolog.Arity + " для " + this);Inject(this);//Пытаемся подставить эту функцию вдругие}return true;}public override bool CalcArityLite(bool recalc =false) {return true;}public override string GetTypeFunction() {return "Function";}}//Класс для пользовательской функцииpublic class UserFunction:Function {public List<Definition> definition = newList<Definition>();//Определения функцииpublic UserFunction(string Name): base(Name) {//Конструктор}public bool AssignArity(Base def) {return AssignArity(def.prolog.Arity);}51/// <summary>/// Пересчитать арность функци/// </summary>public override bool CalcArityLite(bool recalc =false) {LOGClass.Add(GetTypeFunction(),"Пересчетарности для " + Name);definition = definition.Select(p => {if (p.Type == Definition.TType.Tree)if (p.Tree.CalcArityLite())//ВЫчисляем его.if (p.Tree.prolog != null)if (AssignArity(p.Tree)) {p.Upgrade(p.Tree.prolog);return p;// newDefinition(p.Tree.prolog);} elsethrow newException("Арности не совпадают");elsereturn null;elsereturn p;elsereturn p;}).Where(p => p != null).ToList();return true;}public override string GetTypeFunction(){return "UserFunction";}public static UserFunction CreateFunction(stringName, List<string[]> lst, string SArity = null) {Function maintmp =UserFunction.Functions.Where(p => (p != null) &&(p.Name == Name)).FirstOrDefault();52UserFunction main;if (maintmp == null) { //Если функции небылоLOGClass.Add("Saver", "Определяетсяновая функция " + Name);main = new UserFunction(Name);//Создадим её} else {if (maintmp is UserFunction) {main = maintmp as UserFunction;LOGClass.Add("Saver", "Найденафункция с именем " + Name);} elsethrow new Exception("C именем " +Name + " объявлен конструктор " +maintmp.prolog.ToString());}//В main лежит определяемая функцияif (SArity != null) {string[] arr = SArity.Split(')', '(',':'); //Отделяем имя от определенияarr = arr.Where(p => p != "").ToArray();if (arr.Length != 2)throw new Exception("Ошибка парсинга" + SArity);int input = Convert.ToInt16(arr[0]);int output = Convert.ToInt16(arr[1]);Pair inArity = new Pair(input, output);if (!main.AssignArity(inArity))throw new Exception("Арности несовпадают");}LOGClass.Add("Saver", "Создание дерева изсписка лексем ");TypeTree defin = CreateOperand(main, lst);//Определеие по списку токенов53LOGClass.Add("Saver", "Дерево создано: " +defin);LOGClass.Add("Saver", "Попытка созданияProlog представления: ");if (defin == null) {LOGClass.Add("Saver", "Дерево " + defin+ " редуцировалось к пустому");} else if (defin.Type ==TypeTree.TType.Tree) {if (defin.Tree.prolog != null) {LOGClass.Add("Saver", "Созданоprolog представление " + defin.Tree.prolog);if (main.AssignArity(defin.Tree)) {Definition d = newDefinition(defin.Tree);d.Upgrade(defin.Tree.prolog);main.definition.Add(d);} elsethrow new Exception("Арности несовпадают");} else {LOGClass.Add("Saver", "Не всезависимые функции определены");main.definition.Add(newDefinition(defin.Tree));List<int> relat =defin.Tree.GetRelation();foreach (int pt in relat) {Function.Functions[pt].Relation.Add(main);}}} else {if (defin.prolog != null)main.definition.Add(newDefinition(defin.Prolog));}return main;}public static UserFunction CreateProlog(stringName, List<string[]> lst, string SArity = null) {54Function maintmp =UserFunction.Functions.Where(p => (p != null) &&(p.Name ==Name)).FirstOrDefault();UserFunction main;if (maintmp == null) { //Если функции небылоLOGClass.Add("Saver", "Определяетсяновая функция " + Name);main = new UserFunction(Name);//Создадим её} else {if (maintmp is UserFunction) {main = maintmp as UserFunction;LOGClass.Add("Saver", "Найденафункция с именем " + Name);} elsethrow new Exception("C именем " +Name + " объявлен конструктор " + maintmp.prolog);}//В main лежит определяемая функцияif (SArity != null) {string[] arr = SArity.Split(')', '(',':'); //Отделяем имя от определенияarr = arr.Where(p => p != "").ToArray();if (arr.Length != 2)throw new Exception("Ошибка парсинга" + SArity);int input = Convert.ToInt16(arr[0]);int output = Convert.ToInt16(arr[1]);Pair inArity = new Pair(input, output);if(!main.AssignArity(inArity))throw new Exception("Арности несовпадают");}LOGClass.Add("Saver", "Создание прологпредставления из списка лексем ");55PrologWiewCreator pc = newPrologWiewCreator();PrologView defin = pc.CreatePrologView(main,lst);//Определеие по списку токеновif (defin != null) {LOGClass.Add("Saver", "Создано prologпредставление " + defin);if (main.AssignArity(defin.Arity))main.definition.Add(newDefinition(defin));elsethrow new Exception("Арности несовпадают");} elseLOGClass.Add("Saver", "Представление " +defin + " редуцировалось к пустому");return main;}static List<List<string[]>>TokenListToStruct(List<string[]> lst) {List<List<string[]>> result = newList<List<string[]>>();int countInt = 0;for (int i = 0; i < lst.Count; i++) {if (lst[i][0] == "$Константа") {if (countInt == 0)result.Add(new List<string[]>(){ lst[i] });elseresult.Last().Add(lst[i]);} else if (lst[i][0] == "$Имя") {if (countInt == 0)result.Add(new List<string[]>(){ lst[i] });elseresult.Last().Add(lst[i]);} else if (lst[i][0] == "$Рекурсия") {if (countInt == 0)56result.Add(new List<string[]>(){ lst[i] });elseresult.Last().Add(lst[i]);} else if (lst[i][0] == "$Операция") {if (countInt == 0)result.Add(new List<string[]>(){ lst[i] });elseresult.Last().Add(lst[i]);} else if (lst[i][0] =="$НачалоВСкобках") {if (countInt == 0)result.Add(newList<string[]>());elseresult.Last().Add(lst[i]);countInt++;} else if (lst[i][0] =="$КонецВСкобках") {countInt--;} else {throw new NotImplementedException();}}return result;}static TypeTree CreateOperand(UserFunction name,List<string[]> token) {List<List<string[]>> lst =TokenListToStruct(token);if (lst.Count == 1) { //Если всего 1лексема, то она опреандif (lst[0].Count == 1) {Function f = null;if (lst[0][0][0] == "$Константа") {f =UserFunction.Functions.Where(p => (p != null) &&57(p.Name ==lst[0][0][1])).FirstOrDefault();} else if (lst[0][0][0] == "$Имя") {f =UserFunction.Functions.Where(p => (p != null) &&(p.Name ==lst[0][0][1])).FirstOrDefault();if (f == null) {f = newUserFunction(lst[0][0][1]);}} else if (lst[0][0][0] =="$Рекурсия") {f = name;} else {throw new Exception("Errortype");}return f;} else {return CreateOperand(name, lst[0]);}} else {return TokenList_to_Tree(name, lst);}}static TypeTree TokenList_to_Tree(UserFunctionname, List<List<string[]>> token) {string stat = "";TypeTree operandl = null;TypeTree operandr = null;if (token.Count > 1) {operandl = CreateOperand(name,token[0]);if (operandl == null)return null;} else if (token.Count == 1) {return CreateOperand(name, token[0]);} else {throw new NotImplementedException();58}for (int i = 1; i < token.Count; i++) {// Преобразуем список операндов в списокдеревьевif (i % 2 == 0) {operandr = CreateOperand(name,token[i]);if (operandr == null)return null;if (stat == "*") {if ((operandl.Type ==TypeTree.TType.Tree) &&(operandl.Tree is LinearTree)) {operandl.Tree.operands.Add(operandr);} else {operandl = newLinearTree(operandl, operandr);}} else if (stat == "#") {if ((operandl.Type ==TypeTree.TType.Tree) &&(operandl.Tree is ParallelTree)) {operandl.Tree.operands.Add(operandr);} else {operandl = newParallelTree(operandl, operandr);}} else {throw newException("Неопределнная лексема " + stat);}if (operandl.CalcArityLite(true)) {if (operandl.Tree.prolog ==null) {//Дерево редуцировалось кпустомуreturn null;59}}} else { //Если вх лексема - опреаторif (token[i][0][0] != "$Операция")throw new Exception("Error");stat = token[i][0][1];}}//На этом этапе в памяти 1 опреанд.return operandl;}}public class Constants:Function {public Constants(string Name, Pair Arity,params int[] lst) : base(Name) {prolog = newPrologView(lst.Take(Arity.input), lst.Skip(Arity.input));}public override string GetTypeFunction() {return "Constant";}}class Constructor: Function {Constructor(string Name, Pair Arity) :base(Name) {List<int> lstinput = Enumerable.Range(1,Arity.input).ToList();List<int> lstoutput =Enumerable.Range(Arity.input+1, Arity.output).ToList();prolog = PrologView.Create(lstinput,lstoutput,new List<Def>() { new Def() {name = this,input = lstinput,output = lstoutput } }60);}public static Constructor Create(string SArity,string Name) {LOGClass.Add("Static Constructor" ,"Созданиеконструктора из " + SArity + Name);string[] arr = SArity.Split('+', ')', '(',':');//Отделяем имя от определенияarr = arr.Where(p => p != "").ToArray();if(arr.Length != 2)throw new Exception("Ошибка парсинга " +SArity);int input = Convert.ToInt16(arr[0]);int output = Convert.ToInt16(arr[1]);Pair Arity = new Pair(input, output);int result = Functions.FindIndex(p => (p !=null) && (p.Name == Name));if(result== -1) { //Если функции не былоLOGClass.Add("StaticConstructor","Конструктор " + Arity + Name + " ещё неупомянался ");Constructor c = new Constructor(Name,Arity); //Создадим еёreturn c;} else {LOGClass.Add("Static Constructor","Конструктор " + Arity + Name + " уже упомянался ");bool usl = (Functions[result] isUserFunction) && ((Functions[result] asUserFunction).definition.Count > 0);if (!(Functions[result] isUserFunction))usl = true;if((Functions[result].prolog == null) &&!usl) {61Constructor c = newConstructor(Name, Arity); //Создадим еёc.Relation =Functions[result].Relation;Functions[result] = c;Inject(result);return c;} else {throw new Exception("Функция " +result.GetFunction() + " уже определена");}}}public override string GetTypeFunction() {return "Constructor";}}5.