15 |
| SUM of field_def * field_def |
| SUM of field_def * field_def |
16 |
(* scaling too? *) |
(* scaling too? *) |
17 |
|
|
18 |
|
(* slightly smart constructor for DIFF *) |
19 |
|
fun diff (DIFF(k, fld)) = DIFF(k+1, fld) |
20 |
|
| diff fld = DIFF(1, fld) |
21 |
|
|
22 |
|
(* slightly smart constructor for NEG *) |
23 |
|
fun neg (NEG fld) = fld |
24 |
|
| neg fld = (NEG fld) |
25 |
|
|
26 |
(* normalize a field definition by pushing the DIFF operators to the |
(* normalize a field definition by pushing the DIFF operators to the |
27 |
* leaves |
* leaves |
28 |
*) |
*) |
30 |
fun norm fld = (case fld |
fun norm fld = (case fld |
31 |
of CONV _ => fld |
of CONV _ => fld |
32 |
| DIFF(k, fld) => diff (k, fld) |
| DIFF(k, fld) => diff (k, fld) |
33 |
|
| NEG(NEG fld) => norm fld |
34 |
| NEG fld => NEG(norm fld) |
| NEG fld => NEG(norm fld) |
35 |
| SUM(fld1, fld2) => SUM(norm fld1, norm fld2) |
| SUM(fld1, fld2) => SUM(norm fld1, norm fld2) |
36 |
(* end case *)) |
(* end case *)) |
37 |
and diff (k, fld) = (case fld |
and diff (k, fld) = (case fld |
38 |
of CONV _ => DIFF(k, fld) |
of CONV _ => DIFF(k, fld) |
39 |
| DIFF(k', fld) => diff (k+k', fld) |
| DIFF(k', fld) => diff (k+k', fld) |
40 |
|
| NEG(NEG fld) => norm fld |
41 |
| NEG fld => NEG(diff(k, fld)) |
| NEG fld => NEG(diff(k, fld)) |
42 |
| SUM(fld1, fld2) => SUM(diff(k, fld1), diff(k, fld2)) |
| SUM(fld1, fld2) => SUM(diff(k, fld1), diff(k, fld2)) |
43 |
(* end case *)) |
(* end case *)) |