| 1 | | template TypeOfSub(T, V) |
|---|
| 2 | | { |
|---|
| 3 | | static if( // (- (/> A B) (/> C (+> (/ D C) B))) -> (+> D (/> (- A C) B)) |
|---|
| 4 | | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 5 | | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.LHS.DefP == Defined) && is(V.RHS.LHS.RHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| 6 | | && is(T.RHS == V.RHS.RHS) && is(V.LHS == V.RHS.LHS.RHS) |
|---|
| 7 | | ) |
|---|
| 8 | | alias OpAddA!(V.RHS.LHS.LHS, OpDivA!(OpSub!(T.LHS, V.LHS), T.RHS)) TypeOfSub; |
|---|
| 9 | | else |
|---|
| 10 | | static if( // (- (*> A B) (*> C (-> (* D C) B))) -> (+> D (/> (- (/ 1 A) (/ 1 C)) B)) |
|---|
| 11 | | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 12 | | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.LHS.DefP == Defined) && is(V.RHS.LHS.RHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| 13 | | && is(T.RHS == V.RHS.RHS) && is(V.LHS == V.RHS.LHS.RHS) |
|---|
| 14 | | ) |
|---|
| 15 | | alias OpAddA!(V.RHS.LHS.LHS, OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), T.RHS)) TypeOfSub; |
|---|
| 16 | | else |
|---|
| 17 | | static if( // (- (/R> A B) (/R> C B)) -> (/R> (- A C) B) |
|---|
| 18 | | is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 19 | | is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 20 | | && is(T.RHS == V.RHS) |
|---|
| 21 | | ) |
|---|
| 22 | | alias OpDivAR!(OpSub!(T.LHS, V.LHS), T.RHS) TypeOfSub; |
|---|
| 23 | | else |
|---|
| 24 | | static if( // (- (/> A B) (/> C B)) -> (/> (- A C) B) |
|---|
| 25 | | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 26 | | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 27 | | && is(T.RHS == V.RHS) |
|---|
| 28 | | ) |
|---|
| 29 | | alias OpDivA!(OpSub!(T.LHS, V.LHS), T.RHS) TypeOfSub; |
|---|
| 30 | | else |
|---|
| 31 | | static if( // (- A (-R> B X)) -> (+> (- B A) X) |
|---|
| 32 | | is(T.DefP == Defined) && |
|---|
| 33 | | is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 34 | | /+ no repeats +/ |
|---|
| 35 | | ) |
|---|
| 36 | | alias OpAddA!(OpSub!(V.LHS, T), V.RHS) TypeOfSub; |
|---|
| 37 | | else |
|---|
| 38 | | static if( // (- X (-R> E X)) -> (/> 2 (+> (/ E 2) X)) |
|---|
| 39 | | is(T.DefP == UnDefined) && |
|---|
| 40 | | is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 41 | | && is(T == V.RHS) |
|---|
| 42 | | ) |
|---|
| 43 | | alias OpDivA!(Value!(2), OpAddA!(OpDiv!(V.LHS, Value!(2)), T)) TypeOfSub; |
|---|
| 44 | | else |
|---|
| 45 | | static if( // (- C (*> A (-> B X))) -> (*> A (-R> (+ (* C A) B) X)) |
|---|
| 46 | | is(T.DefP == Defined) && |
|---|
| 47 | | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| 48 | | /+ no repeats +/ |
|---|
| 49 | | ) |
|---|
| 50 | | alias OpMulA!(V.LHS, OpSubAR!(OpAdd!(OpMul!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfSub; |
|---|
| 51 | | else |
|---|
| 52 | | static if( // (- A (*> B X)) -> (*> B (-R> (* A B) X)) |
|---|
| 53 | | is(T.DefP == Defined) && |
|---|
| 54 | | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 55 | | /+ no repeats +/ |
|---|
| 56 | | ) |
|---|
| 57 | | alias OpMulA!(V.LHS, OpSubAR!(OpMul!(T, V.LHS), V.RHS)) TypeOfSub; |
|---|
| 58 | | else |
|---|
| 59 | | static if( // (- X (*> E X)) -> (/> (- 1 (/ 1 E)) X) |
|---|
| 60 | | is(T.DefP == UnDefined) && |
|---|
| 61 | | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 62 | | && is(T == V.RHS) |
|---|
| 63 | | ) |
|---|
| 64 | | alias OpDivA!(OpSub!(Value!(1), OpDiv!(Value!(1), V.LHS)), T) TypeOfSub; |
|---|
| 65 | | else |
|---|
| 66 | | static if( // (- A (/> B X)) -> (/> B (-R> (/ A B) X)) |
|---|
| 67 | | is(T.DefP == Defined) && |
|---|
| 68 | | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 69 | | /+ no repeats +/ |
|---|
| 70 | | ) |
|---|
| 71 | | alias OpDivA!(V.LHS, OpSubAR!(OpDiv!(T, V.LHS), V.RHS)) TypeOfSub; |
|---|
| 72 | | else |
|---|
| 73 | | static if( // (- X (/> E X)) -> (/> (- 1 E) X) |
|---|
| 74 | | is(T.DefP == UnDefined) && |
|---|
| 75 | | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 76 | | && is(T == V.RHS) |
|---|
| 77 | | ) |
|---|
| 78 | | alias OpDivA!(OpSub!(Value!(1), V.LHS), T) TypeOfSub; |
|---|
| 79 | | else |
|---|
| 80 | | static if( // (- (-R> B X) A) -> (-R> (- B A) X) |
|---|
| 81 | | is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 82 | | is(V.DefP == Defined) |
|---|
| 83 | | /+ no repeats +/ |
|---|
| 84 | | ) |
|---|
| 85 | | alias OpSubAR!(OpSub!(T.LHS, V), T.RHS) TypeOfSub; |
|---|
| 86 | | else |
|---|
| 87 | | static if( // (- (-R> H X) X) -> (/> 2 (-R> H X)) |
|---|
| 88 | | is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 89 | | is(V.DefP == UnDefined) |
|---|
| 90 | | && is(T.RHS == V) |
|---|
| 91 | | ) |
|---|
| 92 | | alias OpDivA!(Value!(2), OpSubAR!(T.LHS, T.RHS)) TypeOfSub; |
|---|
| 93 | | else |
|---|
| 94 | | static if( // (- (*> A (-> B X)) C) -> (*> A (+> (- (* C A) B) X)) |
|---|
| 95 | | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| 96 | | is(V.DefP == Defined) |
|---|
| 97 | | /+ no repeats +/ |
|---|
| 98 | | ) |
|---|
| 99 | | alias OpMulA!(T.LHS, OpAddA!(OpSub!(OpMul!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub; |
|---|
| 100 | | else |
|---|
| 101 | | static if( // (- (*> B X) A) -> (*> B (+> (* A B) X)) |
|---|
| 102 | | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 103 | | is(V.DefP == Defined) |
|---|
| 104 | | /+ no repeats +/ |
|---|
| 105 | | ) |
|---|
| 106 | | alias OpMulA!(T.LHS, OpAddA!(OpMul!(V, T.LHS), T.RHS)) TypeOfSub; |
|---|
| 107 | | else |
|---|
| 108 | | static if( // (- (*> H X) X) -> (/> (- (/ 1 H) 1) X) |
|---|
| 109 | | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 110 | | is(V.DefP == UnDefined) |
|---|
| 111 | | && is(T.RHS == V) |
|---|
| 112 | | ) |
|---|
| 113 | | alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), Value!(1)), T.RHS) TypeOfSub; |
|---|
| 114 | | else |
|---|
| 115 | | static if( // (- (/> B X) A) -> (/> B (+> (/ A B) X)) |
|---|
| 116 | | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 117 | | is(V.DefP == Defined) |
|---|
| 118 | | /+ no repeats +/ |
|---|
| 119 | | ) |
|---|
| 120 | | alias OpDivA!(T.LHS, OpAddA!(OpDiv!(V, T.LHS), T.RHS)) TypeOfSub; |
|---|
| 121 | | else |
|---|
| 122 | | static if( // (- (/> H X) X) -> (/> (- H 1) X) |
|---|
| 123 | | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 124 | | is(V.DefP == UnDefined) |
|---|
| 125 | | && is(T.RHS == V) |
|---|
| 126 | | ) |
|---|
| 127 | | alias OpDivA!(OpSub!(T.LHS, Value!(1)), T.RHS) TypeOfSub; |
|---|
| 128 | | else |
|---|
| 129 | | static if( // (- (+> B X) A) -> (+> (+ A B) X) |
|---|
| 130 | | is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 131 | | is(V.DefP == Defined) |
|---|
| 132 | | /+ no repeats +/ |
|---|
| 133 | | ) |
|---|
| 134 | | alias OpAddA!(OpAdd!(V, T.LHS), T.RHS) TypeOfSub; |
|---|
| 135 | | else |
|---|
| 136 | | static if( // (- A (+> B X)) -> (-R> (+ A B) X) |
|---|
| 137 | | is(T.DefP == Defined) && |
|---|
| 138 | | is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 139 | | /+ no repeats +/ |
|---|
| 140 | | ) |
|---|
| 141 | | alias OpSubAR!(OpAdd!(T, V.LHS), V.RHS) TypeOfSub; |
|---|
| 142 | | else |
|---|
| 143 | | static if( // (- (-> B X) A) -> (+> (- A B) X) |
|---|
| 144 | | is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 145 | | is(V.DefP == Defined) |
|---|
| 146 | | /+ no repeats +/ |
|---|
| 147 | | ) |
|---|
| 148 | | alias OpAddA!(OpSub!(V, T.LHS), T.RHS) TypeOfSub; |
|---|
| 149 | | else |
|---|
| 150 | | static if( // (- A (-> B X)) -> (-R> (- A B) X) |
|---|
| 151 | | is(T.DefP == Defined) && |
|---|
| 152 | | is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 153 | | /+ no repeats +/ |
|---|
| 154 | | ) |
|---|
| 155 | | alias OpSubAR!(OpSub!(T, V.LHS), V.RHS) TypeOfSub; |
|---|
| 156 | | else |
|---|
| 157 | | static if( // (- A X) -> (-R> A X) |
|---|
| 158 | | is(T.DefP == Defined) && |
|---|
| 159 | | is(V.DefP == UnDefined) |
|---|
| 160 | | /+ no repeats +/ |
|---|
| 161 | | ) |
|---|
| 162 | | alias OpSubAR!(T, V) TypeOfSub; |
|---|
| 163 | | else |
|---|
| 164 | | static if( // (- A B) -> (- A B) |
|---|
| 165 | | is(T.DefP == Defined) && |
|---|
| 166 | | is(V.DefP == Defined) |
|---|
| 167 | | /+ no repeats +/ |
|---|
| 168 | | ) |
|---|
| 169 | | alias OpSub!(T, V) TypeOfSub; |
|---|
| 170 | | else |
|---|
| 171 | | static if( // (- X A) -> (+> A X) |
|---|
| 172 | | is(T.DefP == UnDefined) && |
|---|
| 173 | | is(V.DefP == Defined) |
|---|
| 174 | | /+ no repeats +/ |
|---|
| 175 | | ) |
|---|
| 176 | | alias OpAddA!(V, T) TypeOfSub; |
|---|
| 177 | | else |
|---|
| 178 | | static assert(false, `inavlid type used for Sub: T == ` ~ T.stringof ~ ` and V == `~ V.stringof ); |
|---|
| 179 | | } |
|---|
| | 256 | } |
|---|
| | 257 | template TypeOfSub(T, V) |
|---|
| | 258 | { |
|---|
| | 259 | static if( // (- A (-R> B X)) -> (+> (- B A) X) |
|---|
| | 260 | is(T.DefP == Defined) && |
|---|
| | 261 | is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 262 | /+ no repeats +/ |
|---|
| | 263 | ) |
|---|
| | 264 | alias OpAddA!(OpSub!(V.LHS, T), V.RHS) TypeOfSub; |
|---|
| | 265 | else |
|---|
| | 266 | static if( // (- X (-R> E X)) -> (/> 2 (+> (/ E 2) X)) |
|---|
| | 267 | is(T.DefP == UnDefined) && |
|---|
| | 268 | is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 269 | && is(T == V.RHS) |
|---|
| | 270 | ) |
|---|
| | 271 | alias OpDivA!(Value!(2), OpAddA!(OpDiv!(V.LHS, Value!(2)), T)) TypeOfSub; |
|---|
| | 272 | else |
|---|
| | 273 | static if( // (- C (*> A (-R> B X))) -> (*> A (+> (- B (* C A)) X)) |
|---|
| | 274 | is(T.DefP == Defined) && |
|---|
| | 275 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 276 | /+ no repeats +/ |
|---|
| | 277 | ) |
|---|
| | 278 | alias OpMulA!(V.LHS, OpAddA!(OpSub!(V.RHS.LHS, OpMul!(T, V.LHS)), V.RHS.RHS)) TypeOfSub; |
|---|
| | 279 | else |
|---|
| | 280 | static if( // (- C (*> A (+> B X))) -> (*> A (-R> (+ (* C A) B) X)) |
|---|
| | 281 | is(T.DefP == Defined) && |
|---|
| | 282 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 283 | /+ no repeats +/ |
|---|
| | 284 | ) |
|---|
| | 285 | alias OpMulA!(V.LHS, OpSubAR!(OpAdd!(OpMul!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfSub; |
|---|
| | 286 | else |
|---|
| | 287 | static if( // (- C (*> A (-> B X))) -> (*> A (-R> (- (* A C) B) X)) |
|---|
| | 288 | is(T.DefP == Defined) && |
|---|
| | 289 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 290 | /+ no repeats +/ |
|---|
| | 291 | ) |
|---|
| | 292 | alias OpMulA!(V.LHS, OpSubAR!(OpSub!(OpMul!(V.LHS, T), V.RHS.LHS), V.RHS.RHS)) TypeOfSub; |
|---|
| | 293 | else |
|---|
| | 294 | static if( // (- A (*> B X)) -> (*> B (-R> (* A B) X)) |
|---|
| | 295 | is(T.DefP == Defined) && |
|---|
| | 296 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 297 | /+ no repeats +/ |
|---|
| | 298 | ) |
|---|
| | 299 | alias OpMulA!(V.LHS, OpSubAR!(OpMul!(T, V.LHS), V.RHS)) TypeOfSub; |
|---|
| | 300 | else |
|---|
| | 301 | static if( // (- X (*> E X)) -> (/> (- 1 (/ 1 E)) X) |
|---|
| | 302 | is(T.DefP == UnDefined) && |
|---|
| | 303 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 304 | && is(T == V.RHS) |
|---|
| | 305 | ) |
|---|
| | 306 | alias OpDivA!(OpSub!(Value!(1), OpDiv!(Value!(1), V.LHS)), T) TypeOfSub; |
|---|
| | 307 | else |
|---|
| | 308 | static if( // (- C (/> A (-R> B X))) -> (/> A (+> (- B (/ C A)) X)) |
|---|
| | 309 | is(T.DefP == Defined) && |
|---|
| | 310 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 311 | /+ no repeats +/ |
|---|
| | 312 | ) |
|---|
| | 313 | alias OpDivA!(V.LHS, OpAddA!(OpSub!(V.RHS.LHS, OpDiv!(T, V.LHS)), V.RHS.RHS)) TypeOfSub; |
|---|
| | 314 | else |
|---|
| | 315 | static if( // (- C (/> A (+> B X))) -> (/> A (-R> (+ (/ C A) B) X)) |
|---|
| | 316 | is(T.DefP == Defined) && |
|---|
| | 317 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 318 | /+ no repeats +/ |
|---|
| | 319 | ) |
|---|
| | 320 | alias OpDivA!(V.LHS, OpSubAR!(OpAdd!(OpDiv!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfSub; |
|---|
| | 321 | else |
|---|
| | 322 | static if( // (- C (/> A (-> B X))) -> (/> A (-R> (- (/ C A) B) X)) |
|---|
| | 323 | is(T.DefP == Defined) && |
|---|
| | 324 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 325 | /+ no repeats +/ |
|---|
| | 326 | ) |
|---|
| | 327 | alias OpDivA!(V.LHS, OpSubAR!(OpSub!(OpDiv!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfSub; |
|---|
| | 328 | else |
|---|
| | 329 | static if( // (- A (/> B X)) -> (/> B (-R> (/ A B) X)) |
|---|
| | 330 | is(T.DefP == Defined) && |
|---|
| | 331 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 332 | /+ no repeats +/ |
|---|
| | 333 | ) |
|---|
| | 334 | alias OpDivA!(V.LHS, OpSubAR!(OpDiv!(T, V.LHS), V.RHS)) TypeOfSub; |
|---|
| | 335 | else |
|---|
| | 336 | static if( // (- X (/> E X)) -> (/> (- 1 E) X) |
|---|
| | 337 | is(T.DefP == UnDefined) && |
|---|
| | 338 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 339 | && is(T == V.RHS) |
|---|
| | 340 | ) |
|---|
| | 341 | alias OpDivA!(OpSub!(Value!(1), V.LHS), T) TypeOfSub; |
|---|
| | 342 | else |
|---|
| | 343 | static if( // (- (-R> B X) A) -> (-R> (- B A) X) |
|---|
| | 344 | is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 345 | is(V.DefP == Defined) |
|---|
| | 346 | /+ no repeats +/ |
|---|
| | 347 | ) |
|---|
| | 348 | alias OpSubAR!(OpSub!(T.LHS, V), T.RHS) TypeOfSub; |
|---|
| | 349 | else |
|---|
| | 350 | static if( // (- (-R> H X) X) -> (/> 2 (-R> (/ H 2) X)) |
|---|
| | 351 | is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 352 | is(V.DefP == UnDefined) |
|---|
| | 353 | && is(T.RHS == V) |
|---|
| | 354 | ) |
|---|
| | 355 | alias OpDivA!(Value!(2), OpSubAR!(OpDiv!(T.LHS, Value!(2)), T.RHS)) TypeOfSub; |
|---|
| | 356 | else |
|---|
| | 357 | static if( // (- (*> A (-R> B X)) C) -> (*> A (-R> (- B (* C A)) X)) |
|---|
| | 358 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 359 | is(V.DefP == Defined) |
|---|
| | 360 | /+ no repeats +/ |
|---|
| | 361 | ) |
|---|
| | 362 | alias OpMulA!(T.LHS, OpSubAR!(OpSub!(T.RHS.LHS, OpMul!(V, T.LHS)), T.RHS.RHS)) TypeOfSub; |
|---|
| | 363 | else |
|---|
| | 364 | static if( // (- (*> A (+> B X)) C) -> (*> A (+> (+ (* C A) B) X)) |
|---|
| | 365 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 366 | is(V.DefP == Defined) |
|---|
| | 367 | /+ no repeats +/ |
|---|
| | 368 | ) |
|---|
| | 369 | alias OpMulA!(T.LHS, OpAddA!(OpAdd!(OpMul!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub; |
|---|
| | 370 | else |
|---|
| | 371 | static if( // (- (*> A (-> B X)) C) -> (*> A (+> (- (* C A) B) X)) |
|---|
| | 372 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 373 | is(V.DefP == Defined) |
|---|
| | 374 | /+ no repeats +/ |
|---|
| | 375 | ) |
|---|
| | 376 | alias OpMulA!(T.LHS, OpAddA!(OpSub!(OpMul!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub; |
|---|
| | 377 | else |
|---|
| | 378 | static if( // (- (*> B X) A) -> (*> B (+> (* A B) X)) |
|---|
| | 379 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 380 | is(V.DefP == Defined) |
|---|
| | 381 | /+ no repeats +/ |
|---|
| | 382 | ) |
|---|
| | 383 | alias OpMulA!(T.LHS, OpAddA!(OpMul!(V, T.LHS), T.RHS)) TypeOfSub; |
|---|
| | 384 | else |
|---|
| | 385 | static if( // (- (*> H X) X) -> (/> (- (/ 1 H) 1) X) |
|---|
| | 386 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 387 | is(V.DefP == UnDefined) |
|---|
| | 388 | && is(T.RHS == V) |
|---|
| | 389 | ) |
|---|
| | 390 | alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), Value!(1)), T.RHS) TypeOfSub; |
|---|
| | 391 | else |
|---|
| | 392 | static if( // (- (/> A (-R> B X)) C) -> (/> A (-R> (- B (/ C A)) X)) |
|---|
| | 393 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 394 | is(V.DefP == Defined) |
|---|
| | 395 | /+ no repeats +/ |
|---|
| | 396 | ) |
|---|
| | 397 | alias OpDivA!(T.LHS, OpSubAR!(OpSub!(T.RHS.LHS, OpDiv!(V, T.LHS)), T.RHS.RHS)) TypeOfSub; |
|---|
| | 398 | else |
|---|
| | 399 | static if( // (- (/> A (+> B X)) C) -> (/> A (+> (+ (/ C A) B) X)) |
|---|
| | 400 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 401 | is(V.DefP == Defined) |
|---|
| | 402 | /+ no repeats +/ |
|---|
| | 403 | ) |
|---|
| | 404 | alias OpDivA!(T.LHS, OpAddA!(OpAdd!(OpDiv!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub; |
|---|
| | 405 | else |
|---|
| | 406 | static if( // (- (/> A (-> B X)) C) -> (/> A (+> (- (/ C A) B) X)) |
|---|
| | 407 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 408 | is(V.DefP == Defined) |
|---|
| | 409 | /+ no repeats +/ |
|---|
| | 410 | ) |
|---|
| | 411 | alias OpDivA!(T.LHS, OpAddA!(OpSub!(OpDiv!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub; |
|---|
| | 412 | else |
|---|
| | 413 | static if( // (- (/> B X) A) -> (/> B (+> (/ A B) X)) |
|---|
| | 414 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 415 | is(V.DefP == Defined) |
|---|
| | 416 | /+ no repeats +/ |
|---|
| | 417 | ) |
|---|
| | 418 | alias OpDivA!(T.LHS, OpAddA!(OpDiv!(V, T.LHS), T.RHS)) TypeOfSub; |
|---|
| | 419 | else |
|---|
| | 420 | static if( // (- (/> H X) X) -> (/> (- H 1) X) |
|---|
| | 421 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 422 | is(V.DefP == UnDefined) |
|---|
| | 423 | && is(T.RHS == V) |
|---|
| | 424 | ) |
|---|
| | 425 | alias OpDivA!(OpSub!(T.LHS, Value!(1)), T.RHS) TypeOfSub; |
|---|
| | 426 | else |
|---|
| | 427 | static if( // (- (+> B X) A) -> (+> (+ A B) X) |
|---|
| | 428 | is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 429 | is(V.DefP == Defined) |
|---|
| | 430 | /+ no repeats +/ |
|---|
| | 431 | ) |
|---|
| | 432 | alias OpAddA!(OpAdd!(V, T.LHS), T.RHS) TypeOfSub; |
|---|
| | 433 | else |
|---|
| | 434 | static if( // (- A (+> B X)) -> (-R> (+ A B) X) |
|---|
| | 435 | is(T.DefP == Defined) && |
|---|
| | 436 | is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 437 | /+ no repeats +/ |
|---|
| | 438 | ) |
|---|
| | 439 | alias OpSubAR!(OpAdd!(T, V.LHS), V.RHS) TypeOfSub; |
|---|
| | 440 | else |
|---|
| | 441 | static if( // (- (-> B X) A) -> (+> (- A B) X) |
|---|
| | 442 | is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 443 | is(V.DefP == Defined) |
|---|
| | 444 | /+ no repeats +/ |
|---|
| | 445 | ) |
|---|
| | 446 | alias OpAddA!(OpSub!(V, T.LHS), T.RHS) TypeOfSub; |
|---|
| | 447 | else |
|---|
| | 448 | static if( // (- A (-> B X)) -> (-R> (- A B) X) |
|---|
| | 449 | is(T.DefP == Defined) && |
|---|
| | 450 | is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 451 | /+ no repeats +/ |
|---|
| | 452 | ) |
|---|
| | 453 | alias OpSubAR!(OpSub!(T, V.LHS), V.RHS) TypeOfSub; |
|---|
| | 454 | else |
|---|
| | 455 | static if( // (- A B) -> (- A B) |
|---|
| | 456 | is(T.DefP == Defined) && |
|---|
| | 457 | is(V.DefP == Defined) |
|---|
| | 458 | /+ no repeats +/ |
|---|
| | 459 | ) |
|---|
| | 460 | alias OpSub!(T, V) TypeOfSub; |
|---|
| | 461 | else |
|---|
| | 462 | static if( // (- A X) -> (-R> A X) |
|---|
| | 463 | is(T.DefP == Defined) && |
|---|
| | 464 | is(V.DefP == UnDefined) |
|---|
| | 465 | /+ no repeats +/ |
|---|
| | 466 | ) |
|---|
| | 467 | alias OpSubAR!(T, V) TypeOfSub; |
|---|
| | 468 | else |
|---|
| | 469 | static if( // (- X A) -> (+> A X) |
|---|
| | 470 | is(T.DefP == UnDefined) && |
|---|
| | 471 | is(V.DefP == Defined) |
|---|
| | 472 | /+ no repeats +/ |
|---|
| | 473 | ) |
|---|
| | 474 | alias OpAddA!(V, T) TypeOfSub; |
|---|
| | 475 | else |
|---|
| | 476 | static assert(false, `inavlid type used for Sub: T == ` ~ T.stringof ~ ` and V == `~ V.stringof ); |
|---|
| | 477 | } |
|---|
| | 478 | template TypeOfMul(T, V) |
|---|
| | 479 | { |
|---|
| | 480 | static if( // (* (/> A (-R> B X)) C) -> (/> (* A C) (-R> B X)) |
|---|
| | 481 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 482 | is(V.DefP == Defined) |
|---|
| | 483 | /+ no repeats +/ |
|---|
| | 484 | ) |
|---|
| | 485 | alias OpDivA!(OpMul!(T.LHS, V), OpSubAR!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 486 | else |
|---|
| | 487 | static if( // (* C (/> A (-R> B X))) -> (/> (* A C) (-R> B X)) |
|---|
| | 488 | is(T.DefP == Defined) && |
|---|
| | 489 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 490 | /+ no repeats +/ |
|---|
| | 491 | ) |
|---|
| | 492 | alias OpDivA!(OpMul!(V.LHS, T), OpSubAR!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 493 | else |
|---|
| | 494 | static if( // (* (*> A (-R> B X)) C) -> (*> (/ A C) (-R> B X)) |
|---|
| | 495 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 496 | is(V.DefP == Defined) |
|---|
| | 497 | /+ no repeats +/ |
|---|
| | 498 | ) |
|---|
| | 499 | alias OpMulA!(OpDiv!(T.LHS, V), OpSubAR!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 500 | else |
|---|
| | 501 | static if( // (* C (*> A (-R> B X))) -> (*> (/ A C) (-R> B X)) |
|---|
| | 502 | is(T.DefP == Defined) && |
|---|
| | 503 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 504 | /+ no repeats +/ |
|---|
| | 505 | ) |
|---|
| | 506 | alias OpMulA!(OpDiv!(V.LHS, T), OpSubAR!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 507 | else |
|---|
| | 508 | static if( // (* (/R> A (+> B X)) C) -> (/R> (* A C) (+> B X)) |
|---|
| | 509 | is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 510 | is(V.DefP == Defined) |
|---|
| | 511 | /+ no repeats +/ |
|---|
| | 512 | ) |
|---|
| | 513 | alias OpDivAR!(OpMul!(T.LHS, V), OpAddA!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 514 | else |
|---|
| | 515 | static if( // (* C (/R> A (+> B X))) -> (/R> (* A C) (+> B X)) |
|---|
| | 516 | is(T.DefP == Defined) && |
|---|
| | 517 | is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 518 | /+ no repeats +/ |
|---|
| | 519 | ) |
|---|
| | 520 | alias OpDivAR!(OpMul!(V.LHS, T), OpAddA!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 521 | else |
|---|
| | 522 | static if( // (* (/> A (+> B X)) C) -> (/> (* C A) (+> B X)) |
|---|
| | 523 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 524 | is(V.DefP == Defined) |
|---|
| | 525 | /+ no repeats +/ |
|---|
| | 526 | ) |
|---|
| | 527 | alias OpDivA!(OpMul!(V, T.LHS), OpAddA!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 528 | else |
|---|
| | 529 | static if( // (* C (/> A (+> B X))) -> (/> (* C A) (+> B X)) |
|---|
| | 530 | is(T.DefP == Defined) && |
|---|
| | 531 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 532 | /+ no repeats +/ |
|---|
| | 533 | ) |
|---|
| | 534 | alias OpDivA!(OpMul!(T, V.LHS), OpAddA!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 535 | else |
|---|
| | 536 | static if( // (* (*> A (+> B X)) C) -> (*> (/ A C) (+> B X)) |
|---|
| | 537 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 538 | is(V.DefP == Defined) |
|---|
| | 539 | /+ no repeats +/ |
|---|
| | 540 | ) |
|---|
| | 541 | alias OpMulA!(OpDiv!(T.LHS, V), OpAddA!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 542 | else |
|---|
| | 543 | static if( // (* C (*> A (+> B X))) -> (*> (/ A C) (+> B X)) |
|---|
| | 544 | is(T.DefP == Defined) && |
|---|
| | 545 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 546 | /+ no repeats +/ |
|---|
| | 547 | ) |
|---|
| | 548 | alias OpMulA!(OpDiv!(V.LHS, T), OpAddA!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 549 | else |
|---|
| | 550 | static if( // (* (/R> A (-> B X)) C) -> (/R> (* A C) (-> B X)) |
|---|
| | 551 | is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 552 | is(V.DefP == Defined) |
|---|
| | 553 | /+ no repeats +/ |
|---|
| | 554 | ) |
|---|
| | 555 | alias OpDivAR!(OpMul!(T.LHS, V), OpSubA!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 556 | else |
|---|
| | 557 | static if( // (* C (/R> A (-> B X))) -> (/R> (* A C) (-> B X)) |
|---|
| | 558 | is(T.DefP == Defined) && |
|---|
| | 559 | is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 560 | /+ no repeats +/ |
|---|
| | 561 | ) |
|---|
| | 562 | alias OpDivAR!(OpMul!(V.LHS, T), OpSubA!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 563 | else |
|---|
| | 564 | static if( // (* (/> A (-> B X)) C) -> (/> (* C A) (-> B X)) |
|---|
| | 565 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 566 | is(V.DefP == Defined) |
|---|
| | 567 | /+ no repeats +/ |
|---|
| | 568 | ) |
|---|
| | 569 | alias OpDivA!(OpMul!(V, T.LHS), OpSubA!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 570 | else |
|---|
| | 571 | static if( // (* C (/> A (-> B X))) -> (/> (* C A) (-> B X)) |
|---|
| | 572 | is(T.DefP == Defined) && |
|---|
| | 573 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 574 | /+ no repeats +/ |
|---|
| | 575 | ) |
|---|
| | 576 | alias OpDivA!(OpMul!(T, V.LHS), OpSubA!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 577 | else |
|---|
| | 578 | static if( // (* (*> A (-> B X)) C) -> (*> (/ A C) (-> B X)) |
|---|
| | 579 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 580 | is(V.DefP == Defined) |
|---|
| | 581 | /+ no repeats +/ |
|---|
| | 582 | ) |
|---|
| | 583 | alias OpMulA!(OpDiv!(T.LHS, V), OpSubA!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| | 584 | else |
|---|
| | 585 | static if( // (* C (*> A (-> B X))) -> (*> (/ A C) (-> B X)) |
|---|
| | 586 | is(T.DefP == Defined) && |
|---|
| | 587 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 588 | /+ no repeats +/ |
|---|
| | 589 | ) |
|---|
| | 590 | alias OpMulA!(OpDiv!(V.LHS, T), OpSubA!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| | 591 | else |
|---|
| | 592 | static if( // (* (/R> B X) A) -> (/R> (* A B) X) |
|---|
| | 593 | is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 594 | is(V.DefP == Defined) |
|---|
| | 595 | /+ no repeats +/ |
|---|
| | 596 | ) |
|---|
| | 597 | alias OpDivAR!(OpMul!(V, T.LHS), T.RHS) TypeOfMul; |
|---|
| | 598 | else |
|---|
| | 599 | static if( // (* A (/R> B X)) -> (/R> (* A B) X) |
|---|
| | 600 | is(T.DefP == Defined) && |
|---|
| | 601 | is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 602 | /+ no repeats +/ |
|---|
| | 603 | ) |
|---|
| | 604 | alias OpDivAR!(OpMul!(T, V.LHS), V.RHS) TypeOfMul; |
|---|
| | 605 | else |
|---|
| | 606 | static if( // (* (*> B X) A) -> (*> (/ B A) X) |
|---|
| | 607 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 608 | is(V.DefP == Defined) |
|---|
| | 609 | /+ no repeats +/ |
|---|
| | 610 | ) |
|---|
| | 611 | alias OpMulA!(OpDiv!(T.LHS, V), T.RHS) TypeOfMul; |
|---|
| | 612 | else |
|---|
| | 613 | static if( // (* A (*> B X)) -> (*> (/ B A) X) |
|---|
| | 614 | is(T.DefP == Defined) && |
|---|
| | 615 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 616 | /+ no repeats +/ |
|---|
| | 617 | ) |
|---|
| | 618 | alias OpMulA!(OpDiv!(V.LHS, T), V.RHS) TypeOfMul; |
|---|
| | 619 | else |
|---|
| | 620 | static if( // (* (/> B X) A) -> (/> (* A B) X) |
|---|
| | 621 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 622 | is(V.DefP == Defined) |
|---|
| | 623 | /+ no repeats +/ |
|---|
| | 624 | ) |
|---|
| | 625 | alias OpDivA!(OpMul!(V, T.LHS), T.RHS) TypeOfMul; |
|---|
| | 626 | else |
|---|
| | 627 | static if( // (* A (/> B X)) -> (/> (* A B) X) |
|---|
| | 628 | is(T.DefP == Defined) && |
|---|
| | 629 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 630 | /+ no repeats +/ |
|---|
| | 631 | ) |
|---|
| | 632 | alias OpDivA!(OpMul!(T, V.LHS), V.RHS) TypeOfMul; |
|---|
| | 633 | else |
|---|
| | 634 | static if( // (* (+> B X) A) -> (/> A (+> B X)) |
|---|
| | 635 | is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 636 | is(V.DefP == Defined) |
|---|
| | 637 | /+ no repeats +/ |
|---|
| | 638 | ) |
|---|
| | 639 | alias OpDivA!(V, OpAddA!(T.LHS, T.RHS)) TypeOfMul; |
|---|
| | 640 | else |
|---|
| | 641 | static if( // (* A (+> B X)) -> (/> A (+> B X)) |
|---|
| | 642 | is(T.DefP == Defined) && |
|---|
| | 643 | is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 644 | /+ no repeats +/ |
|---|
| | 645 | ) |
|---|
| | 646 | alias OpDivA!(T, OpAddA!(V.LHS, V.RHS)) TypeOfMul; |
|---|
| | 647 | else |
|---|
| | 648 | static if( // (* (-> B X) A) -> (/> A (-> B X)) |
|---|
| | 649 | is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 650 | is(V.DefP == Defined) |
|---|
| | 651 | /+ no repeats +/ |
|---|
| | 652 | ) |
|---|
| | 653 | alias OpDivA!(V, OpSubA!(T.LHS, T.RHS)) TypeOfMul; |
|---|
| | 654 | else |
|---|
| | 655 | static if( // (* A (-> B X)) -> (/> A (-> B X)) |
|---|
| | 656 | is(T.DefP == Defined) && |
|---|
| | 657 | is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| | 658 | /+ no repeats +/ |
|---|
| | 659 | ) |
|---|
| | 660 | alias OpDivA!(T, OpSubA!(V.LHS, V.RHS)) TypeOfMul; |
|---|
| | 661 | else |
|---|
| | 662 | static if( // (* A B) -> (* A B) |
|---|
| | 663 | is(T.DefP == Defined) && |
|---|
| | 664 | is(V.DefP == Defined) |
|---|
| | 665 | /+ no repeats +/ |
|---|
| | 666 | ) |
|---|
| | 667 | alias OpMul!(T, V) TypeOfMul; |
|---|
| | 668 | else |
|---|
| | 669 | static if( // (* A X) -> (/> A X) |
|---|
| | 670 | is(T.DefP == Defined) && |
|---|
| | 671 | is(V.DefP == UnDefined) |
|---|
| | 672 | /+ no repeats +/ |
|---|
| | 673 | ) |
|---|
| | 674 | alias OpDivA!(T, V) TypeOfMul; |
|---|
| | 675 | else |
|---|
| | 676 | static if( // (* X A) -> (/> A X) |
|---|
| | 677 | is(T.DefP == UnDefined) && |
|---|
| | 678 | is(V.DefP == Defined) |
|---|
| | 679 | /+ no repeats +/ |
|---|
| | 680 | ) |
|---|
| | 681 | alias OpDivA!(V, T) TypeOfMul; |
|---|
| | 682 | else |
|---|
| | 683 | static assert(false, `inavlid type used for Mul: T == ` ~ T.stringof ~ ` and V == `~ V.stringof ); |
|---|
| | 687 | static if( // (/ (-R> H X) X) -> (*> H (+> H X)) |
|---|
| | 688 | is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 689 | is(V.DefP == UnDefined) |
|---|
| | 690 | && is(T.RHS == V) |
|---|
| | 691 | ) |
|---|
| | 692 | alias OpMulA!(T.LHS, OpAddA!(T.LHS, T.RHS)) TypeOfDiv; |
|---|
| | 693 | else |
|---|
| | 694 | static if( // (/ (+> B X) A) -> (*> A (+> B X)) |
|---|
| | 695 | is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 696 | is(V.DefP == Defined) |
|---|
| | 697 | /+ no repeats +/ |
|---|
| | 698 | ) |
|---|
| | 699 | alias OpMulA!(V, OpAddA!(T.LHS, T.RHS)) TypeOfDiv; |
|---|
| | 700 | else |
|---|
| | 701 | static if( // (/ (+> H X) X) -> (-R> 1 (/R> H X)) |
|---|
| | 702 | is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 703 | is(V.DefP == UnDefined) |
|---|
| | 704 | && is(T.RHS == V) |
|---|
| | 705 | ) |
|---|
| | 706 | alias OpSubAR!(Value!(1), OpDivAR!(T.LHS, T.RHS)) TypeOfDiv; |
|---|
| | 707 | else |
|---|
| | 708 | static if( // (/ (-> B X) A) -> (*> A (-> B X)) |
|---|
| | 709 | is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 710 | is(V.DefP == Defined) |
|---|
| | 711 | /+ no repeats +/ |
|---|
| | 712 | ) |
|---|
| | 713 | alias OpMulA!(V, OpSubA!(T.LHS, T.RHS)) TypeOfDiv; |
|---|
| | 714 | else |
|---|
| | 715 | static if( // (/ (-> H X) X) -> (-> 1 (/R> H X)) |
|---|
| | 716 | is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| | 717 | is(V.DefP == UnDefined) |
|---|
| | 718 | && is(T.RHS == V) |
|---|
| | 719 | ) |
|---|
| | 720 | alias OpSubA!(Value!(1), OpDivAR!(T.LHS, T.RHS)) TypeOfDiv; |
|---|
| | 721 | else |
|---|
| | 722 | static if( // (/ (/> A (-R> B X)) C) -> (*> (/ C A) (-R> B X)) |
|---|
| | 723 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 724 | is(V.DefP == Defined) |
|---|
| | 725 | /+ no repeats +/ |
|---|
| | 726 | ) |
|---|
| | 727 | alias OpMulA!(OpDiv!(V, T.LHS), OpSubAR!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; |
|---|
| | 728 | else |
|---|
| | 729 | static if( // (/ C (/> A (-R> B X))) -> (/R> (/ C A) (-R> B X)) |
|---|
| | 730 | is(T.DefP == Defined) && |
|---|
| | 731 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 732 | /+ no repeats +/ |
|---|
| | 733 | ) |
|---|
| | 734 | alias OpDivAR!(OpDiv!(T, V.LHS), OpSubAR!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; |
|---|
| | 735 | else |
|---|
| | 736 | static if( // (/ (*> A (-R> B X)) C) -> (*> (* A C) (-R> B X)) |
|---|
| | 737 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 738 | is(V.DefP == Defined) |
|---|
| | 739 | /+ no repeats +/ |
|---|
| | 740 | ) |
|---|
| | 741 | alias OpMulA!(OpMul!(T.LHS, V), OpSubAR!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; |
|---|
| | 742 | else |
|---|
| | 743 | static if( // (/ C (*> A (-R> B X))) -> (/R> (* A C) (-R> B X)) |
|---|
| | 744 | is(T.DefP == Defined) && |
|---|
| | 745 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 746 | /+ no repeats +/ |
|---|
| | 747 | ) |
|---|
| | 748 | alias OpDivAR!(OpMul!(V.LHS, T), OpSubAR!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; |
|---|
| | 749 | else |
|---|
| | 750 | static if( // (/ (/R> A (+> B X)) C) -> (/R> (/ A C) (+> B X)) |
|---|
| | 751 | is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 752 | is(V.DefP == Defined) |
|---|
| | 753 | /+ no repeats +/ |
|---|
| | 754 | ) |
|---|
| | 755 | alias OpDivAR!(OpDiv!(T.LHS, V), OpAddA!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; |
|---|
| | 756 | else |
|---|
| | 757 | static if( // (/ C (/R> A (+> B X))) -> (*> (/ A C) (+> B X)) |
|---|
| | 758 | is(T.DefP == Defined) && |
|---|
| | 759 | is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 760 | /+ no repeats +/ |
|---|
| | 761 | ) |
|---|
| | 762 | alias OpMulA!(OpDiv!(V.LHS, T), OpAddA!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; |
|---|
| | 763 | else |
|---|
| | 764 | static if( // (/ (/> A (+> B X)) C) -> (*> (/ C A) (+> B X)) |
|---|
| | 765 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 766 | is(V.DefP == Defined) |
|---|
| | 767 | /+ no repeats +/ |
|---|
| | 768 | ) |
|---|
| | 769 | alias OpMulA!(OpDiv!(V, T.LHS), OpAddA!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; |
|---|
| | 770 | else |
|---|
| | 771 | static if( // (/ C (/> A (+> B X))) -> (/R> (/ C A) (+> B X)) |
|---|
| | 772 | is(T.DefP == Defined) && |
|---|
| | 773 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 774 | /+ no repeats +/ |
|---|
| | 775 | ) |
|---|
| | 776 | alias OpDivAR!(OpDiv!(T, V.LHS), OpAddA!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; |
|---|
| | 777 | else |
|---|
| | 778 | static if( // (/ (*> A (+> B X)) C) -> (*> (* C A) (+> B X)) |
|---|
| | 779 | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 780 | is(V.DefP == Defined) |
|---|
| | 781 | /+ no repeats +/ |
|---|
| | 782 | ) |
|---|
| | 783 | alias OpMulA!(OpMul!(V, T.LHS), OpAddA!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; |
|---|
| | 784 | else |
|---|
| | 785 | static if( // (/ C (*> A (+> B X))) -> (/R> (* A C) (+> B X)) |
|---|
| | 786 | is(T.DefP == Defined) && |
|---|
| | 787 | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 788 | /+ no repeats +/ |
|---|
| | 789 | ) |
|---|
| | 790 | alias OpDivAR!(OpMul!(V.LHS, T), OpAddA!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; |
|---|
| | 791 | else |
|---|
| | 792 | static if( // (/ (/R> A (-> B X)) C) -> (/R> (/ A C) (-> B X)) |
|---|
| | 793 | is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 794 | is(V.DefP == Defined) |
|---|
| | 795 | /+ no repeats +/ |
|---|
| | 796 | ) |
|---|
| | 797 | alias OpDivAR!(OpDiv!(T.LHS, V), OpSubA!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; |
|---|
| | 798 | else |
|---|
| | 799 | static if( // (/ C (/R> A (-> B X))) -> (*> (/ A C) (-> B X)) |
|---|
| | 800 | is(T.DefP == Defined) && |
|---|
| | 801 | is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 802 | /+ no repeats +/ |
|---|
| | 803 | ) |
|---|
| | 804 | alias OpMulA!(OpDiv!(V.LHS, T), OpSubA!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; |
|---|
| | 805 | else |
|---|
| | 806 | static if( // (/ (/> A (-> B X)) C) -> (*> (/ C A) (-> B X)) |
|---|
| | 807 | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| | 808 | is(V.DefP == Defined) |
|---|
| | 809 | /+ no repeats +/ |
|---|
| | 810 | ) |
|---|
| | 811 | alias OpMulA!(OpDiv!(V, T.LHS), OpSubA!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; |
|---|
| | 812 | else |
|---|
| | 813 | static if( // (/ C (/> A (-> B X))) -> (/R> (/ C A) (-> B X)) |
|---|
| | 814 | is(T.DefP == Defined) && |
|---|
| | 815 | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| | 816 | /+ no repeats +/ |
|---|
| | 817 | ) |
|---|
| | 818 | alias OpDivAR!(OpDiv!(T, V.LHS), OpSubA!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; |
|---|
| | 819 | else |
|---|
| 475 | | template TypeOfMul(T, V) |
|---|
| 476 | | { |
|---|
| 477 | | static if( // (* (*> A (-> B X)) C) -> (*> (/ A C) (-> B X)) |
|---|
| 478 | | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && |
|---|
| 479 | | is(V.DefP == Defined) |
|---|
| 480 | | /+ no repeats +/ |
|---|
| 481 | | ) |
|---|
| 482 | | alias OpMulA!(OpDiv!(T.LHS, V), OpSubA!(T.RHS.LHS, T.RHS.RHS)) TypeOfMul; |
|---|
| 483 | | else |
|---|
| 484 | | static if( // (* C (*> A (-> B X))) -> (*> (/ A C) (-> B X)) |
|---|
| 485 | | is(T.DefP == Defined) && |
|---|
| 486 | | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) |
|---|
| 487 | | /+ no repeats +/ |
|---|
| 488 | | ) |
|---|
| 489 | | alias OpMulA!(OpDiv!(V.LHS, T), OpSubA!(V.RHS.LHS, V.RHS.RHS)) TypeOfMul; |
|---|
| 490 | | else |
|---|
| 491 | | static if( // (* (/R> B X) A) -> (/R> (* A B) X) |
|---|
| 492 | | is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 493 | | is(V.DefP == Defined) |
|---|
| 494 | | /+ no repeats +/ |
|---|
| 495 | | ) |
|---|
| 496 | | alias OpDivAR!(OpMul!(V, T.LHS), T.RHS) TypeOfMul; |
|---|
| 497 | | else |
|---|
| 498 | | static if( // (* A (/R> B X)) -> (/R> (* A B) X) |
|---|
| 499 | | is(T.DefP == Defined) && |
|---|
| 500 | | is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 501 | | /+ no repeats +/ |
|---|
| 502 | | ) |
|---|
| 503 | | alias OpDivAR!(OpMul!(T, V.LHS), V.RHS) TypeOfMul; |
|---|
| 504 | | else |
|---|
| 505 | | static if( // (* (*> B X) A) -> (*> (/ B A) X) |
|---|
| 506 | | is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 507 | | is(V.DefP == Defined) |
|---|
| 508 | | /+ no repeats +/ |
|---|
| 509 | | ) |
|---|
| 510 | | alias OpMulA!(OpDiv!(T.LHS, V), T.RHS) TypeOfMul; |
|---|
| 511 | | else |
|---|
| 512 | | static if( // (* A (*> B X)) -> (*> (/ B A) X) |
|---|
| 513 | | is(T.DefP == Defined) && |
|---|
| 514 | | is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 515 | | /+ no repeats +/ |
|---|
| 516 | | ) |
|---|
| 517 | | alias OpMulA!(OpDiv!(V.LHS, T), V.RHS) TypeOfMul; |
|---|
| 518 | | else |
|---|
| 519 | | static if( // (* (/> B X) A) -> (/> (* A B) X) |
|---|
| 520 | | is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 521 | | is(V.DefP == Defined) |
|---|
| 522 | | /+ no repeats +/ |
|---|
| 523 | | ) |
|---|
| 524 | | alias OpDivA!(OpMul!(V, T.LHS), T.RHS) TypeOfMul; |
|---|
| 525 | | else |
|---|
| 526 | | static if( // (* A (/> B X)) -> (/> (* A B) X) |
|---|
| 527 | | is(T.DefP == Defined) && |
|---|
| 528 | | is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 529 | | /+ no repeats +/ |
|---|
| 530 | | ) |
|---|
| 531 | | alias OpDivA!(OpMul!(T, V.LHS), V.RHS) TypeOfMul; |
|---|
| 532 | | else |
|---|
| 533 | | static if( // (* (+> B X) A) -> (/> A (+> B X)) |
|---|
| 534 | | is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 535 | | is(V.DefP == Defined) |
|---|
| 536 | | /+ no repeats +/ |
|---|
| 537 | | ) |
|---|
| 538 | | alias OpDivA!(V, OpAddA!(T.LHS, T.RHS)) TypeOfMul; |
|---|
| 539 | | else |
|---|
| 540 | | static if( // (* A (+> B X)) -> (/> A (+> B X)) |
|---|
| 541 | | is(T.DefP == Defined) && |
|---|
| 542 | | is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 543 | | /+ no repeats +/ |
|---|
| 544 | | ) |
|---|
| 545 | | alias OpDivA!(T, OpAddA!(V.LHS, V.RHS)) TypeOfMul; |
|---|
| 546 | | else |
|---|
| 547 | | static if( // (* (-> B X) A) -> (/> A (-> B X)) |
|---|
| 548 | | is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && |
|---|
| 549 | | is(V.DefP == Defined) |
|---|
| 550 | | /+ no repeats +/ |
|---|
| 551 | | ) |
|---|
| 552 | | alias OpDivA!(V, OpSubA!(T.LHS, T.RHS)) TypeOfMul; |
|---|
| 553 | | else |
|---|
| 554 | | static if( // (* A (-> B X)) -> (/> A (-> B X)) |
|---|
| 555 | | is(T.DefP == Defined) && |
|---|
| 556 | | is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) |
|---|
| 557 | | /+ no repeats +/ |
|---|
| 558 | | ) |
|---|
| 559 | | alias OpDivA!(T, OpSubA!(V.LHS, V.RHS)) TypeOfMul; |
|---|
| 560 | | else |
|---|
| 561 | | static if( // (* A X) -> (/> A X) |
|---|
| 562 | | is(T.DefP == Defined) && |
|---|
| 563 | | is(V.DefP == UnDefined) |
|---|
| 564 | | /+ no repeats +/ |
|---|
| 565 | | ) |
|---|
| 566 | | alias OpDivA!(T, V) TypeOfMul; |
|---|
| 567 | | else |
|---|
| 568 | | static if( // (* A B) -> (* A B) |
|---|
| 569 | | is(T.DefP == Defined) && |
|---|
| 570 | | is(V.DefP == Defined) |
|---|
| 571 | | /+ no repeats +/ |
|---|
| 572 | | ) |
|---|
| 573 | | alias OpMul!(T, V) TypeOfMul; |
|---|
| 574 | | else |
|---|
| 575 | | static if( // (* X A) -> (/> A X) |
|---|
| 576 | | is(T.DefP == UnDefined) && |
|---|
| 577 | | is(V.DefP == Defined) |
|---|
| 578 | | /+ no repeats +/ |
|---|
| 579 | | ) |
|---|
| 580 | | alias OpDivA!(V, T) TypeOfMul; |
|---|
| 581 | | else |
|---|
| 582 | | static assert(false, `inavlid type used for Mul: T == ` ~ T.stringof ~ ` and V == `~ V.stringof ); |
|---|
| 583 | | } |
|---|