Commit | Line | Data |
---|---|---|
24271b43 AT |
1 | // (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com> |
2 | // See LICENSE.txt file for copyright and license details. | |
3 | ||
4 | package main | |
5 | ||
6 | import ( | |
3c02a58e | 7 | "flag" |
24271b43 | 8 | "fmt" |
3c02a58e | 9 | "log" |
24271b43 AT |
10 | ) |
11 | ||
3c02a58e AT |
12 | // ============================================================================= |
13 | ||
14 | type 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 | ||
21 | func (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 | ||
33 | func (u *surrealUniverse) cardinality() int { | |
34 | return len(u.numbers) | |
35 | } | |
36 | ||
37 | func (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 | ||
47 | func (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 | ||
57 | type 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. | |
64 | type surrealValue struct { | |
65 | leftSet *surrealSet | |
66 | rightSet *surrealSet | |
67 | } | |
68 | ||
69 | type surrealMetadata struct { | |
70 | identifier int | |
71 | generation int | |
72 | } | |
73 | ||
74 | // ============================================================================= | |
75 | ||
76 | type surrealSet struct { | |
77 | members []surrealNumber | |
78 | } | |
79 | ||
80 | func (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 | ||
89 | func (s *surrealSet) cardinality() int { | |
90 | return len(s.members) | |
91 | } | |
92 | ||
93 | func (s *surrealSet) insert(num surrealNumber) { | |
94 | if !s.isMember(num) { | |
95 | s.members = append(s.members, num) | |
96 | } | |
97 | } | |
98 | ||
99 | func (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 | 110 | func 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 | // ============================================================================= |