Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Реализация сетевой модели вычислений с аксиоматической и рекурсивной формами задания функций и предикатов (бакалаврская работа)

.pdf
Скачиваний:
6
Добавлен:
28.06.2014
Размер:
704.41 Кб
Скачать

80

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