-
Notifications
You must be signed in to change notification settings - Fork 0
/
stackcollection.go
99 lines (91 loc) · 2.63 KB
/
stackcollection.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package abstracttapestack
import TM "github.com/Iijil1/Bruteforce-CTL/turingmachines"
type stackList struct {
abstractions Heuristics
symbolsInUse TM.SymbolCollection
symbolSegments map[TM.Symbol]segment
emptyStack *stack
anyEndStack *stack
}
func (sl *stackList) getSegmentBySymbol(query TM.Symbol) segment {
if symbolSegment, exists := sl.symbolSegments[query]; exists {
return symbolSegment
} else {
newSegment := &symbol{
list: sl,
value: query,
segmentExtensions: map[segment]segment{},
repeater: nil,
orExtensions: map[segment]segment{},
}
newSegment.orExtensions[newSegment] = newSegment
sl.symbolSegments[query] = newSegment
return newSegment
}
}
func (sl *stackList) AnyEndStack() AbstractStack {
if sl.abstractions.Buffer > 0 {
return stackWithBuffer{
list: sl,
bufferEncoding: 0,
bufferLength: 0,
stackWithoutBuffer: sl.anyEndStack,
}
}
return sl.anyEndStack
}
func (sl *stackList) EmptyStack() AbstractStack {
if sl.abstractions.Buffer > 0 {
return stackWithBuffer{
list: sl,
bufferEncoding: 0,
bufferLength: 0,
stackWithoutBuffer: sl.emptyStack,
}
}
return sl.emptyStack
}
func NewStackCollection(tm TM.TuringMachine, abstractions Heuristics) StackCollection {
ns := &stackList{
abstractions: abstractions,
symbolsInUse: tm,
symbolSegments: map[TM.Symbol]segment{},
}
infZeroSegment := &infZeroes{
list: ns,
segmentExtensions: map[segment]segment{},
orExtensions: map[segment]segment{},
}
infZeroSegment.orExtensions[infZeroSegment] = infZeroSegment
infAnySegment := &infAnys{
list: ns,
segmentExtensions: map[segment]segment{},
orExtensions: map[segment]segment{},
}
infAnySegment.orExtensions[infAnySegment] = infAnySegment
emptyStack := &stack{
list: ns,
top: infZeroSegment,
length: 0,
numRepeaters: 0,
extensions: map[TM.Symbol][]AbstractStack{},
segmentExtensions: map[segment]*stack{},
}
anyEndStack := &stack{
list: ns,
top: infAnySegment,
length: 0,
numRepeaters: 1,
extensions: map[TM.Symbol][]AbstractStack{},
segmentExtensions: map[segment]*stack{},
}
emptyStack.tail = emptyStack
emptyStack.cutOff = anyEndStack
emptyStack.extensions[tm.Zero()] = []AbstractStack{emptyStack}
emptyStack.segmentExtensions[ns.getSegmentBySymbol(tm.Zero())] = emptyStack
anyEndStack.tail = anyEndStack
anyEndStack.cutOff = anyEndStack
ns.emptyStack = emptyStack
ns.anyEndStack = anyEndStack
return ns
}