root/trunk/backmath/generated_rules.d

Revision 178, 71.7 kB (checked in by BCS, 4 years ago)

added makefiles for win and linux

Line 
1 template TypeOfAdd(T, V)
2 {
3     static if( /+ (+ (/> K (-> H X)) (/> F (-> E X))) -> (/> (+ K F) (-> (/ (+ (* H K) (* E F)) (+ K F)) X)) +/
4         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
5         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
6          && is(T.RHS.RHS == V.RHS.RHS)
7         )
8         alias OpDivA!(OpAdd!(T.LHS, V.LHS), OpSubA!(OpDiv!(OpAdd!(OpMul!(T.RHS.LHS, T.LHS), OpMul!(V.RHS.LHS, V.LHS)), OpAdd!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfAdd;
9     else
10     static if( /+ (+ (/> K (-> H X)) (*> F (-> E X))) -> (/> (+ K (/ 1 F)) (-> (/ (+ (* H K) (/ E F)) (+ K (/ 1 F))) X)) +/
11         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
12         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
13          && is(T.RHS.RHS == V.RHS.RHS)
14         )
15         alias OpDivA!(OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpAdd!(OpMul!(T.RHS.LHS, T.LHS), OpDiv!(V.RHS.LHS, V.LHS)), OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
16     else
17     static if( /+ (+ (/> K (-> H X)) (/> E X)) -> (/> (+ K E) (-> (/ (* H K) (+ K E)) X)) +/
18         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
19         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
20          && is(T.RHS.RHS == V.RHS)
21         )
22         alias OpDivA!(OpAdd!(T.LHS, V.LHS), OpSubA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpAdd!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfAdd;
23     else
24     static if( /+ (+ (/> K (-> H X)) (*> E X)) -> (/> (+ K (/ 1 E)) (-> (/ (* H K) (+ K (/ 1 E))) X)) +/
25         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
26         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
27          && is(T.RHS.RHS == V.RHS)
28         )
29         alias OpDivA!(OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
30     else
31     static if( /+ (+ (/> A (-> B X)) C) -> (/> A (-> (+ (/ C A) B) X)) +/
32         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
33         is(V.DefP == Defined)
34          /+ no repeats +/
35         )
36         alias OpDivA!(T.LHS, OpSubA!(OpAdd!(OpDiv!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfAdd;
37     else
38     static if( /+ (+ (/> K (-> H X)) X) -> (/> (+ K 1) (-> (/ (* H K) (+ K 1)) X)) +/
39         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
40         is(V.DefP == UnDefined)
41          && is(T.RHS.RHS == V)
42         )
43         alias OpDivA!(OpAdd!(T.LHS, Value!(1)), OpSubA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpAdd!(T.LHS, Value!(1))), T.RHS.RHS)) TypeOfAdd;
44     else
45     static if( /+ (+ (/> K (+> H X)) (/> F (+> E X))) -> (/> (+ K F) (+> (/ (+ (* H K) (* E F)) (+ K F)) X)) +/
46         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
47         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
48          && is(T.RHS.RHS == V.RHS.RHS)
49         )
50         alias OpDivA!(OpAdd!(T.LHS, V.LHS), OpAddA!(OpDiv!(OpAdd!(OpMul!(T.RHS.LHS, T.LHS), OpMul!(V.RHS.LHS, V.LHS)), OpAdd!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfAdd;
51     else
52     static if( /+ (+ (/> K (+> H X)) (*> F (+> E X))) -> (/> (+ K (/ 1 F)) (+> (/ (+ (* H K) (/ E F)) (+ K (/ 1 F))) X)) +/
53         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
54         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
55          && is(T.RHS.RHS == V.RHS.RHS)
56         )
57         alias OpDivA!(OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpAdd!(OpMul!(T.RHS.LHS, T.LHS), OpDiv!(V.RHS.LHS, V.LHS)), OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
58     else
59     static if( /+ (+ (/> K (+> H X)) (/> E X)) -> (/> (+ K E) (+> (/ (* H K) (+ K E)) X)) +/
60         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
61         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
62          && is(T.RHS.RHS == V.RHS)
63         )
64         alias OpDivA!(OpAdd!(T.LHS, V.LHS), OpAddA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpAdd!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfAdd;
65     else
66     static if( /+ (+ (/> K (+> H X)) (*> E X)) -> (/> (+ K (/ 1 E)) (+> (/ (* H K) (+ K (/ 1 E))) X)) +/
67         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
68         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
69          && is(T.RHS.RHS == V.RHS)
70         )
71         alias OpDivA!(OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
72     else
73     static if( /+ (+ (/> A (+> B X)) C) -> (/> A (+> (- B (/ C A)) X)) +/
74         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
75         is(V.DefP == Defined)
76          /+ no repeats +/
77         )
78         alias OpDivA!(T.LHS, OpAddA!(OpSub!(T.RHS.LHS, OpDiv!(V, T.LHS)), T.RHS.RHS)) TypeOfAdd;
79     else
80     static if( /+ (+ (/> K (+> H X)) X) -> (/> (+ K 1) (+> (/ (* H K) (+ K 1)) X)) +/
81         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
82         is(V.DefP == UnDefined)
83          && is(T.RHS.RHS == V)
84         )
85         alias OpDivA!(OpAdd!(T.LHS, Value!(1)), OpAddA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpAdd!(T.LHS, Value!(1))), T.RHS.RHS)) TypeOfAdd;
86     else
87     static if( /+ (+ (*> K (-> H X)) (/> F (-> E X))) -> (/> (+ (/ 1 K) F) (-> (/ (+ (* H (/ 1 K)) (* E F)) (+ (/ 1 K) F)) X)) +/
88         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
89         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
90          && is(T.RHS.RHS == V.RHS.RHS)
91         )
92         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS), OpSubA!(OpDiv!(OpAdd!(OpMul!(T.RHS.LHS, OpDiv!(Value!(1), T.LHS)), OpMul!(V.RHS.LHS, V.LHS)), OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS.RHS)) TypeOfAdd;
93     else
94     static if( /+ (+ (*> K (-> H X)) (*> F (-> E X))) -> (/> (+ (/ 1 K) (/ 1 F))
95     (-> (/ (+ (/ E F) (/ H K)) (+ (/ 1 K) (/ 1 F))) X)) +/
96         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
97         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
98          && is(T.RHS.RHS == V.RHS.RHS)
99         )
100         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpAdd!(OpDiv!(V.RHS.LHS, V.LHS), OpDiv!(T.RHS.LHS, T.LHS)), OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
101     else
102     static if( /+ (+ (*> K (-> H X)) (/> E X)) -> (/> (+ E (/ 1 K)) (-> (/ (/ H K) (+ E (/ 1 K))) X)) +/
103         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
104         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
105          && is(T.RHS.RHS == V.RHS)
106         )
107         alias OpDivA!(OpAdd!(V.LHS, OpDiv!(Value!(1), T.LHS)), OpSubA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpAdd!(V.LHS, OpDiv!(Value!(1), T.LHS))), T.RHS.RHS)) TypeOfAdd;
108     else
109     static if( /+ (+ (*> K (-> H X)) (*> E X)) -> (/> (+ (/ 1 K) (/ 1 E)) (-> (/ (/ H K) (+ (/ 1 K) (/ 1 E))) X)) +/
110         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
111         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
112          && is(T.RHS.RHS == V.RHS)
113         )
114         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
115     else
116     static if( /+ (+ (*> K (+> H X)) (/> F (+> E X))) -> (/> (+ F (/ 1 K)) (+> (/ (+ (/ H K) (* E F)) (+ F (/ 1 K))) X)) +/
117         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
118         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
119          && is(T.RHS.RHS == V.RHS.RHS)
120         )
121         alias OpDivA!(OpAdd!(V.LHS, OpDiv!(Value!(1), T.LHS)), OpAddA!(OpDiv!(OpAdd!(OpDiv!(T.RHS.LHS, T.LHS), OpMul!(V.RHS.LHS, V.LHS)), OpAdd!(V.LHS, OpDiv!(Value!(1), T.LHS))), T.RHS.RHS)) TypeOfAdd;
122     else
123     static if( /+ (+ (*> K (+> H X)) (*> F (+> E X))) -> (/> (+ (/ 1 K) (/ 1 F))
124     (+> (/ (+ (/ H K) (/ E F)) (+ (/ 1 K) (/ 1 F))) X)) +/
125         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
126         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
127          && is(T.RHS.RHS == V.RHS.RHS)
128         )
129         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpAdd!(OpDiv!(T.RHS.LHS, T.LHS), OpDiv!(V.RHS.LHS, V.LHS)), OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
130     else
131     static if( /+ (+ (*> K (+> H X)) (/> E X)) -> (/> (+ (/ 1 K) E) (+> (/ (/ H K) (+ (/ 1 K) E)) X)) +/
132         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
133         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
134          && is(T.RHS.RHS == V.RHS)
135         )
136         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS), OpAddA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS.RHS)) TypeOfAdd;
137     else
138     static if( /+ (+ (*> K (+> H X)) (*> E X)) -> (/> (+ (/ 1 K) (/ 1 E)) (+> (/ (/ H K) (+ (/ 1 K) (/ 1 E))) X)) +/
139         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
140         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
141          && is(T.RHS.RHS == V.RHS)
142         )
143         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfAdd;
144     else
145     static if( /+ (+ (*> A (+> B X)) C) -> (*> A (+> (- B (* C A)) X)) +/
146         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
147         is(V.DefP == Defined)
148          /+ no repeats +/
149         )
150         alias OpMulA!(T.LHS, OpAddA!(OpSub!(T.RHS.LHS, OpMul!(V, T.LHS)), T.RHS.RHS)) TypeOfAdd;
151     else
152     static if( /+ (+ (*> K (+> H X)) X) -> (/> (+ (/ 1 K) 1) (+> (/ (/ H K) (+ (/ 1 K) 1)) X)) +/
153         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
154         is(V.DefP == UnDefined)
155          && is(T.RHS.RHS == V)
156         )
157         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), Value!(1)), OpAddA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), Value!(1))), T.RHS.RHS)) TypeOfAdd;
158     else
159     static if( /+ (+ (/R> H X) (/R> E X)) -> (/R> (+ H E) X) +/
160         is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
161         is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
162          && is(T.RHS == V.RHS)
163         )
164         alias OpDivAR!(OpAdd!(T.LHS, V.LHS), T.RHS) TypeOfAdd;
165     else
166     static if( /+ (+ (/> H X) (/> F (-> E X))) -> (/> (+ H F) (-> (/ (* E F) (+ H F)) X)) +/
167         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
168         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
169          && is(T.RHS == V.RHS.RHS)
170         )
171         alias OpDivA!(OpAdd!(T.LHS, V.LHS), OpSubA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpAdd!(T.LHS, V.LHS)), T.RHS)) TypeOfAdd;
172     else
173     static if( /+ (+ (/> H X) (/> F (+> E X))) -> (/> (+ H F) (+> (/ (* E F) (+ H F)) X)) +/
174         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
175         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
176          && is(T.RHS == V.RHS.RHS)
177         )
178         alias OpDivA!(OpAdd!(T.LHS, V.LHS), OpAddA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpAdd!(T.LHS, V.LHS)), T.RHS)) TypeOfAdd;
179     else
180     static if( /+ (+ (/> H X) (*> F (-> E X))) -> (/> (+ H (/ 1 F)) (-> (/ (/ E F) (+ H (/ 1 F))) X)) +/
181         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
182         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
183          && is(T.RHS == V.RHS.RHS)
184         )
185         alias OpDivA!(OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS)) TypeOfAdd;
186     else
187     static if( /+ (+ (/> H X) (*> F (+> E X))) -> (/> (+ H (/ 1 F)) (+> (/ (/ E F) (+ H (/ 1 F))) X)) +/
188         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
189         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
190          && is(T.RHS == V.RHS.RHS)
191         )
192         alias OpDivA!(OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS)) TypeOfAdd;
193     else
194     static if( /+ (+ (/> H X) (/> C X)) -> (/> (+ H C) X) +/
195         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
196         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
197          && is(T.RHS == V.RHS)
198         )
199         alias OpDivA!(OpAdd!(T.LHS, V.LHS), T.RHS) TypeOfAdd;
200     else
201     static if( /+ (+ (/> H X) (*> E X)) -> (/> (+ H (/ 1 E)) X) +/
202         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
203         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
204          && is(T.RHS == V.RHS)
205         )
206         alias OpDivA!(OpAdd!(T.LHS, OpDiv!(Value!(1), V.LHS)), T.RHS) TypeOfAdd;
207     else
208     static if( /+ (+ (/> A (-R> B X)) C) -> (/> A (-R> (+ B (/ C A)) X)) +/
209         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubAR) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
210         is(V.DefP == Defined)
211          /+ no repeats +/
212         )
213         alias OpDivA!(T.LHS, OpSubAR!(OpAdd!(T.RHS.LHS, OpDiv!(V, T.LHS)), T.RHS.RHS)) TypeOfAdd;
214     else
215     static if( /+ (+ (/> B X) A) -> (/> B (-> (/ A B) X)) +/
216         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
217         is(V.DefP == Defined)
218          /+ no repeats +/
219         )
220         alias OpDivA!(T.LHS, OpSubA!(OpDiv!(V, T.LHS), T.RHS)) TypeOfAdd;
221     else
222     static if( /+ (+ (/> H X) X) -> (/> (+ H 1) X) +/
223         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
224         is(V.DefP == UnDefined)
225          && is(T.RHS == V)
226         )
227         alias OpDivA!(OpAdd!(T.LHS, Value!(1)), T.RHS) TypeOfAdd;
228     else
229     static if( /+ (+ (*> H X) (/> F (-> E X))) -> (/> (+ (/ 1 H) F) (-> (/ (* E F) (+ (/ 1 H) F)) X)) +/
230         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
231         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
232          && is(T.RHS == V.RHS.RHS)
233         )
234         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS), OpSubA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS)) TypeOfAdd;
235     else
236     static if( /+ (+ (*> H X) (/> F (+> E X))) -> (/> (+ (/ 1 H) F) (+> (/ (* E F) (+ (/ 1 H) F)) X)) +/
237         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
238         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
239          && is(T.RHS == V.RHS.RHS)
240         )
241         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS), OpAddA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS)) TypeOfAdd;
242     else
243     static if( /+ (+ (*> H X) (*> F (-> E X))) -> (/> (+ (/ 1 H) (/ 1 F)) (-> (/ (/ E F) (+ (/ 1 H) (/ 1 F))) X)) +/
244         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
245         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
246          && is(T.RHS == V.RHS.RHS)
247         )
248         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS)) TypeOfAdd;
249     else
250     static if( /+ (+ (*> H X) (*> F (+> E X))) -> (/> (+ (/ 1 H) (/ 1 F)) (+> (/ (/ E F) (+ (/ 1 H) (/ 1 F))) X)) +/
251         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
252         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
253          && is(T.RHS == V.RHS.RHS)
254         )
255         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS)) TypeOfAdd;
256     else
257     static if( /+ (+ (*> H X) (/> E X)) -> (/> (+ (/ 1 H) E) X) +/
258         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
259         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
260          && is(T.RHS == V.RHS)
261         )
262         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), V.LHS), T.RHS) TypeOfAdd;
263     else
264     static if( /+ (+ (*> H X) (*> E X)) -> (/> (+ (/ 1 H) (/ 1 E)) X) +/
265         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
266         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
267          && is(T.RHS == V.RHS)
268         )
269         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), T.RHS) TypeOfAdd;
270     else
271     static if( /+ (+ (*> A (-R> B X)) C) -> (*> A (-R> (+ B (* C A)) X)) +/
272         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubAR) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
273         is(V.DefP == Defined)
274          /+ no repeats +/
275         )
276         alias OpMulA!(T.LHS, OpSubAR!(OpAdd!(T.RHS.LHS, OpMul!(V, T.LHS)), T.RHS.RHS)) TypeOfAdd;
277     else
278     static if( /+ (+ (*> A (-> B X)) C) -> (*> A (-> (+ (* C A) B) X)) +/
279         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
280         is(V.DefP == Defined)
281          /+ no repeats +/
282         )
283         alias OpMulA!(T.LHS, OpSubA!(OpAdd!(OpMul!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfAdd;
284     else
285     static if( /+ (+ (*> B X) A) -> (*> B (-> (* A B) X)) +/
286         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
287         is(V.DefP == Defined)
288          /+ no repeats +/
289         )
290         alias OpMulA!(T.LHS, OpSubA!(OpMul!(V, T.LHS), T.RHS)) TypeOfAdd;
291     else
292     static if( /+ (+ (*> H X) X) -> (/> (+ (/ 1 H) 1) X) +/
293         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
294         is(V.DefP == UnDefined)
295          && is(T.RHS == V)
296         )
297         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), Value!(1)), T.RHS) TypeOfAdd;
298     else
299     static if( /+ (+ (-> B X) A) -> (-> (+ A B) X) +/
300         is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
301         is(V.DefP == Defined)
302          /+ no repeats +/
303         )
304         alias OpSubA!(OpAdd!(V, T.LHS), T.RHS) TypeOfAdd;
305     else
306     static if( /+ (+ (-> H X) X) -> (/> 2 (-> (/ H 2) X)) +/
307         is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
308         is(V.DefP == UnDefined)
309          && is(T.RHS == V)
310         )
311         alias OpDivA!(Value!(2), OpSubA!(OpDiv!(T.LHS, Value!(2)), T.RHS)) TypeOfAdd;
312     else
313     static if( /+ (+ (+> B X) A) -> (+> (- B A) X) +/
314         is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
315         is(V.DefP == Defined)
316          /+ no repeats +/
317         )
318         alias OpAddA!(OpSub!(T.LHS, V), T.RHS) TypeOfAdd;
319     else
320     static if( /+ (+ (+> H X) X) -> (/> 2 (+> (/ H 2) X)) +/
321         is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
322         is(V.DefP == UnDefined)
323          && is(T.RHS == V)
324         )
325         alias OpDivA!(Value!(2), OpAddA!(OpDiv!(T.LHS, Value!(2)), T.RHS)) TypeOfAdd;
326     else
327     static if( /+ (+ C (/> A (-> B X))) -> (/> A (-> (+ (/ C A) B) X)) +/
328         is(T.DefP == Defined) &&
329         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
330          /+ no repeats +/
331         )
332         alias OpDivA!(V.LHS, OpSubA!(OpAdd!(OpDiv!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfAdd;
333     else
334     static if( /+ (+ X (/> F (-> E X))) -> (/> (+ 1 F) (-> (/ (* E F) (+ 1 F)) X)) +/
335         is(T.DefP == UnDefined) &&
336         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
337          && is(T == V.RHS.RHS)
338         )
339         alias OpDivA!(OpAdd!(Value!(1), V.LHS), OpSubA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpAdd!(Value!(1), V.LHS)), T)) TypeOfAdd;
340     else
341     static if( /+ (+ C (/> A (+> B X))) -> (/> A (+> (- B (/ C A)) X)) +/
342         is(T.DefP == Defined) &&
343         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
344          /+ no repeats +/
345         )
346         alias OpDivA!(V.LHS, OpAddA!(OpSub!(V.RHS.LHS, OpDiv!(T, V.LHS)), V.RHS.RHS)) TypeOfAdd;
347     else
348     static if( /+ (+ X (/> F (+> E X))) -> (/> (+ 1 F) (+> (/ (* E F) (+ 1 F)) X)) +/
349         is(T.DefP == UnDefined) &&
350         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
351          && is(T == V.RHS.RHS)
352         )
353         alias OpDivA!(OpAdd!(Value!(1), V.LHS), OpAddA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpAdd!(Value!(1), V.LHS)), T)) TypeOfAdd;
354     else
355     static if( /+ (+ C (*> A (-> B X))) -> (*> A (-> (+ (* C A) B) X)) +/
356         is(T.DefP == Defined) &&
357         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
358          /+ no repeats +/
359         )
360         alias OpMulA!(V.LHS, OpSubA!(OpAdd!(OpMul!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfAdd;
361     else
362     static if( /+ (+ X (*> F (-> E X))) -> (/> (+ 1 (/ 1 F)) (-> (/ (/ E F) (+ 1 (/ 1 F))) X)) +/
363         is(T.DefP == UnDefined) &&
364         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
365          && is(T == V.RHS.RHS)
366         )
367         alias OpDivA!(OpAdd!(Value!(1), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpAdd!(Value!(1), OpDiv!(Value!(1), V.LHS))), T)) TypeOfAdd;
368     else
369     static if( /+ (+ C (*> A (+> B X))) -> (*> A (+> (- B (* C A)) X)) +/
370         is(T.DefP == Defined) &&
371         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
372          /+ no repeats +/
373         )
374         alias OpMulA!(V.LHS, OpAddA!(OpSub!(V.RHS.LHS, OpMul!(T, V.LHS)), V.RHS.RHS)) TypeOfAdd;
375     else
376     static if( /+ (+ X (*> F (+> E X))) -> (/> (+ 1 (/ 1 F)) (+> (/ (/ E F) (+ 1 (/ 1 F))) X)) +/
377         is(T.DefP == UnDefined) &&
378         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
379          && is(T == V.RHS.RHS)
380         )
381         alias OpDivA!(OpAdd!(Value!(1), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpAdd!(Value!(1), OpDiv!(Value!(1), V.LHS))), T)) TypeOfAdd;
382     else
383     static if( /+ (+ C (/> A (-R> B X))) -> (/> A (-R> (+ B (/ C A)) X)) +/
384         is(T.DefP == Defined) &&
385         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubAR) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
386          /+ no repeats +/
387         )
388         alias OpDivA!(V.LHS, OpSubAR!(OpAdd!(V.RHS.LHS, OpDiv!(T, V.LHS)), V.RHS.RHS)) TypeOfAdd;
389     else
390     static if( /+ (+ A (/> B X)) -> (/> B (-> (/ A B) X)) +/
391         is(T.DefP == Defined) &&
392         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
393          /+ no repeats +/
394         )
395         alias OpDivA!(V.LHS, OpSubA!(OpDiv!(T, V.LHS), V.RHS)) TypeOfAdd;
396     else
397     static if( /+ (+ X (/> E X)) -> (/> (+ 1 E) X) +/
398         is(T.DefP == UnDefined) &&
399         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
400          && is(T == V.RHS)
401         )
402         alias OpDivA!(OpAdd!(Value!(1), V.LHS), T) TypeOfAdd;
403     else
404     static if( /+ (+ C (*> A (-R> B X))) -> (*> A (-R> (+ B (* C A)) X)) +/
405         is(T.DefP == Defined) &&
406         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubAR) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
407          /+ no repeats +/
408         )
409         alias OpMulA!(V.LHS, OpSubAR!(OpAdd!(V.RHS.LHS, OpMul!(T, V.LHS)), V.RHS.RHS)) TypeOfAdd;
410     else
411     static if( /+ (+ A (*> B X)) -> (*> B (-> (* A B) X)) +/
412         is(T.DefP == Defined) &&
413         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
414          /+ no repeats +/
415         )
416         alias OpMulA!(V.LHS, OpSubA!(OpMul!(T, V.LHS), V.RHS)) TypeOfAdd;
417     else
418     static if( /+ (+ X (*> E X)) -> (/> (+ (/ 1 E) 1) X) +/
419         is(T.DefP == UnDefined) &&
420         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
421          && is(T == V.RHS)
422         )
423         alias OpDivA!(OpAdd!(OpDiv!(Value!(1), V.LHS), Value!(1)), T) TypeOfAdd;
424     else
425     static if( /+ (+ A (-> B X)) -> (-> (+ A B) X) +/
426         is(T.DefP == Defined) &&
427         is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
428          /+ no repeats +/
429         )
430         alias OpSubA!(OpAdd!(T, V.LHS), V.RHS) TypeOfAdd;
431     else
432     static if( /+ (+ X (-> E X)) -> (/> 2 (-> (/ E 2) X)) +/
433         is(T.DefP == UnDefined) &&
434         is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
435          && is(T == V.RHS)
436         )
437         alias OpDivA!(Value!(2), OpSubA!(OpDiv!(V.LHS, Value!(2)), T)) TypeOfAdd;
438     else
439     static if( /+ (+ A (+> B X)) -> (+> (- B A) X) +/
440         is(T.DefP == Defined) &&
441         is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
442          /+ no repeats +/
443         )
444         alias OpAddA!(OpSub!(V.LHS, T), V.RHS) TypeOfAdd;
445     else
446     static if( /+ (+ X (+> E X)) -> (/> 2 (+> (/ E 2) X)) +/
447         is(T.DefP == UnDefined) &&
448         is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
449          && is(T == V.RHS)
450         )
451         alias OpDivA!(Value!(2), OpAddA!(OpDiv!(V.LHS, Value!(2)), T)) TypeOfAdd;
452     else
453     static if( /+ (+ (-R> B X) A) -> (-R> (+ A B) X) +/
454         is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
455         is(V.DefP == Defined)
456          /+ no repeats +/
457         )
458         alias OpSubAR!(OpAdd!(V, T.LHS), T.RHS) TypeOfAdd;
459     else
460     static if( /+ (+ A (-R> B X)) -> (-R> (+ A B) X) +/
461         is(T.DefP == Defined) &&
462         is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
463          /+ no repeats +/
464         )
465         alias OpSubAR!(OpAdd!(T, V.LHS), V.RHS) TypeOfAdd;
466     else
467     static if( /+ (+ A B) -> (+ A B) +/
468         is(T.DefP == Defined) &&
469         is(V.DefP == Defined)
470          /+ no repeats +/
471         )
472         alias OpAdd!(T, V) TypeOfAdd;
473     else
474     static if( /+ (+ A X) -> (-> A X) +/
475         is(T.DefP == Defined) &&
476         is(V.DefP == UnDefined)
477          /+ no repeats +/
478         )
479         alias OpSubA!(T, V) TypeOfAdd;
480     else
481     static if( /+ (+ X A) -> (-> A X) +/
482         is(T.DefP == UnDefined) &&
483         is(V.DefP == Defined)
484          /+ no repeats +/
485         )
486         alias OpSubA!(V, T) TypeOfAdd;
487     else
488     static if( /+ (+ X X) -> (/> 2 X) +/
489         is(T.DefP == UnDefined) &&
490         is(V.DefP == UnDefined)
491          && is(T == V)
492         )
493         alias OpDivA!(Value!(2), T) TypeOfAdd;
494     else
495         {}
496     static if(!is(TypeOfAdd))
497         static assert(false, `unusable types used for Add: (+ ` ~ T.LispOf ~ ` `~ V.LispOf ~ `)` );
498 }
499 template TypeOfSub(T, V)
500 {
501     static if( /+ (- (/> K (-> H X)) (/> F (-> E X))) -> (/> (- K F) (-> (/ (- (* H K) (* E F)) (- K F)) X)) +/
502         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
503         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
504          && is(T.RHS.RHS == V.RHS.RHS)
505         )
506         alias OpDivA!(OpSub!(T.LHS, V.LHS), OpSubA!(OpDiv!(OpSub!(OpMul!(T.RHS.LHS, T.LHS), OpMul!(V.RHS.LHS, V.LHS)), OpSub!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfSub;
507     else
508     static if( /+ (- (/> K (-> H X)) (*> F (-> E X))) -> (/> (- K (/ 1 F)) (-> (/ (- (* H K) (/ E F)) (- K (/ 1 F))) X)) +/
509         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
510         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
511          && is(T.RHS.RHS == V.RHS.RHS)
512         )
513         alias OpDivA!(OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpSub!(OpMul!(T.RHS.LHS, T.LHS), OpDiv!(V.RHS.LHS, V.LHS)), OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
514     else
515     static if( /+ (- (/> K (-> H X)) (/> E X)) -> (/> (- K E) (-> (/ (* H K) (- K E)) X)) +/
516         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
517         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
518          && is(T.RHS.RHS == V.RHS)
519         )
520         alias OpDivA!(OpSub!(T.LHS, V.LHS), OpSubA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpSub!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfSub;
521     else
522     static if( /+ (- (/> K (-> H X)) (*> E X)) -> (/> (- K (/ 1 E)) (-> (/ (* H K) (- K (/ 1 E))) X)) +/
523         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
524         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
525          && is(T.RHS.RHS == V.RHS)
526         )
527         alias OpDivA!(OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
528     else
529     static if( /+ (- (/> K (+> H X)) (/> F (+> E X))) -> (/> (- K F) (-> (/ (- (* E F) (* H K)) (- K F)) X)) +/
530         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
531         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
532          && is(T.RHS.RHS == V.RHS.RHS)
533         )
534         alias OpDivA!(OpSub!(T.LHS, V.LHS), OpSubA!(OpDiv!(OpSub!(OpMul!(V.RHS.LHS, V.LHS), OpMul!(T.RHS.LHS, T.LHS)), OpSub!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfSub;
535     else
536     static if( /+ (- (/> K (+> H X)) (*> F (+> E X))) -> (/> (- K (/ 1 F)) (-> (/ (- (/ E F) (* H K)) (- K (/ 1 F))) X)) +/
537         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
538         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
539          && is(T.RHS.RHS == V.RHS.RHS)
540         )
541         alias OpDivA!(OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpSub!(OpDiv!(V.RHS.LHS, V.LHS), OpMul!(T.RHS.LHS, T.LHS)), OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
542     else
543     static if( /+ (- (/> K (+> H X)) (/> E X)) -> (/> (- K E) (+> (/ (* H K) (- K E)) X)) +/
544         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
545         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
546          && is(T.RHS.RHS == V.RHS)
547         )
548         alias OpDivA!(OpSub!(T.LHS, V.LHS), OpAddA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpSub!(T.LHS, V.LHS)), T.RHS.RHS)) TypeOfSub;
549     else
550     static if( /+ (- (/> K (+> H X)) (*> E X)) -> (/> (- K (/ 1 E)) (+> (/ (* H K) (- K (/ 1 E))) X)) +/
551         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
552         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
553          && is(T.RHS.RHS == V.RHS)
554         )
555         alias OpDivA!(OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpMul!(T.RHS.LHS, T.LHS), OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
556     else
557     static if( /+ (- (*> K (-> H X)) (/> F (-> E X))) -> (/> (- (/ 1 K) F) (-> (/ (- (/ H K) (* E F)) (- (/ 1 K) F)) X)) +/
558         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
559         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
560          && is(T.RHS.RHS == V.RHS.RHS)
561         )
562         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS), OpSubA!(OpDiv!(OpSub!(OpDiv!(T.RHS.LHS, T.LHS), OpMul!(V.RHS.LHS, V.LHS)), OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS.RHS)) TypeOfSub;
563     else
564     static if( /+ (- (*> K (-> H X)) (*> F (-> E X))) -> (/> (- (/ 1 K) (/ 1 F))
565     (-> (/ (- (/ H K) (/ E F)) (- (/ 1 K) (/ 1 F))) X)) +/
566         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
567         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
568          && is(T.RHS.RHS == V.RHS.RHS)
569         )
570         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpSub!(OpDiv!(T.RHS.LHS, T.LHS), OpDiv!(V.RHS.LHS, V.LHS)), OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
571     else
572     static if( /+ (- (*> K (-> H X)) (/> E X)) -> (/> (- (/ 1 K) E) (-> (/ (/ H K) (- (/ 1 K) E)) X)) +/
573         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
574         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
575          && is(T.RHS.RHS == V.RHS)
576         )
577         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS), OpSubA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS.RHS)) TypeOfSub;
578     else
579     static if( /+ (- (*> K (-> H X)) (*> E X)) -> (/> (- (/ 1 K) (/ 1 E)) (-> (/ (/ H K) (- (/ 1 K) (/ 1 E))) X)) +/
580         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
581         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
582          && is(T.RHS.RHS == V.RHS)
583         )
584         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
585     else
586     static if( /+ (- (*> K (+> H X)) (/> F (+> E X))) -> (/> (- (/ 1 K) F) (-> (/ (- (* E F) (/ H K)) (- (/ 1 K) F)) X)) +/
587         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
588         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
589          && is(T.RHS.RHS == V.RHS.RHS)
590         )
591         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS), OpSubA!(OpDiv!(OpSub!(OpMul!(V.RHS.LHS, V.LHS), OpDiv!(T.RHS.LHS, T.LHS)), OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS.RHS)) TypeOfSub;
592     else
593     static if( /+ (- (*> K (+> H X)) (*> F (+> E X))) -> (/> (- (/ 1 K) (/ 1 F))
594     (-> (/ (- (/ E F) (/ H K)) (- (/ 1 K) (/ 1 F))) X)) +/
595         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
596         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
597          && is(T.RHS.RHS == V.RHS.RHS)
598         )
599         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpSub!(OpDiv!(V.RHS.LHS, V.LHS), OpDiv!(T.RHS.LHS, T.LHS)), OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
600     else
601     static if( /+ (- (*> K (+> H X)) (/> E X)) -> (/> (- (/ 1 K) E) (+> (/ (/ H K) (- (/ 1 K) E)) X)) +/
602         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
603         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
604          && is(T.RHS.RHS == V.RHS)
605         )
606         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS), OpAddA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS.RHS)) TypeOfSub;
607     else
608     static if( /+ (- (*> K (+> H X)) (*> E X)) -> (/> (- (/ 1 K) (/ 1 E)) (+> (/ (/ H K) (- (/ 1 K) (/ 1 E))) X)) +/
609         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
610         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
611          && is(T.RHS.RHS == V.RHS)
612         )
613         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(T.RHS.LHS, T.LHS), OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS.RHS)) TypeOfSub;
614     else
615     static if( /+ (- (/R> H X) (/R> E X)) -> (/R> (- H E) X) +/
616         is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
617         is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
618          && is(T.RHS == V.RHS)
619         )
620         alias OpDivAR!(OpSub!(T.LHS, V.LHS), T.RHS) TypeOfSub;
621     else
622     static if( /+ (- (-R> B X) A) -> (-R> (- B A) X) +/
623         is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
624         is(V.DefP == Defined)
625          /+ no repeats +/
626         )
627         alias OpSubAR!(OpSub!(T.LHS, V), T.RHS) TypeOfSub;
628     else
629     static if( /+ (- (-R> H X) X) -> (/> 2 (-R> (/ H 2) X)) +/
630         is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
631         is(V.DefP == UnDefined)
632          && is(T.RHS == V)
633         )
634         alias OpDivA!(Value!(2), OpSubAR!(OpDiv!(T.LHS, Value!(2)), T.RHS)) TypeOfSub;
635     else
636     static if( /+ (- (/> H X) (/> F (-> E X))) -> (/> (- H F) (+> (/ (* E F) (- H F)) X)) +/
637         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
638         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
639          && is(T.RHS == V.RHS.RHS)
640         )
641         alias OpDivA!(OpSub!(T.LHS, V.LHS), OpAddA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpSub!(T.LHS, V.LHS)), T.RHS)) TypeOfSub;
642     else
643     static if( /+ (- (/> H X) (/> F (+> E X))) -> (/> (- H F) (-> (/ (* E F) (- H F)) X)) +/
644         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
645         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
646          && is(T.RHS == V.RHS.RHS)
647         )
648         alias OpDivA!(OpSub!(T.LHS, V.LHS), OpSubA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpSub!(T.LHS, V.LHS)), T.RHS)) TypeOfSub;
649     else
650     static if( /+ (- (/> H X) (*> F (-> E X))) -> (/> (- H (/ 1 F)) (+> (/ (/ E F) (- H (/ 1 F))) X)) +/
651         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
652         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
653          && is(T.RHS == V.RHS.RHS)
654         )
655         alias OpDivA!(OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS)) TypeOfSub;
656     else
657     static if( /+ (- (/> H X) (*> F (+> E X))) -> (/> (- H (/ 1 F)) (-> (/ (/ E F) (- H (/ 1 F))) X)) +/
658         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
659         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
660          && is(T.RHS == V.RHS.RHS)
661         )
662         alias OpDivA!(OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS))), T.RHS)) TypeOfSub;
663     else
664     static if( /+ (- (/> H X) (/> E X)) -> (/> (- H E) X) +/
665         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
666         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
667          && is(T.RHS == V.RHS)
668         )
669         alias OpDivA!(OpSub!(T.LHS, V.LHS), T.RHS) TypeOfSub;
670     else
671     static if( /+ (- (/> H X) (*> E X)) -> (/> (- H (/ 1 E)) X) +/
672         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
673         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
674          && is(T.RHS == V.RHS)
675         )
676         alias OpDivA!(OpSub!(T.LHS, OpDiv!(Value!(1), V.LHS)), T.RHS) TypeOfSub;
677     else
678     static if( /+ (- (/> A (-R> B X)) C) -> (/> A (-R> (- B (/ C A)) X)) +/
679         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubAR) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
680         is(V.DefP == Defined)
681          /+ no repeats +/
682         )
683         alias OpDivA!(T.LHS, OpSubAR!(OpSub!(T.RHS.LHS, OpDiv!(V, T.LHS)), T.RHS.RHS)) TypeOfSub;
684     else
685     static if( /+ (- (/> A (+> B X)) C) -> (/> A (+> (+ (/ C A) B) X)) +/
686         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
687         is(V.DefP == Defined)
688          /+ no repeats +/
689         )
690         alias OpDivA!(T.LHS, OpAddA!(OpAdd!(OpDiv!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub;
691     else
692     static if( /+ (- (/> A (-> B X)) C) -> (/> A (+> (- (/ C A) B) X)) +/
693         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
694         is(V.DefP == Defined)
695          /+ no repeats +/
696         )
697         alias OpDivA!(T.LHS, OpAddA!(OpSub!(OpDiv!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub;
698     else
699     static if( /+ (- (/> B X) A) -> (/> B (+> (/ A B) X)) +/
700         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
701         is(V.DefP == Defined)
702          /+ no repeats +/
703         )
704         alias OpDivA!(T.LHS, OpAddA!(OpDiv!(V, T.LHS), T.RHS)) TypeOfSub;
705     else
706     static if( /+ (- (/> H X) X) -> (/> (- H 1) X) +/
707         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
708         is(V.DefP == UnDefined)
709          && is(T.RHS == V)
710         )
711         alias OpDivA!(OpSub!(T.LHS, Value!(1)), T.RHS) TypeOfSub;
712     else
713     static if( /+ (- (*> H X) (/> F (-> E X))) -> (/> (- (/ 1 H) F) (+> (/ (* E F) (- (/ 1 H) F)) X)) +/
714         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
715         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
716          && is(T.RHS == V.RHS.RHS)
717         )
718         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS), OpAddA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS)) TypeOfSub;
719     else
720     static if( /+ (- (*> H X) (/> F (+> E X))) -> (/> (- (/ 1 H) F) (-> (/ (* E F) (- (/ 1 H) F)) X)) +/
721         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
722         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
723          && is(T.RHS == V.RHS.RHS)
724         )
725         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS), OpSubA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS)), T.RHS)) TypeOfSub;
726     else
727     static if( /+ (- (*> H X) (*> A (-> B X))) -> (+> (/ B A) (/> (- (/ 1 H) (/ 1 A)) X)) +/
728         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
729         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
730          && is(T.RHS == V.RHS.RHS)
731         )
732         alias OpAddA!(OpDiv!(V.RHS.LHS, V.LHS), OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), T.RHS)) TypeOfSub;
733     else
734     static if( /+ (- (*> H X) (*> F (+> E X))) -> (/> (- (/ 1 H) (/ 1 F)) (+> (/ (/ E F) (- (/ 1 H) (/ 1 F))) X)) +/
735         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
736         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
737          && is(T.RHS == V.RHS.RHS)
738         )
739         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS))), T.RHS)) TypeOfSub;
740     else
741     static if( /+ (- (*> H X) (/> E X)) -> (/> (- (/ 1 H) E) X) +/
742         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
743         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
744          && is(T.RHS == V.RHS)
745         )
746         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), V.LHS), T.RHS) TypeOfSub;
747     else
748     static if( /+ (- (*> H X) (*> E X)) -> (/> (- (/ 1 H) (/ 1 E)) X) +/
749         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
750         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
751          && is(T.RHS == V.RHS)
752         )
753         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), OpDiv!(Value!(1), V.LHS)), T.RHS) TypeOfSub;
754     else
755     static if( /+ (- (*> A (-R> B X)) C) -> (*> A (-R> (- B (* C A)) X)) +/
756         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubAR) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
757         is(V.DefP == Defined)
758          /+ no repeats +/
759         )
760         alias OpMulA!(T.LHS, OpSubAR!(OpSub!(T.RHS.LHS, OpMul!(V, T.LHS)), T.RHS.RHS)) TypeOfSub;
761     else
762     static if( /+ (- (*> A (+> B X)) C) -> (*> A (+> (+ (* C A) B) X)) +/
763         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == AddA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
764         is(V.DefP == Defined)
765          /+ no repeats +/
766         )
767         alias OpMulA!(T.LHS, OpAddA!(OpAdd!(OpMul!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub;
768     else
769     static if( /+ (- (*> A (-> B X)) C) -> (*> A (+> (- (* C A) B) X)) +/
770         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.Op == SubA) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) &&
771         is(V.DefP == Defined)
772          /+ no repeats +/
773         )
774         alias OpMulA!(T.LHS, OpAddA!(OpSub!(OpMul!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfSub;
775     else
776     static if( /+ (- (*> B X) A) -> (*> B (+> (* A B) X)) +/
777         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
778         is(V.DefP == Defined)
779          /+ no repeats +/
780         )
781         alias OpMulA!(T.LHS, OpAddA!(OpMul!(V, T.LHS), T.RHS)) TypeOfSub;
782     else
783     static if( /+ (- (*> H X) X) -> (/> (- (/ 1 H) 1) X) +/
784         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) &&
785         is(V.DefP == UnDefined)
786          && is(T.RHS == V)
787         )
788         alias OpDivA!(OpSub!(OpDiv!(Value!(1), T.LHS), Value!(1)), T.RHS) TypeOfSub;
789     else
790     static if( /+ (- C (/> A (-R> B X))) -> (/> A (+> (- B (/ C A)) X)) +/
791         is(T.DefP == Defined) &&
792         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubAR) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
793          /+ no repeats +/
794         )
795         alias OpDivA!(V.LHS, OpAddA!(OpSub!(V.RHS.LHS, OpDiv!(T, V.LHS)), V.RHS.RHS)) TypeOfSub;
796     else
797     static if( /+ (- X (/> F (-R> E X))) -> (/> (+ 1 F) (-> (/ (* E F) (+ 1 F)) X)) +/
798         is(T.DefP == UnDefined) &&
799         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubAR) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
800          && is(T == V.RHS.RHS)
801         )
802         alias OpDivA!(OpAdd!(Value!(1), V.LHS), OpSubA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpAdd!(Value!(1), V.LHS)), T)) TypeOfSub;
803     else
804     static if( /+ (- C (/> A (-> B X))) -> (/> A (-R> (- (/ C A) B) X)) +/
805         is(T.DefP == Defined) &&
806         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
807          /+ no repeats +/
808         )
809         alias OpDivA!(V.LHS, OpSubAR!(OpSub!(OpDiv!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfSub;
810     else
811     static if( /+ (- X (/> F (-> E X))) -> (/> (- 1 F) (+> (/ (* E F) (- 1 F)) X)) +/
812         is(T.DefP == UnDefined) &&
813         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
814          && is(T == V.RHS.RHS)
815         )
816         alias OpDivA!(OpSub!(Value!(1), V.LHS), OpAddA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpSub!(Value!(1), V.LHS)), T)) TypeOfSub;
817     else
818     static if( /+ (- C (/> A (+> B X))) -> (/> A (-R> (+ (/ C A) B) X)) +/
819         is(T.DefP == Defined) &&
820         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
821          /+ no repeats +/
822         )
823         alias OpDivA!(V.LHS, OpSubAR!(OpAdd!(OpDiv!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfSub;
824     else
825     static if( /+ (- X (/> F (+> E X))) -> (/> (- 1 F) (-> (/ (* E F) (- 1 F)) X)) +/
826         is(T.DefP == UnDefined) &&
827         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
828          && is(T == V.RHS.RHS)
829         )
830         alias OpDivA!(OpSub!(Value!(1), V.LHS), OpSubA!(OpDiv!(OpMul!(V.RHS.LHS, V.LHS), OpSub!(Value!(1), V.LHS)), T)) TypeOfSub;
831     else
832     static if( /+ (- C (*> A (-R> B X))) -> (*> A (+> (- B (* C A)) X)) +/
833         is(T.DefP == Defined) &&
834         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubAR) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
835          /+ no repeats +/
836         )
837         alias OpMulA!(V.LHS, OpAddA!(OpSub!(V.RHS.LHS, OpMul!(T, V.LHS)), V.RHS.RHS)) TypeOfSub;
838     else
839     static if( /+ (- X (*> F (-R> E X))) -> (/> (+ 1 (/ 1 F)) (+> (/ (/ E F) (+ 1 (/ 1 F))) X)) +/
840         is(T.DefP == UnDefined) &&
841         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubAR) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
842          && is(T == V.RHS.RHS)
843         )
844         alias OpDivA!(OpAdd!(Value!(1), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpAdd!(Value!(1), OpDiv!(Value!(1), V.LHS))), T)) TypeOfSub;
845     else
846     static if( /+ (- C (*> A (-> B X))) -> (*> A (-R> (- (* A C) B) X)) +/
847         is(T.DefP == Defined) &&
848         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
849          /+ no repeats +/
850         )
851         alias OpMulA!(V.LHS, OpSubAR!(OpSub!(OpMul!(V.LHS, T), V.RHS.LHS), V.RHS.RHS)) TypeOfSub;
852     else
853     static if( /+ (- X (*> F (-> E X))) -> (/> (- 1 (/ 1 F)) (+> (/ (/ E F) (- 1 (/ 1 F))) X)) +/
854         is(T.DefP == UnDefined) &&
855         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == SubA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
856          && is(T == V.RHS.RHS)
857         )
858         alias OpDivA!(OpSub!(Value!(1), OpDiv!(Value!(1), V.LHS)), OpAddA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpSub!(Value!(1), OpDiv!(Value!(1), V.LHS))), T)) TypeOfSub;
859     else
860     static if( /+ (- C (*> A (+> B X))) -> (*> A (-R> (+ (* C A) B) X)) +/
861         is(T.DefP == Defined) &&
862         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
863          /+ no repeats +/
864         )
865         alias OpMulA!(V.LHS, OpSubAR!(OpAdd!(OpMul!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfSub;
866     else
867     static if( /+ (- X (*> F (+> E X))) -> (/> (- 1 (/ 1 F)) (-> (/ (/ E F) (- 1 (/ 1 F))) X)) +/
868         is(T.DefP == UnDefined) &&
869         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.Op == AddA) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined)
870          && is(T == V.RHS.RHS)
871         )
872         alias OpDivA!(OpSub!(Value!(1), OpDiv!(Value!(1), V.LHS)), OpSubA!(OpDiv!(OpDiv!(V.RHS.LHS, V.LHS), OpSub!(Value!(1), OpDiv!(Value!(1), V.LHS))), T)) TypeOfSub;
873     else
874     static if( /+ (- A (-R> B X)) -> (+> (- B A) X) +/
875         is(T.DefP == Defined) &&
876         is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
877          /+ no repeats +/
878         )
879         alias OpAddA!(OpSub!(V.LHS, T), V.RHS) TypeOfSub;
880     else
881     static if( /+ (- X (-R> E X)) -> (/> 2 (+> (/ E 2) X)) +/
882         is(T.DefP == UnDefined) &&
883         is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
884          && is(T == V.RHS)
885         )
886         alias OpDivA!(Value!(2), OpAddA!(OpDiv!(V.LHS, Value!(2)), T)) TypeOfSub;
887     else
888     static if( /+ (- A (/> B X)) -> (/> B (-R> (/ A B) X)) +/
889         is(T.DefP == Defined) &&
890         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
891          /+ no repeats +/
892         )
893         alias OpDivA!(V.LHS, OpSubAR!(OpDiv!(T, V.LHS), V.RHS)) TypeOfSub;
894     else
895     static if( /+ (- X (/> E X)) -> (/> (- 1 E) X) +/
896         is(T.DefP == UnDefined) &&
897         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
898          && is(T == V.RHS)
899         )
900         alias OpDivA!(OpSub!(Value!(1), V.LHS), T) TypeOfSub;
901     else
902     static if( /+ (- A (*> B X)) -> (*> B (-R> (* A B) X)) +/
903         is(T.DefP == Defined) &&
904         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
905          /+ no repeats +/
906         )
907         alias OpMulA!(V.LHS, OpSubAR!(OpMul!(T, V.LHS), V.RHS)) TypeOfSub;
908     else
909     static if( /+ (- X (*> E X)) -> (/> (- 1 (/ 1 E)) X) +/
910         is(T.DefP == UnDefined) &&
911         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
912          && is(T == V.RHS)
913         )
914         alias OpDivA!(OpSub!(Value!(1), OpDiv!(Value!(1), V.LHS)), T) TypeOfSub;
915     else
916     static if( /+ (- A (-> B X)) -> (-R> (- A B) X) +/
917         is(T.DefP == Defined) &&
918         is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
919          /+ no repeats +/
920         )
921         alias OpSubAR!(OpSub!(T, V.LHS), V.RHS) TypeOfSub;
922     else
923     static if( /+ (- X (-> E X)) -> (- 0 E) +/
924         is(T.DefP == UnDefined) &&
925         is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
926          && is(T == V.RHS)
927         )
928         alias OpSub!(Value!(0), V.LHS) TypeOfSub;
929     else
930     static if( /+ (- A (+> B X)) -> (-R> (+ A B) X) +/
931         is(T.DefP == Defined) &&
932         is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
933          /+ no repeats +/
934         )
935         alias OpSubAR!(OpAdd!(T, V.LHS), V.RHS) TypeOfSub;
936     else
937     static if( /+ (- X (+> E X)) -> E +/
938         is(T.DefP == UnDefined) &&
939         is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined)
940          && is(T == V.RHS)
941         )
942         alias V.LHS TypeOfSub;
943     else
944     static if( /+ (- (+> B X) A) -> (+> (+ A B) X) +/
945         is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.