Реализация сетевой модели вычислений с аксиоматической и рекурсивной формами задания функций и предикатов (бакалаврская работа)
.pdf80
public void Check() { Label1:
bool res = check(); if (res)
goto Label1; else {
defs.Reverse(); res = check(); if (res)
goto Label1;
}
}
public List<Pair> Return() { return defs;
}
}
8. Классы для работы с деревьями public class Tree : Base
{
public Tree(params TypeTree[] lst) { operands = lst.ToList();
}
public Tree(PrologView pv) : base() { prolog = pv;
}
protected Func<PrologView, PrologView, PrologView> AggregateFunction;
public List<TypeTree> operands = new List<TypeTree>();
///<summary>
///Вычисление характеристик дерева
///</summary>
///<returns>true - дерево можно заменить на
пролог представление</returns>
public override bool CalcArityLite(bool recalc =
false) {
81
LOGClass.Add(GetTypeFunction(), "Попытка создания Prolog представления для дерева " + this);
if (recalc)
prolog = null; if (prolog == null)
return CalcArity(recalc); else {
LOGClass.Add(GetTypeFunction(), "Представление уже создано " + prolog);
return true;
}
}
///<summary>
///Вычисление арности дерева
///</summary>
///<returns>true если арность удалось
вычислить, иначе false</returns>
bool CalcArity(bool lite = false) { if (operands.Count == 0) {
prolog = new PrologView(new List<int>(),
new List<int>());
LOGClass.Add(GetTypeFunction(), "Операндов нет. Представление " + prolog);
return true; } else {
bool flag = true; prolog = null;
if (lite) {
if (operands.All(p => p.prolog !=
null)) {
prolog = operands.Select(p => p.prolog).Aggregate(AggregateFunction);
if (prolog != null)
LOGClass.Add(GetTypeFunction(), "Арности операндов подсчитаны " + ToString(1) + " эквивалентна " + ToString(2));
else
LOGClass.Add(GetTypeFunction(), "Арности операндов
82
подсчитаны. Prolog представление не может существовать " + ToString(1));
return true; } else {
return false;
}
} else {
for (int i = 0; i < operands.Count;
i++)
if (operands[i].prolog == null)
{
if
(operands[i].CalcArityLite()) {
if (operands[i].prolog
== null)
//Дерево не может
существовать
return true; } else {
flag = false;
}
}
if (flag) {
prolog = operands.Select(p => p.prolog).Aggregate(AggregateFunction);
if (prolog != null)
LOGClass.Add(GetTypeFunction(), "Арности операндов подсчитаны " + ToString(1) + " эквивалентна " + ToString(2));
else
LOGClass.Add(GetTypeFunction(), "Арности операндов подсчитаны. Prolog представление не может существовать " + ToString(1));
return true; } else {
LOGClass.Add(GetTypeFunction(), "Арность одного или нескольких операндов вычислить не удалось " + ToString());
return false;
83
}
}
}
}
public List<int> GetRelation() { List<int> result = new List<int>(); if (operands.Count > 0) {
for (int i = 0; i < operands.Count; i++
) {
if (operands[i].Type ==
TypeTree.TType.Tree)
result = result.Union(operands[i].Tree.GetRelation()).ToList();
else
result.Add(operands[i].Prolog);
}
}
return result;
}
public override string ToString() { return ToString(1);
}
public virtual string ToString(int i) { if (i == 2)
if (prolog != null)
return prolog.ToString(); else
return "No string";
else
return "No define string";
}
public override string GetTypeFunction() { return "Tree";
}
}
public class LinearTree : Tree
{
84
public LinearTree(params TypeTree[] lst) :
base(lst) {
AggregateFunction = (p, q) => p * q;
}
public override string ToString(int i) { if (i == 1) {
if (operands.Count == 0) return "";
else if (operands.Count == 1) return operands[0].ToString(1);
else
return operands.Select(p => "(" + p.ToString(1) + ")").Aggregate((x, y) => x + "*" + y);
} else {
return prolog.Arity + prolog.ToString();
}
}
public override string GetTypeFunction() { return "Linear Tree";
}
}
public class ParallelTree : Tree
{
public ParallelTree(params TypeTree[] t) : base(t) {
AggregateFunction = (p, q) => p + q;
}
public override string ToString(int i) { if (i == 1) {
if (operands.Count == 0) return "";
else if (operands.Count == 1) return operands[0].ToString(1);
85
else
return operands.Select(p => p.ToString(1)).Aggregate((x, y) => x + "#" + y);
} else {
return prolog.Arity + prolog.ToString();
}
}
public override string GetTypeFunction() { return "Parallel Tree";
}
}
9. Входной файл |
|
|
|
|
|
|
|
|
||||
A=(--- |
#(<-- |
*--<)#--- |
)*( |
--- #S#--- |
#--- |
)*(>-- |
#@)*(-->#S); |
|||||
A=((--- |
#N#--- |
)*(>-- |
*-- |
>#--- |
)); |
|
|
|
|
|
||
(+0+:+1)N; |
|
|
|
|
|
|
|
|
|
|
||
(+1+:+1)S; |
|
|
|
|
|
|
|
|
|
|
||
(+1+:+1)B; |
|
|
|
|
|
|
|
|
|
|
||
TestReduce=E#E*>-- |
*-- |
|
|
|
|
|
|
|||||
TestReduce2=(S#N)*]; |
|
|
|
|
|
|
||||||
(+2+:+2)Ah; |
|
|
|
|
|
|
|
|
|
|||
(+1+:+1)Bh; |
|
|
|
|
|
|
|
|
|
|||
Test5=( |
---#--- |
#[)*(--- |
|
#Ah#--- |
)*(--<#--- |
#--- |
#--- |
)*(Bh#]#---#---)*(>--#---); |
||||
Test4=(--- |
#--- |
)*( |
--- |
#-- |
<)*(--- |
#Bh#--- |
#[)*(--- |
#--- |
#Ah#---)*(---#]#---#--- |
|||
)*(]#---); |
|
|
|
|
|
|
|
|
|
|
|
|
Query={:A(S(N),N)}; |
|
|
|
|
|
|
||||||
Test=(--- |
#-- |
<#--- |
)*(S#S#B#B)*(>-- |
#>-- |
); |
|
|
|||||
Test2=(--- |
#-- |
<#--- |
)*(>-- --- |
#--- |
)*(S#B#B)*(--- |
#>--); |
||||||
Test3=(--- |
#-- |
<#--- |
)*(>-- -- |
)*(S#B); |
|
|
|
|||||
Rec=[*(S#--- |
)*]; |
|
|
|
|
|
|
|
|
|
Rec1=[*(S#S)*];
Rec2=(S#N)*];
QQQ=Rec1;
PrologText={a:b?b=S(a)};
86 |
|
|
ОГЛАВЛЕНИЕ |
|
|
Введение......................................................................................................... |
|
1 |
1. Теоретическая часть.................................................................................. |
|
2 |
1.1. Основные понятия .............................................................................. |
|
2 |
1.2. Языки и схемы направленных отношений....................................... |
|
3 |
1.3. Комбинаторные d -отношения......................................................... |
|
6 |
1.4. Правила вычисления схем направленных отношений.................... |
9 |
|
1.5. Схемы аксиом.................................................................................... |
|
11 |
2. Различные представления схем направленных отношений ............... |
13 |
|
2.1. Схематическое представление ....................................................... |
|
13 |
2.2. Алгебраическое представление....................................................... |
|
17 |
2.3. Графическое представление. ........................................................... |
|
18 |
3. Реализация программы........................................................................... |
|
19 |
3.1. Построение графа переходов для грамматики .............................. |
|
20 |
3.2. Описание объектов программы....................................................... |
|
24 |
3.3. Процесс создания пользовательской функции из алгебраического |
||
представления..................................................................................................... |
|
25 |
3.4. Процесс создания графиеского |
представления |
из |
алгебраического ................................................................................................. |
|
26 |
3.5. Создание графического представления и его проверка................ |
28 |
|
4. Описание программы.............................................................................. |
|
29 |
4.1. Графический интерфейс................................................................... |
|
29 |
4.2. Вывод ................................................................................................. |
|
32 |
4.3. Перспективы...................................................................................... |
|
32 |
|
87 |
|
5. Использованная литература................................................................... |
34 |
|
Приложение................................................................................................. |
35 |
|
1. |
Описание грамматики ......................................................................... |
35 |
2. |
Класс для составления функций по списку лексем.......................... |
37 |
3. |
Лексический разбор на основе грамматики...................................... |
39 |
4. |
Классы для объектов внутреннего представления НО.................... |
47 |
5. Класс для графического представления.................................... |
61 |
|
6. |
Создание списка зависимостей из списка лексем............................ |
72 |
7. |
Класс для работы со списком замен .................................................. |
79 |
8. |
Классы для работы с деревьями......................................................... |
80 |
9. |
Входной файл....................................................................................... |
85 |