Created basic data structures and methods for dealing with a collection of surreal...
[surreal-numbers] / chapter-1-experiments / ch1-breeding-numbers.go
CommitLineData
24271b43
AT
1// (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
2// See LICENSE.txt file for copyright and license details.
3
4package main
5
6import (
3c02a58e 7 "flag"
24271b43 8 "fmt"
3c02a58e 9 "log"
24271b43
AT
10)
11
3c02a58e
AT
12// =============================================================================
13
14type surrealUniverse struct {
15 // TODO: Note that the elements of this array are maintained in order
16 // w.r.t. Axiom 2.
17 numbers []surrealNumber
18 nextUniqueID int
19}
20
21func (u *surrealUniverse) exists(num surrealNumber) bool {
22 // TODO: After I implement a LEQ comparison function, the fact that
23 // u.numbers[] is ordered by that comparison will allow me to greatly
24 // shorten the search.
25 for i := 0; i < len(u.numbers); i++ {
26 if num.number == u.numbers[i].number {
27 return true
28 }
29 }
30 return false
31}
32
33func (u *surrealUniverse) cardinality() int {
34 return len(u.numbers)
35}
36
37func (u *surrealUniverse) insert(num surrealNumber) {
38 if !u.exists(num) {
39 num.metadata.identifier = u.nextUniqueID
40 u.nextUniqueID++
41 // TODO: Need a LEQ function before I can insert in the correct order.
42 // For now, just append to the end.
43 u.numbers = append(u.numbers, num)
44 }
45}
46
47func (u *surrealUniverse) remove(num surrealNumber) {
48 for i := 0; i < len(u.numbers); i++ {
49 if num.number == u.numbers[i].number {
50 u.numbers = append(u.numbers[:i], u.numbers[i+1:]...)
51 }
52 }
53}
54
55// =============================================================================
56
57type surrealNumber struct {
58 number surrealValue
59 metadata surrealMetadata
60}
61
62// TODO: Note that this is split from the metadata so we can do direct
63// comparisons when numbers are in reduced form.
64type surrealValue struct {
65 leftSet *surrealSet
66 rightSet *surrealSet
67}
68
69type surrealMetadata struct {
70 identifier int
71 generation int
72}
73
74// =============================================================================
75
76type surrealSet struct {
77 members []surrealNumber
78}
79
80func (s *surrealSet) isMember(num surrealNumber) bool {
81 for i := 0; i < len(s.members); i++ {
82 if num.number == s.members[i].number {
83 return true
84 }
85 }
86 return false
87}
88
89func (s *surrealSet) cardinality() int {
90 return len(s.members)
91}
92
93func (s *surrealSet) insert(num surrealNumber) {
94 if !s.isMember(num) {
95 s.members = append(s.members, num)
96 }
97}
98
99func (s *surrealSet) remove(num surrealNumber) {
100 for i := 0; i < len(s.members); i++ {
101 if num.number == s.members[i].number {
102 s.members[i] = s.members[len(s.members)-1]
103 s.members = s.members[:len(s.members)-1]
104 }
105 }
106}
107
108// =============================================================================
109
24271b43 110func main() {
3c02a58e
AT
111 // Obtain termination conditions from user.
112 remainingGenerations := flag.Int("generations", 2, "Number of generations of surreal numbers to breed.")
113 flag.Parse()
114 if *remainingGenerations < 1 {
115 log.Fatal("ERROR: The argument to '-generations' must be greater than zero.")
116 }
117
118 // Build a universe to contain all the surreal numbers we breed.
119 // Seed it by hand with the number zero as generation-0.
120 var universe surrealUniverse
121 universe.insert(surrealNumber{surrealValue{nil, nil}, surrealMetadata{0, 0}})
122
123 // TODO: Describe the basic algorithm.
124 for generation := 1; generation <= *remainingGenerations; generation++ {
125// TODO: Continue here next time.
126// Rough Plan:
127// allSymbols := buildAllSymbolCombinations(generation)
128// validNumbers := pruneInvalidSymbolCombinations(allSymbols)
129// addNumbersToUniverse(validNumbers)
130 }
131
132 // TODO: These are just for checking progress. How do I want to render the
133 // final generations vs magnitude chart?
134 fmt.Println("Total Numbers:", len(universe.numbers))
135 fmt.Println(universe.numbers)
24271b43 136}
3c02a58e
AT
137
138// =============================================================================