+// =============================================================================
+
+type surrealUniverse struct {
+ // TODO: Note that the elements of this array are maintained in order
+ // w.r.t. Axiom 2.
+ numbers []surrealNumber
+ nextUniqueID int
+}
+
+func (u *surrealUniverse) exists(num surrealNumber) bool {
+ // TODO: After I implement a LEQ comparison function, the fact that
+ // u.numbers[] is ordered by that comparison will allow me to greatly
+ // shorten the search.
+ for i := 0; i < len(u.numbers); i++ {
+ if num.number == u.numbers[i].number {
+ return true
+ }
+ }
+ return false
+}
+
+func (u *surrealUniverse) cardinality() int {
+ return len(u.numbers)
+}
+
+func (u *surrealUniverse) insert(num surrealNumber) {
+ if !u.exists(num) {
+ num.metadata.identifier = u.nextUniqueID
+ u.nextUniqueID++
+ // TODO: Need a LEQ function before I can insert in the correct order.
+ // For now, just append to the end.
+ u.numbers = append(u.numbers, num)
+ }
+}
+
+func (u *surrealUniverse) remove(num surrealNumber) {
+ for i := 0; i < len(u.numbers); i++ {
+ if num.number == u.numbers[i].number {
+ u.numbers = append(u.numbers[:i], u.numbers[i+1:]...)
+ }
+ }
+}
+
+// =============================================================================
+
+type surrealNumber struct {
+ number surrealValue
+ metadata surrealMetadata
+}
+
+// TODO: Note that this is split from the metadata so we can do direct
+// comparisons when numbers are in reduced form.
+type surrealValue struct {
+ leftSet *surrealSet
+ rightSet *surrealSet
+}
+
+type surrealMetadata struct {
+ identifier int
+ generation int
+}
+
+// =============================================================================
+
+type surrealSet struct {
+ members []surrealNumber
+}
+
+func (s *surrealSet) isMember(num surrealNumber) bool {
+ for i := 0; i < len(s.members); i++ {
+ if num.number == s.members[i].number {
+ return true
+ }
+ }
+ return false
+}
+
+func (s *surrealSet) cardinality() int {
+ return len(s.members)
+}
+
+func (s *surrealSet) insert(num surrealNumber) {
+ if !s.isMember(num) {
+ s.members = append(s.members, num)
+ }
+}
+
+func (s *surrealSet) remove(num surrealNumber) {
+ for i := 0; i < len(s.members); i++ {
+ if num.number == s.members[i].number {
+ s.members[i] = s.members[len(s.members)-1]
+ s.members = s.members[:len(s.members)-1]
+ }
+ }
+}
+
+// =============================================================================
+