@@ -9,112 +9,123 @@ local function intersect(a_min, a_max, operator, b_min, b_max)
99 if a_max < b_min then
1010 return a_min , a_max , b_min , b_max , nil , nil , nil , nil
1111 end
12-
12+
1313 -- Case 2: A < B is always false (A's lower bound ≥ B's upper bound)
1414 if a_min >= b_max then
1515 return nil , nil , nil , nil , a_min , a_max , b_min , b_max
1616 end
17-
17+
1818 -- Case 3: Ranges overlap, narrowing needed
19-
2019 -- TRUE branch (A < B):
21- local a_min_true = a_min -- A's lower bound doesn't change
22- local a_max_true = math.min (a_max , b_max - 1 ) -- A must be less than B's maximum
23- local b_min_true = math.max (b_min , a_min + 1 ) -- B must be greater than A's minimum
24- local b_max_true = b_max -- B's upper bound doesn't change
25-
20+ local a_min_true = a_min -- A's lower bound doesn't change
21+ local a_max_true = math.min (a_max , b_max - 1 ) -- A must be less than B's maximum
22+ local b_min_true = math.max (b_min , a_min + 1 ) -- B must be greater than A's minimum
23+ local b_max_true = b_max -- B's upper bound doesn't change
2624 -- FALSE branch (A ≥ B):
27- local a_min_false = math.max (a_min , b_min ) -- A must be at least B's minimum
28- local a_max_false = a_max -- A's upper bound doesn't change
29- local b_min_false = b_min -- B's lower bound doesn't change
30- local b_max_false = math.min (b_max , a_max ) -- B can't exceed A's maximum
31-
32- return a_min_true , a_max_true , b_min_true , b_max_true ,
33- a_min_false , a_max_false , b_min_false , b_max_false
25+ local a_min_false = math.max (a_min , b_min ) -- A must be at least B's minimum
26+ local a_max_false = a_max -- A's upper bound doesn't change
27+ local b_min_false = b_min -- B's lower bound doesn't change
28+ local b_max_false = math.min (b_max , a_max ) -- B can't exceed A's maximum
29+ return a_min_true ,
30+ a_max_true ,
31+ b_min_true ,
32+ b_max_true ,
33+ a_min_false ,
34+ a_max_false ,
35+ b_min_false ,
36+ b_max_false
3437 elseif operator == " >" then
3538 -- Return value structure:
3639 -- a_min_true, a_max_true, b_min_true, b_max_true, a_min_false, a_max_false, b_min_false, b_max_false
37-
3840 -- Case 1: A > B is always true (A's lower bound > B's upper bound)
3941 if a_min > b_max then
4042 return a_min , a_max , b_min , b_max , nil , nil , nil , nil
4143 end
42-
44+
4345 -- Case 2: A > B is always false (A's upper bound ≤ B's lower bound)
4446 if a_max <= b_min then
4547 return nil , nil , nil , nil , a_min , a_max , b_min , b_max
4648 end
47-
49+
4850 -- Case 3: Ranges overlap, narrowing needed
49-
5051 -- TRUE branch (A > B):
51- local a_min_true = math.max (a_min , b_min + 1 ) -- A must be greater than B's minimum
52- local a_max_true = a_max -- A's upper bound doesn't change
53- local b_min_true = b_min -- B's lower bound doesn't change
54- local b_max_true = math.min (b_max , a_max - 1 ) -- B must be less than A's maximum
55-
52+ local a_min_true = math.max (a_min , b_min + 1 ) -- A must be greater than B's minimum
53+ local a_max_true = a_max -- A's upper bound doesn't change
54+ local b_min_true = b_min -- B's lower bound doesn't change
55+ local b_max_true = math.min (b_max , a_max - 1 ) -- B must be less than A's maximum
5656 -- FALSE branch (A ≤ B):
57- local a_min_false = a_min -- A's lower bound doesn't change
58- local a_max_false = math.min (a_max , b_max ) -- A can't exceed B's maximum
59- local b_min_false = math.max (b_min , a_min ) -- B must be at least A's minimum
60- local b_max_false = b_max -- B's upper bound doesn't change
61-
62- return a_min_true , a_max_true , b_min_true , b_max_true ,
63- a_min_false , a_max_false , b_min_false , b_max_false
57+ local a_min_false = a_min -- A's lower bound doesn't change
58+ local a_max_false = math.min (a_max , b_max ) -- A can't exceed B's maximum
59+ local b_min_false = math.max (b_min , a_min ) -- B must be at least A's minimum
60+ local b_max_false = b_max -- B's upper bound doesn't change
61+ return a_min_true ,
62+ a_max_true ,
63+ b_min_true ,
64+ b_max_true ,
65+ a_min_false ,
66+ a_max_false ,
67+ b_min_false ,
68+ b_max_false
6469 elseif operator == " <=" then
6570 -- Case 1: A <= B is always true (A's upper bound <= B's lower bound)
6671 if a_max <= b_min then
6772 return a_min , a_max , b_min , b_max , nil , nil , nil , nil
6873 end
69-
74+
7075 -- Case 2: A <= B is always false (A's lower bound > B's upper bound)
7176 if a_min > b_max then
7277 return nil , nil , nil , nil , a_min , a_max , b_min , b_max
7378 end
74-
79+
7580 -- Case 3: Ranges overlap, narrowing needed
76-
7781 -- TRUE branch (A <= B):
78- local a_min_true = a_min -- A's lower bound doesn't change
79- local a_max_true = math.min (a_max , b_max ) -- A must be less than or equal to B's maximum
80- local b_min_true = math.max (b_min , a_min ) -- B must be at least A's minimum
81- local b_max_true = b_max -- B's upper bound doesn't change
82-
82+ local a_min_true = a_min -- A's lower bound doesn't change
83+ local a_max_true = math.min (a_max , b_max ) -- A must be less than or equal to B's maximum
84+ local b_min_true = math.max (b_min , a_min ) -- B must be at least A's minimum
85+ local b_max_true = b_max -- B's upper bound doesn't change
8386 -- FALSE branch (A > B):
84- local a_min_false = math.max (a_min , b_max + 1 ) -- A must be greater than B's maximum
85- local a_max_false = a_max -- A's upper bound doesn't change
86- local b_min_false = b_min -- B's lower bound doesn't change
87- local b_max_false = math.min (b_max , a_min - 1 ) -- B must be less than A's minimum
88-
89- return a_min_true , a_max_true , b_min_true , b_max_true ,
90- a_min_false , a_max_false , b_min_false , b_max_false
87+ local a_min_false = math.max (a_min , b_max + 1 ) -- A must be greater than B's maximum
88+ local a_max_false = a_max -- A's upper bound doesn't change
89+ local b_min_false = b_min -- B's lower bound doesn't change
90+ local b_max_false = math.min (b_max , a_min - 1 ) -- B must be less than A's minimum
91+ return a_min_true ,
92+ a_max_true ,
93+ b_min_true ,
94+ b_max_true ,
95+ a_min_false ,
96+ a_max_false ,
97+ b_min_false ,
98+ b_max_false
9199 elseif operator == " >=" then
92100 -- Case 1: A >= B is always true (A's lower bound >= B's upper bound)
93101 if a_min >= b_max then
94102 return a_min , a_max , b_min , b_max , nil , nil , nil , nil
95103 end
96-
104+
97105 -- Case 2: A >= B is always false (A's upper bound < B's lower bound)
98106 if a_max < b_min then
99107 return nil , nil , nil , nil , a_min , a_max , b_min , b_max
100108 end
101-
109+
102110 -- Case 3: Ranges overlap, narrowing needed
103-
104111 -- TRUE branch (A >= B):
105- local a_min_true = math.max (a_min , b_min ) -- A must be at least B's minimum
106- local a_max_true = a_max -- A's upper bound doesn't change
107- local b_min_true = b_min -- B's lower bound doesn't change
108- local b_max_true = math.min (b_max , a_max ) -- B can't exceed A's maximum
109-
112+ local a_min_true = math.max (a_min , b_min ) -- A must be at least B's minimum
113+ local a_max_true = a_max -- A's upper bound doesn't change
114+ local b_min_true = b_min -- B's lower bound doesn't change
115+ local b_max_true = math.min (b_max , a_max ) -- B can't exceed A's maximum
110116 -- FALSE branch (A < B):
111- local a_min_false = a_min -- A's lower bound doesn't change
112- local a_max_false = math.min (a_max , b_min - 1 ) -- A must be less than B's minimum
113- local b_min_false = math.max (b_min , a_max + 1 ) -- B must be greater than A's maximum
114- local b_max_false = b_max -- B's upper bound doesn't change
115-
116- return a_min_true , a_max_true , b_min_true , b_max_true ,
117- a_min_false , a_max_false , b_min_false , b_max_false
117+ local a_min_false = a_min -- A's lower bound doesn't change
118+ local a_max_false = math.min (a_max , b_min - 1 ) -- A must be less than B's minimum
119+ local b_min_false = math.max (b_min , a_max + 1 ) -- B must be greater than A's maximum
120+ local b_max_false = b_max -- B's upper bound doesn't change
121+ return a_min_true ,
122+ a_max_true ,
123+ b_min_true ,
124+ b_max_true ,
125+ a_min_false ,
126+ a_max_false ,
127+ b_min_false ,
128+ b_max_false
118129 elseif operator == " ==" then
119130 -- Case 1: A == B is impossible (non-overlapping ranges)
120131 if a_max < b_min or b_max < a_min then
@@ -127,26 +138,23 @@ local function intersect(a_min, a_max, operator, b_min, b_max)
127138 end
128139
129140 -- Case 3: Ranges overlap, narrowing needed
130-
131141 -- TRUE branch (A == B): intersection of the two ranges
132142 local a_min_true = math.max (a_min , b_min )
133143 local a_max_true = math.min (a_max , b_max )
134- local b_min_true = a_min_true -- For equality, the ranges must have the same values
144+ local b_min_true = a_min_true -- For equality, the ranges must have the same values
135145 local b_max_true = a_max_true
136-
137146 -- FALSE branch (A != B): all values where they don't overlap
138147 local a_min_false1 = a_min
139148 local a_max_false1 = math.min (a_max , b_min - 1 )
140149 local a_min_false2 = math.max (a_min , b_max + 1 )
141150 local a_max_false2 = a_max
142-
143151 local b_min_false1 = b_min
144152 local b_max_false1 = math.min (b_max , a_min - 1 )
145153 local b_min_false2 = math.max (b_min , a_max + 1 )
146154 local b_max_false2 = b_max
147-
148155 -- Combine the false ranges if possible
149156 local a_min_false , a_max_false
157+
150158 if a_max_false1 >= a_min_false1 and a_max_false2 >= a_min_false2 then
151159 a_min_false = math.min (a_min_false1 , a_min_false2 )
152160 a_max_false = math.max (a_max_false1 , a_max_false2 )
@@ -160,8 +168,9 @@ local function intersect(a_min, a_max, operator, b_min, b_max)
160168 a_min_false = nil
161169 a_max_false = nil
162170 end
163-
171+
164172 local b_min_false , b_max_false
173+
165174 if b_max_false1 >= b_min_false1 and b_max_false2 >= b_min_false2 then
166175 b_min_false = math.min (b_min_false1 , b_min_false2 )
167176 b_max_false = math.max (b_max_false1 , b_max_false2 )
@@ -174,17 +183,28 @@ local function intersect(a_min, a_max, operator, b_min, b_max)
174183 else
175184 b_min_false = nil
176185 b_max_false = nil
177- end
186+ end
178187
179- return a_min_true , a_max_true , b_min_true , b_max_true ,
180- a_min_false , a_max_false , b_min_false , b_max_false
188+ return a_min_true ,
189+ a_max_true ,
190+ b_min_true ,
191+ b_max_true ,
192+ a_min_false ,
193+ a_max_false ,
194+ b_min_false ,
195+ b_max_false
181196 elseif operator == " ~=" then
182197 -- Implement ~= as the logical inverse of ==
183- local a_min_true , a_max_true , b_min_true , b_max_true , a_min_false , a_max_false , b_min_false , b_max_false =
184- intersect (a_min , a_max , " ==" , b_min , b_max )
185-
198+ local a_min_true , a_max_true , b_min_true , b_max_true , a_min_false , a_max_false , b_min_false , b_max_false = intersect (a_min , a_max , " ==" , b_min , b_max )
186199 -- Swap the true and false branches to represent the logical NOT
187- return a_min_false , a_max_false , b_min_false , b_max_false , a_min_true , a_max_true , b_min_true , b_max_true
200+ return a_min_false ,
201+ a_max_false ,
202+ b_min_false ,
203+ b_max_false ,
204+ a_min_true ,
205+ a_max_true ,
206+ b_min_true ,
207+ b_max_true
188208 end
189209end
190210
@@ -215,6 +235,7 @@ local function intersect_comparison(a--[[#: NumericType]], b--[[#: NumericType]]
215235 result_a_false = LNumberRange (a_min_res_false , a_max_res_false )
216236 end
217237 end
238+
218239 if b_min_res_true and b_max_res_true then
219240 if b_min_res_true == b_max_res_true then
220241 result_b_true = LNumber (b_min_res_true )
0 commit comments