1
2
3
4
5 package types2
6
7
8
9
10
11
12
13
14 type term struct {
15 tilde bool
16 typ Type
17 }
18
19 func (x *term) String() string {
20 switch {
21 case x == nil:
22 return "∅"
23 case x.typ == nil:
24 return "𝓤"
25 case x.tilde:
26 return "~" + x.typ.String()
27 default:
28 return x.typ.String()
29 }
30 }
31
32
33 func (x *term) equal(y *term) bool {
34
35 switch {
36 case x == nil || y == nil:
37 return x == y
38 case x.typ == nil || y.typ == nil:
39 return x.typ == y.typ
40 }
41
42
43 return x.tilde == y.tilde && Identical(x.typ, y.typ)
44 }
45
46
47 func (x *term) union(y *term) (_, _ *term) {
48
49 switch {
50 case x == nil && y == nil:
51 return nil, nil
52 case x == nil:
53 return y, nil
54 case y == nil:
55 return x, nil
56 case x.typ == nil:
57 return x, nil
58 case y.typ == nil:
59 return y, nil
60 }
61
62
63 if x.disjoint(y) {
64 return x, y
65 }
66
67
68
69
70
71
72 if x.tilde || !y.tilde {
73 return x, nil
74 }
75 return y, nil
76 }
77
78
79 func (x *term) intersect(y *term) *term {
80
81 switch {
82 case x == nil || y == nil:
83 return nil
84 case x.typ == nil:
85 return y
86 case y.typ == nil:
87 return x
88 }
89
90
91 if x.disjoint(y) {
92 return nil
93 }
94
95
96
97
98
99
100 if !x.tilde || y.tilde {
101 return x
102 }
103 return y
104 }
105
106
107 func (x *term) includes(t Type) bool {
108
109 switch {
110 case x == nil:
111 return false
112 case x.typ == nil:
113 return true
114 }
115
116
117 u := t
118 if x.tilde {
119 u = under(u)
120 }
121 return Identical(x.typ, u)
122 }
123
124
125 func (x *term) subsetOf(y *term) bool {
126
127 switch {
128 case x == nil:
129 return true
130 case y == nil:
131 return false
132 case y.typ == nil:
133 return true
134 case x.typ == nil:
135 return false
136 }
137
138
139 if x.disjoint(y) {
140 return false
141 }
142
143
144
145
146
147
148 return !x.tilde || y.tilde
149 }
150
151
152
153 func (x *term) disjoint(y *term) bool {
154 if debug && (x.typ == nil || y.typ == nil) {
155 panic("invalid argument(s)")
156 }
157 ux := x.typ
158 if y.tilde {
159 ux = under(ux)
160 }
161 uy := y.typ
162 if x.tilde {
163 uy = under(uy)
164 }
165 return !Identical(ux, uy)
166 }
167
View as plain text