Changeset 155

Show
Ignore:
Timestamp:
12/18/07 18:01:40 (4 years ago)
Author:
BCS
Message:

added a bunch more rules (NOTE: these is unproven code here it's likely to contain bugs)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/backmath/generated_rules.d

    r134 r155  
     1template 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} 
    1180template TypeOfAdd(T, V) 
    2181{ 
     
    8187        alias OpDivAR!(OpAdd!(T.LHS, V.LHS), T.RHS) TypeOfAdd; 
    9188    else 
    10     static if( // (+ (/R> A B) (/R> C D)) -> (/R> (+ A C) B) 
    11         is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    12         is(V.Op == DivAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    13          /+ no repeats +/ 
    14         )  
    15         alias OpDivAR!(OpAdd!(T.LHS, V.LHS), T.RHS) TypeOfAdd; 
    16     else 
    17189    static if( // (+ (/> A B) (/> C B)) -> (/> (+ A C) B) 
    18190        is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     
    21193        )  
    22194        alias OpDivA!(OpAdd!(T.LHS, V.LHS), T.RHS) TypeOfAdd; 
     195    else 
     196    static if( // (+ C (*> A (-> B X))) -> (*> A (-> (+ (* C A) B) X)) 
     197        is(T.DefP == Defined) && 
     198        is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) 
     199         /+ no repeats +/ 
     200        )  
     201        alias OpMulA!(V.LHS, OpSubA!(OpAdd!(OpMul!(T, V.LHS), V.RHS.LHS), V.RHS.RHS)) TypeOfAdd; 
     202    else 
     203    static if( // (+ A (*> B X)) -> (*> B (-> (* A B) X)) 
     204        is(T.DefP == Defined) && 
     205        is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     206         /+ no repeats +/ 
     207        )  
     208        alias OpMulA!(V.LHS, OpSubA!(OpMul!(T, V.LHS), V.RHS)) TypeOfAdd; 
     209    else 
     210    static if( // (+ X (*> E X)) -> (/> (+ (/ 1 E) 1) X) 
     211        is(T.DefP == UnDefined) && 
     212        is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     213         && is(T == V.RHS) 
     214        )  
     215        alias OpDivA!(OpAdd!(OpDiv!(Value!(1), V.LHS), Value!(1)), T) TypeOfAdd; 
     216    else 
     217    static if( // (+ A (/> B X)) -> (/> B (-> (/ A B) X)) 
     218        is(T.DefP == Defined) && 
     219        is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     220         /+ no repeats +/ 
     221        )  
     222        alias OpDivA!(V.LHS, OpSubA!(OpDiv!(T, V.LHS), V.RHS)) TypeOfAdd; 
     223    else 
     224    static if( // (+ X (/> E X)) -> (/> (+ E 1) X) 
     225        is(T.DefP == UnDefined) && 
     226        is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     227         && is(T == V.RHS) 
     228        )  
     229        alias OpDivA!(OpAdd!(V.LHS, Value!(1)), T) TypeOfAdd; 
     230    else 
     231    static if( // (+ A (+> B X)) -> (+> (- B A) X) 
     232        is(T.DefP == Defined) && 
     233        is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     234         /+ no repeats +/ 
     235        )  
     236        alias OpAddA!(OpSub!(V.LHS, T), V.RHS) TypeOfAdd; 
     237    else 
     238    static if( // (+ X (+> E X)) -> (+> E (/> 2 X)) 
     239        is(T.DefP == UnDefined) && 
     240        is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     241         && is(T == V.RHS) 
     242        )  
     243        alias OpAddA!(V.LHS, OpDivA!(Value!(2), T)) TypeOfAdd; 
     244    else 
     245    static if( // (+ A (-> B X)) -> (-> (+ A B) X) 
     246        is(T.DefP == Defined) && 
     247        is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     248         /+ no repeats +/ 
     249        )  
     250        alias OpSubA!(OpAdd!(T, V.LHS), V.RHS) TypeOfAdd; 
     251    else 
     252    static if( // (+ X (-> E X)) -> (-> E (/> 2 X)) 
     253        is(T.DefP == UnDefined) && 
     254        is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
     255         && is(T == V.RHS) 
     256        )  
     257        alias OpSubA!(V.LHS, OpDivA!(Value!(2), T)) TypeOfAdd; 
     258    else 
     259    static if( // (+ (*> A (-> B X)) C) -> (*> A (-> (+ (* C A) B) X)) 
     260        is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && 
     261        is(V.DefP == Defined) 
     262         /+ no repeats +/ 
     263        )  
     264        alias OpMulA!(T.LHS, OpSubA!(OpAdd!(OpMul!(V, T.LHS), T.RHS.LHS), T.RHS.RHS)) TypeOfAdd; 
     265    else 
     266    static if( // (+ (*> B X) A) -> (*> B (-> (* A B) X)) 
     267        is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     268        is(V.DefP == Defined) 
     269         /+ no repeats +/ 
     270        )  
     271        alias OpMulA!(T.LHS, OpSubA!(OpMul!(V, T.LHS), T.RHS)) TypeOfAdd; 
     272    else 
     273    static if( // (+ (*> H X) X) -> (/> (+ (/ 1 H) 1) X) 
     274        is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     275        is(V.DefP == UnDefined) 
     276         && is(T.RHS == V) 
     277        )  
     278        alias OpDivA!(OpAdd!(OpDiv!(Value!(1), T.LHS), Value!(1)), T.RHS) TypeOfAdd; 
     279    else 
     280    static if( // (+ (/> B X) A) -> (/> B (-> (/ A B) X)) 
     281        is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     282        is(V.DefP == Defined) 
     283         /+ no repeats +/ 
     284        )  
     285        alias OpDivA!(T.LHS, OpSubA!(OpDiv!(V, T.LHS), T.RHS)) TypeOfAdd; 
     286    else 
     287    static if( // (+ (/> H X) X) -> (/> (+ H 1) X) 
     288        is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     289        is(V.DefP == UnDefined) 
     290         && is(T.RHS == V) 
     291        )  
     292        alias OpDivA!(OpAdd!(T.LHS, Value!(1)), T.RHS) TypeOfAdd; 
     293    else 
     294    static if( // (+ (+> B X) A) -> (+> (- B A) X) 
     295        is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     296        is(V.DefP == Defined) 
     297         /+ no repeats +/ 
     298        )  
     299        alias OpAddA!(OpSub!(T.LHS, V), T.RHS) TypeOfAdd; 
     300    else 
     301    static if( // (+ (+> H X) X) -> (+> H (/> 2 X)) 
     302        is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     303        is(V.DefP == UnDefined) 
     304         && is(T.RHS == V) 
     305        )  
     306        alias OpAddA!(T.LHS, OpDivA!(Value!(2), T.RHS)) TypeOfAdd; 
     307    else 
     308    static if( // (+ (-> B X) A) -> (-> (+ A B) X) 
     309        is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     310        is(V.DefP == Defined) 
     311         /+ no repeats +/ 
     312        )  
     313        alias OpSubA!(OpAdd!(V, T.LHS), T.RHS) TypeOfAdd; 
     314    else 
     315    static if( // (+ (-> H X) X) -> (-> H (/> 2 X)) 
     316        is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     317        is(V.DefP == UnDefined) 
     318         && is(T.RHS == V) 
     319        )  
     320        alias OpSubA!(T.LHS, OpDivA!(Value!(2), T.RHS)) TypeOfAdd; 
    23321    else 
    24322    static if( // (+ (-R> B X) A) -> (-R> (+ A B) X) 
     
    36334        alias OpSubAR!(OpAdd!(T, V.LHS), V.RHS) TypeOfAdd; 
    37335    else 
    38     static if( // (+ (*> B X) A) -> (*> B (-> (* A B) X)) 
    39         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    40         is(V.DefP == Defined) 
    41          /+ no repeats +/ 
    42         )  
    43         alias OpMulA!(T.LHS, OpSubA!(OpMul!(V, T.LHS), T.RHS)) TypeOfAdd; 
    44     else 
    45     static if( // (+ A (*> B X)) -> (*> B (-> (* A B) X)) 
    46         is(T.DefP == Defined) && 
    47         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    48          /+ no repeats +/ 
    49         )  
    50         alias OpMulA!(V.LHS, OpSubA!(OpMul!(T, V.LHS), V.RHS)) TypeOfAdd; 
    51     else 
    52     static if( // (+ (/> B X) A) -> (/> B (-> (/ A B) X)) 
    53         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    54         is(V.DefP == Defined) 
    55          /+ no repeats +/ 
    56         )  
    57         alias OpDivA!(T.LHS, OpSubA!(OpDiv!(V, T.LHS), T.RHS)) TypeOfAdd; 
    58     else 
    59     static if( // (+ A (/> B X)) -> (/> B (-> (/ A B) X)) 
    60         is(T.DefP == Defined) && 
    61         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    62          /+ no repeats +/ 
    63         )  
    64         alias OpDivA!(V.LHS, OpSubA!(OpDiv!(T, V.LHS), V.RHS)) TypeOfAdd; 
    65     else 
    66     static if( // (+ (+> B X) A) -> (+> (- B A) X) 
    67         is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    68         is(V.DefP == Defined) 
    69          /+ no repeats +/ 
    70         )  
    71         alias OpAddA!(OpSub!(T.LHS, V), T.RHS) TypeOfAdd; 
    72     else 
    73     static if( // (+ A (+> B X)) -> (+> (- B A) X) 
    74         is(T.DefP == Defined) && 
    75         is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    76          /+ no repeats +/ 
    77         )  
    78         alias OpAddA!(OpSub!(V.LHS, T), V.RHS) TypeOfAdd; 
    79     else 
    80     static if( // (+ (-> B X) A) -> (-> (+ A B) X) 
    81         is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    82         is(V.DefP == Defined) 
    83          /+ no repeats +/ 
    84         )  
    85         alias OpSubA!(OpAdd!(V, T.LHS), T.RHS) TypeOfAdd; 
    86     else 
    87     static if( // (+ A (-> B X)) -> (-> (+ A B) X) 
    88         is(T.DefP == Defined) && 
    89         is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    90          /+ no repeats +/ 
    91         )  
    92         alias OpSubA!(OpAdd!(T, V.LHS), V.RHS) TypeOfAdd; 
    93     else 
    94336    static if( // (+ A X) -> (-> A X) 
    95337        is(T.DefP == Defined) && 
     
    112354        )  
    113355        alias OpSubA!(V, T) TypeOfAdd; 
     356    else 
     357    static if( // (+ X X) -> (/> 2 X) 
     358        is(T.DefP == UnDefined) && 
     359        is(V.DefP == UnDefined) 
     360         && is(T == V) 
     361        )  
     362        alias OpDivA!(Value!(2), T) TypeOfAdd; 
    114363    else 
    115364    static assert(false, `inavlid type used for Add: T == ` ~ T.stringof ~ ` and V == `~ V.stringof ); 
     
    117366template TypeOfDiv(T, V) 
    118367{ 
     368    static if( // (/ (*> A (-> B X)) C) -> (*> (* C A) (-> B X)) 
     369        is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.LHS.DefP == Defined) && is(T.RHS.RHS.DefP == UnDefined) && 
     370        is(V.DefP == Defined) 
     371         /+ no repeats +/ 
     372        )  
     373        alias OpMulA!(OpMul!(V, T.LHS), OpSubA!(T.RHS.LHS, T.RHS.RHS)) TypeOfDiv; 
     374    else 
     375    static if( // (/ C (*> A (-> B X))) -> (/R> (* C A) (-> B X)) 
     376        is(T.DefP == Defined) && 
     377        is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.LHS.DefP == Defined) && is(V.RHS.RHS.DefP == UnDefined) 
     378         /+ no repeats +/ 
     379        )  
     380        alias OpDivAR!(OpMul!(T, V.LHS), OpSubA!(V.RHS.LHS, V.RHS.RHS)) TypeOfDiv; 
     381    else 
    119382    static if( // (/ (/R> B X) A) -> (/R> (/ B A) X) 
    120383        is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     
    212475template TypeOfMul(T, V) 
    213476{ 
     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 
    214491    static if( // (* (/R> B X) A) -> (/R> (* A B) X) 
    215492        is(T.Op == DivAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
     
    305582    static assert(false, `inavlid type used for Mul: T == ` ~ T.stringof ~ ` and V == `~ V.stringof ); 
    306583} 
    307 template TypeOfSub(T, V) 
    308 { 
    309     static if( // (- (-R> B X) A) -> (-R> (- B A) X) 
    310         is(T.Op == SubAR) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    311         is(V.DefP == Defined) 
    312          /+ no repeats +/ 
    313         )  
    314         alias OpSubAR!(OpSub!(T.LHS, V), T.RHS) TypeOfSub; 
    315     else 
    316     static if( // (- A (-R> B X)) -> (+> (- B A) X) 
    317         is(T.DefP == Defined) && 
    318         is(V.Op == SubAR) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    319          /+ no repeats +/ 
    320         )  
    321         alias OpAddA!(OpSub!(V.LHS, T), V.RHS) TypeOfSub; 
    322     else 
    323     static if( // (- (*> B X) A) -> (*> B (+> (* A B) X)) 
    324         is(T.Op == MulA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    325         is(V.DefP == Defined) 
    326          /+ no repeats +/ 
    327         )  
    328         alias OpMulA!(T.LHS, OpAddA!(OpMul!(V, T.LHS), T.RHS)) TypeOfSub; 
    329     else 
    330     static if( // (- A (*> B X)) -> (*> B (-R> (* A B) X)) 
    331         is(T.DefP == Defined) && 
    332         is(V.Op == MulA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    333          /+ no repeats +/ 
    334         )  
    335         alias OpMulA!(V.LHS, OpSubAR!(OpMul!(T, V.LHS), V.RHS)) TypeOfSub; 
    336     else 
    337     static if( // (- (/> B X) A) -> (/> B (+> (/ A B) X)) 
    338         is(T.Op == DivA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    339         is(V.DefP == Defined) 
    340          /+ no repeats +/ 
    341         )  
    342         alias OpDivA!(T.LHS, OpAddA!(OpDiv!(V, T.LHS), T.RHS)) TypeOfSub; 
    343     else 
    344     static if( // (- A (/> B X)) -> (/> B (-R> (/ A B) X)) 
    345         is(T.DefP == Defined) && 
    346         is(V.Op == DivA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    347          /+ no repeats +/ 
    348         )  
    349         alias OpDivA!(V.LHS, OpSubAR!(OpDiv!(T, V.LHS), V.RHS)) TypeOfSub; 
    350     else 
    351     static if( // (- (+> B X) A) -> (+> (+ A B) X) 
    352         is(T.Op == AddA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    353         is(V.DefP == Defined) 
    354          /+ no repeats +/ 
    355         )  
    356         alias OpAddA!(OpAdd!(V, T.LHS), T.RHS) TypeOfSub; 
    357     else 
    358     static if( // (- A (+> B X)) -> (-R> (+ A B) X) 
    359         is(T.DefP == Defined) && 
    360         is(V.Op == AddA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    361          /+ no repeats +/ 
    362         )  
    363         alias OpSubAR!(OpAdd!(T, V.LHS), V.RHS) TypeOfSub; 
    364     else 
    365     static if( // (- (-> B X) A) -> (+> (- A B) X) 
    366         is(T.Op == SubA) && is(T.LHS.DefP == Defined) && is(T.RHS.DefP == UnDefined) && 
    367         is(V.DefP == Defined) 
    368          /+ no repeats +/ 
    369         )  
    370         alias OpAddA!(OpSub!(V, T.LHS), T.RHS) TypeOfSub; 
    371     else 
    372     static if( // (- A (-> B X)) -> (-R> (- A B) X) 
    373         is(T.DefP == Defined) && 
    374         is(V.Op == SubA) && is(V.LHS.DefP == Defined) && is(V.RHS.DefP == UnDefined) 
    375          /+ no repeats +/ 
    376         )  
    377         alias OpSubAR!(OpSub!(T, V.LHS), V.RHS) TypeOfSub; 
    378     else 
    379     static if( // (- A X) -> (-R> A X) 
    380         is(T.DefP == Defined) && 
    381         is(V.DefP == UnDefined) 
    382          /+ no repeats +/ 
    383         )  
    384         alias OpSubAR!(T, V) TypeOfSub; 
    385     else 
    386     static if( // (- A B) -> (- A B) 
    387         is(T.DefP == Defined) && 
    388         is(V.DefP == Defined) 
    389          /+ no repeats +/ 
    390         )  
    391         alias OpSub!(T, V) TypeOfSub; 
    392     else 
    393     static if( // (- X A) -> (+> A X) 
    394         is(T.DefP == UnDefined) && 
    395         is(V.DefP == Defined) 
    396          /+ no repeats +/ 
    397         )  
    398         alias OpAddA!(V, T) TypeOfSub; 
    399     else 
    400     static assert(false, `inavlid type used for Sub: T == ` ~ T.stringof ~ ` and V == `~ V.stringof ); 
    401 } 
    402584