diff options
Diffstat (limited to 'theories/Ints/num/NMake.v')
| -rw-r--r-- | theories/Ints/num/NMake.v | 5639 |
1 files changed, 2367 insertions, 3272 deletions
diff --git a/theories/Ints/num/NMake.v b/theories/Ints/num/NMake.v index 26174bdb1e..03402c53ff 100644 --- a/theories/Ints/num/NMake.v +++ b/theories/Ints/num/NMake.v @@ -1,3 +1,4 @@ +Require Import ZAux. Require Import ZArith. Require Import Basic_type. Require Import ZnZ. @@ -7,6 +8,13 @@ Require Import GenMul. Require Import GenDivn1. Require Import Wf_nat. + (***************************************************************) + (* *) + (* File automatically generated DO NOT EDIT *) + (* Constructors: 13 Generated Proofs: false *) + (* *) + (***************************************************************) + Module Type W0Type. Parameter w : Set. Parameter w_op : znz_op w. @@ -109,6 +117,1508 @@ Module Make (W0:W0Type). Definition zero := N0 w_0. Definition one := N0 one0. + Definition to_Z x := + match x with + | N0 wx => w0_op.(znz_to_Z) wx + | N1 wx => w1_op.(znz_to_Z) wx + | N2 wx => w2_op.(znz_to_Z) wx + | N3 wx => w3_op.(znz_to_Z) wx + | N4 wx => w4_op.(znz_to_Z) wx + | N5 wx => w5_op.(znz_to_Z) wx + | N6 wx => w6_op.(znz_to_Z) wx + | N7 wx => w7_op.(znz_to_Z) wx + | N8 wx => w8_op.(znz_to_Z) wx + | N9 wx => w9_op.(znz_to_Z) wx + | N10 wx => w10_op.(znz_to_Z) wx + | N11 wx => w11_op.(znz_to_Z) wx + | N12 wx => w12_op.(znz_to_Z) wx + | N13 wx => w13_op.(znz_to_Z) wx + | Nn n wx => (make_op n).(znz_to_Z) wx + end. + + Open Scope Z_scope. + Notation "[ x ]" := (to_Z x). + + (* Eval and extend functions for each level *) + Let extend0 := GenBase.extend (WW w_0). + Let extend1 := GenBase.extend (WW (W0: w1)). + Let extend2 := GenBase.extend (WW (W0: w2)). + Let extend3 := GenBase.extend (WW (W0: w3)). + Let extend4 := GenBase.extend (WW (W0: w4)). + Let extend5 := GenBase.extend (WW (W0: w5)). + Let extend6 := GenBase.extend (WW (W0: w6)). + Let extend7 := GenBase.extend (WW (W0: w7)). + Let extend8 := GenBase.extend (WW (W0: w8)). + Let extend9 := GenBase.extend (WW (W0: w9)). + Let extend10 := GenBase.extend (WW (W0: w10)). + Let extend11 := GenBase.extend (WW (W0: w11)). + Let extend12 := GenBase.extend (WW (W0: w12)). + Let extend13 := GenBase.extend (WW (W0: w13)). + + Definition w0_eq0 := w0_op.(znz_eq0). + Let spec_w0_eq0: forall x, if w0_eq0 x then [N0 x] = 0 else True. + Admitted. + + Definition w1_eq0 := w1_op.(znz_eq0). + Let spec_w1_eq0: forall x, if w1_eq0 x then [N1 x] = 0 else True. + Admitted. + + Definition w2_eq0 := w2_op.(znz_eq0). + Let spec_w2_eq0: forall x, if w2_eq0 x then [N2 x] = 0 else True. + Admitted. + + Definition w3_eq0 := w3_op.(znz_eq0). + Let spec_w3_eq0: forall x, if w3_eq0 x then [N3 x] = 0 else True. + Admitted. + + Definition w4_eq0 := w4_op.(znz_eq0). + Let spec_w4_eq0: forall x, if w4_eq0 x then [N4 x] = 0 else True. + Admitted. + + Definition w5_eq0 := w5_op.(znz_eq0). + Let spec_w5_eq0: forall x, if w5_eq0 x then [N5 x] = 0 else True. + Admitted. + + Definition w6_eq0 := w6_op.(znz_eq0). + Let spec_w6_eq0: forall x, if w6_eq0 x then [N6 x] = 0 else True. + Admitted. + + Definition w7_eq0 := w7_op.(znz_eq0). + Let spec_w7_eq0: forall x, if w7_eq0 x then [N7 x] = 0 else True. + Admitted. + + Definition w8_eq0 := w8_op.(znz_eq0). + Let spec_w8_eq0: forall x, if w8_eq0 x then [N8 x] = 0 else True. + Admitted. + + Definition w9_eq0 := w9_op.(znz_eq0). + Let spec_w9_eq0: forall x, if w9_eq0 x then [N9 x] = 0 else True. + Admitted. + + Definition w10_eq0 := w10_op.(znz_eq0). + Let spec_w10_eq0: forall x, if w10_eq0 x then [N10 x] = 0 else True. + Admitted. + + Definition w11_eq0 := w11_op.(znz_eq0). + Let spec_w11_eq0: forall x, if w11_eq0 x then [N11 x] = 0 else True. + Admitted. + + Definition w12_eq0 := w12_op.(znz_eq0). + Let spec_w12_eq0: forall x, if w12_eq0 x then [N12 x] = 0 else True. + Admitted. + + Definition w13_eq0 := w13_op.(znz_eq0). + Let spec_w13_eq0: forall x, if w13_eq0 x then [N13 x] = 0 else True. + Admitted. + + + Theorem to_Z_pos: forall x, 0 <= [x]. + Admitted. + + Section LevelAndIter. + + Variable res: Set. + Variable xxx: res. + Variable P: Z -> Z -> res -> Prop. + (* Abstraction function for each level *) + Variable f0: w0 -> w0 -> res. + Variable f0n: forall n, w0 -> word w0 (S n) -> res. + Variable fn0: forall n, word w0 (S n) -> w0 -> res. + + Variable f1: w1 -> w1 -> res. + Variable f1n: forall n, w1 -> word w1 (S n) -> res. + Variable fn1: forall n, word w1 (S n) -> w1 -> res. + + Variable f2: w2 -> w2 -> res. + Variable f2n: forall n, w2 -> word w2 (S n) -> res. + Variable fn2: forall n, word w2 (S n) -> w2 -> res. + + Variable f3: w3 -> w3 -> res. + Variable f3n: forall n, w3 -> word w3 (S n) -> res. + Variable fn3: forall n, word w3 (S n) -> w3 -> res. + + Variable f4: w4 -> w4 -> res. + Variable f4n: forall n, w4 -> word w4 (S n) -> res. + Variable fn4: forall n, word w4 (S n) -> w4 -> res. + + Variable f5: w5 -> w5 -> res. + Variable f5n: forall n, w5 -> word w5 (S n) -> res. + Variable fn5: forall n, word w5 (S n) -> w5 -> res. + + Variable f6: w6 -> w6 -> res. + Variable f6n: forall n, w6 -> word w6 (S n) -> res. + Variable fn6: forall n, word w6 (S n) -> w6 -> res. + + Variable f7: w7 -> w7 -> res. + Variable f7n: forall n, w7 -> word w7 (S n) -> res. + Variable fn7: forall n, word w7 (S n) -> w7 -> res. + + Variable f8: w8 -> w8 -> res. + Variable f8n: forall n, w8 -> word w8 (S n) -> res. + Variable fn8: forall n, word w8 (S n) -> w8 -> res. + + Variable f9: w9 -> w9 -> res. + Variable f9n: forall n, w9 -> word w9 (S n) -> res. + Variable fn9: forall n, word w9 (S n) -> w9 -> res. + + Variable f10: w10 -> w10 -> res. + Variable f10n: forall n, w10 -> word w10 (S n) -> res. + Variable fn10: forall n, word w10 (S n) -> w10 -> res. + + Variable f11: w11 -> w11 -> res. + Variable f11n: forall n, w11 -> word w11 (S n) -> res. + Variable fn11: forall n, word w11 (S n) -> w11 -> res. + + Variable f12: w12 -> w12 -> res. + Variable f12n: forall n, w12 -> word w12 (S n) -> res. + Variable fn12: forall n, word w12 (S n) -> w12 -> res. + + Variable f13: w13 -> w13 -> res. + Variable f13n: forall n, w13 -> word w13 (S n) -> res. + Variable fn13: forall n, word w13 (S n) -> w13 -> res. + + Variable fnn: forall n, word w13 (S n) -> word w13 (S n) -> res. + Variable fnm: forall n m, word w13 (S n) -> word w13 (S m) -> res. + + (* Special zero functions *) + Variable f0t: t_ -> res. + Variable ft0: t_ -> res. + + (* We level the two arguments before applying *) + (* the functions at each leval *) + Definition same_level (x y: t_): res := + Eval lazy zeta beta iota delta [extend0 extend1 extend2 extend3 extend4 extend5 extend6 extend7 extend8 extend9 extend10 extend11 extend12 extend13 + GenBase.extend GenBase.extend_aux + ] in + match x, y with + | N0 wx, N0 wy => f0 wx wy + | N0 wx, N1 wy => f1 (extend0 0 wx) wy + | N0 wx, N2 wy => f2 (extend0 1 wx) wy + | N0 wx, N3 wy => f3 (extend0 2 wx) wy + | N0 wx, N4 wy => f4 (extend0 3 wx) wy + | N0 wx, N5 wy => f5 (extend0 4 wx) wy + | N0 wx, N6 wy => f6 (extend0 5 wx) wy + | N0 wx, N7 wy => f7 (extend0 6 wx) wy + | N0 wx, N8 wy => f8 (extend0 7 wx) wy + | N0 wx, N9 wy => f9 (extend0 8 wx) wy + | N0 wx, N10 wy => f10 (extend0 9 wx) wy + | N0 wx, N11 wy => f11 (extend0 10 wx) wy + | N0 wx, N12 wy => f12 (extend0 11 wx) wy + | N0 wx, N13 wy => f13 (extend0 12 wx) wy + | N0 wx, Nn m wy => fnn m (extend13 m (extend0 12 wx)) wy + | N1 wx, N0 wy => f1 wx (extend0 0 wy) + | N1 wx, N1 wy => f1 wx wy + | N1 wx, N2 wy => f2 (extend1 0 wx) wy + | N1 wx, N3 wy => f3 (extend1 1 wx) wy + | N1 wx, N4 wy => f4 (extend1 2 wx) wy + | N1 wx, N5 wy => f5 (extend1 3 wx) wy + | N1 wx, N6 wy => f6 (extend1 4 wx) wy + | N1 wx, N7 wy => f7 (extend1 5 wx) wy + | N1 wx, N8 wy => f8 (extend1 6 wx) wy + | N1 wx, N9 wy => f9 (extend1 7 wx) wy + | N1 wx, N10 wy => f10 (extend1 8 wx) wy + | N1 wx, N11 wy => f11 (extend1 9 wx) wy + | N1 wx, N12 wy => f12 (extend1 10 wx) wy + | N1 wx, N13 wy => f13 (extend1 11 wx) wy + | N1 wx, Nn m wy => fnn m (extend13 m (extend1 11 wx)) wy + | N2 wx, N0 wy => f2 wx (extend0 1 wy) + | N2 wx, N1 wy => f2 wx (extend1 0 wy) + | N2 wx, N2 wy => f2 wx wy + | N2 wx, N3 wy => f3 (extend2 0 wx) wy + | N2 wx, N4 wy => f4 (extend2 1 wx) wy + | N2 wx, N5 wy => f5 (extend2 2 wx) wy + | N2 wx, N6 wy => f6 (extend2 3 wx) wy + | N2 wx, N7 wy => f7 (extend2 4 wx) wy + | N2 wx, N8 wy => f8 (extend2 5 wx) wy + | N2 wx, N9 wy => f9 (extend2 6 wx) wy + | N2 wx, N10 wy => f10 (extend2 7 wx) wy + | N2 wx, N11 wy => f11 (extend2 8 wx) wy + | N2 wx, N12 wy => f12 (extend2 9 wx) wy + | N2 wx, N13 wy => f13 (extend2 10 wx) wy + | N2 wx, Nn m wy => fnn m (extend13 m (extend2 10 wx)) wy + | N3 wx, N0 wy => f3 wx (extend0 2 wy) + | N3 wx, N1 wy => f3 wx (extend1 1 wy) + | N3 wx, N2 wy => f3 wx (extend2 0 wy) + | N3 wx, N3 wy => f3 wx wy + | N3 wx, N4 wy => f4 (extend3 0 wx) wy + | N3 wx, N5 wy => f5 (extend3 1 wx) wy + | N3 wx, N6 wy => f6 (extend3 2 wx) wy + | N3 wx, N7 wy => f7 (extend3 3 wx) wy + | N3 wx, N8 wy => f8 (extend3 4 wx) wy + | N3 wx, N9 wy => f9 (extend3 5 wx) wy + | N3 wx, N10 wy => f10 (extend3 6 wx) wy + | N3 wx, N11 wy => f11 (extend3 7 wx) wy + | N3 wx, N12 wy => f12 (extend3 8 wx) wy + | N3 wx, N13 wy => f13 (extend3 9 wx) wy + | N3 wx, Nn m wy => fnn m (extend13 m (extend3 9 wx)) wy + | N4 wx, N0 wy => f4 wx (extend0 3 wy) + | N4 wx, N1 wy => f4 wx (extend1 2 wy) + | N4 wx, N2 wy => f4 wx (extend2 1 wy) + | N4 wx, N3 wy => f4 wx (extend3 0 wy) + | N4 wx, N4 wy => f4 wx wy + | N4 wx, N5 wy => f5 (extend4 0 wx) wy + | N4 wx, N6 wy => f6 (extend4 1 wx) wy + | N4 wx, N7 wy => f7 (extend4 2 wx) wy + | N4 wx, N8 wy => f8 (extend4 3 wx) wy + | N4 wx, N9 wy => f9 (extend4 4 wx) wy + | N4 wx, N10 wy => f10 (extend4 5 wx) wy + | N4 wx, N11 wy => f11 (extend4 6 wx) wy + | N4 wx, N12 wy => f12 (extend4 7 wx) wy + | N4 wx, N13 wy => f13 (extend4 8 wx) wy + | N4 wx, Nn m wy => fnn m (extend13 m (extend4 8 wx)) wy + | N5 wx, N0 wy => f5 wx (extend0 4 wy) + | N5 wx, N1 wy => f5 wx (extend1 3 wy) + | N5 wx, N2 wy => f5 wx (extend2 2 wy) + | N5 wx, N3 wy => f5 wx (extend3 1 wy) + | N5 wx, N4 wy => f5 wx (extend4 0 wy) + | N5 wx, N5 wy => f5 wx wy + | N5 wx, N6 wy => f6 (extend5 0 wx) wy + | N5 wx, N7 wy => f7 (extend5 1 wx) wy + | N5 wx, N8 wy => f8 (extend5 2 wx) wy + | N5 wx, N9 wy => f9 (extend5 3 wx) wy + | N5 wx, N10 wy => f10 (extend5 4 wx) wy + | N5 wx, N11 wy => f11 (extend5 5 wx) wy + | N5 wx, N12 wy => f12 (extend5 6 wx) wy + | N5 wx, N13 wy => f13 (extend5 7 wx) wy + | N5 wx, Nn m wy => fnn m (extend13 m (extend5 7 wx)) wy + | N6 wx, N0 wy => f6 wx (extend0 5 wy) + | N6 wx, N1 wy => f6 wx (extend1 4 wy) + | N6 wx, N2 wy => f6 wx (extend2 3 wy) + | N6 wx, N3 wy => f6 wx (extend3 2 wy) + | N6 wx, N4 wy => f6 wx (extend4 1 wy) + | N6 wx, N5 wy => f6 wx (extend5 0 wy) + | N6 wx, N6 wy => f6 wx wy + | N6 wx, N7 wy => f7 (extend6 0 wx) wy + | N6 wx, N8 wy => f8 (extend6 1 wx) wy + | N6 wx, N9 wy => f9 (extend6 2 wx) wy + | N6 wx, N10 wy => f10 (extend6 3 wx) wy + | N6 wx, N11 wy => f11 (extend6 4 wx) wy + | N6 wx, N12 wy => f12 (extend6 5 wx) wy + | N6 wx, N13 wy => f13 (extend6 6 wx) wy + | N6 wx, Nn m wy => fnn m (extend13 m (extend6 6 wx)) wy + | N7 wx, N0 wy => f7 wx (extend0 6 wy) + | N7 wx, N1 wy => f7 wx (extend1 5 wy) + | N7 wx, N2 wy => f7 wx (extend2 4 wy) + | N7 wx, N3 wy => f7 wx (extend3 3 wy) + | N7 wx, N4 wy => f7 wx (extend4 2 wy) + | N7 wx, N5 wy => f7 wx (extend5 1 wy) + | N7 wx, N6 wy => f7 wx (extend6 0 wy) + | N7 wx, N7 wy => f7 wx wy + | N7 wx, N8 wy => f8 (extend7 0 wx) wy + | N7 wx, N9 wy => f9 (extend7 1 wx) wy + | N7 wx, N10 wy => f10 (extend7 2 wx) wy + | N7 wx, N11 wy => f11 (extend7 3 wx) wy + | N7 wx, N12 wy => f12 (extend7 4 wx) wy + | N7 wx, N13 wy => f13 (extend7 5 wx) wy + | N7 wx, Nn m wy => fnn m (extend13 m (extend7 5 wx)) wy + | N8 wx, N0 wy => f8 wx (extend0 7 wy) + | N8 wx, N1 wy => f8 wx (extend1 6 wy) + | N8 wx, N2 wy => f8 wx (extend2 5 wy) + | N8 wx, N3 wy => f8 wx (extend3 4 wy) + | N8 wx, N4 wy => f8 wx (extend4 3 wy) + | N8 wx, N5 wy => f8 wx (extend5 2 wy) + | N8 wx, N6 wy => f8 wx (extend6 1 wy) + | N8 wx, N7 wy => f8 wx (extend7 0 wy) + | N8 wx, N8 wy => f8 wx wy + | N8 wx, N9 wy => f9 (extend8 0 wx) wy + | N8 wx, N10 wy => f10 (extend8 1 wx) wy + | N8 wx, N11 wy => f11 (extend8 2 wx) wy + | N8 wx, N12 wy => f12 (extend8 3 wx) wy + | N8 wx, N13 wy => f13 (extend8 4 wx) wy + | N8 wx, Nn m wy => fnn m (extend13 m (extend8 4 wx)) wy + | N9 wx, N0 wy => f9 wx (extend0 8 wy) + | N9 wx, N1 wy => f9 wx (extend1 7 wy) + | N9 wx, N2 wy => f9 wx (extend2 6 wy) + | N9 wx, N3 wy => f9 wx (extend3 5 wy) + | N9 wx, N4 wy => f9 wx (extend4 4 wy) + | N9 wx, N5 wy => f9 wx (extend5 3 wy) + | N9 wx, N6 wy => f9 wx (extend6 2 wy) + | N9 wx, N7 wy => f9 wx (extend7 1 wy) + | N9 wx, N8 wy => f9 wx (extend8 0 wy) + | N9 wx, N9 wy => f9 wx wy + | N9 wx, N10 wy => f10 (extend9 0 wx) wy + | N9 wx, N11 wy => f11 (extend9 1 wx) wy + | N9 wx, N12 wy => f12 (extend9 2 wx) wy + | N9 wx, N13 wy => f13 (extend9 3 wx) wy + | N9 wx, Nn m wy => fnn m (extend13 m (extend9 3 wx)) wy + | N10 wx, N0 wy => f10 wx (extend0 9 wy) + | N10 wx, N1 wy => f10 wx (extend1 8 wy) + | N10 wx, N2 wy => f10 wx (extend2 7 wy) + | N10 wx, N3 wy => f10 wx (extend3 6 wy) + | N10 wx, N4 wy => f10 wx (extend4 5 wy) + | N10 wx, N5 wy => f10 wx (extend5 4 wy) + | N10 wx, N6 wy => f10 wx (extend6 3 wy) + | N10 wx, N7 wy => f10 wx (extend7 2 wy) + | N10 wx, N8 wy => f10 wx (extend8 1 wy) + | N10 wx, N9 wy => f10 wx (extend9 0 wy) + | N10 wx, N10 wy => f10 wx wy + | N10 wx, N11 wy => f11 (extend10 0 wx) wy + | N10 wx, N12 wy => f12 (extend10 1 wx) wy + | N10 wx, N13 wy => f13 (extend10 2 wx) wy + | N10 wx, Nn m wy => fnn m (extend13 m (extend10 2 wx)) wy + | N11 wx, N0 wy => f11 wx (extend0 10 wy) + | N11 wx, N1 wy => f11 wx (extend1 9 wy) + | N11 wx, N2 wy => f11 wx (extend2 8 wy) + | N11 wx, N3 wy => f11 wx (extend3 7 wy) + | N11 wx, N4 wy => f11 wx (extend4 6 wy) + | N11 wx, N5 wy => f11 wx (extend5 5 wy) + | N11 wx, N6 wy => f11 wx (extend6 4 wy) + | N11 wx, N7 wy => f11 wx (extend7 3 wy) + | N11 wx, N8 wy => f11 wx (extend8 2 wy) + | N11 wx, N9 wy => f11 wx (extend9 1 wy) + | N11 wx, N10 wy => f11 wx (extend10 0 wy) + | N11 wx, N11 wy => f11 wx wy + | N11 wx, N12 wy => f12 (extend11 0 wx) wy + | N11 wx, N13 wy => f13 (extend11 1 wx) wy + | N11 wx, Nn m wy => fnn m (extend13 m (extend11 1 wx)) wy + | N12 wx, N0 wy => f12 wx (extend0 11 wy) + | N12 wx, N1 wy => f12 wx (extend1 10 wy) + | N12 wx, N2 wy => f12 wx (extend2 9 wy) + | N12 wx, N3 wy => f12 wx (extend3 8 wy) + | N12 wx, N4 wy => f12 wx (extend4 7 wy) + | N12 wx, N5 wy => f12 wx (extend5 6 wy) + | N12 wx, N6 wy => f12 wx (extend6 5 wy) + | N12 wx, N7 wy => f12 wx (extend7 4 wy) + | N12 wx, N8 wy => f12 wx (extend8 3 wy) + | N12 wx, N9 wy => f12 wx (extend9 2 wy) + | N12 wx, N10 wy => f12 wx (extend10 1 wy) + | N12 wx, N11 wy => f12 wx (extend11 0 wy) + | N12 wx, N12 wy => f12 wx wy + | N12 wx, N13 wy => f13 (extend12 0 wx) wy + | N12 wx, Nn m wy => fnn m (extend13 m (extend12 0 wx)) wy + | N13 wx, N0 wy => f13 wx (extend0 12 wy) + | N13 wx, N1 wy => f13 wx (extend1 11 wy) + | N13 wx, N2 wy => f13 wx (extend2 10 wy) + | N13 wx, N3 wy => f13 wx (extend3 9 wy) + | N13 wx, N4 wy => f13 wx (extend4 8 wy) + | N13 wx, N5 wy => f13 wx (extend5 7 wy) + | N13 wx, N6 wy => f13 wx (extend6 6 wy) + | N13 wx, N7 wy => f13 wx (extend7 5 wy) + | N13 wx, N8 wy => f13 wx (extend8 4 wy) + | N13 wx, N9 wy => f13 wx (extend9 3 wy) + | N13 wx, N10 wy => f13 wx (extend10 2 wy) + | N13 wx, N11 wy => f13 wx (extend11 1 wy) + | N13 wx, N12 wy => f13 wx (extend12 0 wy) + | N13 wx, N13 wy => f13 wx wy + | N13 wx, Nn m wy => fnn m (extend13 m wx) wy + | Nn n wx, N0 wy => fnn n wx (extend13 n (extend0 12 wy)) + | Nn n wx, N1 wy => fnn n wx (extend13 n (extend1 11 wy)) + | Nn n wx, N2 wy => fnn n wx (extend13 n (extend2 10 wy)) + | Nn n wx, N3 wy => fnn n wx (extend13 n (extend3 9 wy)) + | Nn n wx, N4 wy => fnn n wx (extend13 n (extend4 8 wy)) + | Nn n wx, N5 wy => fnn n wx (extend13 n (extend5 7 wy)) + | Nn n wx, N6 wy => fnn n wx (extend13 n (extend6 6 wy)) + | Nn n wx, N7 wy => fnn n wx (extend13 n (extend7 5 wy)) + | Nn n wx, N8 wy => fnn n wx (extend13 n (extend8 4 wy)) + | Nn n wx, N9 wy => fnn n wx (extend13 n (extend9 3 wy)) + | Nn n wx, N10 wy => fnn n wx (extend13 n (extend10 2 wy)) + | Nn n wx, N11 wy => fnn n wx (extend13 n (extend11 1 wy)) + | Nn n wx, N12 wy => fnn n wx (extend13 n (extend12 0 wy)) + | Nn n wx, N13 wy => fnn n wx (extend13 n wy) + | Nn n wx, Nn m wy => + let mn := Max.max n m in + let d := diff n m in + fnn mn + (castm (diff_r n m) (extend_tr wx (snd d))) + (castm (diff_l n m) (extend_tr wy (fst d))) + end. + + (* We level the two arguments before applying *) + (* the functions at each level (special zero case) *) + Definition same_level0 (x y: t_): res := + Eval lazy zeta beta iota delta [extend0 extend1 extend2 extend3 extend4 extend5 extend6 extend7 extend8 extend9 extend10 extend11 extend12 extend13 + GenBase.extend GenBase.extend_aux + ] in + match x with + | N0 wx => + if w0_eq0 wx then f0t y else + match y with + | N0 wy => f0 wx wy + | N1 wy => f1 (extend0 0 wx) wy + | N2 wy => f2 (extend0 1 wx) wy + | N3 wy => f3 (extend0 2 wx) wy + | N4 wy => f4 (extend0 3 wx) wy + | N5 wy => f5 (extend0 4 wx) wy + | N6 wy => f6 (extend0 5 wx) wy + | N7 wy => f7 (extend0 6 wx) wy + | N8 wy => f8 (extend0 7 wx) wy + | N9 wy => f9 (extend0 8 wx) wy + | N10 wy => f10 (extend0 9 wx) wy + | N11 wy => f11 (extend0 10 wx) wy + | N12 wy => f12 (extend0 11 wx) wy + | N13 wy => f13 (extend0 12 wx) wy + | Nn m wy => fnn m (extend13 m (extend0 12 wx)) wy + end + | N1 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f1 wx (extend0 0 wy) + | N1 wy => f1 wx wy + | N2 wy => f2 (extend1 0 wx) wy + | N3 wy => f3 (extend1 1 wx) wy + | N4 wy => f4 (extend1 2 wx) wy + | N5 wy => f5 (extend1 3 wx) wy + | N6 wy => f6 (extend1 4 wx) wy + | N7 wy => f7 (extend1 5 wx) wy + | N8 wy => f8 (extend1 6 wx) wy + | N9 wy => f9 (extend1 7 wx) wy + | N10 wy => f10 (extend1 8 wx) wy + | N11 wy => f11 (extend1 9 wx) wy + | N12 wy => f12 (extend1 10 wx) wy + | N13 wy => f13 (extend1 11 wx) wy + | Nn m wy => fnn m (extend13 m (extend1 11 wx)) wy + end + | N2 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f2 wx (extend0 1 wy) + | N1 wy => + f2 wx (extend1 0 wy) + | N2 wy => f2 wx wy + | N3 wy => f3 (extend2 0 wx) wy + | N4 wy => f4 (extend2 1 wx) wy + | N5 wy => f5 (extend2 2 wx) wy + | N6 wy => f6 (extend2 3 wx) wy + | N7 wy => f7 (extend2 4 wx) wy + | N8 wy => f8 (extend2 5 wx) wy + | N9 wy => f9 (extend2 6 wx) wy + | N10 wy => f10 (extend2 7 wx) wy + | N11 wy => f11 (extend2 8 wx) wy + | N12 wy => f12 (extend2 9 wx) wy + | N13 wy => f13 (extend2 10 wx) wy + | Nn m wy => fnn m (extend13 m (extend2 10 wx)) wy + end + | N3 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f3 wx (extend0 2 wy) + | N1 wy => + f3 wx (extend1 1 wy) + | N2 wy => + f3 wx (extend2 0 wy) + | N3 wy => f3 wx wy + | N4 wy => f4 (extend3 0 wx) wy + | N5 wy => f5 (extend3 1 wx) wy + | N6 wy => f6 (extend3 2 wx) wy + | N7 wy => f7 (extend3 3 wx) wy + | N8 wy => f8 (extend3 4 wx) wy + | N9 wy => f9 (extend3 5 wx) wy + | N10 wy => f10 (extend3 6 wx) wy + | N11 wy => f11 (extend3 7 wx) wy + | N12 wy => f12 (extend3 8 wx) wy + | N13 wy => f13 (extend3 9 wx) wy + | Nn m wy => fnn m (extend13 m (extend3 9 wx)) wy + end + | N4 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f4 wx (extend0 3 wy) + | N1 wy => + f4 wx (extend1 2 wy) + | N2 wy => + f4 wx (extend2 1 wy) + | N3 wy => + f4 wx (extend3 0 wy) + | N4 wy => f4 wx wy + | N5 wy => f5 (extend4 0 wx) wy + | N6 wy => f6 (extend4 1 wx) wy + | N7 wy => f7 (extend4 2 wx) wy + | N8 wy => f8 (extend4 3 wx) wy + | N9 wy => f9 (extend4 4 wx) wy + | N10 wy => f10 (extend4 5 wx) wy + | N11 wy => f11 (extend4 6 wx) wy + | N12 wy => f12 (extend4 7 wx) wy + | N13 wy => f13 (extend4 8 wx) wy + | Nn m wy => fnn m (extend13 m (extend4 8 wx)) wy + end + | N5 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f5 wx (extend0 4 wy) + | N1 wy => + f5 wx (extend1 3 wy) + | N2 wy => + f5 wx (extend2 2 wy) + | N3 wy => + f5 wx (extend3 1 wy) + | N4 wy => + f5 wx (extend4 0 wy) + | N5 wy => f5 wx wy + | N6 wy => f6 (extend5 0 wx) wy + | N7 wy => f7 (extend5 1 wx) wy + | N8 wy => f8 (extend5 2 wx) wy + | N9 wy => f9 (extend5 3 wx) wy + | N10 wy => f10 (extend5 4 wx) wy + | N11 wy => f11 (extend5 5 wx) wy + | N12 wy => f12 (extend5 6 wx) wy + | N13 wy => f13 (extend5 7 wx) wy + | Nn m wy => fnn m (extend13 m (extend5 7 wx)) wy + end + | N6 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f6 wx (extend0 5 wy) + | N1 wy => + f6 wx (extend1 4 wy) + | N2 wy => + f6 wx (extend2 3 wy) + | N3 wy => + f6 wx (extend3 2 wy) + | N4 wy => + f6 wx (extend4 1 wy) + | N5 wy => + f6 wx (extend5 0 wy) + | N6 wy => f6 wx wy + | N7 wy => f7 (extend6 0 wx) wy + | N8 wy => f8 (extend6 1 wx) wy + | N9 wy => f9 (extend6 2 wx) wy + | N10 wy => f10 (extend6 3 wx) wy + | N11 wy => f11 (extend6 4 wx) wy + | N12 wy => f12 (extend6 5 wx) wy + | N13 wy => f13 (extend6 6 wx) wy + | Nn m wy => fnn m (extend13 m (extend6 6 wx)) wy + end + | N7 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f7 wx (extend0 6 wy) + | N1 wy => + f7 wx (extend1 5 wy) + | N2 wy => + f7 wx (extend2 4 wy) + | N3 wy => + f7 wx (extend3 3 wy) + | N4 wy => + f7 wx (extend4 2 wy) + | N5 wy => + f7 wx (extend5 1 wy) + | N6 wy => + f7 wx (extend6 0 wy) + | N7 wy => f7 wx wy + | N8 wy => f8 (extend7 0 wx) wy + | N9 wy => f9 (extend7 1 wx) wy + | N10 wy => f10 (extend7 2 wx) wy + | N11 wy => f11 (extend7 3 wx) wy + | N12 wy => f12 (extend7 4 wx) wy + | N13 wy => f13 (extend7 5 wx) wy + | Nn m wy => fnn m (extend13 m (extend7 5 wx)) wy + end + | N8 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f8 wx (extend0 7 wy) + | N1 wy => + f8 wx (extend1 6 wy) + | N2 wy => + f8 wx (extend2 5 wy) + | N3 wy => + f8 wx (extend3 4 wy) + | N4 wy => + f8 wx (extend4 3 wy) + | N5 wy => + f8 wx (extend5 2 wy) + | N6 wy => + f8 wx (extend6 1 wy) + | N7 wy => + f8 wx (extend7 0 wy) + | N8 wy => f8 wx wy + | N9 wy => f9 (extend8 0 wx) wy + | N10 wy => f10 (extend8 1 wx) wy + | N11 wy => f11 (extend8 2 wx) wy + | N12 wy => f12 (extend8 3 wx) wy + | N13 wy => f13 (extend8 4 wx) wy + | Nn m wy => fnn m (extend13 m (extend8 4 wx)) wy + end + | N9 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f9 wx (extend0 8 wy) + | N1 wy => + f9 wx (extend1 7 wy) + | N2 wy => + f9 wx (extend2 6 wy) + | N3 wy => + f9 wx (extend3 5 wy) + | N4 wy => + f9 wx (extend4 4 wy) + | N5 wy => + f9 wx (extend5 3 wy) + | N6 wy => + f9 wx (extend6 2 wy) + | N7 wy => + f9 wx (extend7 1 wy) + | N8 wy => + f9 wx (extend8 0 wy) + | N9 wy => f9 wx wy + | N10 wy => f10 (extend9 0 wx) wy + | N11 wy => f11 (extend9 1 wx) wy + | N12 wy => f12 (extend9 2 wx) wy + | N13 wy => f13 (extend9 3 wx) wy + | Nn m wy => fnn m (extend13 m (extend9 3 wx)) wy + end + | N10 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f10 wx (extend0 9 wy) + | N1 wy => + f10 wx (extend1 8 wy) + | N2 wy => + f10 wx (extend2 7 wy) + | N3 wy => + f10 wx (extend3 6 wy) + | N4 wy => + f10 wx (extend4 5 wy) + | N5 wy => + f10 wx (extend5 4 wy) + | N6 wy => + f10 wx (extend6 3 wy) + | N7 wy => + f10 wx (extend7 2 wy) + | N8 wy => + f10 wx (extend8 1 wy) + | N9 wy => + f10 wx (extend9 0 wy) + | N10 wy => f10 wx wy + | N11 wy => f11 (extend10 0 wx) wy + | N12 wy => f12 (extend10 1 wx) wy + | N13 wy => f13 (extend10 2 wx) wy + | Nn m wy => fnn m (extend13 m (extend10 2 wx)) wy + end + | N11 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f11 wx (extend0 10 wy) + | N1 wy => + f11 wx (extend1 9 wy) + | N2 wy => + f11 wx (extend2 8 wy) + | N3 wy => + f11 wx (extend3 7 wy) + | N4 wy => + f11 wx (extend4 6 wy) + | N5 wy => + f11 wx (extend5 5 wy) + | N6 wy => + f11 wx (extend6 4 wy) + | N7 wy => + f11 wx (extend7 3 wy) + | N8 wy => + f11 wx (extend8 2 wy) + | N9 wy => + f11 wx (extend9 1 wy) + | N10 wy => + f11 wx (extend10 0 wy) + | N11 wy => f11 wx wy + | N12 wy => f12 (extend11 0 wx) wy + | N13 wy => f13 (extend11 1 wx) wy + | Nn m wy => fnn m (extend13 m (extend11 1 wx)) wy + end + | N12 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f12 wx (extend0 11 wy) + | N1 wy => + f12 wx (extend1 10 wy) + | N2 wy => + f12 wx (extend2 9 wy) + | N3 wy => + f12 wx (extend3 8 wy) + | N4 wy => + f12 wx (extend4 7 wy) + | N5 wy => + f12 wx (extend5 6 wy) + | N6 wy => + f12 wx (extend6 5 wy) + | N7 wy => + f12 wx (extend7 4 wy) + | N8 wy => + f12 wx (extend8 3 wy) + | N9 wy => + f12 wx (extend9 2 wy) + | N10 wy => + f12 wx (extend10 1 wy) + | N11 wy => + f12 wx (extend11 0 wy) + | N12 wy => f12 wx wy + | N13 wy => f13 (extend12 0 wx) wy + | Nn m wy => fnn m (extend13 m (extend12 0 wx)) wy + end + | N13 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + f13 wx (extend0 12 wy) + | N1 wy => + f13 wx (extend1 11 wy) + | N2 wy => + f13 wx (extend2 10 wy) + | N3 wy => + f13 wx (extend3 9 wy) + | N4 wy => + f13 wx (extend4 8 wy) + | N5 wy => + f13 wx (extend5 7 wy) + | N6 wy => + f13 wx (extend6 6 wy) + | N7 wy => + f13 wx (extend7 5 wy) + | N8 wy => + f13 wx (extend8 4 wy) + | N9 wy => + f13 wx (extend9 3 wy) + | N10 wy => + f13 wx (extend10 2 wy) + | N11 wy => + f13 wx (extend11 1 wy) + | N12 wy => + f13 wx (extend12 0 wy) + | N13 wy => f13 wx wy + | Nn m wy => fnn m (extend13 m wx) wy + end + | Nn n wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fnn n wx (extend13 n (extend0 12 wy)) + | N1 wy => + fnn n wx (extend13 n (extend1 11 wy)) + | N2 wy => + fnn n wx (extend13 n (extend2 10 wy)) + | N3 wy => + fnn n wx (extend13 n (extend3 9 wy)) + | N4 wy => + fnn n wx (extend13 n (extend4 8 wy)) + | N5 wy => + fnn n wx (extend13 n (extend5 7 wy)) + | N6 wy => + fnn n wx (extend13 n (extend6 6 wy)) + | N7 wy => + fnn n wx (extend13 n (extend7 5 wy)) + | N8 wy => + fnn n wx (extend13 n (extend8 4 wy)) + | N9 wy => + fnn n wx (extend13 n (extend9 3 wy)) + | N10 wy => + fnn n wx (extend13 n (extend10 2 wy)) + | N11 wy => + fnn n wx (extend13 n (extend11 1 wy)) + | N12 wy => + fnn n wx (extend13 n (extend12 0 wy)) + | N13 wy => + fnn n wx (extend13 n wy) + | Nn m wy => + let mn := Max.max n m in + let d := diff n m in + fnn mn + (castm (diff_r n m) (extend_tr wx (snd d))) + (castm (diff_l n m) (extend_tr wy (fst d))) + end + end. + + (* We iter the smaller argument with the bigger *) + Definition iter (x y: t_): res := + Eval lazy zeta beta iota delta [extend0 extend1 extend2 extend3 extend4 extend5 extend6 extend7 extend8 extend9 extend10 extend11 extend12 extend13 + GenBase.extend GenBase.extend_aux + ] in + match x, y with + | N0 wx, N0 wy => f0 wx wy + | N0 wx, N1 wy => f0n 0 wx wy + | N0 wx, N2 wy => f0n 1 wx wy + | N0 wx, N3 wy => f0n 2 wx wy + | N0 wx, N4 wy => f0n 3 wx wy + | N0 wx, N5 wy => f0n 4 wx wy + | N0 wx, N6 wy => f0n 5 wx wy + | N0 wx, N7 wy => f0n 6 wx wy + | N0 wx, N8 wy => f0n 7 wx wy + | N0 wx, N9 wy => f0n 8 wx wy + | N0 wx, N10 wy => f0n 9 wx wy + | N0 wx, N11 wy => f0n 10 wx wy + | N0 wx, N12 wy => f0n 11 wx wy + | N0 wx, N13 wy => f0n 12 wx wy + | N0 wx, Nn m wy => f13n m (extend0 12 wx) wy + | N1 wx, N0 wy => fn0 0 wx wy + | N1 wx, N1 wy => f1 wx wy + | N1 wx, N2 wy => f1n 0 wx wy + | N1 wx, N3 wy => f1n 1 wx wy + | N1 wx, N4 wy => f1n 2 wx wy + | N1 wx, N5 wy => f1n 3 wx wy + | N1 wx, N6 wy => f1n 4 wx wy + | N1 wx, N7 wy => f1n 5 wx wy + | N1 wx, N8 wy => f1n 6 wx wy + | N1 wx, N9 wy => f1n 7 wx wy + | N1 wx, N10 wy => f1n 8 wx wy + | N1 wx, N11 wy => f1n 9 wx wy + | N1 wx, N12 wy => f1n 10 wx wy + | N1 wx, N13 wy => f1n 11 wx wy + | N1 wx, Nn m wy => f13n m (extend1 11 wx) wy + | N2 wx, N0 wy => fn0 1 wx wy + | N2 wx, N1 wy => fn1 0 wx wy + | N2 wx, N2 wy => f2 wx wy + | N2 wx, N3 wy => f2n 0 wx wy + | N2 wx, N4 wy => f2n 1 wx wy + | N2 wx, N5 wy => f2n 2 wx wy + | N2 wx, N6 wy => f2n 3 wx wy + | N2 wx, N7 wy => f2n 4 wx wy + | N2 wx, N8 wy => f2n 5 wx wy + | N2 wx, N9 wy => f2n 6 wx wy + | N2 wx, N10 wy => f2n 7 wx wy + | N2 wx, N11 wy => f2n 8 wx wy + | N2 wx, N12 wy => f2n 9 wx wy + | N2 wx, N13 wy => f2n 10 wx wy + | N2 wx, Nn m wy => f13n m (extend2 10 wx) wy + | N3 wx, N0 wy => fn0 2 wx wy + | N3 wx, N1 wy => fn1 1 wx wy + | N3 wx, N2 wy => fn2 0 wx wy + | N3 wx, N3 wy => f3 wx wy + | N3 wx, N4 wy => f3n 0 wx wy + | N3 wx, N5 wy => f3n 1 wx wy + | N3 wx, N6 wy => f3n 2 wx wy + | N3 wx, N7 wy => f3n 3 wx wy + | N3 wx, N8 wy => f3n 4 wx wy + | N3 wx, N9 wy => f3n 5 wx wy + | N3 wx, N10 wy => f3n 6 wx wy + | N3 wx, N11 wy => f3n 7 wx wy + | N3 wx, N12 wy => f3n 8 wx wy + | N3 wx, N13 wy => f3n 9 wx wy + | N3 wx, Nn m wy => f13n m (extend3 9 wx) wy + | N4 wx, N0 wy => fn0 3 wx wy + | N4 wx, N1 wy => fn1 2 wx wy + | N4 wx, N2 wy => fn2 1 wx wy + | N4 wx, N3 wy => fn3 0 wx wy + | N4 wx, N4 wy => f4 wx wy + | N4 wx, N5 wy => f4n 0 wx wy + | N4 wx, N6 wy => f4n 1 wx wy + | N4 wx, N7 wy => f4n 2 wx wy + | N4 wx, N8 wy => f4n 3 wx wy + | N4 wx, N9 wy => f4n 4 wx wy + | N4 wx, N10 wy => f4n 5 wx wy + | N4 wx, N11 wy => f4n 6 wx wy + | N4 wx, N12 wy => f4n 7 wx wy + | N4 wx, N13 wy => f4n 8 wx wy + | N4 wx, Nn m wy => f13n m (extend4 8 wx) wy + | N5 wx, N0 wy => fn0 4 wx wy + | N5 wx, N1 wy => fn1 3 wx wy + | N5 wx, N2 wy => fn2 2 wx wy + | N5 wx, N3 wy => fn3 1 wx wy + | N5 wx, N4 wy => fn4 0 wx wy + | N5 wx, N5 wy => f5 wx wy + | N5 wx, N6 wy => f5n 0 wx wy + | N5 wx, N7 wy => f5n 1 wx wy + | N5 wx, N8 wy => f5n 2 wx wy + | N5 wx, N9 wy => f5n 3 wx wy + | N5 wx, N10 wy => f5n 4 wx wy + | N5 wx, N11 wy => f5n 5 wx wy + | N5 wx, N12 wy => f5n 6 wx wy + | N5 wx, N13 wy => f5n 7 wx wy + | N5 wx, Nn m wy => f13n m (extend5 7 wx) wy + | N6 wx, N0 wy => fn0 5 wx wy + | N6 wx, N1 wy => fn1 4 wx wy + | N6 wx, N2 wy => fn2 3 wx wy + | N6 wx, N3 wy => fn3 2 wx wy + | N6 wx, N4 wy => fn4 1 wx wy + | N6 wx, N5 wy => fn5 0 wx wy + | N6 wx, N6 wy => f6 wx wy + | N6 wx, N7 wy => f6n 0 wx wy + | N6 wx, N8 wy => f6n 1 wx wy + | N6 wx, N9 wy => f6n 2 wx wy + | N6 wx, N10 wy => f6n 3 wx wy + | N6 wx, N11 wy => f6n 4 wx wy + | N6 wx, N12 wy => f6n 5 wx wy + | N6 wx, N13 wy => f6n 6 wx wy + | N6 wx, Nn m wy => f13n m (extend6 6 wx) wy + | N7 wx, N0 wy => fn0 6 wx wy + | N7 wx, N1 wy => fn1 5 wx wy + | N7 wx, N2 wy => fn2 4 wx wy + | N7 wx, N3 wy => fn3 3 wx wy + | N7 wx, N4 wy => fn4 2 wx wy + | N7 wx, N5 wy => fn5 1 wx wy + | N7 wx, N6 wy => fn6 0 wx wy + | N7 wx, N7 wy => f7 wx wy + | N7 wx, N8 wy => f7n 0 wx wy + | N7 wx, N9 wy => f7n 1 wx wy + | N7 wx, N10 wy => f7n 2 wx wy + | N7 wx, N11 wy => f7n 3 wx wy + | N7 wx, N12 wy => f7n 4 wx wy + | N7 wx, N13 wy => f7n 5 wx wy + | N7 wx, Nn m wy => f13n m (extend7 5 wx) wy + | N8 wx, N0 wy => fn0 7 wx wy + | N8 wx, N1 wy => fn1 6 wx wy + | N8 wx, N2 wy => fn2 5 wx wy + | N8 wx, N3 wy => fn3 4 wx wy + | N8 wx, N4 wy => fn4 3 wx wy + | N8 wx, N5 wy => fn5 2 wx wy + | N8 wx, N6 wy => fn6 1 wx wy + | N8 wx, N7 wy => fn7 0 wx wy + | N8 wx, N8 wy => f8 wx wy + | N8 wx, N9 wy => f8n 0 wx wy + | N8 wx, N10 wy => f8n 1 wx wy + | N8 wx, N11 wy => f8n 2 wx wy + | N8 wx, N12 wy => f8n 3 wx wy + | N8 wx, N13 wy => f8n 4 wx wy + | N8 wx, Nn m wy => f13n m (extend8 4 wx) wy + | N9 wx, N0 wy => fn0 8 wx wy + | N9 wx, N1 wy => fn1 7 wx wy + | N9 wx, N2 wy => fn2 6 wx wy + | N9 wx, N3 wy => fn3 5 wx wy + | N9 wx, N4 wy => fn4 4 wx wy + | N9 wx, N5 wy => fn5 3 wx wy + | N9 wx, N6 wy => fn6 2 wx wy + | N9 wx, N7 wy => fn7 1 wx wy + | N9 wx, N8 wy => fn8 0 wx wy + | N9 wx, N9 wy => f9 wx wy + | N9 wx, N10 wy => f9n 0 wx wy + | N9 wx, N11 wy => f9n 1 wx wy + | N9 wx, N12 wy => f9n 2 wx wy + | N9 wx, N13 wy => f9n 3 wx wy + | N9 wx, Nn m wy => f13n m (extend9 3 wx) wy + | N10 wx, N0 wy => fn0 9 wx wy + | N10 wx, N1 wy => fn1 8 wx wy + | N10 wx, N2 wy => fn2 7 wx wy + | N10 wx, N3 wy => fn3 6 wx wy + | N10 wx, N4 wy => fn4 5 wx wy + | N10 wx, N5 wy => fn5 4 wx wy + | N10 wx, N6 wy => fn6 3 wx wy + | N10 wx, N7 wy => fn7 2 wx wy + | N10 wx, N8 wy => fn8 1 wx wy + | N10 wx, N9 wy => fn9 0 wx wy + | N10 wx, N10 wy => f10 wx wy + | N10 wx, N11 wy => f10n 0 wx wy + | N10 wx, N12 wy => f10n 1 wx wy + | N10 wx, N13 wy => f10n 2 wx wy + | N10 wx, Nn m wy => f13n m (extend10 2 wx) wy + | N11 wx, N0 wy => fn0 10 wx wy + | N11 wx, N1 wy => fn1 9 wx wy + | N11 wx, N2 wy => fn2 8 wx wy + | N11 wx, N3 wy => fn3 7 wx wy + | N11 wx, N4 wy => fn4 6 wx wy + | N11 wx, N5 wy => fn5 5 wx wy + | N11 wx, N6 wy => fn6 4 wx wy + | N11 wx, N7 wy => fn7 3 wx wy + | N11 wx, N8 wy => fn8 2 wx wy + | N11 wx, N9 wy => fn9 1 wx wy + | N11 wx, N10 wy => fn10 0 wx wy + | N11 wx, N11 wy => f11 wx wy + | N11 wx, N12 wy => f11n 0 wx wy + | N11 wx, N13 wy => f11n 1 wx wy + | N11 wx, Nn m wy => f13n m (extend11 1 wx) wy + | N12 wx, N0 wy => fn0 11 wx wy + | N12 wx, N1 wy => fn1 10 wx wy + | N12 wx, N2 wy => fn2 9 wx wy + | N12 wx, N3 wy => fn3 8 wx wy + | N12 wx, N4 wy => fn4 7 wx wy + | N12 wx, N5 wy => fn5 6 wx wy + | N12 wx, N6 wy => fn6 5 wx wy + | N12 wx, N7 wy => fn7 4 wx wy + | N12 wx, N8 wy => fn8 3 wx wy + | N12 wx, N9 wy => fn9 2 wx wy + | N12 wx, N10 wy => fn10 1 wx wy + | N12 wx, N11 wy => fn11 0 wx wy + | N12 wx, N12 wy => f12 wx wy + | N12 wx, N13 wy => f12n 0 wx wy + | N12 wx, Nn m wy => f13n m (extend12 0 wx) wy + | N13 wx, N0 wy => fn0 12 wx wy + | N13 wx, N1 wy => fn1 11 wx wy + | N13 wx, N2 wy => fn2 10 wx wy + | N13 wx, N3 wy => fn3 9 wx wy + | N13 wx, N4 wy => fn4 8 wx wy + | N13 wx, N5 wy => fn5 7 wx wy + | N13 wx, N6 wy => fn6 6 wx wy + | N13 wx, N7 wy => fn7 5 wx wy + | N13 wx, N8 wy => fn8 4 wx wy + | N13 wx, N9 wy => fn9 3 wx wy + | N13 wx, N10 wy => fn10 2 wx wy + | N13 wx, N11 wy => fn11 1 wx wy + | N13 wx, N12 wy => fn12 0 wx wy + | N13 wx, N13 wy => f13 wx wy + | N13 wx, Nn m wy => f13n m wx wy + | Nn n wx, N0 wy => fn13 n wx (extend0 12 wy) + | Nn n wx, N1 wy => fn13 n wx (extend1 11 wy) + | Nn n wx, N2 wy => fn13 n wx (extend2 10 wy) + | Nn n wx, N3 wy => fn13 n wx (extend3 9 wy) + | Nn n wx, N4 wy => fn13 n wx (extend4 8 wy) + | Nn n wx, N5 wy => fn13 n wx (extend5 7 wy) + | Nn n wx, N6 wy => fn13 n wx (extend6 6 wy) + | Nn n wx, N7 wy => fn13 n wx (extend7 5 wy) + | Nn n wx, N8 wy => fn13 n wx (extend8 4 wy) + | Nn n wx, N9 wy => fn13 n wx (extend9 3 wy) + | Nn n wx, N10 wy => fn13 n wx (extend10 2 wy) + | Nn n wx, N11 wy => fn13 n wx (extend11 1 wy) + | Nn n wx, N12 wy => fn13 n wx (extend12 0 wy) + | Nn n wx, N13 wy => fn13 n wx wy + | Nn n wx, Nn m wy => fnm n m wx wy + end. + + (* We iter the smaller argument with the bigger (zero case) *) + Definition iter0 (x y: t_): res := + Eval lazy zeta beta iota delta [extend0 extend1 extend2 extend3 extend4 extend5 extend6 extend7 extend8 extend9 extend10 extend11 extend12 extend13 + GenBase.extend GenBase.extend_aux + ] in + match x with + | N0 wx => + if w0_eq0 wx then f0t y else + match y with + | N0 wy => f0 wx wy + | N1 wy => f0n 0 wx wy + | N2 wy => f0n 1 wx wy + | N3 wy => f0n 2 wx wy + | N4 wy => f0n 3 wx wy + | N5 wy => f0n 4 wx wy + | N6 wy => f0n 5 wx wy + | N7 wy => f0n 6 wx wy + | N8 wy => f0n 7 wx wy + | N9 wy => f0n 8 wx wy + | N10 wy => f0n 9 wx wy + | N11 wy => f0n 10 wx wy + | N12 wy => f0n 11 wx wy + | N13 wy => f0n 12 wx wy + | Nn m wy => f13n m (extend0 12 wx) wy + end + | N1 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 0 wx wy + | N1 wy => f1 wx wy + | N2 wy => f1n 0 wx wy + | N3 wy => f1n 1 wx wy + | N4 wy => f1n 2 wx wy + | N5 wy => f1n 3 wx wy + | N6 wy => f1n 4 wx wy + | N7 wy => f1n 5 wx wy + | N8 wy => f1n 6 wx wy + | N9 wy => f1n 7 wx wy + | N10 wy => f1n 8 wx wy + | N11 wy => f1n 9 wx wy + | N12 wy => f1n 10 wx wy + | N13 wy => f1n 11 wx wy + | Nn m wy => f13n m (extend1 11 wx) wy + end + | N2 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 1 wx wy + | N1 wy => + fn1 0 wx wy + | N2 wy => f2 wx wy + | N3 wy => f2n 0 wx wy + | N4 wy => f2n 1 wx wy + | N5 wy => f2n 2 wx wy + | N6 wy => f2n 3 wx wy + | N7 wy => f2n 4 wx wy + | N8 wy => f2n 5 wx wy + | N9 wy => f2n 6 wx wy + | N10 wy => f2n 7 wx wy + | N11 wy => f2n 8 wx wy + | N12 wy => f2n 9 wx wy + | N13 wy => f2n 10 wx wy + | Nn m wy => f13n m (extend2 10 wx) wy + end + | N3 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 2 wx wy + | N1 wy => + fn1 1 wx wy + | N2 wy => + fn2 0 wx wy + | N3 wy => f3 wx wy + | N4 wy => f3n 0 wx wy + | N5 wy => f3n 1 wx wy + | N6 wy => f3n 2 wx wy + | N7 wy => f3n 3 wx wy + | N8 wy => f3n 4 wx wy + | N9 wy => f3n 5 wx wy + | N10 wy => f3n 6 wx wy + | N11 wy => f3n 7 wx wy + | N12 wy => f3n 8 wx wy + | N13 wy => f3n 9 wx wy + | Nn m wy => f13n m (extend3 9 wx) wy + end + | N4 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 3 wx wy + | N1 wy => + fn1 2 wx wy + | N2 wy => + fn2 1 wx wy + | N3 wy => + fn3 0 wx wy + | N4 wy => f4 wx wy + | N5 wy => f4n 0 wx wy + | N6 wy => f4n 1 wx wy + | N7 wy => f4n 2 wx wy + | N8 wy => f4n 3 wx wy + | N9 wy => f4n 4 wx wy + | N10 wy => f4n 5 wx wy + | N11 wy => f4n 6 wx wy + | N12 wy => f4n 7 wx wy + | N13 wy => f4n 8 wx wy + | Nn m wy => f13n m (extend4 8 wx) wy + end + | N5 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 4 wx wy + | N1 wy => + fn1 3 wx wy + | N2 wy => + fn2 2 wx wy + | N3 wy => + fn3 1 wx wy + | N4 wy => + fn4 0 wx wy + | N5 wy => f5 wx wy + | N6 wy => f5n 0 wx wy + | N7 wy => f5n 1 wx wy + | N8 wy => f5n 2 wx wy + | N9 wy => f5n 3 wx wy + | N10 wy => f5n 4 wx wy + | N11 wy => f5n 5 wx wy + | N12 wy => f5n 6 wx wy + | N13 wy => f5n 7 wx wy + | Nn m wy => f13n m (extend5 7 wx) wy + end + | N6 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 5 wx wy + | N1 wy => + fn1 4 wx wy + | N2 wy => + fn2 3 wx wy + | N3 wy => + fn3 2 wx wy + | N4 wy => + fn4 1 wx wy + | N5 wy => + fn5 0 wx wy + | N6 wy => f6 wx wy + | N7 wy => f6n 0 wx wy + | N8 wy => f6n 1 wx wy + | N9 wy => f6n 2 wx wy + | N10 wy => f6n 3 wx wy + | N11 wy => f6n 4 wx wy + | N12 wy => f6n 5 wx wy + | N13 wy => f6n 6 wx wy + | Nn m wy => f13n m (extend6 6 wx) wy + end + | N7 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 6 wx wy + | N1 wy => + fn1 5 wx wy + | N2 wy => + fn2 4 wx wy + | N3 wy => + fn3 3 wx wy + | N4 wy => + fn4 2 wx wy + | N5 wy => + fn5 1 wx wy + | N6 wy => + fn6 0 wx wy + | N7 wy => f7 wx wy + | N8 wy => f7n 0 wx wy + | N9 wy => f7n 1 wx wy + | N10 wy => f7n 2 wx wy + | N11 wy => f7n 3 wx wy + | N12 wy => f7n 4 wx wy + | N13 wy => f7n 5 wx wy + | Nn m wy => f13n m (extend7 5 wx) wy + end + | N8 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 7 wx wy + | N1 wy => + fn1 6 wx wy + | N2 wy => + fn2 5 wx wy + | N3 wy => + fn3 4 wx wy + | N4 wy => + fn4 3 wx wy + | N5 wy => + fn5 2 wx wy + | N6 wy => + fn6 1 wx wy + | N7 wy => + fn7 0 wx wy + | N8 wy => f8 wx wy + | N9 wy => f8n 0 wx wy + | N10 wy => f8n 1 wx wy + | N11 wy => f8n 2 wx wy + | N12 wy => f8n 3 wx wy + | N13 wy => f8n 4 wx wy + | Nn m wy => f13n m (extend8 4 wx) wy + end + | N9 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 8 wx wy + | N1 wy => + fn1 7 wx wy + | N2 wy => + fn2 6 wx wy + | N3 wy => + fn3 5 wx wy + | N4 wy => + fn4 4 wx wy + | N5 wy => + fn5 3 wx wy + | N6 wy => + fn6 2 wx wy + | N7 wy => + fn7 1 wx wy + | N8 wy => + fn8 0 wx wy + | N9 wy => f9 wx wy + | N10 wy => f9n 0 wx wy + | N11 wy => f9n 1 wx wy + | N12 wy => f9n 2 wx wy + | N13 wy => f9n 3 wx wy + | Nn m wy => f13n m (extend9 3 wx) wy + end + | N10 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 9 wx wy + | N1 wy => + fn1 8 wx wy + | N2 wy => + fn2 7 wx wy + | N3 wy => + fn3 6 wx wy + | N4 wy => + fn4 5 wx wy + | N5 wy => + fn5 4 wx wy + | N6 wy => + fn6 3 wx wy + | N7 wy => + fn7 2 wx wy + | N8 wy => + fn8 1 wx wy + | N9 wy => + fn9 0 wx wy + | N10 wy => f10 wx wy + | N11 wy => f10n 0 wx wy + | N12 wy => f10n 1 wx wy + | N13 wy => f10n 2 wx wy + | Nn m wy => f13n m (extend10 2 wx) wy + end + | N11 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 10 wx wy + | N1 wy => + fn1 9 wx wy + | N2 wy => + fn2 8 wx wy + | N3 wy => + fn3 7 wx wy + | N4 wy => + fn4 6 wx wy + | N5 wy => + fn5 5 wx wy + | N6 wy => + fn6 4 wx wy + | N7 wy => + fn7 3 wx wy + | N8 wy => + fn8 2 wx wy + | N9 wy => + fn9 1 wx wy + | N10 wy => + fn10 0 wx wy + | N11 wy => f11 wx wy + | N12 wy => f11n 0 wx wy + | N13 wy => f11n 1 wx wy + | Nn m wy => f13n m (extend11 1 wx) wy + end + | N12 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 11 wx wy + | N1 wy => + fn1 10 wx wy + | N2 wy => + fn2 9 wx wy + | N3 wy => + fn3 8 wx wy + | N4 wy => + fn4 7 wx wy + | N5 wy => + fn5 6 wx wy + | N6 wy => + fn6 5 wx wy + | N7 wy => + fn7 4 wx wy + | N8 wy => + fn8 3 wx wy + | N9 wy => + fn9 2 wx wy + | N10 wy => + fn10 1 wx wy + | N11 wy => + fn11 0 wx wy + | N12 wy => f12 wx wy + | N13 wy => f12n 0 wx wy + | Nn m wy => f13n m (extend12 0 wx) wy + end + | N13 wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn0 12 wx wy + | N1 wy => + fn1 11 wx wy + | N2 wy => + fn2 10 wx wy + | N3 wy => + fn3 9 wx wy + | N4 wy => + fn4 8 wx wy + | N5 wy => + fn5 7 wx wy + | N6 wy => + fn6 6 wx wy + | N7 wy => + fn7 5 wx wy + | N8 wy => + fn8 4 wx wy + | N9 wy => + fn9 3 wx wy + | N10 wy => + fn10 2 wx wy + | N11 wy => + fn11 1 wx wy + | N12 wy => + fn12 0 wx wy + | N13 wy => f13 wx wy + | Nn m wy => f13n m wx wy + end + | Nn n wx => + match y with + | N0 wy => + if w0_eq0 wy then ft0 x else + fn13 n wx (extend0 12 wy) + | N1 wy => + fn13 n wx (extend1 11 wy) + | N2 wy => + fn13 n wx (extend2 10 wy) + | N3 wy => + fn13 n wx (extend3 9 wy) + | N4 wy => + fn13 n wx (extend4 8 wy) + | N5 wy => + fn13 n wx (extend5 7 wy) + | N6 wy => + fn13 n wx (extend6 6 wy) + | N7 wy => + fn13 n wx (extend7 5 wy) + | N8 wy => + fn13 n wx (extend8 4 wy) + | N9 wy => + fn13 n wx (extend9 3 wy) + | N10 wy => + fn13 n wx (extend10 2 wy) + | N11 wy => + fn13 n wx (extend11 1 wy) + | N12 wy => + fn13 n wx (extend12 0 wy) + | N13 wy => + fn13 n wx wy + | Nn m wy => fnm n m wx wy + end + end. + + End LevelAndIter. + + (***************************************************************) + (* *) + (* Reduction *) + (* *) + (***************************************************************) + + Definition reduce_0 (x:w) := N0 x. + Definition reduce_1 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w0_eq0 N0 N1. + Definition reduce_2 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w1_eq0 reduce_1 N2. + Definition reduce_3 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w2_eq0 reduce_2 N3. + Definition reduce_4 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w3_eq0 reduce_3 N4. + Definition reduce_5 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w4_eq0 reduce_4 N5. + Definition reduce_6 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w5_eq0 reduce_5 N6. + Definition reduce_7 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w6_eq0 reduce_6 N7. + Definition reduce_8 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w7_eq0 reduce_7 N8. + Definition reduce_9 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w8_eq0 reduce_8 N9. + Definition reduce_10 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w9_eq0 reduce_9 N10. + Definition reduce_11 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w10_eq0 reduce_10 N11. + Definition reduce_12 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w11_eq0 reduce_11 N12. + Definition reduce_13 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w12_eq0 reduce_12 N13. + Definition reduce_14 := + Eval lazy beta iota delta[reduce_n1] in + reduce_n1 _ _ zero w13_eq0 reduce_13 (Nn 0). + Definition reduce_n n := + Eval lazy beta iota delta[reduce_n] in + reduce_n _ _ zero reduce_14 Nn n. + + (***************************************************************) + (* *) + (* Successor *) + (* *) + (***************************************************************) + Definition w0_succ_c := w0_op.(znz_succ_c). Definition w1_succ_c := w1_op.(znz_succ_c). Definition w2_succ_c := w2_op.(znz_succ_c). @@ -219,466 +1729,130 @@ Module Make (W0:W0Type). end end. - Definition extend1 := - Eval lazy beta zeta iota delta [extend]in extend 1. - Definition extend2 := - Eval lazy beta zeta iota delta [extend]in extend 2. - Definition extend3 := - Eval lazy beta zeta iota delta [extend]in extend 3. - Definition extend4 := - Eval lazy beta zeta iota delta [extend]in extend 4. - Definition extend5 := - Eval lazy beta zeta iota delta [extend]in extend 5. - Definition extend6 := - Eval lazy beta zeta iota delta [extend]in extend 6. - Definition extend7 := - Eval lazy beta zeta iota delta [extend]in extend 7. - Definition extend8 := - Eval lazy beta zeta iota delta [extend]in extend 8. - Definition extend9 := - Eval lazy beta zeta iota delta [extend]in extend 9. - Definition extend10 := - Eval lazy beta zeta iota delta [extend]in extend 10. - Definition extend11 := - Eval lazy beta zeta iota delta [extend]in extend 11. - Definition extend12 := - Eval lazy beta zeta iota delta [extend]in extend 12. - Definition extend13 := - Eval lazy beta zeta iota delta [extend]in extend 13. - - Definition w0_eq0 := w0_op.(znz_eq0). - Definition w1_eq0 := w1_op.(znz_eq0). - Definition w2_eq0 := w2_op.(znz_eq0). - Definition w3_eq0 := w3_op.(znz_eq0). - Definition w4_eq0 := w4_op.(znz_eq0). - Definition w5_eq0 := w5_op.(znz_eq0). - Definition w6_eq0 := w6_op.(znz_eq0). - Definition w7_eq0 := w7_op.(znz_eq0). - Definition w8_eq0 := w8_op.(znz_eq0). - Definition w9_eq0 := w9_op.(znz_eq0). - Definition w10_eq0 := w10_op.(znz_eq0). - Definition w11_eq0 := w11_op.(znz_eq0). - Definition w12_eq0 := w12_op.(znz_eq0). - Definition w13_eq0 := w13_op.(znz_eq0). - - Definition w0_0W := w0_op.(znz_0W). - Definition w1_0W := w1_op.(znz_0W). - Definition w2_0W := w2_op.(znz_0W). - Definition w3_0W := w3_op.(znz_0W). - Definition w4_0W := w4_op.(znz_0W). - Definition w5_0W := w5_op.(znz_0W). - Definition w6_0W := w6_op.(znz_0W). - Definition w7_0W := w7_op.(znz_0W). - Definition w8_0W := w8_op.(znz_0W). - Definition w9_0W := w9_op.(znz_0W). - Definition w10_0W := w10_op.(znz_0W). - Definition w11_0W := w11_op.(znz_0W). - Definition w12_0W := w12_op.(znz_0W). - Definition w13_0W := w13_op.(znz_0W). + Theorem succ_spec: forall n, [succ n] = [n] + 1. + Admitted. - Definition w0_WW := w0_op.(znz_WW). - - Definition w0_add_c := w0_op.(znz_add_c). - Definition w1_add_c := w1_op.(znz_add_c). - Definition w2_add_c := w2_op.(znz_add_c). - Definition w3_add_c := w3_op.(znz_add_c). - Definition w4_add_c := w4_op.(znz_add_c). - Definition w5_add_c := w5_op.(znz_add_c). - Definition w6_add_c := w6_op.(znz_add_c). - Definition w7_add_c := w7_op.(znz_add_c). - Definition w8_add_c := w8_op.(znz_add_c). - Definition w9_add_c := w9_op.(znz_add_c). - Definition w10_add_c := w10_op.(znz_add_c). - Definition w11_add_c := w11_op.(znz_add_c). - Definition w12_add_c := w12_op.(znz_add_c). - Definition w13_add_c := w13_op.(znz_add_c). + (***************************************************************) + (* *) + (* Adddition *) + (* *) + (***************************************************************) + Definition w0_add_c := znz_add_c w0_op. Definition w0_add x y := match w0_add_c x y with | C0 r => N0 r | C1 r => N1 (WW one0 r) end. + + Definition w1_add_c := znz_add_c w1_op. Definition w1_add x y := match w1_add_c x y with | C0 r => N1 r | C1 r => N2 (WW one1 r) end. + + Definition w2_add_c := znz_add_c w2_op. Definition w2_add x y := match w2_add_c x y with | C0 r => N2 r | C1 r => N3 (WW one2 r) end. + + Definition w3_add_c := znz_add_c w3_op. Definition w3_add x y := match w3_add_c x y with | C0 r => N3 r | C1 r => N4 (WW one3 r) end. + + Definition w4_add_c := znz_add_c w4_op. Definition w4_add x y := match w4_add_c x y with | C0 r => N4 r | C1 r => N5 (WW one4 r) end. + + Definition w5_add_c := znz_add_c w5_op. Definition w5_add x y := match w5_add_c x y with | C0 r => N5 r | C1 r => N6 (WW one5 r) end. + + Definition w6_add_c := znz_add_c w6_op. Definition w6_add x y := match w6_add_c x y with | C0 r => N6 r | C1 r => N7 (WW one6 r) end. + + Definition w7_add_c := znz_add_c w7_op. Definition w7_add x y := match w7_add_c x y with | C0 r => N7 r | C1 r => N8 (WW one7 r) end. + + Definition w8_add_c := znz_add_c w8_op. Definition w8_add x y := match w8_add_c x y with | C0 r => N8 r | C1 r => N9 (WW one8 r) end. + + Definition w9_add_c := znz_add_c w9_op. Definition w9_add x y := match w9_add_c x y with | C0 r => N9 r | C1 r => N10 (WW one9 r) end. + + Definition w10_add_c := znz_add_c w10_op. Definition w10_add x y := match w10_add_c x y with | C0 r => N10 r | C1 r => N11 (WW one10 r) end. + + Definition w11_add_c := znz_add_c w11_op. Definition w11_add x y := match w11_add_c x y with | C0 r => N11 r | C1 r => N12 (WW one11 r) end. + + Definition w12_add_c := znz_add_c w12_op. Definition w12_add x y := match w12_add_c x y with | C0 r => N12 r | C1 r => N13 (WW one12 r) end. + + Definition w13_add_c := znz_add_c w13_op. Definition w13_add x y := match w13_add_c x y with | C0 r => N13 r | C1 r => Nn 0 (WW one13 r) end. + Definition addn n (x y : word w13 (S n)) := let op := make_op n in match op.(znz_add_c) x y with | C0 r => Nn n r | C1 r => Nn (S n) (WW op.(znz_1) r) end. - Definition add x y := - match x, y with - | N0 wx, N0 wy => w0_add wx wy - | N0 wx, N1 wy => - if w0_eq0 wx then y else w1_add (WW w_0 wx) wy - | N0 wx, N2 wy => - if w0_eq0 wx then y else w2_add (extend1 w0 (WW w_0 wx)) wy - | N0 wx, N3 wy => - if w0_eq0 wx then y else w3_add (extend2 w0 (WW w_0 wx)) wy - | N0 wx, N4 wy => - if w0_eq0 wx then y else w4_add (extend3 w0 (WW w_0 wx)) wy - | N0 wx, N5 wy => - if w0_eq0 wx then y else w5_add (extend4 w0 (WW w_0 wx)) wy - | N0 wx, N6 wy => - if w0_eq0 wx then y else w6_add (extend5 w0 (WW w_0 wx)) wy - | N0 wx, N7 wy => - if w0_eq0 wx then y else w7_add (extend6 w0 (WW w_0 wx)) wy - | N0 wx, N8 wy => - if w0_eq0 wx then y else w8_add (extend7 w0 (WW w_0 wx)) wy - | N0 wx, N9 wy => - if w0_eq0 wx then y else w9_add (extend8 w0 (WW w_0 wx)) wy - | N0 wx, N10 wy => - if w0_eq0 wx then y else w10_add (extend9 w0 (WW w_0 wx)) wy - | N0 wx, N11 wy => - if w0_eq0 wx then y else w11_add (extend10 w0 (WW w_0 wx)) wy - | N0 wx, N12 wy => - if w0_eq0 wx then y else w12_add (extend11 w0 (WW w_0 wx)) wy - | N0 wx, N13 wy => - if w0_eq0 wx then y else w13_add (extend12 w0 (WW w_0 wx)) wy - | N0 wx, Nn n wy => - if w0_eq0 wx then y - else addn n (extend n w13 (extend13 w0 (WW w_0 wx))) wy - | N1 wx, N0 wy => - if w0_eq0 wy then x else w1_add wx (WW w_0 wy) - | N1 wx, N1 wy => w1_add wx wy - | N1 wx, N2 wy => w2_add (extend1 w0 wx) wy - | N1 wx, N3 wy => w3_add (extend2 w0 wx) wy - | N1 wx, N4 wy => w4_add (extend3 w0 wx) wy - | N1 wx, N5 wy => w5_add (extend4 w0 wx) wy - | N1 wx, N6 wy => w6_add (extend5 w0 wx) wy - | N1 wx, N7 wy => w7_add (extend6 w0 wx) wy - | N1 wx, N8 wy => w8_add (extend7 w0 wx) wy - | N1 wx, N9 wy => w9_add (extend8 w0 wx) wy - | N1 wx, N10 wy => w10_add (extend9 w0 wx) wy - | N1 wx, N11 wy => w11_add (extend10 w0 wx) wy - | N1 wx, N12 wy => w12_add (extend11 w0 wx) wy - | N1 wx, N13 wy => w13_add (extend12 w0 wx) wy - | N1 wx, Nn n wy => addn n (extend n w13 (extend13 w0 wx)) wy - | N2 wx, N0 wy => - if w0_eq0 wy then x else w2_add wx (extend1 w0 (WW w_0 wy)) - | N2 wx, N1 wy => w2_add wx (extend1 w0 wy) - | N2 wx, N2 wy => w2_add wx wy - | N2 wx, N3 wy => w3_add (extend1 w1 wx) wy - | N2 wx, N4 wy => w4_add (extend2 w1 wx) wy - | N2 wx, N5 wy => w5_add (extend3 w1 wx) wy - | N2 wx, N6 wy => w6_add (extend4 w1 wx) wy - | N2 wx, N7 wy => w7_add (extend5 w1 wx) wy - | N2 wx, N8 wy => w8_add (extend6 w1 wx) wy - | N2 wx, N9 wy => w9_add (extend7 w1 wx) wy - | N2 wx, N10 wy => w10_add (extend8 w1 wx) wy - | N2 wx, N11 wy => w11_add (extend9 w1 wx) wy - | N2 wx, N12 wy => w12_add (extend10 w1 wx) wy - | N2 wx, N13 wy => w13_add (extend11 w1 wx) wy - | N2 wx, Nn n wy => addn n (extend n w13 (extend12 w1 wx)) wy - | N3 wx, N0 wy => - if w0_eq0 wy then x else w3_add wx (extend2 w0 (WW w_0 wy)) - | N3 wx, N1 wy => w3_add wx (extend2 w0 wy) - | N3 wx, N2 wy => w3_add wx (extend1 w1 wy) - | N3 wx, N3 wy => w3_add wx wy - | N3 wx, N4 wy => w4_add (extend1 w2 wx) wy - | N3 wx, N5 wy => w5_add (extend2 w2 wx) wy - | N3 wx, N6 wy => w6_add (extend3 w2 wx) wy - | N3 wx, N7 wy => w7_add (extend4 w2 wx) wy - | N3 wx, N8 wy => w8_add (extend5 w2 wx) wy - | N3 wx, N9 wy => w9_add (extend6 w2 wx) wy - | N3 wx, N10 wy => w10_add (extend7 w2 wx) wy - | N3 wx, N11 wy => w11_add (extend8 w2 wx) wy - | N3 wx, N12 wy => w12_add (extend9 w2 wx) wy - | N3 wx, N13 wy => w13_add (extend10 w2 wx) wy - | N3 wx, Nn n wy => addn n (extend n w13 (extend11 w2 wx)) wy - | N4 wx, N0 wy => - if w0_eq0 wy then x else w4_add wx (extend3 w0 (WW w_0 wy)) - | N4 wx, N1 wy => w4_add wx (extend3 w0 wy) - | N4 wx, N2 wy => w4_add wx (extend2 w1 wy) - | N4 wx, N3 wy => w4_add wx (extend1 w2 wy) - | N4 wx, N4 wy => w4_add wx wy - | N4 wx, N5 wy => w5_add (extend1 w3 wx) wy - | N4 wx, N6 wy => w6_add (extend2 w3 wx) wy - | N4 wx, N7 wy => w7_add (extend3 w3 wx) wy - | N4 wx, N8 wy => w8_add (extend4 w3 wx) wy - | N4 wx, N9 wy => w9_add (extend5 w3 wx) wy - | N4 wx, N10 wy => w10_add (extend6 w3 wx) wy - | N4 wx, N11 wy => w11_add (extend7 w3 wx) wy - | N4 wx, N12 wy => w12_add (extend8 w3 wx) wy - | N4 wx, N13 wy => w13_add (extend9 w3 wx) wy - | N4 wx, Nn n wy => addn n (extend n w13 (extend10 w3 wx)) wy - | N5 wx, N0 wy => - if w0_eq0 wy then x else w5_add wx (extend4 w0 (WW w_0 wy)) - | N5 wx, N1 wy => w5_add wx (extend4 w0 wy) - | N5 wx, N2 wy => w5_add wx (extend3 w1 wy) - | N5 wx, N3 wy => w5_add wx (extend2 w2 wy) - | N5 wx, N4 wy => w5_add wx (extend1 w3 wy) - | N5 wx, N5 wy => w5_add wx wy - | N5 wx, N6 wy => w6_add (extend1 w4 wx) wy - | N5 wx, N7 wy => w7_add (extend2 w4 wx) wy - | N5 wx, N8 wy => w8_add (extend3 w4 wx) wy - | N5 wx, N9 wy => w9_add (extend4 w4 wx) wy - | N5 wx, N10 wy => w10_add (extend5 w4 wx) wy - | N5 wx, N11 wy => w11_add (extend6 w4 wx) wy - | N5 wx, N12 wy => w12_add (extend7 w4 wx) wy - | N5 wx, N13 wy => w13_add (extend8 w4 wx) wy - | N5 wx, Nn n wy => addn n (extend n w13 (extend9 w4 wx)) wy - | N6 wx, N0 wy => - if w0_eq0 wy then x else w6_add wx (extend5 w0 (WW w_0 wy)) - | N6 wx, N1 wy => w6_add wx (extend5 w0 wy) - | N6 wx, N2 wy => w6_add wx (extend4 w1 wy) - | N6 wx, N3 wy => w6_add wx (extend3 w2 wy) - | N6 wx, N4 wy => w6_add wx (extend2 w3 wy) - | N6 wx, N5 wy => w6_add wx (extend1 w4 wy) - | N6 wx, N6 wy => w6_add wx wy - | N6 wx, N7 wy => w7_add (extend1 w5 wx) wy - | N6 wx, N8 wy => w8_add (extend2 w5 wx) wy - | N6 wx, N9 wy => w9_add (extend3 w5 wx) wy - | N6 wx, N10 wy => w10_add (extend4 w5 wx) wy - | N6 wx, N11 wy => w11_add (extend5 w5 wx) wy - | N6 wx, N12 wy => w12_add (extend6 w5 wx) wy - | N6 wx, N13 wy => w13_add (extend7 w5 wx) wy - | N6 wx, Nn n wy => addn n (extend n w13 (extend8 w5 wx)) wy - | N7 wx, N0 wy => - if w0_eq0 wy then x else w7_add wx (extend6 w0 (WW w_0 wy)) - | N7 wx, N1 wy => w7_add wx (extend6 w0 wy) - | N7 wx, N2 wy => w7_add wx (extend5 w1 wy) - | N7 wx, N3 wy => w7_add wx (extend4 w2 wy) - | N7 wx, N4 wy => w7_add wx (extend3 w3 wy) - | N7 wx, N5 wy => w7_add wx (extend2 w4 wy) - | N7 wx, N6 wy => w7_add wx (extend1 w5 wy) - | N7 wx, N7 wy => w7_add wx wy - | N7 wx, N8 wy => w8_add (extend1 w6 wx) wy - | N7 wx, N9 wy => w9_add (extend2 w6 wx) wy - | N7 wx, N10 wy => w10_add (extend3 w6 wx) wy - | N7 wx, N11 wy => w11_add (extend4 w6 wx) wy - | N7 wx, N12 wy => w12_add (extend5 w6 wx) wy - | N7 wx, N13 wy => w13_add (extend6 w6 wx) wy - | N7 wx, Nn n wy => addn n (extend n w13 (extend7 w6 wx)) wy - | N8 wx, N0 wy => - if w0_eq0 wy then x else w8_add wx (extend7 w0 (WW w_0 wy)) - | N8 wx, N1 wy => w8_add wx (extend7 w0 wy) - | N8 wx, N2 wy => w8_add wx (extend6 w1 wy) - | N8 wx, N3 wy => w8_add wx (extend5 w2 wy) - | N8 wx, N4 wy => w8_add wx (extend4 w3 wy) - | N8 wx, N5 wy => w8_add wx (extend3 w4 wy) - | N8 wx, N6 wy => w8_add wx (extend2 w5 wy) - | N8 wx, N7 wy => w8_add wx (extend1 w6 wy) - | N8 wx, N8 wy => w8_add wx wy - | N8 wx, N9 wy => w9_add (extend1 w7 wx) wy - | N8 wx, N10 wy => w10_add (extend2 w7 wx) wy - | N8 wx, N11 wy => w11_add (extend3 w7 wx) wy - | N8 wx, N12 wy => w12_add (extend4 w7 wx) wy - | N8 wx, N13 wy => w13_add (extend5 w7 wx) wy - | N8 wx, Nn n wy => addn n (extend n w13 (extend6 w7 wx)) wy - | N9 wx, N0 wy => - if w0_eq0 wy then x else w9_add wx (extend8 w0 (WW w_0 wy)) - | N9 wx, N1 wy => w9_add wx (extend8 w0 wy) - | N9 wx, N2 wy => w9_add wx (extend7 w1 wy) - | N9 wx, N3 wy => w9_add wx (extend6 w2 wy) - | N9 wx, N4 wy => w9_add wx (extend5 w3 wy) - | N9 wx, N5 wy => w9_add wx (extend4 w4 wy) - | N9 wx, N6 wy => w9_add wx (extend3 w5 wy) - | N9 wx, N7 wy => w9_add wx (extend2 w6 wy) - | N9 wx, N8 wy => w9_add wx (extend1 w7 wy) - | N9 wx, N9 wy => w9_add wx wy - | N9 wx, N10 wy => w10_add (extend1 w8 wx) wy - | N9 wx, N11 wy => w11_add (extend2 w8 wx) wy - | N9 wx, N12 wy => w12_add (extend3 w8 wx) wy - | N9 wx, N13 wy => w13_add (extend4 w8 wx) wy - | N9 wx, Nn n wy => addn n (extend n w13 (extend5 w8 wx)) wy - | N10 wx, N0 wy => - if w0_eq0 wy then x else w10_add wx (extend9 w0 (WW w_0 wy)) - | N10 wx, N1 wy => w10_add wx (extend9 w0 wy) - | N10 wx, N2 wy => w10_add wx (extend8 w1 wy) - | N10 wx, N3 wy => w10_add wx (extend7 w2 wy) - | N10 wx, N4 wy => w10_add wx (extend6 w3 wy) - | N10 wx, N5 wy => w10_add wx (extend5 w4 wy) - | N10 wx, N6 wy => w10_add wx (extend4 w5 wy) - | N10 wx, N7 wy => w10_add wx (extend3 w6 wy) - | N10 wx, N8 wy => w10_add wx (extend2 w7 wy) - | N10 wx, N9 wy => w10_add wx (extend1 w8 wy) - | N10 wx, N10 wy => w10_add wx wy - | N10 wx, N11 wy => w11_add (extend1 w9 wx) wy - | N10 wx, N12 wy => w12_add (extend2 w9 wx) wy - | N10 wx, N13 wy => w13_add (extend3 w9 wx) wy - | N10 wx, Nn n wy => addn n (extend n w13 (extend4 w9 wx)) wy - | N11 wx, N0 wy => - if w0_eq0 wy then x else w11_add wx (extend10 w0 (WW w_0 wy)) - | N11 wx, N1 wy => w11_add wx (extend10 w0 wy) - | N11 wx, N2 wy => w11_add wx (extend9 w1 wy) - | N11 wx, N3 wy => w11_add wx (extend8 w2 wy) - | N11 wx, N4 wy => w11_add wx (extend7 w3 wy) - | N11 wx, N5 wy => w11_add wx (extend6 w4 wy) - | N11 wx, N6 wy => w11_add wx (extend5 w5 wy) - | N11 wx, N7 wy => w11_add wx (extend4 w6 wy) - | N11 wx, N8 wy => w11_add wx (extend3 w7 wy) - | N11 wx, N9 wy => w11_add wx (extend2 w8 wy) - | N11 wx, N10 wy => w11_add wx (extend1 w9 wy) - | N11 wx, N11 wy => w11_add wx wy - | N11 wx, N12 wy => w12_add (extend1 w10 wx) wy - | N11 wx, N13 wy => w13_add (extend2 w10 wx) wy - | N11 wx, Nn n wy => addn n (extend n w13 (extend3 w10 wx)) wy - | N12 wx, N0 wy => - if w0_eq0 wy then x else w12_add wx (extend11 w0 (WW w_0 wy)) - | N12 wx, N1 wy => w12_add wx (extend11 w0 wy) - | N12 wx, N2 wy => w12_add wx (extend10 w1 wy) - | N12 wx, N3 wy => w12_add wx (extend9 w2 wy) - | N12 wx, N4 wy => w12_add wx (extend8 w3 wy) - | N12 wx, N5 wy => w12_add wx (extend7 w4 wy) - | N12 wx, N6 wy => w12_add wx (extend6 w5 wy) - | N12 wx, N7 wy => w12_add wx (extend5 w6 wy) - | N12 wx, N8 wy => w12_add wx (extend4 w7 wy) - | N12 wx, N9 wy => w12_add wx (extend3 w8 wy) - | N12 wx, N10 wy => w12_add wx (extend2 w9 wy) - | N12 wx, N11 wy => w12_add wx (extend1 w10 wy) - | N12 wx, N12 wy => w12_add wx wy - | N12 wx, N13 wy => w13_add (extend1 w11 wx) wy - | N12 wx, Nn n wy => addn n (extend n w13 (extend2 w11 wx)) wy - | N13 wx, N0 wy => - if w0_eq0 wy then x else w13_add wx (extend12 w0 (WW w_0 wy)) - | N13 wx, N1 wy => w13_add wx (extend12 w0 wy) - | N13 wx, N2 wy => w13_add wx (extend11 w1 wy) - | N13 wx, N3 wy => w13_add wx (extend10 w2 wy) - | N13 wx, N4 wy => w13_add wx (extend9 w3 wy) - | N13 wx, N5 wy => w13_add wx (extend8 w4 wy) - | N13 wx, N6 wy => w13_add wx (extend7 w5 wy) - | N13 wx, N7 wy => w13_add wx (extend6 w6 wy) - | N13 wx, N8 wy => w13_add wx (extend5 w7 wy) - | N13 wx, N9 wy => w13_add wx (extend4 w8 wy) - | N13 wx, N10 wy => w13_add wx (extend3 w9 wy) - | N13 wx, N11 wy => w13_add wx (extend2 w10 wy) - | N13 wx, N12 wy => w13_add wx (extend1 w11 wy) - | N13 wx, N13 wy => w13_add wx wy - | N13 wx, Nn n wy => addn n (extend n w13 (extend1 w12 wx)) wy - | Nn n wx, N0 wy => - if w0_eq0 wy then x - else addn n wx (extend n w13 (extend13 w0 (WW w_0 wy))) - | Nn n wx, N1 wy => addn n wx (extend n w13 (extend13 w0 wy)) - | Nn n wx, N2 wy => addn n wx (extend n w13 (extend12 w1 wy)) - | Nn n wx, N3 wy => addn n wx (extend n w13 (extend11 w2 wy)) - | Nn n wx, N4 wy => addn n wx (extend n w13 (extend10 w3 wy)) - | Nn n wx, N5 wy => addn n wx (extend n w13 (extend9 w4 wy)) - | Nn n wx, N6 wy => addn n wx (extend n w13 (extend8 w5 wy)) - | Nn n wx, N7 wy => addn n wx (extend n w13 (extend7 w6 wy)) - | Nn n wx, N8 wy => addn n wx (extend n w13 (extend6 w7 wy)) - | Nn n wx, N9 wy => addn n wx (extend n w13 (extend5 w8 wy)) - | Nn n wx, N10 wy => addn n wx (extend n w13 (extend4 w9 wy)) - | Nn n wx, N11 wy => addn n wx (extend n w13 (extend3 w10 wy)) - | Nn n wx, N12 wy => addn n wx (extend n w13 (extend2 w11 wy)) - | Nn n wx, N13 wy => addn n wx (extend n w13 (extend1 w12 wy)) - | Nn n wx, Nn m wy => - let mn := Max.max n m in - let d := diff n m in - addn mn - (castm (diff_r n m) (extend_tr wx (snd d))) - (castm (diff_l n m) (extend_tr wy (fst d))) - end. + Definition add := Eval lazy beta delta [same_level] in + (same_level t_ w0_add w1_add w2_add w3_add w4_add w5_add w6_add w7_add w8_add w9_add w10_add w11_add w12_add w13_add addn). - Definition reduce_0 (x:w) := N0 x. - Definition reduce_1 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w0_eq0 N0 N1. - Definition reduce_2 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w1_eq0 reduce_1 N2. - Definition reduce_3 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w2_eq0 reduce_2 N3. - Definition reduce_4 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w3_eq0 reduce_3 N4. - Definition reduce_5 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w4_eq0 reduce_4 N5. - Definition reduce_6 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w5_eq0 reduce_5 N6. - Definition reduce_7 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w6_eq0 reduce_6 N7. - Definition reduce_8 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w7_eq0 reduce_7 N8. - Definition reduce_9 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w8_eq0 reduce_8 N9. - Definition reduce_10 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w9_eq0 reduce_9 N10. - Definition reduce_11 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w10_eq0 reduce_10 N11. - Definition reduce_12 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w11_eq0 reduce_11 N12. - Definition reduce_13 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w12_eq0 reduce_12 N13. - Definition reduce_14 := - Eval lazy beta iota delta[reduce_n1] in - reduce_n1 _ _ zero w13_eq0 reduce_13 (Nn 0). - Definition reduce_n n := - Eval lazy beta iota delta[reduce_n] in - reduce_n _ _ zero reduce_14 Nn n. + Theorem spec_add: forall x y, [add x y] = [x] + [y]. + Admitted. + + (***************************************************************) + (* *) + (* Predecessor *) + (* *) + (***************************************************************) Definition w0_pred_c := w0_op.(znz_pred_c). Definition w1_pred_c := w1_op.(znz_pred_c). @@ -775,6 +1949,14 @@ Module Make (W0:W0Type). end end. + Let spec_pred: forall x, 0 < [x] -> [pred x] = [x] - 1. + Admitted. + + (***************************************************************) + (* *) + (* Subtraction *) + (* *) + (***************************************************************) Definition w0_sub_c := w0_op.(znz_sub_c). Definition w1_sub_c := w1_op.(znz_sub_c). @@ -868,282 +2050,20 @@ Module Make (W0:W0Type). | C0 r => Nn n r | C1 r => N0 w_0 end. - Definition sub x y := - match x, y with - | N0 wx, N0 wy => w0_sub wx wy - | N0 wx, N1 wy => - if w0_eq0 wx then zero else w1_sub (WW w_0 wx) wy - | N0 wx, N2 wy => - if w0_eq0 wx then zero else w2_sub (extend1 w0 (WW w_0 wx)) wy - | N0 wx, N3 wy => - if w0_eq0 wx then zero else w3_sub (extend2 w0 (WW w_0 wx)) wy - | N0 wx, N4 wy => - if w0_eq0 wx then zero else w4_sub (extend3 w0 (WW w_0 wx)) wy - | N0 wx, N5 wy => - if w0_eq0 wx then zero else w5_sub (extend4 w0 (WW w_0 wx)) wy - | N0 wx, N6 wy => - if w0_eq0 wx then zero else w6_sub (extend5 w0 (WW w_0 wx)) wy - | N0 wx, N7 wy => - if w0_eq0 wx then zero else w7_sub (extend6 w0 (WW w_0 wx)) wy - | N0 wx, N8 wy => - if w0_eq0 wx then zero else w8_sub (extend7 w0 (WW w_0 wx)) wy - | N0 wx, N9 wy => - if w0_eq0 wx then zero else w9_sub (extend8 w0 (WW w_0 wx)) wy - | N0 wx, N10 wy => - if w0_eq0 wx then zero else w10_sub (extend9 w0 (WW w_0 wx)) wy - | N0 wx, N11 wy => - if w0_eq0 wx then zero else w11_sub (extend10 w0 (WW w_0 wx)) wy - | N0 wx, N12 wy => - if w0_eq0 wx then zero else w12_sub (extend11 w0 (WW w_0 wx)) wy - | N0 wx, N13 wy => - if w0_eq0 wx then zero else w13_sub (extend12 w0 (WW w_0 wx)) wy - | N0 wx, Nn n wy => - if w0_eq0 wx then zero - else subn n (extend n w13 (extend13 w0 (WW w_0 wx))) wy - | N1 wx, N0 wy => - if w0_eq0 wy then x - else w1_sub wx (WW w_0 wy) - | N1 wx, N1 wy => w1_sub wx wy - | N1 wx, N2 wy => w2_sub (extend1 w0 wx) wy - | N1 wx, N3 wy => w3_sub (extend2 w0 wx) wy - | N1 wx, N4 wy => w4_sub (extend3 w0 wx) wy - | N1 wx, N5 wy => w5_sub (extend4 w0 wx) wy - | N1 wx, N6 wy => w6_sub (extend5 w0 wx) wy - | N1 wx, N7 wy => w7_sub (extend6 w0 wx) wy - | N1 wx, N8 wy => w8_sub (extend7 w0 wx) wy - | N1 wx, N9 wy => w9_sub (extend8 w0 wx) wy - | N1 wx, N10 wy => w10_sub (extend9 w0 wx) wy - | N1 wx, N11 wy => w11_sub (extend10 w0 wx) wy - | N1 wx, N12 wy => w12_sub (extend11 w0 wx) wy - | N1 wx, N13 wy => w13_sub (extend12 w0 wx) wy - | N1 wx, Nn n wy => subn n (extend n w13 (extend13 w0 wx)) wy - | N2 wx, N0 wy => - if w0_eq0 wy then x - else w2_sub wx (extend1 w0 (WW w_0 wy)) - | N2 wx, N1 wy => w2_sub wx (extend1 w0 wy) - | N2 wx, N2 wy => w2_sub wx wy - | N2 wx, N3 wy => w3_sub (extend1 w1 wx) wy - | N2 wx, N4 wy => w4_sub (extend2 w1 wx) wy - | N2 wx, N5 wy => w5_sub (extend3 w1 wx) wy - | N2 wx, N6 wy => w6_sub (extend4 w1 wx) wy - | N2 wx, N7 wy => w7_sub (extend5 w1 wx) wy - | N2 wx, N8 wy => w8_sub (extend6 w1 wx) wy - | N2 wx, N9 wy => w9_sub (extend7 w1 wx) wy - | N2 wx, N10 wy => w10_sub (extend8 w1 wx) wy - | N2 wx, N11 wy => w11_sub (extend9 w1 wx) wy - | N2 wx, N12 wy => w12_sub (extend10 w1 wx) wy - | N2 wx, N13 wy => w13_sub (extend11 w1 wx) wy - | N2 wx, Nn n wy => subn n (extend n w13 (extend12 w1 wx)) wy - | N3 wx, N0 wy => - if w0_eq0 wy then x - else w3_sub wx (extend2 w0 (WW w_0 wy)) - | N3 wx, N1 wy => w3_sub wx (extend2 w0 wy) - | N3 wx, N2 wy => w3_sub wx (extend1 w1 wy) - | N3 wx, N3 wy => w3_sub wx wy - | N3 wx, N4 wy => w4_sub (extend1 w2 wx) wy - | N3 wx, N5 wy => w5_sub (extend2 w2 wx) wy - | N3 wx, N6 wy => w6_sub (extend3 w2 wx) wy - | N3 wx, N7 wy => w7_sub (extend4 w2 wx) wy - | N3 wx, N8 wy => w8_sub (extend5 w2 wx) wy - | N3 wx, N9 wy => w9_sub (extend6 w2 wx) wy - | N3 wx, N10 wy => w10_sub (extend7 w2 wx) wy - | N3 wx, N11 wy => w11_sub (extend8 w2 wx) wy - | N3 wx, N12 wy => w12_sub (extend9 w2 wx) wy - | N3 wx, N13 wy => w13_sub (extend10 w2 wx) wy - | N3 wx, Nn n wy => subn n (extend n w13 (extend11 w2 wx)) wy - | N4 wx, N0 wy => - if w0_eq0 wy then x - else w4_sub wx (extend3 w0 (WW w_0 wy)) - | N4 wx, N1 wy => w4_sub wx (extend3 w0 wy) - | N4 wx, N2 wy => w4_sub wx (extend2 w1 wy) - | N4 wx, N3 wy => w4_sub wx (extend1 w2 wy) - | N4 wx, N4 wy => w4_sub wx wy - | N4 wx, N5 wy => w5_sub (extend1 w3 wx) wy - | N4 wx, N6 wy => w6_sub (extend2 w3 wx) wy - | N4 wx, N7 wy => w7_sub (extend3 w3 wx) wy - | N4 wx, N8 wy => w8_sub (extend4 w3 wx) wy - | N4 wx, N9 wy => w9_sub (extend5 w3 wx) wy - | N4 wx, N10 wy => w10_sub (extend6 w3 wx) wy - | N4 wx, N11 wy => w11_sub (extend7 w3 wx) wy - | N4 wx, N12 wy => w12_sub (extend8 w3 wx) wy - | N4 wx, N13 wy => w13_sub (extend9 w3 wx) wy - | N4 wx, Nn n wy => subn n (extend n w13 (extend10 w3 wx)) wy - | N5 wx, N0 wy => - if w0_eq0 wy then x - else w5_sub wx (extend4 w0 (WW w_0 wy)) - | N5 wx, N1 wy => w5_sub wx (extend4 w0 wy) - | N5 wx, N2 wy => w5_sub wx (extend3 w1 wy) - | N5 wx, N3 wy => w5_sub wx (extend2 w2 wy) - | N5 wx, N4 wy => w5_sub wx (extend1 w3 wy) - | N5 wx, N5 wy => w5_sub wx wy - | N5 wx, N6 wy => w6_sub (extend1 w4 wx) wy - | N5 wx, N7 wy => w7_sub (extend2 w4 wx) wy - | N5 wx, N8 wy => w8_sub (extend3 w4 wx) wy - | N5 wx, N9 wy => w9_sub (extend4 w4 wx) wy - | N5 wx, N10 wy => w10_sub (extend5 w4 wx) wy - | N5 wx, N11 wy => w11_sub (extend6 w4 wx) wy - | N5 wx, N12 wy => w12_sub (extend7 w4 wx) wy - | N5 wx, N13 wy => w13_sub (extend8 w4 wx) wy - | N5 wx, Nn n wy => subn n (extend n w13 (extend9 w4 wx)) wy - | N6 wx, N0 wy => - if w0_eq0 wy then x - else w6_sub wx (extend5 w0 (WW w_0 wy)) - | N6 wx, N1 wy => w6_sub wx (extend5 w0 wy) - | N6 wx, N2 wy => w6_sub wx (extend4 w1 wy) - | N6 wx, N3 wy => w6_sub wx (extend3 w2 wy) - | N6 wx, N4 wy => w6_sub wx (extend2 w3 wy) - | N6 wx, N5 wy => w6_sub wx (extend1 w4 wy) - | N6 wx, N6 wy => w6_sub wx wy - | N6 wx, N7 wy => w7_sub (extend1 w5 wx) wy - | N6 wx, N8 wy => w8_sub (extend2 w5 wx) wy - | N6 wx, N9 wy => w9_sub (extend3 w5 wx) wy - | N6 wx, N10 wy => w10_sub (extend4 w5 wx) wy - | N6 wx, N11 wy => w11_sub (extend5 w5 wx) wy - | N6 wx, N12 wy => w12_sub (extend6 w5 wx) wy - | N6 wx, N13 wy => w13_sub (extend7 w5 wx) wy - | N6 wx, Nn n wy => subn n (extend n w13 (extend8 w5 wx)) wy - | N7 wx, N0 wy => - if w0_eq0 wy then x - else w7_sub wx (extend6 w0 (WW w_0 wy)) - | N7 wx, N1 wy => w7_sub wx (extend6 w0 wy) - | N7 wx, N2 wy => w7_sub wx (extend5 w1 wy) - | N7 wx, N3 wy => w7_sub wx (extend4 w2 wy) - | N7 wx, N4 wy => w7_sub wx (extend3 w3 wy) - | N7 wx, N5 wy => w7_sub wx (extend2 w4 wy) - | N7 wx, N6 wy => w7_sub wx (extend1 w5 wy) - | N7 wx, N7 wy => w7_sub wx wy - | N7 wx, N8 wy => w8_sub (extend1 w6 wx) wy - | N7 wx, N9 wy => w9_sub (extend2 w6 wx) wy - | N7 wx, N10 wy => w10_sub (extend3 w6 wx) wy - | N7 wx, N11 wy => w11_sub (extend4 w6 wx) wy - | N7 wx, N12 wy => w12_sub (extend5 w6 wx) wy - | N7 wx, N13 wy => w13_sub (extend6 w6 wx) wy - | N7 wx, Nn n wy => subn n (extend n w13 (extend7 w6 wx)) wy - | N8 wx, N0 wy => - if w0_eq0 wy then x - else w8_sub wx (extend7 w0 (WW w_0 wy)) - | N8 wx, N1 wy => w8_sub wx (extend7 w0 wy) - | N8 wx, N2 wy => w8_sub wx (extend6 w1 wy) - | N8 wx, N3 wy => w8_sub wx (extend5 w2 wy) - | N8 wx, N4 wy => w8_sub wx (extend4 w3 wy) - | N8 wx, N5 wy => w8_sub wx (extend3 w4 wy) - | N8 wx, N6 wy => w8_sub wx (extend2 w5 wy) - | N8 wx, N7 wy => w8_sub wx (extend1 w6 wy) - | N8 wx, N8 wy => w8_sub wx wy - | N8 wx, N9 wy => w9_sub (extend1 w7 wx) wy - | N8 wx, N10 wy => w10_sub (extend2 w7 wx) wy - | N8 wx, N11 wy => w11_sub (extend3 w7 wx) wy - | N8 wx, N12 wy => w12_sub (extend4 w7 wx) wy - | N8 wx, N13 wy => w13_sub (extend5 w7 wx) wy - | N8 wx, Nn n wy => subn n (extend n w13 (extend6 w7 wx)) wy - | N9 wx, N0 wy => - if w0_eq0 wy then x - else w9_sub wx (extend8 w0 (WW w_0 wy)) - | N9 wx, N1 wy => w9_sub wx (extend8 w0 wy) - | N9 wx, N2 wy => w9_sub wx (extend7 w1 wy) - | N9 wx, N3 wy => w9_sub wx (extend6 w2 wy) - | N9 wx, N4 wy => w9_sub wx (extend5 w3 wy) - | N9 wx, N5 wy => w9_sub wx (extend4 w4 wy) - | N9 wx, N6 wy => w9_sub wx (extend3 w5 wy) - | N9 wx, N7 wy => w9_sub wx (extend2 w6 wy) - | N9 wx, N8 wy => w9_sub wx (extend1 w7 wy) - | N9 wx, N9 wy => w9_sub wx wy - | N9 wx, N10 wy => w10_sub (extend1 w8 wx) wy - | N9 wx, N11 wy => w11_sub (extend2 w8 wx) wy - | N9 wx, N12 wy => w12_sub (extend3 w8 wx) wy - | N9 wx, N13 wy => w13_sub (extend4 w8 wx) wy - | N9 wx, Nn n wy => subn n (extend n w13 (extend5 w8 wx)) wy - | N10 wx, N0 wy => - if w0_eq0 wy then x - else w10_sub wx (extend9 w0 (WW w_0 wy)) - | N10 wx, N1 wy => w10_sub wx (extend9 w0 wy) - | N10 wx, N2 wy => w10_sub wx (extend8 w1 wy) - | N10 wx, N3 wy => w10_sub wx (extend7 w2 wy) - | N10 wx, N4 wy => w10_sub wx (extend6 w3 wy) - | N10 wx, N5 wy => w10_sub wx (extend5 w4 wy) - | N10 wx, N6 wy => w10_sub wx (extend4 w5 wy) - | N10 wx, N7 wy => w10_sub wx (extend3 w6 wy) - | N10 wx, N8 wy => w10_sub wx (extend2 w7 wy) - | N10 wx, N9 wy => w10_sub wx (extend1 w8 wy) - | N10 wx, N10 wy => w10_sub wx wy - | N10 wx, N11 wy => w11_sub (extend1 w9 wx) wy - | N10 wx, N12 wy => w12_sub (extend2 w9 wx) wy - | N10 wx, N13 wy => w13_sub (extend3 w9 wx) wy - | N10 wx, Nn n wy => subn n (extend n w13 (extend4 w9 wx)) wy - | N11 wx, N0 wy => - if w0_eq0 wy then x - else w11_sub wx (extend10 w0 (WW w_0 wy)) - | N11 wx, N1 wy => w11_sub wx (extend10 w0 wy) - | N11 wx, N2 wy => w11_sub wx (extend9 w1 wy) - | N11 wx, N3 wy => w11_sub wx (extend8 w2 wy) - | N11 wx, N4 wy => w11_sub wx (extend7 w3 wy) - | N11 wx, N5 wy => w11_sub wx (extend6 w4 wy) - | N11 wx, N6 wy => w11_sub wx (extend5 w5 wy) - | N11 wx, N7 wy => w11_sub wx (extend4 w6 wy) - | N11 wx, N8 wy => w11_sub wx (extend3 w7 wy) - | N11 wx, N9 wy => w11_sub wx (extend2 w8 wy) - | N11 wx, N10 wy => w11_sub wx (extend1 w9 wy) - | N11 wx, N11 wy => w11_sub wx wy - | N11 wx, N12 wy => w12_sub (extend1 w10 wx) wy - | N11 wx, N13 wy => w13_sub (extend2 w10 wx) wy - | N11 wx, Nn n wy => subn n (extend n w13 (extend3 w10 wx)) wy - | N12 wx, N0 wy => - if w0_eq0 wy then x - else w12_sub wx (extend11 w0 (WW w_0 wy)) - | N12 wx, N1 wy => w12_sub wx (extend11 w0 wy) - | N12 wx, N2 wy => w12_sub wx (extend10 w1 wy) - | N12 wx, N3 wy => w12_sub wx (extend9 w2 wy) - | N12 wx, N4 wy => w12_sub wx (extend8 w3 wy) - | N12 wx, N5 wy => w12_sub wx (extend7 w4 wy) - | N12 wx, N6 wy => w12_sub wx (extend6 w5 wy) - | N12 wx, N7 wy => w12_sub wx (extend5 w6 wy) - | N12 wx, N8 wy => w12_sub wx (extend4 w7 wy) - | N12 wx, N9 wy => w12_sub wx (extend3 w8 wy) - | N12 wx, N10 wy => w12_sub wx (extend2 w9 wy) - | N12 wx, N11 wy => w12_sub wx (extend1 w10 wy) - | N12 wx, N12 wy => w12_sub wx wy - | N12 wx, N13 wy => w13_sub (extend1 w11 wx) wy - | N12 wx, Nn n wy => subn n (extend n w13 (extend2 w11 wx)) wy - | N13 wx, N0 wy => - if w0_eq0 wy then x - else w13_sub wx (extend12 w0 (WW w_0 wy)) - | N13 wx, N1 wy => w13_sub wx (extend12 w0 wy) - | N13 wx, N2 wy => w13_sub wx (extend11 w1 wy) - | N13 wx, N3 wy => w13_sub wx (extend10 w2 wy) - | N13 wx, N4 wy => w13_sub wx (extend9 w3 wy) - | N13 wx, N5 wy => w13_sub wx (extend8 w4 wy) - | N13 wx, N6 wy => w13_sub wx (extend7 w5 wy) - | N13 wx, N7 wy => w13_sub wx (extend6 w6 wy) - | N13 wx, N8 wy => w13_sub wx (extend5 w7 wy) - | N13 wx, N9 wy => w13_sub wx (extend4 w8 wy) - | N13 wx, N10 wy => w13_sub wx (extend3 w9 wy) - | N13 wx, N11 wy => w13_sub wx (extend2 w10 wy) - | N13 wx, N12 wy => w13_sub wx (extend1 w11 wy) - | N13 wx, N13 wy => w13_sub wx wy - | N13 wx, Nn n wy => subn n (extend n w13 (extend1 w12 wx)) wy - | Nn n wx, N0 wy => - if w0_eq0 wy then x - else subn n wx (extend n w13 (extend13 w0 (WW w_0 wy))) - | Nn n wx, N1 wy => subn n wx (extend n w13 (extend13 w0 wy)) - | Nn n wx, N2 wy => subn n wx (extend n w13 (extend12 w1 wy)) - | Nn n wx, N3 wy => subn n wx (extend n w13 (extend11 w2 wy)) - | Nn n wx, N4 wy => subn n wx (extend n w13 (extend10 w3 wy)) - | Nn n wx, N5 wy => subn n wx (extend n w13 (extend9 w4 wy)) - | Nn n wx, N6 wy => subn n wx (extend n w13 (extend8 w5 wy)) - | Nn n wx, N7 wy => subn n wx (extend n w13 (extend7 w6 wy)) - | Nn n wx, N8 wy => subn n wx (extend n w13 (extend6 w7 wy)) - | Nn n wx, N9 wy => subn n wx (extend n w13 (extend5 w8 wy)) - | Nn n wx, N10 wy => subn n wx (extend n w13 (extend4 w9 wy)) - | Nn n wx, N11 wy => subn n wx (extend n w13 (extend3 w10 wy)) - | Nn n wx, N12 wy => subn n wx (extend n w13 (extend2 w11 wy)) - | Nn n wx, N13 wy => subn n wx (extend n w13 (extend1 w12 wy)) - | Nn n wx, Nn m wy => - let mn := Max.max n m in - let d := diff n m in - subn mn - (castm (diff_r n m) (extend_tr wx (snd d))) - (castm (diff_l n m) (extend_tr wy (fst d))) - end. + Definition sub := Eval lazy beta delta [same_level] in + (same_level t_ w0_sub w1_sub w2_sub w3_sub w4_sub w5_sub w6_sub w7_sub w8_sub w9_sub w10_sub w11_sub w12_sub w13_sub subn). + + Theorem spec_sub: forall x y, [y] <= [x] -> [sub x y] = [x] - [y]. + Admitted. + + Theorem spec_sub0: forall x y, [x] < [y] -> [sub x y] = 0. + Admitted. + + (***************************************************************) + (* *) + (* Comparison *) + (* *) + (***************************************************************) Definition compare_0 := w0_op.(znz_compare). Definition comparen_0 := @@ -1188,268 +2108,67 @@ Module Make (W0:W0Type). Definition comparen_13 := compare_mn_1 w13 w13 W0 compare_13 (compare_13 W0) compare_13. - Definition compare x y := - match x, y with - | N0 wx, N0 wy => compare_0 wx wy - | N0 wx, N1 wy => opp_compare (comparen_0 1 wy wx) - | N0 wx, N2 wy => opp_compare (comparen_0 2 wy wx) - | N0 wx, N3 wy => opp_compare (comparen_0 3 wy wx) - | N0 wx, N4 wy => opp_compare (comparen_0 4 wy wx) - | N0 wx, N5 wy => opp_compare (comparen_0 5 wy wx) - | N0 wx, N6 wy => opp_compare (comparen_0 6 wy wx) - | N0 wx, N7 wy => opp_compare (comparen_0 7 wy wx) - | N0 wx, N8 wy => opp_compare (comparen_0 8 wy wx) - | N0 wx, N9 wy => opp_compare (comparen_0 9 wy wx) - | N0 wx, N10 wy => opp_compare (comparen_0 10 wy wx) - | N0 wx, N11 wy => opp_compare (comparen_0 11 wy wx) - | N0 wx, N12 wy => opp_compare (comparen_0 12 wy wx) - | N0 wx, N13 wy => opp_compare (comparen_0 13 wy wx) - | N0 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w0 w_0 compare_0 (compare_13 W0) (comparen_0 13) (S n) wy wx) - | N1 wx, N0 wy => comparen_0 1 wx wy - | N1 wx, N1 wy => compare_1 wx wy - | N1 wx, N2 wy => opp_compare (comparen_1 1 wy wx) - | N1 wx, N3 wy => opp_compare (comparen_1 2 wy wx) - | N1 wx, N4 wy => opp_compare (comparen_1 3 wy wx) - | N1 wx, N5 wy => opp_compare (comparen_1 4 wy wx) - | N1 wx, N6 wy => opp_compare (comparen_1 5 wy wx) - | N1 wx, N7 wy => opp_compare (comparen_1 6 wy wx) - | N1 wx, N8 wy => opp_compare (comparen_1 7 wy wx) - | N1 wx, N9 wy => opp_compare (comparen_1 8 wy wx) - | N1 wx, N10 wy => opp_compare (comparen_1 9 wy wx) - | N1 wx, N11 wy => opp_compare (comparen_1 10 wy wx) - | N1 wx, N12 wy => opp_compare (comparen_1 11 wy wx) - | N1 wx, N13 wy => opp_compare (comparen_1 12 wy wx) - | N1 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w1 W0 compare_1 (compare_13 W0) (comparen_1 12) (S n) wy wx) - | N2 wx, N0 wy => comparen_0 2 wx wy - | N2 wx, N1 wy => comparen_1 1 wx wy - | N2 wx, N2 wy => compare_2 wx wy - | N2 wx, N3 wy => opp_compare (comparen_2 1 wy wx) - | N2 wx, N4 wy => opp_compare (comparen_2 2 wy wx) - | N2 wx, N5 wy => opp_compare (comparen_2 3 wy wx) - | N2 wx, N6 wy => opp_compare (comparen_2 4 wy wx) - | N2 wx, N7 wy => opp_compare (comparen_2 5 wy wx) - | N2 wx, N8 wy => opp_compare (comparen_2 6 wy wx) - | N2 wx, N9 wy => opp_compare (comparen_2 7 wy wx) - | N2 wx, N10 wy => opp_compare (comparen_2 8 wy wx) - | N2 wx, N11 wy => opp_compare (comparen_2 9 wy wx) - | N2 wx, N12 wy => opp_compare (comparen_2 10 wy wx) - | N2 wx, N13 wy => opp_compare (comparen_2 11 wy wx) - | N2 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w2 W0 compare_2 (compare_13 W0) (comparen_2 11) (S n) wy wx) - | N3 wx, N0 wy => comparen_0 3 wx wy - | N3 wx, N1 wy => comparen_1 2 wx wy - | N3 wx, N2 wy => comparen_2 1 wx wy - | N3 wx, N3 wy => compare_3 wx wy - | N3 wx, N4 wy => opp_compare (comparen_3 1 wy wx) - | N3 wx, N5 wy => opp_compare (comparen_3 2 wy wx) - | N3 wx, N6 wy => opp_compare (comparen_3 3 wy wx) - | N3 wx, N7 wy => opp_compare (comparen_3 4 wy wx) - | N3 wx, N8 wy => opp_compare (comparen_3 5 wy wx) - | N3 wx, N9 wy => opp_compare (comparen_3 6 wy wx) - | N3 wx, N10 wy => opp_compare (comparen_3 7 wy wx) - | N3 wx, N11 wy => opp_compare (comparen_3 8 wy wx) - | N3 wx, N12 wy => opp_compare (comparen_3 9 wy wx) - | N3 wx, N13 wy => opp_compare (comparen_3 10 wy wx) - | N3 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w3 W0 compare_3 (compare_13 W0) (comparen_3 10) (S n) wy wx) - | N4 wx, N0 wy => comparen_0 4 wx wy - | N4 wx, N1 wy => comparen_1 3 wx wy - | N4 wx, N2 wy => comparen_2 2 wx wy - | N4 wx, N3 wy => comparen_3 1 wx wy - | N4 wx, N4 wy => compare_4 wx wy - | N4 wx, N5 wy => opp_compare (comparen_4 1 wy wx) - | N4 wx, N6 wy => opp_compare (comparen_4 2 wy wx) - | N4 wx, N7 wy => opp_compare (comparen_4 3 wy wx) - | N4 wx, N8 wy => opp_compare (comparen_4 4 wy wx) - | N4 wx, N9 wy => opp_compare (comparen_4 5 wy wx) - | N4 wx, N10 wy => opp_compare (comparen_4 6 wy wx) - | N4 wx, N11 wy => opp_compare (comparen_4 7 wy wx) - | N4 wx, N12 wy => opp_compare (comparen_4 8 wy wx) - | N4 wx, N13 wy => opp_compare (comparen_4 9 wy wx) - | N4 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w4 W0 compare_4 (compare_13 W0) (comparen_4 9) (S n) wy wx) - | N5 wx, N0 wy => comparen_0 5 wx wy - | N5 wx, N1 wy => comparen_1 4 wx wy - | N5 wx, N2 wy => comparen_2 3 wx wy - | N5 wx, N3 wy => comparen_3 2 wx wy - | N5 wx, N4 wy => comparen_4 1 wx wy - | N5 wx, N5 wy => compare_5 wx wy - | N5 wx, N6 wy => opp_compare (comparen_5 1 wy wx) - | N5 wx, N7 wy => opp_compare (comparen_5 2 wy wx) - | N5 wx, N8 wy => opp_compare (comparen_5 3 wy wx) - | N5 wx, N9 wy => opp_compare (comparen_5 4 wy wx) - | N5 wx, N10 wy => opp_compare (comparen_5 5 wy wx) - | N5 wx, N11 wy => opp_compare (comparen_5 6 wy wx) - | N5 wx, N12 wy => opp_compare (comparen_5 7 wy wx) - | N5 wx, N13 wy => opp_compare (comparen_5 8 wy wx) - | N5 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w5 W0 compare_5 (compare_13 W0) (comparen_5 8) (S n) wy wx) - | N6 wx, N0 wy => comparen_0 6 wx wy - | N6 wx, N1 wy => comparen_1 5 wx wy - | N6 wx, N2 wy => comparen_2 4 wx wy - | N6 wx, N3 wy => comparen_3 3 wx wy - | N6 wx, N4 wy => comparen_4 2 wx wy - | N6 wx, N5 wy => comparen_5 1 wx wy - | N6 wx, N6 wy => compare_6 wx wy - | N6 wx, N7 wy => opp_compare (comparen_6 1 wy wx) - | N6 wx, N8 wy => opp_compare (comparen_6 2 wy wx) - | N6 wx, N9 wy => opp_compare (comparen_6 3 wy wx) - | N6 wx, N10 wy => opp_compare (comparen_6 4 wy wx) - | N6 wx, N11 wy => opp_compare (comparen_6 5 wy wx) - | N6 wx, N12 wy => opp_compare (comparen_6 6 wy wx) - | N6 wx, N13 wy => opp_compare (comparen_6 7 wy wx) - | N6 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w6 W0 compare_6 (compare_13 W0) (comparen_6 7) (S n) wy wx) - | N7 wx, N0 wy => comparen_0 7 wx wy - | N7 wx, N1 wy => comparen_1 6 wx wy - | N7 wx, N2 wy => comparen_2 5 wx wy - | N7 wx, N3 wy => comparen_3 4 wx wy - | N7 wx, N4 wy => comparen_4 3 wx wy - | N7 wx, N5 wy => comparen_5 2 wx wy - | N7 wx, N6 wy => comparen_6 1 wx wy - | N7 wx, N7 wy => compare_7 wx wy - | N7 wx, N8 wy => opp_compare (comparen_7 1 wy wx) - | N7 wx, N9 wy => opp_compare (comparen_7 2 wy wx) - | N7 wx, N10 wy => opp_compare (comparen_7 3 wy wx) - | N7 wx, N11 wy => opp_compare (comparen_7 4 wy wx) - | N7 wx, N12 wy => opp_compare (comparen_7 5 wy wx) - | N7 wx, N13 wy => opp_compare (comparen_7 6 wy wx) - | N7 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w7 W0 compare_7 (compare_13 W0) (comparen_7 6) (S n) wy wx) - | N8 wx, N0 wy => comparen_0 8 wx wy - | N8 wx, N1 wy => comparen_1 7 wx wy - | N8 wx, N2 wy => comparen_2 6 wx wy - | N8 wx, N3 wy => comparen_3 5 wx wy - | N8 wx, N4 wy => comparen_4 4 wx wy - | N8 wx, N5 wy => comparen_5 3 wx wy - | N8 wx, N6 wy => comparen_6 2 wx wy - | N8 wx, N7 wy => comparen_7 1 wx wy - | N8 wx, N8 wy => compare_8 wx wy - | N8 wx, N9 wy => opp_compare (comparen_8 1 wy wx) - | N8 wx, N10 wy => opp_compare (comparen_8 2 wy wx) - | N8 wx, N11 wy => opp_compare (comparen_8 3 wy wx) - | N8 wx, N12 wy => opp_compare (comparen_8 4 wy wx) - | N8 wx, N13 wy => opp_compare (comparen_8 5 wy wx) - | N8 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w8 W0 compare_8 (compare_13 W0) (comparen_8 5) (S n) wy wx) - | N9 wx, N0 wy => comparen_0 9 wx wy - | N9 wx, N1 wy => comparen_1 8 wx wy - | N9 wx, N2 wy => comparen_2 7 wx wy - | N9 wx, N3 wy => comparen_3 6 wx wy - | N9 wx, N4 wy => comparen_4 5 wx wy - | N9 wx, N5 wy => comparen_5 4 wx wy - | N9 wx, N6 wy => comparen_6 3 wx wy - | N9 wx, N7 wy => comparen_7 2 wx wy - | N9 wx, N8 wy => comparen_8 1 wx wy - | N9 wx, N9 wy => compare_9 wx wy - | N9 wx, N10 wy => opp_compare (comparen_9 1 wy wx) - | N9 wx, N11 wy => opp_compare (comparen_9 2 wy wx) - | N9 wx, N12 wy => opp_compare (comparen_9 3 wy wx) - | N9 wx, N13 wy => opp_compare (comparen_9 4 wy wx) - | N9 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w9 W0 compare_9 (compare_13 W0) (comparen_9 4) (S n) wy wx) - | N10 wx, N0 wy => comparen_0 10 wx wy - | N10 wx, N1 wy => comparen_1 9 wx wy - | N10 wx, N2 wy => comparen_2 8 wx wy - | N10 wx, N3 wy => comparen_3 7 wx wy - | N10 wx, N4 wy => comparen_4 6 wx wy - | N10 wx, N5 wy => comparen_5 5 wx wy - | N10 wx, N6 wy => comparen_6 4 wx wy - | N10 wx, N7 wy => comparen_7 3 wx wy - | N10 wx, N8 wy => comparen_8 2 wx wy - | N10 wx, N9 wy => comparen_9 1 wx wy - | N10 wx, N10 wy => compare_10 wx wy - | N10 wx, N11 wy => opp_compare (comparen_10 1 wy wx) - | N10 wx, N12 wy => opp_compare (comparen_10 2 wy wx) - | N10 wx, N13 wy => opp_compare (comparen_10 3 wy wx) - | N10 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w10 W0 compare_10 (compare_13 W0) (comparen_10 3) (S n) wy wx) - | N11 wx, N0 wy => comparen_0 11 wx wy - | N11 wx, N1 wy => comparen_1 10 wx wy - | N11 wx, N2 wy => comparen_2 9 wx wy - | N11 wx, N3 wy => comparen_3 8 wx wy - | N11 wx, N4 wy => comparen_4 7 wx wy - | N11 wx, N5 wy => comparen_5 6 wx wy - | N11 wx, N6 wy => comparen_6 5 wx wy - | N11 wx, N7 wy => comparen_7 4 wx wy - | N11 wx, N8 wy => comparen_8 3 wx wy - | N11 wx, N9 wy => comparen_9 2 wx wy - | N11 wx, N10 wy => comparen_10 1 wx wy - | N11 wx, N11 wy => compare_11 wx wy - | N11 wx, N12 wy => opp_compare (comparen_11 1 wy wx) - | N11 wx, N13 wy => opp_compare (comparen_11 2 wy wx) - | N11 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w11 W0 compare_11 (compare_13 W0) (comparen_11 2) (S n) wy wx) - | N12 wx, N0 wy => comparen_0 12 wx wy - | N12 wx, N1 wy => comparen_1 11 wx wy - | N12 wx, N2 wy => comparen_2 10 wx wy - | N12 wx, N3 wy => comparen_3 9 wx wy - | N12 wx, N4 wy => comparen_4 8 wx wy - | N12 wx, N5 wy => comparen_5 7 wx wy - | N12 wx, N6 wy => comparen_6 6 wx wy - | N12 wx, N7 wy => comparen_7 5 wx wy - | N12 wx, N8 wy => comparen_8 4 wx wy - | N12 wx, N9 wy => comparen_9 3 wx wy - | N12 wx, N10 wy => comparen_10 2 wx wy - | N12 wx, N11 wy => comparen_11 1 wx wy - | N12 wx, N12 wy => compare_12 wx wy - | N12 wx, N13 wy => opp_compare (comparen_12 1 wy wx) - | N12 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w12 W0 compare_12 (compare_13 W0) (comparen_12 1) (S n) wy wx) - | N13 wx, N0 wy => comparen_0 13 wx wy - | N13 wx, N1 wy => comparen_1 12 wx wy - | N13 wx, N2 wy => comparen_2 11 wx wy - | N13 wx, N3 wy => comparen_3 10 wx wy - | N13 wx, N4 wy => comparen_4 9 wx wy - | N13 wx, N5 wy => comparen_5 8 wx wy - | N13 wx, N6 wy => comparen_6 7 wx wy - | N13 wx, N7 wy => comparen_7 6 wx wy - | N13 wx, N8 wy => comparen_8 5 wx wy - | N13 wx, N9 wy => comparen_9 4 wx wy - | N13 wx, N10 wy => comparen_10 3 wx wy - | N13 wx, N11 wy => comparen_11 2 wx wy - | N13 wx, N12 wy => comparen_12 1 wx wy - | N13 wx, N13 wy => compare_13 wx wy - | N13 wx, Nn n wy => - opp_compare (compare_mn_1 w13 w13 W0 compare_13 (compare_13 W0) (comparen_13 0) (S n) wy wx) - | Nn n wx, N0 wy => - compare_mn_1 w13 w0 w_0 compare_0 (compare_13 W0) (comparen_0 13) (S n) wx wy - | Nn n wx, N1 wy => - compare_mn_1 w13 w1 W0 compare_1 (compare_13 W0) (comparen_1 12) (S n) wx wy - | Nn n wx, N2 wy => - compare_mn_1 w13 w2 W0 compare_2 (compare_13 W0) (comparen_2 11) (S n) wx wy - | Nn n wx, N3 wy => - compare_mn_1 w13 w3 W0 compare_3 (compare_13 W0) (comparen_3 10) (S n) wx wy - | Nn n wx, N4 wy => - compare_mn_1 w13 w4 W0 compare_4 (compare_13 W0) (comparen_4 9) (S n) wx wy - | Nn n wx, N5 wy => - compare_mn_1 w13 w5 W0 compare_5 (compare_13 W0) (comparen_5 8) (S n) wx wy - | Nn n wx, N6 wy => - compare_mn_1 w13 w6 W0 compare_6 (compare_13 W0) (comparen_6 7) (S n) wx wy - | Nn n wx, N7 wy => - compare_mn_1 w13 w7 W0 compare_7 (compare_13 W0) (comparen_7 6) (S n) wx wy - | Nn n wx, N8 wy => - compare_mn_1 w13 w8 W0 compare_8 (compare_13 W0) (comparen_8 5) (S n) wx wy - | Nn n wx, N9 wy => - compare_mn_1 w13 w9 W0 compare_9 (compare_13 W0) (comparen_9 4) (S n) wx wy - | Nn n wx, N10 wy => - compare_mn_1 w13 w10 W0 compare_10 (compare_13 W0) (comparen_10 3) (S n) wx wy - | Nn n wx, N11 wy => - compare_mn_1 w13 w11 W0 compare_11 (compare_13 W0) (comparen_11 2) (S n) wx wy - | Nn n wx, N12 wy => - compare_mn_1 w13 w12 W0 compare_12 (compare_13 W0) (comparen_12 1) (S n) wx wy - | Nn n wx, N13 wy => - compare_mn_1 w13 w13 W0 compare_13 (compare_13 W0) (comparen_13 0) (S n) wx wy - | Nn n wx, Nn m wy => + Definition comparenm n m wx wy := let mn := Max.max n m in let d := diff n m in let op := make_op mn in op.(znz_compare) (castm (diff_r n m) (extend_tr wx (snd d))) - (castm (diff_l n m) (extend_tr wy (fst d))) - end. + (castm (diff_l n m) (extend_tr wy (fst d))). + + Definition compare := Eval lazy beta delta [iter] in + (iter _ + compare_0 + (fun n x y => opp_compare (comparen_0 (S n) y x)) + (fun n => comparen_0 (S n)) + compare_1 + (fun n x y => opp_compare (comparen_1 (S n) y x)) + (fun n => comparen_1 (S n)) + compare_2 + (fun n x y => opp_compare (comparen_2 (S n) y x)) + (fun n => comparen_2 (S n)) + compare_3 + (fun n x y => opp_compare (comparen_3 (S n) y x)) + (fun n => comparen_3 (S n)) + compare_4 + (fun n x y => opp_compare (comparen_4 (S n) y x)) + (fun n => comparen_4 (S n)) + compare_5 + (fun n x y => opp_compare (comparen_5 (S n) y x)) + (fun n => comparen_5 (S n)) + compare_6 + (fun n x y => opp_compare (comparen_6 (S n) y x)) + (fun n => comparen_6 (S n)) + compare_7 + (fun n x y => opp_compare (comparen_7 (S n) y x)) + (fun n => comparen_7 (S n)) + compare_8 + (fun n x y => opp_compare (comparen_8 (S n) y x)) + (fun n => comparen_8 (S n)) + compare_9 + (fun n x y => opp_compare (comparen_9 (S n) y x)) + (fun n => comparen_9 (S n)) + compare_10 + (fun n x y => opp_compare (comparen_10 (S n) y x)) + (fun n => comparen_10 (S n)) + compare_11 + (fun n x y => opp_compare (comparen_11 (S n) y x)) + (fun n => comparen_11 (S n)) + compare_12 + (fun n x y => opp_compare (comparen_12 (S n) y x)) + (fun n => comparen_12 (S n)) + compare_13 + (fun n x y => opp_compare (comparen_13 (S n) y x)) + (fun n => comparen_13 (S n)) + comparenm). + + Theorem spec_compare: forall x y, + match compare x y with + Eq => [x] = [y] + | Lt => [x] < [y] + | Gt => [x] > [y] + end. + Admitted. Definition eq_bool x y := match compare x y with @@ -1457,6 +2176,16 @@ Module Make (W0:W0Type). | _ => false end. + Theorem spec_eq_bool: forall x y, + if eq_bool x y then [x] = [y] else [x] <> [y]. + Admitted. + + (***************************************************************) + (* *) + (* Multiplication *) + (* *) + (***************************************************************) + Definition w0_mul_c := w0_op.(znz_mul_c). Definition w1_mul_c := w1_op.(znz_mul_c). Definition w2_mul_c := w2_op.(znz_mul_c). @@ -1515,6 +2244,21 @@ Module Make (W0:W0Type). Eval lazy beta delta [w_mul_add] in @w_mul_add w13 W0 w13_succ w13_add_c w13_mul_c. + Definition w0_0W := w0_op.(znz_0W). + Definition w1_0W := w1_op.(znz_0W). + Definition w2_0W := w2_op.(znz_0W). + Definition w3_0W := w3_op.(znz_0W). + Definition w4_0W := w4_op.(znz_0W). + Definition w5_0W := w5_op.(znz_0W). + Definition w6_0W := w6_op.(znz_0W). + Definition w7_0W := w7_op.(znz_0W). + Definition w8_0W := w8_op.(znz_0W). + Definition w9_0W := w9_op.(znz_0W). + Definition w10_0W := w10_op.(znz_0W). + Definition w11_0W := w11_op.(znz_0W). + Definition w12_0W := w12_op.(znz_0W). + Definition w13_0W := w13_op.(znz_0W). + Definition w0_mul_add_n1 := @gen_mul_add_n1 w0 w_0 w0_op.(znz_WW) w0_0W w0_mul_add. Definition w1_mul_add_n1 := @@ -1544,940 +2288,323 @@ Module Make (W0:W0Type). Definition w13_mul_add_n1 := @gen_mul_add_n1 w13 W0 w13_op.(znz_WW) w13_0W w13_mul_add. - Definition mul x y := - match x, y with - | N0 wx, N0 wy => - reduce_1 (w0_mul_c wx wy) - | N0 wx, N1 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 1 wy wx w_0 in - if w0_eq0 w then N1 r - else N2 (WW (WW w_0 w) r) - | N0 wx, N2 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 2 wy wx w_0 in - if w0_eq0 w then N2 r - else N3 (WW (extend1 w0 (WW w_0 w)) r) - | N0 wx, N3 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 3 wy wx w_0 in - if w0_eq0 w then N3 r - else N4 (WW (extend2 w0 (WW w_0 w)) r) - | N0 wx, N4 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 4 wy wx w_0 in - if w0_eq0 w then N4 r - else N5 (WW (extend3 w0 (WW w_0 w)) r) - | N0 wx, N5 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 5 wy wx w_0 in - if w0_eq0 w then N5 r - else N6 (WW (extend4 w0 (WW w_0 w)) r) - | N0 wx, N6 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 6 wy wx w_0 in - if w0_eq0 w then N6 r - else N7 (WW (extend5 w0 (WW w_0 w)) r) - | N0 wx, N7 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 7 wy wx w_0 in - if w0_eq0 w then N7 r - else N8 (WW (extend6 w0 (WW w_0 w)) r) - | N0 wx, N8 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 8 wy wx w_0 in - if w0_eq0 w then N8 r - else N9 (WW (extend7 w0 (WW w_0 w)) r) - | N0 wx, N9 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 9 wy wx w_0 in - if w0_eq0 w then N9 r - else N10 (WW (extend8 w0 (WW w_0 w)) r) - | N0 wx, N10 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 10 wy wx w_0 in - if w0_eq0 w then N10 r - else N11 (WW (extend9 w0 (WW w_0 w)) r) - | N0 wx, N11 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 11 wy wx w_0 in - if w0_eq0 w then N11 r - else N12 (WW (extend10 w0 (WW w_0 w)) r) - | N0 wx, N12 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 12 wy wx w_0 in - if w0_eq0 w then N12 r - else N13 (WW (extend11 w0 (WW w_0 w)) r) - | N0 wx, N13 wy => - if w0_eq0 wx then zero - else - let (w,r) := w0_mul_add_n1 13 wy wx w_0 in - if w0_eq0 w then N13 r - else Nn 0 (WW (extend12 w0 (WW w_0 w)) r) - | N0 wx, Nn n wy => - if w0_eq0 wx then zero - else - let (w,r) := w13_mul_add_n1 (S n) wy (extend12 w0 (WW w_0 wx)) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N1 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 1 wx wy w_0 in - if w0_eq0 w then N1 r - else N2 (WW (WW w_0 w) r) - | N1 wx, N1 wy => - N2 (w1_mul_c wx wy) - | N1 wx, N2 wy => - let (w,r) := w1_mul_add_n1 1 wy wx W0 in - if w1_eq0 w then N2 r - else N3 (WW (extend1 w0 w) r) - | N1 wx, N3 wy => - let (w,r) := w1_mul_add_n1 2 wy wx W0 in - if w1_eq0 w then N3 r - else N4 (WW (extend2 w0 w) r) - | N1 wx, N4 wy => - let (w,r) := w1_mul_add_n1 3 wy wx W0 in - if w1_eq0 w then N4 r - else N5 (WW (extend3 w0 w) r) - | N1 wx, N5 wy => - let (w,r) := w1_mul_add_n1 4 wy wx W0 in - if w1_eq0 w then N5 r - else N6 (WW (extend4 w0 w) r) - | N1 wx, N6 wy => - let (w,r) := w1_mul_add_n1 5 wy wx W0 in - if w1_eq0 w then N6 r - else N7 (WW (extend5 w0 w) r) - | N1 wx, N7 wy => - let (w,r) := w1_mul_add_n1 6 wy wx W0 in - if w1_eq0 w then N7 r - else N8 (WW (extend6 w0 w) r) - | N1 wx, N8 wy => - let (w,r) := w1_mul_add_n1 7 wy wx W0 in - if w1_eq0 w then N8 r - else N9 (WW (extend7 w0 w) r) - | N1 wx, N9 wy => - let (w,r) := w1_mul_add_n1 8 wy wx W0 in - if w1_eq0 w then N9 r - else N10 (WW (extend8 w0 w) r) - | N1 wx, N10 wy => - let (w,r) := w1_mul_add_n1 9 wy wx W0 in - if w1_eq0 w then N10 r - else N11 (WW (extend9 w0 w) r) - | N1 wx, N11 wy => - let (w,r) := w1_mul_add_n1 10 wy wx W0 in - if w1_eq0 w then N11 r - else N12 (WW (extend10 w0 w) r) - | N1 wx, N12 wy => - let (w,r) := w1_mul_add_n1 11 wy wx W0 in - if w1_eq0 w then N12 r - else N13 (WW (extend11 w0 w) r) - | N1 wx, N13 wy => - let (w,r) := w1_mul_add_n1 12 wy wx W0 in - if w1_eq0 w then N13 r - else Nn 0 (WW (extend12 w0 w) r) - | N1 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend12 w0 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N2 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 2 wx wy w_0 in - if w0_eq0 w then N2 r - else N3 (WW (extend1 w0 (WW w_0 w)) r) - | N2 wx, N1 wy => - let (w,r) := w1_mul_add_n1 1 wx wy W0 in - if w1_eq0 w then N2 r - else N3 (WW (extend1 w0 w) r) - | N2 wx, N2 wy => - N3 (w2_mul_c wx wy) - | N2 wx, N3 wy => - let (w,r) := w2_mul_add_n1 1 wy wx W0 in - if w2_eq0 w then N3 r - else N4 (WW (extend1 w1 w) r) - | N2 wx, N4 wy => - let (w,r) := w2_mul_add_n1 2 wy wx W0 in - if w2_eq0 w then N4 r - else N5 (WW (extend2 w1 w) r) - | N2 wx, N5 wy => - let (w,r) := w2_mul_add_n1 3 wy wx W0 in - if w2_eq0 w then N5 r - else N6 (WW (extend3 w1 w) r) - | N2 wx, N6 wy => - let (w,r) := w2_mul_add_n1 4 wy wx W0 in - if w2_eq0 w then N6 r - else N7 (WW (extend4 w1 w) r) - | N2 wx, N7 wy => - let (w,r) := w2_mul_add_n1 5 wy wx W0 in - if w2_eq0 w then N7 r - else N8 (WW (extend5 w1 w) r) - | N2 wx, N8 wy => - let (w,r) := w2_mul_add_n1 6 wy wx W0 in - if w2_eq0 w then N8 r - else N9 (WW (extend6 w1 w) r) - | N2 wx, N9 wy => - let (w,r) := w2_mul_add_n1 7 wy wx W0 in - if w2_eq0 w then N9 r - else N10 (WW (extend7 w1 w) r) - | N2 wx, N10 wy => - let (w,r) := w2_mul_add_n1 8 wy wx W0 in - if w2_eq0 w then N10 r - else N11 (WW (extend8 w1 w) r) - | N2 wx, N11 wy => - let (w,r) := w2_mul_add_n1 9 wy wx W0 in - if w2_eq0 w then N11 r - else N12 (WW (extend9 w1 w) r) - | N2 wx, N12 wy => - let (w,r) := w2_mul_add_n1 10 wy wx W0 in - if w2_eq0 w then N12 r - else N13 (WW (extend10 w1 w) r) - | N2 wx, N13 wy => - let (w,r) := w2_mul_add_n1 11 wy wx W0 in - if w2_eq0 w then N13 r - else Nn 0 (WW (extend11 w1 w) r) - | N2 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend11 w1 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N3 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 3 wx wy w_0 in - if w0_eq0 w then N3 r - else N4 (WW (extend2 w0 (WW w_0 w)) r) - | N3 wx, N1 wy => - let (w,r) := w1_mul_add_n1 2 wx wy W0 in - if w1_eq0 w then N3 r - else N4 (WW (extend2 w0 w) r) - | N3 wx, N2 wy => - let (w,r) := w2_mul_add_n1 1 wx wy W0 in - if w2_eq0 w then N3 r - else N4 (WW (extend1 w1 w) r) - | N3 wx, N3 wy => - N4 (w3_mul_c wx wy) - | N3 wx, N4 wy => - let (w,r) := w3_mul_add_n1 1 wy wx W0 in - if w3_eq0 w then N4 r - else N5 (WW (extend1 w2 w) r) - | N3 wx, N5 wy => - let (w,r) := w3_mul_add_n1 2 wy wx W0 in - if w3_eq0 w then N5 r - else N6 (WW (extend2 w2 w) r) - | N3 wx, N6 wy => - let (w,r) := w3_mul_add_n1 3 wy wx W0 in - if w3_eq0 w then N6 r - else N7 (WW (extend3 w2 w) r) - | N3 wx, N7 wy => - let (w,r) := w3_mul_add_n1 4 wy wx W0 in - if w3_eq0 w then N7 r - else N8 (WW (extend4 w2 w) r) - | N3 wx, N8 wy => - let (w,r) := w3_mul_add_n1 5 wy wx W0 in - if w3_eq0 w then N8 r - else N9 (WW (extend5 w2 w) r) - | N3 wx, N9 wy => - let (w,r) := w3_mul_add_n1 6 wy wx W0 in - if w3_eq0 w then N9 r - else N10 (WW (extend6 w2 w) r) - | N3 wx, N10 wy => - let (w,r) := w3_mul_add_n1 7 wy wx W0 in - if w3_eq0 w then N10 r - else N11 (WW (extend7 w2 w) r) - | N3 wx, N11 wy => - let (w,r) := w3_mul_add_n1 8 wy wx W0 in - if w3_eq0 w then N11 r - else N12 (WW (extend8 w2 w) r) - | N3 wx, N12 wy => - let (w,r) := w3_mul_add_n1 9 wy wx W0 in - if w3_eq0 w then N12 r - else N13 (WW (extend9 w2 w) r) - | N3 wx, N13 wy => - let (w,r) := w3_mul_add_n1 10 wy wx W0 in - if w3_eq0 w then N13 r - else Nn 0 (WW (extend10 w2 w) r) - | N3 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend10 w2 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N4 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 4 wx wy w_0 in - if w0_eq0 w then N4 r - else N5 (WW (extend3 w0 (WW w_0 w)) r) - | N4 wx, N1 wy => - let (w,r) := w1_mul_add_n1 3 wx wy W0 in - if w1_eq0 w then N4 r - else N5 (WW (extend3 w0 w) r) - | N4 wx, N2 wy => - let (w,r) := w2_mul_add_n1 2 wx wy W0 in - if w2_eq0 w then N4 r - else N5 (WW (extend2 w1 w) r) - | N4 wx, N3 wy => - let (w,r) := w3_mul_add_n1 1 wx wy W0 in - if w3_eq0 w then N4 r - else N5 (WW (extend1 w2 w) r) - | N4 wx, N4 wy => - N5 (w4_mul_c wx wy) - | N4 wx, N5 wy => - let (w,r) := w4_mul_add_n1 1 wy wx W0 in - if w4_eq0 w then N5 r - else N6 (WW (extend1 w3 w) r) - | N4 wx, N6 wy => - let (w,r) := w4_mul_add_n1 2 wy wx W0 in - if w4_eq0 w then N6 r - else N7 (WW (extend2 w3 w) r) - | N4 wx, N7 wy => - let (w,r) := w4_mul_add_n1 3 wy wx W0 in - if w4_eq0 w then N7 r - else N8 (WW (extend3 w3 w) r) - | N4 wx, N8 wy => - let (w,r) := w4_mul_add_n1 4 wy wx W0 in - if w4_eq0 w then N8 r - else N9 (WW (extend4 w3 w) r) - | N4 wx, N9 wy => - let (w,r) := w4_mul_add_n1 5 wy wx W0 in - if w4_eq0 w then N9 r - else N10 (WW (extend5 w3 w) r) - | N4 wx, N10 wy => - let (w,r) := w4_mul_add_n1 6 wy wx W0 in - if w4_eq0 w then N10 r - else N11 (WW (extend6 w3 w) r) - | N4 wx, N11 wy => - let (w,r) := w4_mul_add_n1 7 wy wx W0 in - if w4_eq0 w then N11 r - else N12 (WW (extend7 w3 w) r) - | N4 wx, N12 wy => - let (w,r) := w4_mul_add_n1 8 wy wx W0 in - if w4_eq0 w then N12 r - else N13 (WW (extend8 w3 w) r) - | N4 wx, N13 wy => - let (w,r) := w4_mul_add_n1 9 wy wx W0 in - if w4_eq0 w then N13 r - else Nn 0 (WW (extend9 w3 w) r) - | N4 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend9 w3 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N5 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 5 wx wy w_0 in - if w0_eq0 w then N5 r - else N6 (WW (extend4 w0 (WW w_0 w)) r) - | N5 wx, N1 wy => - let (w,r) := w1_mul_add_n1 4 wx wy W0 in - if w1_eq0 w then N5 r - else N6 (WW (extend4 w0 w) r) - | N5 wx, N2 wy => - let (w,r) := w2_mul_add_n1 3 wx wy W0 in - if w2_eq0 w then N5 r - else N6 (WW (extend3 w1 w) r) - | N5 wx, N3 wy => - let (w,r) := w3_mul_add_n1 2 wx wy W0 in - if w3_eq0 w then N5 r - else N6 (WW (extend2 w2 w) r) - | N5 wx, N4 wy => - let (w,r) := w4_mul_add_n1 1 wx wy W0 in - if w4_eq0 w then N5 r - else N6 (WW (extend1 w3 w) r) - | N5 wx, N5 wy => - N6 (w5_mul_c wx wy) - | N5 wx, N6 wy => - let (w,r) := w5_mul_add_n1 1 wy wx W0 in - if w5_eq0 w then N6 r - else N7 (WW (extend1 w4 w) r) - | N5 wx, N7 wy => - let (w,r) := w5_mul_add_n1 2 wy wx W0 in - if w5_eq0 w then N7 r - else N8 (WW (extend2 w4 w) r) - | N5 wx, N8 wy => - let (w,r) := w5_mul_add_n1 3 wy wx W0 in - if w5_eq0 w then N8 r - else N9 (WW (extend3 w4 w) r) - | N5 wx, N9 wy => - let (w,r) := w5_mul_add_n1 4 wy wx W0 in - if w5_eq0 w then N9 r - else N10 (WW (extend4 w4 w) r) - | N5 wx, N10 wy => - let (w,r) := w5_mul_add_n1 5 wy wx W0 in - if w5_eq0 w then N10 r - else N11 (WW (extend5 w4 w) r) - | N5 wx, N11 wy => - let (w,r) := w5_mul_add_n1 6 wy wx W0 in - if w5_eq0 w then N11 r - else N12 (WW (extend6 w4 w) r) - | N5 wx, N12 wy => - let (w,r) := w5_mul_add_n1 7 wy wx W0 in - if w5_eq0 w then N12 r - else N13 (WW (extend7 w4 w) r) - | N5 wx, N13 wy => - let (w,r) := w5_mul_add_n1 8 wy wx W0 in - if w5_eq0 w then N13 r - else Nn 0 (WW (extend8 w4 w) r) - | N5 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend8 w4 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N6 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 6 wx wy w_0 in - if w0_eq0 w then N6 r - else N7 (WW (extend5 w0 (WW w_0 w)) r) - | N6 wx, N1 wy => - let (w,r) := w1_mul_add_n1 5 wx wy W0 in - if w1_eq0 w then N6 r - else N7 (WW (extend5 w0 w) r) - | N6 wx, N2 wy => - let (w,r) := w2_mul_add_n1 4 wx wy W0 in - if w2_eq0 w then N6 r - else N7 (WW (extend4 w1 w) r) - | N6 wx, N3 wy => - let (w,r) := w3_mul_add_n1 3 wx wy W0 in - if w3_eq0 w then N6 r - else N7 (WW (extend3 w2 w) r) - | N6 wx, N4 wy => - let (w,r) := w4_mul_add_n1 2 wx wy W0 in - if w4_eq0 w then N6 r - else N7 (WW (extend2 w3 w) r) - | N6 wx, N5 wy => - let (w,r) := w5_mul_add_n1 1 wx wy W0 in - if w5_eq0 w then N6 r - else N7 (WW (extend1 w4 w) r) - | N6 wx, N6 wy => - N7 (w6_mul_c wx wy) - | N6 wx, N7 wy => - let (w,r) := w6_mul_add_n1 1 wy wx W0 in - if w6_eq0 w then N7 r - else N8 (WW (extend1 w5 w) r) - | N6 wx, N8 wy => - let (w,r) := w6_mul_add_n1 2 wy wx W0 in - if w6_eq0 w then N8 r - else N9 (WW (extend2 w5 w) r) - | N6 wx, N9 wy => - let (w,r) := w6_mul_add_n1 3 wy wx W0 in - if w6_eq0 w then N9 r - else N10 (WW (extend3 w5 w) r) - | N6 wx, N10 wy => - let (w,r) := w6_mul_add_n1 4 wy wx W0 in - if w6_eq0 w then N10 r - else N11 (WW (extend4 w5 w) r) - | N6 wx, N11 wy => - let (w,r) := w6_mul_add_n1 5 wy wx W0 in - if w6_eq0 w then N11 r - else N12 (WW (extend5 w5 w) r) - | N6 wx, N12 wy => - let (w,r) := w6_mul_add_n1 6 wy wx W0 in - if w6_eq0 w then N12 r - else N13 (WW (extend6 w5 w) r) - | N6 wx, N13 wy => - let (w,r) := w6_mul_add_n1 7 wy wx W0 in - if w6_eq0 w then N13 r - else Nn 0 (WW (extend7 w5 w) r) - | N6 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend7 w5 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N7 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 7 wx wy w_0 in - if w0_eq0 w then N7 r - else N8 (WW (extend6 w0 (WW w_0 w)) r) - | N7 wx, N1 wy => - let (w,r) := w1_mul_add_n1 6 wx wy W0 in - if w1_eq0 w then N7 r - else N8 (WW (extend6 w0 w) r) - | N7 wx, N2 wy => - let (w,r) := w2_mul_add_n1 5 wx wy W0 in - if w2_eq0 w then N7 r - else N8 (WW (extend5 w1 w) r) - | N7 wx, N3 wy => - let (w,r) := w3_mul_add_n1 4 wx wy W0 in - if w3_eq0 w then N7 r - else N8 (WW (extend4 w2 w) r) - | N7 wx, N4 wy => - let (w,r) := w4_mul_add_n1 3 wx wy W0 in - if w4_eq0 w then N7 r - else N8 (WW (extend3 w3 w) r) - | N7 wx, N5 wy => - let (w,r) := w5_mul_add_n1 2 wx wy W0 in - if w5_eq0 w then N7 r - else N8 (WW (extend2 w4 w) r) - | N7 wx, N6 wy => - let (w,r) := w6_mul_add_n1 1 wx wy W0 in - if w6_eq0 w then N7 r - else N8 (WW (extend1 w5 w) r) - | N7 wx, N7 wy => - N8 (w7_mul_c wx wy) - | N7 wx, N8 wy => - let (w,r) := w7_mul_add_n1 1 wy wx W0 in - if w7_eq0 w then N8 r - else N9 (WW (extend1 w6 w) r) - | N7 wx, N9 wy => - let (w,r) := w7_mul_add_n1 2 wy wx W0 in - if w7_eq0 w then N9 r - else N10 (WW (extend2 w6 w) r) - | N7 wx, N10 wy => - let (w,r) := w7_mul_add_n1 3 wy wx W0 in - if w7_eq0 w then N10 r - else N11 (WW (extend3 w6 w) r) - | N7 wx, N11 wy => - let (w,r) := w7_mul_add_n1 4 wy wx W0 in - if w7_eq0 w then N11 r - else N12 (WW (extend4 w6 w) r) - | N7 wx, N12 wy => - let (w,r) := w7_mul_add_n1 5 wy wx W0 in - if w7_eq0 w then N12 r - else N13 (WW (extend5 w6 w) r) - | N7 wx, N13 wy => - let (w,r) := w7_mul_add_n1 6 wy wx W0 in - if w7_eq0 w then N13 r - else Nn 0 (WW (extend6 w6 w) r) - | N7 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend6 w6 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N8 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 8 wx wy w_0 in - if w0_eq0 w then N8 r - else N9 (WW (extend7 w0 (WW w_0 w)) r) - | N8 wx, N1 wy => - let (w,r) := w1_mul_add_n1 7 wx wy W0 in - if w1_eq0 w then N8 r - else N9 (WW (extend7 w0 w) r) - | N8 wx, N2 wy => - let (w,r) := w2_mul_add_n1 6 wx wy W0 in - if w2_eq0 w then N8 r - else N9 (WW (extend6 w1 w) r) - | N8 wx, N3 wy => - let (w,r) := w3_mul_add_n1 5 wx wy W0 in - if w3_eq0 w then N8 r - else N9 (WW (extend5 w2 w) r) - | N8 wx, N4 wy => - let (w,r) := w4_mul_add_n1 4 wx wy W0 in - if w4_eq0 w then N8 r - else N9 (WW (extend4 w3 w) r) - | N8 wx, N5 wy => - let (w,r) := w5_mul_add_n1 3 wx wy W0 in - if w5_eq0 w then N8 r - else N9 (WW (extend3 w4 w) r) - | N8 wx, N6 wy => - let (w,r) := w6_mul_add_n1 2 wx wy W0 in - if w6_eq0 w then N8 r - else N9 (WW (extend2 w5 w) r) - | N8 wx, N7 wy => - let (w,r) := w7_mul_add_n1 1 wx wy W0 in - if w7_eq0 w then N8 r - else N9 (WW (extend1 w6 w) r) - | N8 wx, N8 wy => - N9 (w8_mul_c wx wy) - | N8 wx, N9 wy => - let (w,r) := w8_mul_add_n1 1 wy wx W0 in - if w8_eq0 w then N9 r - else N10 (WW (extend1 w7 w) r) - | N8 wx, N10 wy => - let (w,r) := w8_mul_add_n1 2 wy wx W0 in - if w8_eq0 w then N10 r - else N11 (WW (extend2 w7 w) r) - | N8 wx, N11 wy => - let (w,r) := w8_mul_add_n1 3 wy wx W0 in - if w8_eq0 w then N11 r - else N12 (WW (extend3 w7 w) r) - | N8 wx, N12 wy => - let (w,r) := w8_mul_add_n1 4 wy wx W0 in - if w8_eq0 w then N12 r - else N13 (WW (extend4 w7 w) r) - | N8 wx, N13 wy => - let (w,r) := w8_mul_add_n1 5 wy wx W0 in - if w8_eq0 w then N13 r - else Nn 0 (WW (extend5 w7 w) r) - | N8 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend5 w7 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N9 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 9 wx wy w_0 in - if w0_eq0 w then N9 r - else N10 (WW (extend8 w0 (WW w_0 w)) r) - | N9 wx, N1 wy => - let (w,r) := w1_mul_add_n1 8 wx wy W0 in - if w1_eq0 w then N9 r - else N10 (WW (extend8 w0 w) r) - | N9 wx, N2 wy => - let (w,r) := w2_mul_add_n1 7 wx wy W0 in - if w2_eq0 w then N9 r - else N10 (WW (extend7 w1 w) r) - | N9 wx, N3 wy => - let (w,r) := w3_mul_add_n1 6 wx wy W0 in - if w3_eq0 w then N9 r - else N10 (WW (extend6 w2 w) r) - | N9 wx, N4 wy => - let (w,r) := w4_mul_add_n1 5 wx wy W0 in - if w4_eq0 w then N9 r - else N10 (WW (extend5 w3 w) r) - | N9 wx, N5 wy => - let (w,r) := w5_mul_add_n1 4 wx wy W0 in - if w5_eq0 w then N9 r - else N10 (WW (extend4 w4 w) r) - | N9 wx, N6 wy => - let (w,r) := w6_mul_add_n1 3 wx wy W0 in - if w6_eq0 w then N9 r - else N10 (WW (extend3 w5 w) r) - | N9 wx, N7 wy => - let (w,r) := w7_mul_add_n1 2 wx wy W0 in - if w7_eq0 w then N9 r - else N10 (WW (extend2 w6 w) r) - | N9 wx, N8 wy => - let (w,r) := w8_mul_add_n1 1 wx wy W0 in - if w8_eq0 w then N9 r - else N10 (WW (extend1 w7 w) r) - | N9 wx, N9 wy => - N10 (w9_mul_c wx wy) - | N9 wx, N10 wy => - let (w,r) := w9_mul_add_n1 1 wy wx W0 in - if w9_eq0 w then N10 r - else N11 (WW (extend1 w8 w) r) - | N9 wx, N11 wy => - let (w,r) := w9_mul_add_n1 2 wy wx W0 in - if w9_eq0 w then N11 r - else N12 (WW (extend2 w8 w) r) - | N9 wx, N12 wy => - let (w,r) := w9_mul_add_n1 3 wy wx W0 in - if w9_eq0 w then N12 r - else N13 (WW (extend3 w8 w) r) - | N9 wx, N13 wy => - let (w,r) := w9_mul_add_n1 4 wy wx W0 in - if w9_eq0 w then N13 r - else Nn 0 (WW (extend4 w8 w) r) - | N9 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend4 w8 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N10 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 10 wx wy w_0 in - if w0_eq0 w then N10 r - else N11 (WW (extend9 w0 (WW w_0 w)) r) - | N10 wx, N1 wy => - let (w,r) := w1_mul_add_n1 9 wx wy W0 in - if w1_eq0 w then N10 r - else N11 (WW (extend9 w0 w) r) - | N10 wx, N2 wy => - let (w,r) := w2_mul_add_n1 8 wx wy W0 in - if w2_eq0 w then N10 r - else N11 (WW (extend8 w1 w) r) - | N10 wx, N3 wy => - let (w,r) := w3_mul_add_n1 7 wx wy W0 in - if w3_eq0 w then N10 r - else N11 (WW (extend7 w2 w) r) - | N10 wx, N4 wy => - let (w,r) := w4_mul_add_n1 6 wx wy W0 in - if w4_eq0 w then N10 r - else N11 (WW (extend6 w3 w) r) - | N10 wx, N5 wy => - let (w,r) := w5_mul_add_n1 5 wx wy W0 in - if w5_eq0 w then N10 r - else N11 (WW (extend5 w4 w) r) - | N10 wx, N6 wy => - let (w,r) := w6_mul_add_n1 4 wx wy W0 in - if w6_eq0 w then N10 r - else N11 (WW (extend4 w5 w) r) - | N10 wx, N7 wy => - let (w,r) := w7_mul_add_n1 3 wx wy W0 in - if w7_eq0 w then N10 r - else N11 (WW (extend3 w6 w) r) - | N10 wx, N8 wy => - let (w,r) := w8_mul_add_n1 2 wx wy W0 in - if w8_eq0 w then N10 r - else N11 (WW (extend2 w7 w) r) - | N10 wx, N9 wy => - let (w,r) := w9_mul_add_n1 1 wx wy W0 in - if w9_eq0 w then N10 r - else N11 (WW (extend1 w8 w) r) - | N10 wx, N10 wy => - N11 (w10_mul_c wx wy) - | N10 wx, N11 wy => - let (w,r) := w10_mul_add_n1 1 wy wx W0 in - if w10_eq0 w then N11 r - else N12 (WW (extend1 w9 w) r) - | N10 wx, N12 wy => - let (w,r) := w10_mul_add_n1 2 wy wx W0 in - if w10_eq0 w then N12 r - else N13 (WW (extend2 w9 w) r) - | N10 wx, N13 wy => - let (w,r) := w10_mul_add_n1 3 wy wx W0 in - if w10_eq0 w then N13 r - else Nn 0 (WW (extend3 w9 w) r) - | N10 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend3 w9 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N11 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 11 wx wy w_0 in - if w0_eq0 w then N11 r - else N12 (WW (extend10 w0 (WW w_0 w)) r) - | N11 wx, N1 wy => - let (w,r) := w1_mul_add_n1 10 wx wy W0 in - if w1_eq0 w then N11 r - else N12 (WW (extend10 w0 w) r) - | N11 wx, N2 wy => - let (w,r) := w2_mul_add_n1 9 wx wy W0 in - if w2_eq0 w then N11 r - else N12 (WW (extend9 w1 w) r) - | N11 wx, N3 wy => - let (w,r) := w3_mul_add_n1 8 wx wy W0 in - if w3_eq0 w then N11 r - else N12 (WW (extend8 w2 w) r) - | N11 wx, N4 wy => - let (w,r) := w4_mul_add_n1 7 wx wy W0 in - if w4_eq0 w then N11 r - else N12 (WW (extend7 w3 w) r) - | N11 wx, N5 wy => - let (w,r) := w5_mul_add_n1 6 wx wy W0 in - if w5_eq0 w then N11 r - else N12 (WW (extend6 w4 w) r) - | N11 wx, N6 wy => - let (w,r) := w6_mul_add_n1 5 wx wy W0 in - if w6_eq0 w then N11 r - else N12 (WW (extend5 w5 w) r) - | N11 wx, N7 wy => - let (w,r) := w7_mul_add_n1 4 wx wy W0 in - if w7_eq0 w then N11 r - else N12 (WW (extend4 w6 w) r) - | N11 wx, N8 wy => - let (w,r) := w8_mul_add_n1 3 wx wy W0 in - if w8_eq0 w then N11 r - else N12 (WW (extend3 w7 w) r) - | N11 wx, N9 wy => - let (w,r) := w9_mul_add_n1 2 wx wy W0 in - if w9_eq0 w then N11 r - else N12 (WW (extend2 w8 w) r) - | N11 wx, N10 wy => - let (w,r) := w10_mul_add_n1 1 wx wy W0 in - if w10_eq0 w then N11 r - else N12 (WW (extend1 w9 w) r) - | N11 wx, N11 wy => - N12 (w11_mul_c wx wy) - | N11 wx, N12 wy => - let (w,r) := w11_mul_add_n1 1 wy wx W0 in - if w11_eq0 w then N12 r - else N13 (WW (extend1 w10 w) r) - | N11 wx, N13 wy => - let (w,r) := w11_mul_add_n1 2 wy wx W0 in - if w11_eq0 w then N13 r - else Nn 0 (WW (extend2 w10 w) r) - | N11 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend2 w10 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N12 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 12 wx wy w_0 in - if w0_eq0 w then N12 r - else N13 (WW (extend11 w0 (WW w_0 w)) r) - | N12 wx, N1 wy => - let (w,r) := w1_mul_add_n1 11 wx wy W0 in - if w1_eq0 w then N12 r - else N13 (WW (extend11 w0 w) r) - | N12 wx, N2 wy => - let (w,r) := w2_mul_add_n1 10 wx wy W0 in - if w2_eq0 w then N12 r - else N13 (WW (extend10 w1 w) r) - | N12 wx, N3 wy => - let (w,r) := w3_mul_add_n1 9 wx wy W0 in - if w3_eq0 w then N12 r - else N13 (WW (extend9 w2 w) r) - | N12 wx, N4 wy => - let (w,r) := w4_mul_add_n1 8 wx wy W0 in - if w4_eq0 w then N12 r - else N13 (WW (extend8 w3 w) r) - | N12 wx, N5 wy => - let (w,r) := w5_mul_add_n1 7 wx wy W0 in - if w5_eq0 w then N12 r - else N13 (WW (extend7 w4 w) r) - | N12 wx, N6 wy => - let (w,r) := w6_mul_add_n1 6 wx wy W0 in - if w6_eq0 w then N12 r - else N13 (WW (extend6 w5 w) r) - | N12 wx, N7 wy => - let (w,r) := w7_mul_add_n1 5 wx wy W0 in - if w7_eq0 w then N12 r - else N13 (WW (extend5 w6 w) r) - | N12 wx, N8 wy => - let (w,r) := w8_mul_add_n1 4 wx wy W0 in - if w8_eq0 w then N12 r - else N13 (WW (extend4 w7 w) r) - | N12 wx, N9 wy => - let (w,r) := w9_mul_add_n1 3 wx wy W0 in - if w9_eq0 w then N12 r - else N13 (WW (extend3 w8 w) r) - | N12 wx, N10 wy => - let (w,r) := w10_mul_add_n1 2 wx wy W0 in - if w10_eq0 w then N12 r - else N13 (WW (extend2 w9 w) r) - | N12 wx, N11 wy => - let (w,r) := w11_mul_add_n1 1 wx wy W0 in - if w11_eq0 w then N12 r - else N13 (WW (extend1 w10 w) r) - | N12 wx, N12 wy => - N13 (w12_mul_c wx wy) - | N12 wx, N13 wy => - let (w,r) := w12_mul_add_n1 1 wy wx W0 in - if w12_eq0 w then N13 r - else Nn 0 (WW (extend1 w11 w) r) - | N12 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy (extend1 w11 wx) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | N13 wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w0_mul_add_n1 13 wx wy w_0 in - if w0_eq0 w then N13 r - else Nn 0 (WW (extend12 w0 (WW w_0 w)) r) - | N13 wx, N1 wy => - let (w,r) := w1_mul_add_n1 12 wx wy W0 in - if w1_eq0 w then N13 r - else Nn 0 (WW (extend12 w0 w) r) - | N13 wx, N2 wy => - let (w,r) := w2_mul_add_n1 11 wx wy W0 in - if w2_eq0 w then N13 r - else Nn 0 (WW (extend11 w1 w) r) - | N13 wx, N3 wy => - let (w,r) := w3_mul_add_n1 10 wx wy W0 in - if w3_eq0 w then N13 r - else Nn 0 (WW (extend10 w2 w) r) - | N13 wx, N4 wy => - let (w,r) := w4_mul_add_n1 9 wx wy W0 in - if w4_eq0 w then N13 r - else Nn 0 (WW (extend9 w3 w) r) - | N13 wx, N5 wy => - let (w,r) := w5_mul_add_n1 8 wx wy W0 in - if w5_eq0 w then N13 r - else Nn 0 (WW (extend8 w4 w) r) - | N13 wx, N6 wy => - let (w,r) := w6_mul_add_n1 7 wx wy W0 in - if w6_eq0 w then N13 r - else Nn 0 (WW (extend7 w5 w) r) - | N13 wx, N7 wy => - let (w,r) := w7_mul_add_n1 6 wx wy W0 in - if w7_eq0 w then N13 r - else Nn 0 (WW (extend6 w6 w) r) - | N13 wx, N8 wy => - let (w,r) := w8_mul_add_n1 5 wx wy W0 in - if w8_eq0 w then N13 r - else Nn 0 (WW (extend5 w7 w) r) - | N13 wx, N9 wy => - let (w,r) := w9_mul_add_n1 4 wx wy W0 in - if w9_eq0 w then N13 r - else Nn 0 (WW (extend4 w8 w) r) - | N13 wx, N10 wy => - let (w,r) := w10_mul_add_n1 3 wx wy W0 in - if w10_eq0 w then N13 r - else Nn 0 (WW (extend3 w9 w) r) - | N13 wx, N11 wy => - let (w,r) := w11_mul_add_n1 2 wx wy W0 in - if w11_eq0 w then N13 r - else Nn 0 (WW (extend2 w10 w) r) - | N13 wx, N12 wy => - let (w,r) := w12_mul_add_n1 1 wx wy W0 in - if w12_eq0 w then N13 r - else Nn 0 (WW (extend1 w11 w) r) - | N13 wx, N13 wy => - Nn 0 (w13_mul_c wx wy) - | N13 wx, Nn n wy => - let (w,r) := w13_mul_add_n1 (S n) wy wx W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N0 wy => - if w0_eq0 wy then zero - else - let (w,r) := w13_mul_add_n1 (S n) wx (extend12 w0 (WW w_0 wy)) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N1 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend12 w0 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N2 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend11 w1 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N3 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend10 w2 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N4 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend9 w3 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N5 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend8 w4 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N6 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend7 w5 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N7 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend6 w6 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N8 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend5 w7 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N9 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend4 w8 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N10 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend3 w9 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N11 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend2 w10 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N12 wy => - let (w,r) := w13_mul_add_n1 (S n) wx (extend1 w11 wy) W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, N13 wy => - let (w,r) := w13_mul_add_n1 (S n) wx wy W0 in - if w13_eq0 w then Nn n r - else Nn (S n) (WW (extend n w13 (WW W0 w)) r) - | Nn n wx, Nn m wy => + Let to_Z0 n := + match n return word w0 (S n) -> t_ with + | 0%nat => fun x => N1 x + | 1%nat => fun x => N2 x + | 2%nat => fun x => N3 x + | 3%nat => fun x => N4 x + | 4%nat => fun x => N5 x + | 5%nat => fun x => N6 x + | 6%nat => fun x => N7 x + | 7%nat => fun x => N8 x + | 8%nat => fun x => N9 x + | 9%nat => fun x => N10 x + | 10%nat => fun x => N11 x + | 11%nat => fun x => N12 x + | 12%nat => fun x => N13 x + | 13%nat => fun x => Nn 0 x + | 14%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z1 n := + match n return word w1 (S n) -> t_ with + | 0%nat => fun x => N2 x + | 1%nat => fun x => N3 x + | 2%nat => fun x => N4 x + | 3%nat => fun x => N5 x + | 4%nat => fun x => N6 x + | 5%nat => fun x => N7 x + | 6%nat => fun x => N8 x + | 7%nat => fun x => N9 x + | 8%nat => fun x => N10 x + | 9%nat => fun x => N11 x + | 10%nat => fun x => N12 x + | 11%nat => fun x => N13 x + | 12%nat => fun x => Nn 0 x + | 13%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z2 n := + match n return word w2 (S n) -> t_ with + | 0%nat => fun x => N3 x + | 1%nat => fun x => N4 x + | 2%nat => fun x => N5 x + | 3%nat => fun x => N6 x + | 4%nat => fun x => N7 x + | 5%nat => fun x => N8 x + | 6%nat => fun x => N9 x + | 7%nat => fun x => N10 x + | 8%nat => fun x => N11 x + | 9%nat => fun x => N12 x + | 10%nat => fun x => N13 x + | 11%nat => fun x => Nn 0 x + | 12%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z3 n := + match n return word w3 (S n) -> t_ with + | 0%nat => fun x => N4 x + | 1%nat => fun x => N5 x + | 2%nat => fun x => N6 x + | 3%nat => fun x => N7 x + | 4%nat => fun x => N8 x + | 5%nat => fun x => N9 x + | 6%nat => fun x => N10 x + | 7%nat => fun x => N11 x + | 8%nat => fun x => N12 x + | 9%nat => fun x => N13 x + | 10%nat => fun x => Nn 0 x + | 11%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z4 n := + match n return word w4 (S n) -> t_ with + | 0%nat => fun x => N5 x + | 1%nat => fun x => N6 x + | 2%nat => fun x => N7 x + | 3%nat => fun x => N8 x + | 4%nat => fun x => N9 x + | 5%nat => fun x => N10 x + | 6%nat => fun x => N11 x + | 7%nat => fun x => N12 x + | 8%nat => fun x => N13 x + | 9%nat => fun x => Nn 0 x + | 10%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z5 n := + match n return word w5 (S n) -> t_ with + | 0%nat => fun x => N6 x + | 1%nat => fun x => N7 x + | 2%nat => fun x => N8 x + | 3%nat => fun x => N9 x + | 4%nat => fun x => N10 x + | 5%nat => fun x => N11 x + | 6%nat => fun x => N12 x + | 7%nat => fun x => N13 x + | 8%nat => fun x => Nn 0 x + | 9%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z6 n := + match n return word w6 (S n) -> t_ with + | 0%nat => fun x => N7 x + | 1%nat => fun x => N8 x + | 2%nat => fun x => N9 x + | 3%nat => fun x => N10 x + | 4%nat => fun x => N11 x + | 5%nat => fun x => N12 x + | 6%nat => fun x => N13 x + | 7%nat => fun x => Nn 0 x + | 8%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z7 n := + match n return word w7 (S n) -> t_ with + | 0%nat => fun x => N8 x + | 1%nat => fun x => N9 x + | 2%nat => fun x => N10 x + | 3%nat => fun x => N11 x + | 4%nat => fun x => N12 x + | 5%nat => fun x => N13 x + | 6%nat => fun x => Nn 0 x + | 7%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z8 n := + match n return word w8 (S n) -> t_ with + | 0%nat => fun x => N9 x + | 1%nat => fun x => N10 x + | 2%nat => fun x => N11 x + | 3%nat => fun x => N12 x + | 4%nat => fun x => N13 x + | 5%nat => fun x => Nn 0 x + | 6%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z9 n := + match n return word w9 (S n) -> t_ with + | 0%nat => fun x => N10 x + | 1%nat => fun x => N11 x + | 2%nat => fun x => N12 x + | 3%nat => fun x => N13 x + | 4%nat => fun x => Nn 0 x + | 5%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z10 n := + match n return word w10 (S n) -> t_ with + | 0%nat => fun x => N11 x + | 1%nat => fun x => N12 x + | 2%nat => fun x => N13 x + | 3%nat => fun x => Nn 0 x + | 4%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z11 n := + match n return word w11 (S n) -> t_ with + | 0%nat => fun x => N12 x + | 1%nat => fun x => N13 x + | 2%nat => fun x => Nn 0 x + | 3%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Let to_Z12 n := + match n return word w12 (S n) -> t_ with + | 0%nat => fun x => N13 x + | 1%nat => fun x => Nn 0 x + | 2%nat => fun x => Nn 1 x + | _ => fun _ => N0 w_0 + end. + + Definition w0_mul n x y := + let (w,r) := w0_mul_add_n1 (S n) x y w_0 in + if w0_eq0 w then to_Z0 n r + else to_Z0 (S n) (WW (extend0 n w) r). + + Definition w1_mul n x y := + let (w,r) := w1_mul_add_n1 (S n) x y W0 in + if w1_eq0 w then to_Z1 n r + else to_Z1 (S n) (WW (extend1 n w) r). + + Definition w2_mul n x y := + let (w,r) := w2_mul_add_n1 (S n) x y W0 in + if w2_eq0 w then to_Z2 n r + else to_Z2 (S n) (WW (extend2 n w) r). + + Definition w3_mul n x y := + let (w,r) := w3_mul_add_n1 (S n) x y W0 in + if w3_eq0 w then to_Z3 n r + else to_Z3 (S n) (WW (extend3 n w) r). + + Definition w4_mul n x y := + let (w,r) := w4_mul_add_n1 (S n) x y W0 in + if w4_eq0 w then to_Z4 n r + else to_Z4 (S n) (WW (extend4 n w) r). + + Definition w5_mul n x y := + let (w,r) := w5_mul_add_n1 (S n) x y W0 in + if w5_eq0 w then to_Z5 n r + else to_Z5 (S n) (WW (extend5 n w) r). + + Definition w6_mul n x y := + let (w,r) := w6_mul_add_n1 (S n) x y W0 in + if w6_eq0 w then to_Z6 n r + else to_Z6 (S n) (WW (extend6 n w) r). + + Definition w7_mul n x y := + let (w,r) := w7_mul_add_n1 (S n) x y W0 in + if w7_eq0 w then to_Z7 n r + else to_Z7 (S n) (WW (extend7 n w) r). + + Definition w8_mul n x y := + let (w,r) := w8_mul_add_n1 (S n) x y W0 in + if w8_eq0 w then to_Z8 n r + else to_Z8 (S n) (WW (extend8 n w) r). + + Definition w9_mul n x y := + let (w,r) := w9_mul_add_n1 (S n) x y W0 in + if w9_eq0 w then to_Z9 n r + else to_Z9 (S n) (WW (extend9 n w) r). + + Definition w10_mul n x y := + let (w,r) := w10_mul_add_n1 (S n) x y W0 in + if w10_eq0 w then to_Z10 n r + else to_Z10 (S n) (WW (extend10 n w) r). + + Definition w11_mul n x y := + let (w,r) := w11_mul_add_n1 (S n) x y W0 in + if w11_eq0 w then to_Z11 n r + else to_Z11 (S n) (WW (extend11 n w) r). + + Definition w12_mul n x y := + let (w,r) := w12_mul_add_n1 (S n) x y W0 in + if w12_eq0 w then to_Z12 n r + else to_Z12 (S n) (WW (extend12 n w) r). + + Definition w13_mul n x y := + let (w,r) := w13_mul_add_n1 (S n) x y W0 in + if w13_eq0 w then Nn n r + else Nn (S n) (WW (extend13 n w) r). + + Definition mulnm n m x y := let mn := Max.max n m in let d := diff n m in let op := make_op mn in reduce_n (S mn) (op.(znz_mul_c) - (castm (diff_r n m) (extend_tr wx (snd d))) - (castm (diff_l n m) (extend_tr wy (fst d)))) - end. + (castm (diff_r n m) (extend_tr x (snd d))) + (castm (diff_l n m) (extend_tr y (fst d)))). + + Definition mul := Eval lazy beta delta [iter0] in + (iter0 t_ + (fun x y => reduce_1 (w0_mul_c x y)) + (fun n x y => w0_mul n y x) + w0_mul + (fun x y => reduce_2 (w1_mul_c x y)) + (fun n x y => w1_mul n y x) + w1_mul + (fun x y => reduce_3 (w2_mul_c x y)) + (fun n x y => w2_mul n y x) + w2_mul + (fun x y => reduce_4 (w3_mul_c x y)) + (fun n x y => w3_mul n y x) + w3_mul + (fun x y => reduce_5 (w4_mul_c x y)) + (fun n x y => w4_mul n y x) + w4_mul + (fun x y => reduce_6 (w5_mul_c x y)) + (fun n x y => w5_mul n y x) + w5_mul + (fun x y => reduce_7 (w6_mul_c x y)) + (fun n x y => w6_mul n y x) + w6_mul + (fun x y => reduce_8 (w7_mul_c x y)) + (fun n x y => w7_mul n y x) + w7_mul + (fun x y => reduce_9 (w8_mul_c x y)) + (fun n x y => w8_mul n y x) + w8_mul + (fun x y => reduce_10 (w9_mul_c x y)) + (fun n x y => w9_mul n y x) + w9_mul + (fun x y => reduce_11 (w10_mul_c x y)) + (fun n x y => w10_mul n y x) + w10_mul + (fun x y => reduce_12 (w11_mul_c x y)) + (fun n x y => w11_mul n y x) + w11_mul + (fun x y => reduce_13 (w12_mul_c x y)) + (fun n x y => w12_mul n y x) + w12_mul + (fun x y => reduce_14 (w13_mul_c x y)) + (fun n x y => w13_mul n y x) + w13_mul + mulnm + (fun _ => N0 w_0) + (fun _ => N0 w_0) + ). + + Theorem spec_mul: forall x y, [mul x y] = [x] * [y]. + Admitted. + + (***************************************************************) + (* *) + (* Square *) + (* *) + (***************************************************************) Definition w0_square_c := w0_op.(znz_square_c). Definition w1_square_c := w1_op.(znz_square_c). @@ -2515,6 +2642,15 @@ Module Make (W0:W0Type). Nn (S n) (op.(znz_square_c) wx) end. + Theorem spec_square: forall x, [square x] = [x] * [x]. +Admitted. + + (***************************************************************) + (* *) + (* Power *) + (* *) + (***************************************************************) + Fixpoint power_pos (x:t) (p:positive) {struct p} : t := match p with | xH => x @@ -2522,6 +2658,15 @@ Module Make (W0:W0Type). | xI p => mul (square (power_pos x p)) x end. + Theorem spec_power_pos: forall x n, [power_pos x n] = [x] ^ Zpos n. + Admitted. + + (***************************************************************) + (* *) + (* Square root *) + (* *) + (***************************************************************) + Definition w0_sqrt := w0_op.(znz_sqrt). Definition w1_sqrt := w1_op.(znz_sqrt). Definition w2_sqrt := w2_op.(znz_sqrt). @@ -2558,6 +2703,15 @@ Module Make (W0:W0Type). reduce_n n (op.(znz_sqrt) wx) end. + Theorem spec_sqrt: forall x, [sqrt x] ^ 2 <= [x] < ([sqrt x] + 1) ^ 2. +Admitted. + + (***************************************************************) + (* *) + (* Division *) + (* *) + (***************************************************************) + Definition w0_div_gt := w0_op.(znz_div_gt). Definition w1_div_gt := w1_op.(znz_div_gt). Definition w2_div_gt := w2_op.(znz_div_gt). @@ -2573,669 +2727,180 @@ Module Make (W0:W0Type). Definition w12_div_gt := w12_op.(znz_div_gt). Definition w13_div_gt := w13_op.(znz_div_gt). - Definition w0_divn1 := + Definition w0_divn1 n x y := + let (u, v) := gen_divn1 w0_op.(znz_zdigits) w0_op.(znz_0) w0_op.(znz_WW) w0_op.(znz_head0) w0_op.(znz_add_mul_div) w0_op.(znz_div21) - w0_op.(znz_compare) w0_op.(znz_sub). - Definition w1_divn1 := + w0_op.(znz_compare) w0_op.(znz_sub) (S n) x y in + (to_Z0 _ u, N0 v). + Definition w1_divn1 n x y := + let (u, v) := gen_divn1 w1_op.(znz_zdigits) w1_op.(znz_0) w1_op.(znz_WW) w1_op.(znz_head0) w1_op.(znz_add_mul_div) w1_op.(znz_div21) - w1_op.(znz_compare) w1_op.(znz_sub). - Definition w2_divn1 := + w1_op.(znz_compare) w1_op.(znz_sub) (S n) x y in + (to_Z1 _ u, N1 v). + Definition w2_divn1 n x y := + let (u, v) := gen_divn1 w2_op.(znz_zdigits) w2_op.(znz_0) w2_op.(znz_WW) w2_op.(znz_head0) w2_op.(znz_add_mul_div) w2_op.(znz_div21) - w2_op.(znz_compare) w2_op.(znz_sub). - Definition w3_divn1 := + w2_op.(znz_compare) w2_op.(znz_sub) (S n) x y in + (to_Z2 _ u, N2 v). + Definition w3_divn1 n x y := + let (u, v) := gen_divn1 w3_op.(znz_zdigits) w3_op.(znz_0) w3_op.(znz_WW) w3_op.(znz_head0) w3_op.(znz_add_mul_div) w3_op.(znz_div21) - w3_op.(znz_compare) w3_op.(znz_sub). - Definition w4_divn1 := + w3_op.(znz_compare) w3_op.(znz_sub) (S n) x y in + (to_Z3 _ u, N3 v). + Definition w4_divn1 n x y := + let (u, v) := gen_divn1 w4_op.(znz_zdigits) w4_op.(znz_0) w4_op.(znz_WW) w4_op.(znz_head0) w4_op.(znz_add_mul_div) w4_op.(znz_div21) - w4_op.(znz_compare) w4_op.(znz_sub). - Definition w5_divn1 := + w4_op.(znz_compare) w4_op.(znz_sub) (S n) x y in + (to_Z4 _ u, N4 v). + Definition w5_divn1 n x y := + let (u, v) := gen_divn1 w5_op.(znz_zdigits) w5_op.(znz_0) w5_op.(znz_WW) w5_op.(znz_head0) w5_op.(znz_add_mul_div) w5_op.(znz_div21) - w5_op.(znz_compare) w5_op.(znz_sub). - Definition w6_divn1 := + w5_op.(znz_compare) w5_op.(znz_sub) (S n) x y in + (to_Z5 _ u, N5 v). + Definition w6_divn1 n x y := + let (u, v) := gen_divn1 w6_op.(znz_zdigits) w6_op.(znz_0) w6_op.(znz_WW) w6_op.(znz_head0) w6_op.(znz_add_mul_div) w6_op.(znz_div21) - w6_op.(znz_compare) w6_op.(znz_sub). - Definition w7_divn1 := + w6_op.(znz_compare) w6_op.(znz_sub) (S n) x y in + (to_Z6 _ u, N6 v). + Definition w7_divn1 n x y := + let (u, v) := gen_divn1 w7_op.(znz_zdigits) w7_op.(znz_0) w7_op.(znz_WW) w7_op.(znz_head0) w7_op.(znz_add_mul_div) w7_op.(znz_div21) - w7_op.(znz_compare) w7_op.(znz_sub). - Definition w8_divn1 := + w7_op.(znz_compare) w7_op.(znz_sub) (S n) x y in + (to_Z7 _ u, N7 v). + Definition w8_divn1 n x y := + let (u, v) := gen_divn1 w8_op.(znz_zdigits) w8_op.(znz_0) w8_op.(znz_WW) w8_op.(znz_head0) w8_op.(znz_add_mul_div) w8_op.(znz_div21) - w8_op.(znz_compare) w8_op.(znz_sub). - Definition w9_divn1 := + w8_op.(znz_compare) w8_op.(znz_sub) (S n) x y in + (to_Z8 _ u, N8 v). + Definition w9_divn1 n x y := + let (u, v) := gen_divn1 w9_op.(znz_zdigits) w9_op.(znz_0) w9_op.(znz_WW) w9_op.(znz_head0) w9_op.(znz_add_mul_div) w9_op.(znz_div21) - w9_op.(znz_compare) w9_op.(znz_sub). - Definition w10_divn1 := + w9_op.(znz_compare) w9_op.(znz_sub) (S n) x y in + (to_Z9 _ u, N9 v). + Definition w10_divn1 n x y := + let (u, v) := gen_divn1 w10_op.(znz_zdigits) w10_op.(znz_0) w10_op.(znz_WW) w10_op.(znz_head0) w10_op.(znz_add_mul_div) w10_op.(znz_div21) - w10_op.(znz_compare) w10_op.(znz_sub). - Definition w11_divn1 := + w10_op.(znz_compare) w10_op.(znz_sub) (S n) x y in + (to_Z10 _ u, N10 v). + Definition w11_divn1 n x y := + let (u, v) := gen_divn1 w11_op.(znz_zdigits) w11_op.(znz_0) w11_op.(znz_WW) w11_op.(znz_head0) w11_op.(znz_add_mul_div) w11_op.(znz_div21) - w11_op.(znz_compare) w11_op.(znz_sub). - Definition w12_divn1 := + w11_op.(znz_compare) w11_op.(znz_sub) (S n) x y in + (to_Z11 _ u, N11 v). + Definition w12_divn1 n x y := + let (u, v) := gen_divn1 w12_op.(znz_zdigits) w12_op.(znz_0) w12_op.(znz_WW) w12_op.(znz_head0) w12_op.(znz_add_mul_div) w12_op.(znz_div21) - w12_op.(znz_compare) w12_op.(znz_sub). - Definition w13_divn1 := + w12_op.(znz_compare) w12_op.(znz_sub) (S n) x y in + (to_Z12 _ u, N12 v). + Definition w13_divn1 n x y := + let (u, v) := gen_divn1 w13_op.(znz_zdigits) w13_op.(znz_0) w13_op.(znz_WW) w13_op.(znz_head0) w13_op.(znz_add_mul_div) w13_op.(znz_div21) - w13_op.(znz_compare) w13_op.(znz_sub). - - Definition div_gt x y := - match x, y with - | N0 wx, N0 wy => let (q, r):= w0_div_gt wx wy in (reduce_0 q, reduce_0 r) - | N0 wx, N1 wy => - let wx':= GenBase.extend w0_0W 0 wx in - let (q, r):= w1_div_gt wx' wy in - (reduce_1 q, reduce_1 r) - | N0 wx, N2 wy => - let wx':= GenBase.extend w0_0W 1 wx in - let (q, r):= w2_div_gt wx' wy in - (reduce_2 q, reduce_2 r) - | N0 wx, N3 wy => - let wx':= GenBase.extend w0_0W 2 wx in - let (q, r):= w3_div_gt wx' wy in - (reduce_3 q, reduce_3 r) - | N0 wx, N4 wy => - let wx':= GenBase.extend w0_0W 3 wx in - let (q, r):= w4_div_gt wx' wy in - (reduce_4 q, reduce_4 r) - | N0 wx, N5 wy => - let wx':= GenBase.extend w0_0W 4 wx in - let (q, r):= w5_div_gt wx' wy in - (reduce_5 q, reduce_5 r) - | N0 wx, N6 wy => - let wx':= GenBase.extend w0_0W 5 wx in - let (q, r):= w6_div_gt wx' wy in - (reduce_6 q, reduce_6 r) - | N0 wx, N7 wy => - let wx':= GenBase.extend w0_0W 6 wx in - let (q, r):= w7_div_gt wx' wy in - (reduce_7 q, reduce_7 r) - | N0 wx, N8 wy => - let wx':= GenBase.extend w0_0W 7 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N0 wx, N9 wy => - let wx':= GenBase.extend w0_0W 8 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N0 wx, N10 wy => - let wx':= GenBase.extend w0_0W 9 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N0 wx, N11 wy => - let wx':= GenBase.extend w0_0W 10 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N0 wx, N12 wy => - let wx':= GenBase.extend w0_0W 11 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N0 wx, N13 wy => - let wx':= GenBase.extend w0_0W 12 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N0 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w0_0W 13 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N1 wx, N0 wy => let (q, r):= w0_divn1 1 wx wy in (reduce_1 q, reduce_0 r) - | N1 wx, N1 wy => let (q, r):= w1_div_gt wx wy in (reduce_1 q, reduce_1 r) - | N1 wx, N2 wy => - let wx':= GenBase.extend w1_0W 0 wx in - let (q, r):= w2_div_gt wx' wy in - (reduce_2 q, reduce_2 r) - | N1 wx, N3 wy => - let wx':= GenBase.extend w1_0W 1 wx in - let (q, r):= w3_div_gt wx' wy in - (reduce_3 q, reduce_3 r) - | N1 wx, N4 wy => - let wx':= GenBase.extend w1_0W 2 wx in - let (q, r):= w4_div_gt wx' wy in - (reduce_4 q, reduce_4 r) - | N1 wx, N5 wy => - let wx':= GenBase.extend w1_0W 3 wx in - let (q, r):= w5_div_gt wx' wy in - (reduce_5 q, reduce_5 r) - | N1 wx, N6 wy => - let wx':= GenBase.extend w1_0W 4 wx in - let (q, r):= w6_div_gt wx' wy in - (reduce_6 q, reduce_6 r) - | N1 wx, N7 wy => - let wx':= GenBase.extend w1_0W 5 wx in - let (q, r):= w7_div_gt wx' wy in - (reduce_7 q, reduce_7 r) - | N1 wx, N8 wy => - let wx':= GenBase.extend w1_0W 6 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N1 wx, N9 wy => - let wx':= GenBase.extend w1_0W 7 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N1 wx, N10 wy => - let wx':= GenBase.extend w1_0W 8 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N1 wx, N11 wy => - let wx':= GenBase.extend w1_0W 9 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N1 wx, N12 wy => - let wx':= GenBase.extend w1_0W 10 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N1 wx, N13 wy => - let wx':= GenBase.extend w1_0W 11 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N1 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w1_0W 12 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N2 wx, N0 wy => let (q, r):= w0_divn1 2 wx wy in (reduce_2 q, reduce_0 r) - | N2 wx, N1 wy => let (q, r):= w1_divn1 1 wx wy in (reduce_2 q, reduce_1 r) - | N2 wx, N2 wy => let (q, r):= w2_div_gt wx wy in (reduce_2 q, reduce_2 r) - | N2 wx, N3 wy => - let wx':= GenBase.extend w2_0W 0 wx in - let (q, r):= w3_div_gt wx' wy in - (reduce_3 q, reduce_3 r) - | N2 wx, N4 wy => - let wx':= GenBase.extend w2_0W 1 wx in - let (q, r):= w4_div_gt wx' wy in - (reduce_4 q, reduce_4 r) - | N2 wx, N5 wy => - let wx':= GenBase.extend w2_0W 2 wx in - let (q, r):= w5_div_gt wx' wy in - (reduce_5 q, reduce_5 r) - | N2 wx, N6 wy => - let wx':= GenBase.extend w2_0W 3 wx in - let (q, r):= w6_div_gt wx' wy in - (reduce_6 q, reduce_6 r) - | N2 wx, N7 wy => - let wx':= GenBase.extend w2_0W 4 wx in - let (q, r):= w7_div_gt wx' wy in - (reduce_7 q, reduce_7 r) - | N2 wx, N8 wy => - let wx':= GenBase.extend w2_0W 5 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N2 wx, N9 wy => - let wx':= GenBase.extend w2_0W 6 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N2 wx, N10 wy => - let wx':= GenBase.extend w2_0W 7 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N2 wx, N11 wy => - let wx':= GenBase.extend w2_0W 8 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N2 wx, N12 wy => - let wx':= GenBase.extend w2_0W 9 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N2 wx, N13 wy => - let wx':= GenBase.extend w2_0W 10 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N2 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w2_0W 11 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N3 wx, N0 wy => let (q, r):= w0_divn1 3 wx wy in (reduce_3 q, reduce_0 r) - | N3 wx, N1 wy => let (q, r):= w1_divn1 2 wx wy in (reduce_3 q, reduce_1 r) - | N3 wx, N2 wy => let (q, r):= w2_divn1 1 wx wy in (reduce_3 q, reduce_2 r) - | N3 wx, N3 wy => let (q, r):= w3_div_gt wx wy in (reduce_3 q, reduce_3 r) - | N3 wx, N4 wy => - let wx':= GenBase.extend w3_0W 0 wx in - let (q, r):= w4_div_gt wx' wy in - (reduce_4 q, reduce_4 r) - | N3 wx, N5 wy => - let wx':= GenBase.extend w3_0W 1 wx in - let (q, r):= w5_div_gt wx' wy in - (reduce_5 q, reduce_5 r) - | N3 wx, N6 wy => - let wx':= GenBase.extend w3_0W 2 wx in - let (q, r):= w6_div_gt wx' wy in - (reduce_6 q, reduce_6 r) - | N3 wx, N7 wy => - let wx':= GenBase.extend w3_0W 3 wx in - let (q, r):= w7_div_gt wx' wy in - (reduce_7 q, reduce_7 r) - | N3 wx, N8 wy => - let wx':= GenBase.extend w3_0W 4 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N3 wx, N9 wy => - let wx':= GenBase.extend w3_0W 5 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N3 wx, N10 wy => - let wx':= GenBase.extend w3_0W 6 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N3 wx, N11 wy => - let wx':= GenBase.extend w3_0W 7 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N3 wx, N12 wy => - let wx':= GenBase.extend w3_0W 8 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N3 wx, N13 wy => - let wx':= GenBase.extend w3_0W 9 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N3 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w3_0W 10 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N4 wx, N0 wy => let (q, r):= w0_divn1 4 wx wy in (reduce_4 q, reduce_0 r) - | N4 wx, N1 wy => let (q, r):= w1_divn1 3 wx wy in (reduce_4 q, reduce_1 r) - | N4 wx, N2 wy => let (q, r):= w2_divn1 2 wx wy in (reduce_4 q, reduce_2 r) - | N4 wx, N3 wy => let (q, r):= w3_divn1 1 wx wy in (reduce_4 q, reduce_3 r) - | N4 wx, N4 wy => let (q, r):= w4_div_gt wx wy in (reduce_4 q, reduce_4 r) - | N4 wx, N5 wy => - let wx':= GenBase.extend w4_0W 0 wx in - let (q, r):= w5_div_gt wx' wy in - (reduce_5 q, reduce_5 r) - | N4 wx, N6 wy => - let wx':= GenBase.extend w4_0W 1 wx in - let (q, r):= w6_div_gt wx' wy in - (reduce_6 q, reduce_6 r) - | N4 wx, N7 wy => - let wx':= GenBase.extend w4_0W 2 wx in - let (q, r):= w7_div_gt wx' wy in - (reduce_7 q, reduce_7 r) - | N4 wx, N8 wy => - let wx':= GenBase.extend w4_0W 3 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N4 wx, N9 wy => - let wx':= GenBase.extend w4_0W 4 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N4 wx, N10 wy => - let wx':= GenBase.extend w4_0W 5 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N4 wx, N11 wy => - let wx':= GenBase.extend w4_0W 6 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N4 wx, N12 wy => - let wx':= GenBase.extend w4_0W 7 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N4 wx, N13 wy => - let wx':= GenBase.extend w4_0W 8 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N4 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w4_0W 9 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N5 wx, N0 wy => let (q, r):= w0_divn1 5 wx wy in (reduce_5 q, reduce_0 r) - | N5 wx, N1 wy => let (q, r):= w1_divn1 4 wx wy in (reduce_5 q, reduce_1 r) - | N5 wx, N2 wy => let (q, r):= w2_divn1 3 wx wy in (reduce_5 q, reduce_2 r) - | N5 wx, N3 wy => let (q, r):= w3_divn1 2 wx wy in (reduce_5 q, reduce_3 r) - | N5 wx, N4 wy => let (q, r):= w4_divn1 1 wx wy in (reduce_5 q, reduce_4 r) - | N5 wx, N5 wy => let (q, r):= w5_div_gt wx wy in (reduce_5 q, reduce_5 r) - | N5 wx, N6 wy => - let wx':= GenBase.extend w5_0W 0 wx in - let (q, r):= w6_div_gt wx' wy in - (reduce_6 q, reduce_6 r) - | N5 wx, N7 wy => - let wx':= GenBase.extend w5_0W 1 wx in - let (q, r):= w7_div_gt wx' wy in - (reduce_7 q, reduce_7 r) - | N5 wx, N8 wy => - let wx':= GenBase.extend w5_0W 2 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N5 wx, N9 wy => - let wx':= GenBase.extend w5_0W 3 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N5 wx, N10 wy => - let wx':= GenBase.extend w5_0W 4 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N5 wx, N11 wy => - let wx':= GenBase.extend w5_0W 5 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N5 wx, N12 wy => - let wx':= GenBase.extend w5_0W 6 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N5 wx, N13 wy => - let wx':= GenBase.extend w5_0W 7 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N5 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w5_0W 8 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N6 wx, N0 wy => let (q, r):= w0_divn1 6 wx wy in (reduce_6 q, reduce_0 r) - | N6 wx, N1 wy => let (q, r):= w1_divn1 5 wx wy in (reduce_6 q, reduce_1 r) - | N6 wx, N2 wy => let (q, r):= w2_divn1 4 wx wy in (reduce_6 q, reduce_2 r) - | N6 wx, N3 wy => let (q, r):= w3_divn1 3 wx wy in (reduce_6 q, reduce_3 r) - | N6 wx, N4 wy => let (q, r):= w4_divn1 2 wx wy in (reduce_6 q, reduce_4 r) - | N6 wx, N5 wy => let (q, r):= w5_divn1 1 wx wy in (reduce_6 q, reduce_5 r) - | N6 wx, N6 wy => let (q, r):= w6_div_gt wx wy in (reduce_6 q, reduce_6 r) - | N6 wx, N7 wy => - let wx':= GenBase.extend w6_0W 0 wx in - let (q, r):= w7_div_gt wx' wy in - (reduce_7 q, reduce_7 r) - | N6 wx, N8 wy => - let wx':= GenBase.extend w6_0W 1 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N6 wx, N9 wy => - let wx':= GenBase.extend w6_0W 2 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N6 wx, N10 wy => - let wx':= GenBase.extend w6_0W 3 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N6 wx, N11 wy => - let wx':= GenBase.extend w6_0W 4 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N6 wx, N12 wy => - let wx':= GenBase.extend w6_0W 5 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N6 wx, N13 wy => - let wx':= GenBase.extend w6_0W 6 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N6 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w6_0W 7 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N7 wx, N0 wy => let (q, r):= w0_divn1 7 wx wy in (reduce_7 q, reduce_0 r) - | N7 wx, N1 wy => let (q, r):= w1_divn1 6 wx wy in (reduce_7 q, reduce_1 r) - | N7 wx, N2 wy => let (q, r):= w2_divn1 5 wx wy in (reduce_7 q, reduce_2 r) - | N7 wx, N3 wy => let (q, r):= w3_divn1 4 wx wy in (reduce_7 q, reduce_3 r) - | N7 wx, N4 wy => let (q, r):= w4_divn1 3 wx wy in (reduce_7 q, reduce_4 r) - | N7 wx, N5 wy => let (q, r):= w5_divn1 2 wx wy in (reduce_7 q, reduce_5 r) - | N7 wx, N6 wy => let (q, r):= w6_divn1 1 wx wy in (reduce_7 q, reduce_6 r) - | N7 wx, N7 wy => let (q, r):= w7_div_gt wx wy in (reduce_7 q, reduce_7 r) - | N7 wx, N8 wy => - let wx':= GenBase.extend w7_0W 0 wx in - let (q, r):= w8_div_gt wx' wy in - (reduce_8 q, reduce_8 r) - | N7 wx, N9 wy => - let wx':= GenBase.extend w7_0W 1 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N7 wx, N10 wy => - let wx':= GenBase.extend w7_0W 2 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N7 wx, N11 wy => - let wx':= GenBase.extend w7_0W 3 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N7 wx, N12 wy => - let wx':= GenBase.extend w7_0W 4 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N7 wx, N13 wy => - let wx':= GenBase.extend w7_0W 5 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N7 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w7_0W 6 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N8 wx, N0 wy => let (q, r):= w0_divn1 8 wx wy in (reduce_8 q, reduce_0 r) - | N8 wx, N1 wy => let (q, r):= w1_divn1 7 wx wy in (reduce_8 q, reduce_1 r) - | N8 wx, N2 wy => let (q, r):= w2_divn1 6 wx wy in (reduce_8 q, reduce_2 r) - | N8 wx, N3 wy => let (q, r):= w3_divn1 5 wx wy in (reduce_8 q, reduce_3 r) - | N8 wx, N4 wy => let (q, r):= w4_divn1 4 wx wy in (reduce_8 q, reduce_4 r) - | N8 wx, N5 wy => let (q, r):= w5_divn1 3 wx wy in (reduce_8 q, reduce_5 r) - | N8 wx, N6 wy => let (q, r):= w6_divn1 2 wx wy in (reduce_8 q, reduce_6 r) - | N8 wx, N7 wy => let (q, r):= w7_divn1 1 wx wy in (reduce_8 q, reduce_7 r) - | N8 wx, N8 wy => let (q, r):= w8_div_gt wx wy in (reduce_8 q, reduce_8 r) - | N8 wx, N9 wy => - let wx':= GenBase.extend w8_0W 0 wx in - let (q, r):= w9_div_gt wx' wy in - (reduce_9 q, reduce_9 r) - | N8 wx, N10 wy => - let wx':= GenBase.extend w8_0W 1 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N8 wx, N11 wy => - let wx':= GenBase.extend w8_0W 2 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N8 wx, N12 wy => - let wx':= GenBase.extend w8_0W 3 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N8 wx, N13 wy => - let wx':= GenBase.extend w8_0W 4 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N8 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w8_0W 5 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N9 wx, N0 wy => let (q, r):= w0_divn1 9 wx wy in (reduce_9 q, reduce_0 r) - | N9 wx, N1 wy => let (q, r):= w1_divn1 8 wx wy in (reduce_9 q, reduce_1 r) - | N9 wx, N2 wy => let (q, r):= w2_divn1 7 wx wy in (reduce_9 q, reduce_2 r) - | N9 wx, N3 wy => let (q, r):= w3_divn1 6 wx wy in (reduce_9 q, reduce_3 r) - | N9 wx, N4 wy => let (q, r):= w4_divn1 5 wx wy in (reduce_9 q, reduce_4 r) - | N9 wx, N5 wy => let (q, r):= w5_divn1 4 wx wy in (reduce_9 q, reduce_5 r) - | N9 wx, N6 wy => let (q, r):= w6_divn1 3 wx wy in (reduce_9 q, reduce_6 r) - | N9 wx, N7 wy => let (q, r):= w7_divn1 2 wx wy in (reduce_9 q, reduce_7 r) - | N9 wx, N8 wy => let (q, r):= w8_divn1 1 wx wy in (reduce_9 q, reduce_8 r) - | N9 wx, N9 wy => let (q, r):= w9_div_gt wx wy in (reduce_9 q, reduce_9 r) - | N9 wx, N10 wy => - let wx':= GenBase.extend w9_0W 0 wx in - let (q, r):= w10_div_gt wx' wy in - (reduce_10 q, reduce_10 r) - | N9 wx, N11 wy => - let wx':= GenBase.extend w9_0W 1 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N9 wx, N12 wy => - let wx':= GenBase.extend w9_0W 2 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N9 wx, N13 wy => - let wx':= GenBase.extend w9_0W 3 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N9 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w9_0W 4 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N10 wx, N0 wy => let (q, r):= w0_divn1 10 wx wy in (reduce_10 q, reduce_0 r) - | N10 wx, N1 wy => let (q, r):= w1_divn1 9 wx wy in (reduce_10 q, reduce_1 r) - | N10 wx, N2 wy => let (q, r):= w2_divn1 8 wx wy in (reduce_10 q, reduce_2 r) - | N10 wx, N3 wy => let (q, r):= w3_divn1 7 wx wy in (reduce_10 q, reduce_3 r) - | N10 wx, N4 wy => let (q, r):= w4_divn1 6 wx wy in (reduce_10 q, reduce_4 r) - | N10 wx, N5 wy => let (q, r):= w5_divn1 5 wx wy in (reduce_10 q, reduce_5 r) - | N10 wx, N6 wy => let (q, r):= w6_divn1 4 wx wy in (reduce_10 q, reduce_6 r) - | N10 wx, N7 wy => let (q, r):= w7_divn1 3 wx wy in (reduce_10 q, reduce_7 r) - | N10 wx, N8 wy => let (q, r):= w8_divn1 2 wx wy in (reduce_10 q, reduce_8 r) - | N10 wx, N9 wy => let (q, r):= w9_divn1 1 wx wy in (reduce_10 q, reduce_9 r) - | N10 wx, N10 wy => let (q, r):= w10_div_gt wx wy in (reduce_10 q, reduce_10 r) - | N10 wx, N11 wy => - let wx':= GenBase.extend w10_0W 0 wx in - let (q, r):= w11_div_gt wx' wy in - (reduce_11 q, reduce_11 r) - | N10 wx, N12 wy => - let wx':= GenBase.extend w10_0W 1 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N10 wx, N13 wy => - let wx':= GenBase.extend w10_0W 2 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N10 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w10_0W 3 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N11 wx, N0 wy => let (q, r):= w0_divn1 11 wx wy in (reduce_11 q, reduce_0 r) - | N11 wx, N1 wy => let (q, r):= w1_divn1 10 wx wy in (reduce_11 q, reduce_1 r) - | N11 wx, N2 wy => let (q, r):= w2_divn1 9 wx wy in (reduce_11 q, reduce_2 r) - | N11 wx, N3 wy => let (q, r):= w3_divn1 8 wx wy in (reduce_11 q, reduce_3 r) - | N11 wx, N4 wy => let (q, r):= w4_divn1 7 wx wy in (reduce_11 q, reduce_4 r) - | N11 wx, N5 wy => let (q, r):= w5_divn1 6 wx wy in (reduce_11 q, reduce_5 r) - | N11 wx, N6 wy => let (q, r):= w6_divn1 5 wx wy in (reduce_11 q, reduce_6 r) - | N11 wx, N7 wy => let (q, r):= w7_divn1 4 wx wy in (reduce_11 q, reduce_7 r) - | N11 wx, N8 wy => let (q, r):= w8_divn1 3 wx wy in (reduce_11 q, reduce_8 r) - | N11 wx, N9 wy => let (q, r):= w9_divn1 2 wx wy in (reduce_11 q, reduce_9 r) - | N11 wx, N10 wy => let (q, r):= w10_divn1 1 wx wy in (reduce_11 q, reduce_10 r) - | N11 wx, N11 wy => let (q, r):= w11_div_gt wx wy in (reduce_11 q, reduce_11 r) - | N11 wx, N12 wy => - let wx':= GenBase.extend w11_0W 0 wx in - let (q, r):= w12_div_gt wx' wy in - (reduce_12 q, reduce_12 r) - | N11 wx, N13 wy => - let wx':= GenBase.extend w11_0W 1 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N11 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w11_0W 2 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N12 wx, N0 wy => let (q, r):= w0_divn1 12 wx wy in (reduce_12 q, reduce_0 r) - | N12 wx, N1 wy => let (q, r):= w1_divn1 11 wx wy in (reduce_12 q, reduce_1 r) - | N12 wx, N2 wy => let (q, r):= w2_divn1 10 wx wy in (reduce_12 q, reduce_2 r) - | N12 wx, N3 wy => let (q, r):= w3_divn1 9 wx wy in (reduce_12 q, reduce_3 r) - | N12 wx, N4 wy => let (q, r):= w4_divn1 8 wx wy in (reduce_12 q, reduce_4 r) - | N12 wx, N5 wy => let (q, r):= w5_divn1 7 wx wy in (reduce_12 q, reduce_5 r) - | N12 wx, N6 wy => let (q, r):= w6_divn1 6 wx wy in (reduce_12 q, reduce_6 r) - | N12 wx, N7 wy => let (q, r):= w7_divn1 5 wx wy in (reduce_12 q, reduce_7 r) - | N12 wx, N8 wy => let (q, r):= w8_divn1 4 wx wy in (reduce_12 q, reduce_8 r) - | N12 wx, N9 wy => let (q, r):= w9_divn1 3 wx wy in (reduce_12 q, reduce_9 r) - | N12 wx, N10 wy => let (q, r):= w10_divn1 2 wx wy in (reduce_12 q, reduce_10 r) - | N12 wx, N11 wy => let (q, r):= w11_divn1 1 wx wy in (reduce_12 q, reduce_11 r) - | N12 wx, N12 wy => let (q, r):= w12_div_gt wx wy in (reduce_12 q, reduce_12 r) - | N12 wx, N13 wy => - let wx':= GenBase.extend w12_0W 0 wx in - let (q, r):= w13_div_gt wx' wy in - (reduce_13 q, reduce_13 r) - | N12 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w12_0W 1 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | N13 wx, N0 wy => let (q, r):= w0_divn1 13 wx wy in (reduce_13 q, reduce_0 r) - | N13 wx, N1 wy => let (q, r):= w1_divn1 12 wx wy in (reduce_13 q, reduce_1 r) - | N13 wx, N2 wy => let (q, r):= w2_divn1 11 wx wy in (reduce_13 q, reduce_2 r) - | N13 wx, N3 wy => let (q, r):= w3_divn1 10 wx wy in (reduce_13 q, reduce_3 r) - | N13 wx, N4 wy => let (q, r):= w4_divn1 9 wx wy in (reduce_13 q, reduce_4 r) - | N13 wx, N5 wy => let (q, r):= w5_divn1 8 wx wy in (reduce_13 q, reduce_5 r) - | N13 wx, N6 wy => let (q, r):= w6_divn1 7 wx wy in (reduce_13 q, reduce_6 r) - | N13 wx, N7 wy => let (q, r):= w7_divn1 6 wx wy in (reduce_13 q, reduce_7 r) - | N13 wx, N8 wy => let (q, r):= w8_divn1 5 wx wy in (reduce_13 q, reduce_8 r) - | N13 wx, N9 wy => let (q, r):= w9_divn1 4 wx wy in (reduce_13 q, reduce_9 r) - | N13 wx, N10 wy => let (q, r):= w10_divn1 3 wx wy in (reduce_13 q, reduce_10 r) - | N13 wx, N11 wy => let (q, r):= w11_divn1 2 wx wy in (reduce_13 q, reduce_11 r) - | N13 wx, N12 wy => let (q, r):= w12_divn1 1 wx wy in (reduce_13 q, reduce_12 r) - | N13 wx, N13 wy => let (q, r):= w13_div_gt wx wy in (reduce_13 q, reduce_13 r) - | N13 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w13_0W 0 wx) in - let (q, r):= (make_op n).(znz_div_gt) wx' wy in - (reduce_n n q, reduce_n n r) - | Nn n wx, N0 wy => - let wy':= GenBase.extend w0_0W 12 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N1 wy => - let wy':= GenBase.extend w1_0W 11 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N2 wy => - let wy':= GenBase.extend w2_0W 10 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N3 wy => - let wy':= GenBase.extend w3_0W 9 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N4 wy => - let wy':= GenBase.extend w4_0W 8 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N5 wy => - let wy':= GenBase.extend w5_0W 7 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N6 wy => - let wy':= GenBase.extend w6_0W 6 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N7 wy => - let wy':= GenBase.extend w7_0W 5 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N8 wy => - let wy':= GenBase.extend w8_0W 4 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N9 wy => - let wy':= GenBase.extend w9_0W 3 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N10 wy => - let wy':= GenBase.extend w10_0W 2 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N11 wy => - let wy':= GenBase.extend w11_0W 1 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N12 wy => - let wy':= GenBase.extend w12_0W 0 wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, N13 wy => - let wy':= wy in - let (q, r):= w13_divn1 (S n) wx wy' in - (reduce_n n q, reduce_13 r) - | Nn n wx, Nn m wy => + w13_op.(znz_compare) w13_op.(znz_sub) (S n) x y in + (Nn _ u, N13 v). + + Let div_gt0 x y := let (u,v) := (w0_div_gt x y) in (reduce_0 u, reduce_0 v). + Let div_gt1 x y := let (u,v) := (w1_div_gt x y) in (reduce_1 u, reduce_1 v). + Let div_gt2 x y := let (u,v) := (w2_div_gt x y) in (reduce_2 u, reduce_2 v). + Let div_gt3 x y := let (u,v) := (w3_div_gt x y) in (reduce_3 u, reduce_3 v). + Let div_gt4 x y := let (u,v) := (w4_div_gt x y) in (reduce_4 u, reduce_4 v). + Let div_gt5 x y := let (u,v) := (w5_div_gt x y) in (reduce_5 u, reduce_5 v). + Let div_gt6 x y := let (u,v) := (w6_div_gt x y) in (reduce_6 u, reduce_6 v). + Let div_gt7 x y := let (u,v) := (w7_div_gt x y) in (reduce_7 u, reduce_7 v). + Let div_gt8 x y := let (u,v) := (w8_div_gt x y) in (reduce_8 u, reduce_8 v). + Let div_gt9 x y := let (u,v) := (w9_div_gt x y) in (reduce_9 u, reduce_9 v). + Let div_gt10 x y := let (u,v) := (w10_div_gt x y) in (reduce_10 u, reduce_10 v). + Let div_gt11 x y := let (u,v) := (w11_div_gt x y) in (reduce_11 u, reduce_11 v). + Let div_gt12 x y := let (u,v) := (w12_div_gt x y) in (reduce_12 u, reduce_12 v). + Let div_gt13 x y := let (u,v) := (w13_div_gt x y) in (reduce_13 u, reduce_13 v). + + Let div_gtnm n m wx wy := let mn := Max.max n m in let d := diff n m in let op := make_op mn in - let (q, r):= op.(znz_div) + let (q, r):= op.(znz_div_gt) (castm (diff_r n m) (extend_tr wx (snd d))) (castm (diff_l n m) (extend_tr wy (fst d))) in - (reduce_n mn q, reduce_n mn r) - end. + (reduce_n mn q, reduce_n mn r). + + Definition div_gt := Eval lazy beta delta [iter] in + (iter _ + div_gt0 + (fun n x y => div_gt0 x (GenBase.get_low w_0 (S n) y)) + w0_divn1 + div_gt1 + (fun n x y => div_gt1 x (GenBase.get_low W0 (S n) y)) + w1_divn1 + div_gt2 + (fun n x y => div_gt2 x (GenBase.get_low W0 (S n) y)) + w2_divn1 + div_gt3 + (fun n x y => div_gt3 x (GenBase.get_low W0 (S n) y)) + w3_divn1 + div_gt4 + (fun n x y => div_gt4 x (GenBase.get_low W0 (S n) y)) + w4_divn1 + div_gt5 + (fun n x y => div_gt5 x (GenBase.get_low W0 (S n) y)) + w5_divn1 + div_gt6 + (fun n x y => div_gt6 x (GenBase.get_low W0 (S n) y)) + w6_divn1 + div_gt7 + (fun n x y => div_gt7 x (GenBase.get_low W0 (S n) y)) + w7_divn1 + div_gt8 + (fun n x y => div_gt8 x (GenBase.get_low W0 (S n) y)) + w8_divn1 + div_gt9 + (fun n x y => div_gt9 x (GenBase.get_low W0 (S n) y)) + w9_divn1 + div_gt10 + (fun n x y => div_gt10 x (GenBase.get_low W0 (S n) y)) + w10_divn1 + div_gt11 + (fun n x y => div_gt11 x (GenBase.get_low W0 (S n) y)) + w11_divn1 + div_gt12 + (fun n x y => div_gt12 x (GenBase.get_low W0 (S n) y)) + w12_divn1 + div_gt13 + (fun n x y => div_gt13 x (GenBase.get_low W0 (S n) y)) + w13_divn1 + div_gtnm). + + Theorem spec_div_gt: forall x y, + [x] > [y] -> 0 < [y] -> + let (q,r) := div_gt x y in + [q] = [x] / [y] /\ [r] = [x] mod [y]. + Admitted. Definition div_eucl x y := match compare x y with @@ -3244,8 +2909,24 @@ Module Make (W0:W0Type). | Gt => div_gt x y end. + Theorem spec_div_eucl: forall x y, + 0 < [y] -> + let (q,r) := div_eucl x y in + [q] = [x] / [y] /\ [r] = [x] mod [y]. + Admitted. + Definition div x y := fst (div_eucl x y). + Theorem spec_div: + forall x y, 0 < [y] -> [div x y] = [x] / [y]. + Admitted. + + (***************************************************************) + (* *) + (* Modulo *) + (* *) + (***************************************************************) + Definition w0_mod_gt := w0_op.(znz_mod_gt). Definition w1_mod_gt := w1_op.(znz_mod_gt). Definition w2_mod_gt := w2_op.(znz_mod_gt). @@ -3318,478 +2999,63 @@ Module Make (W0:W0Type). w13_op.(znz_head0) w13_op.(znz_add_mul_div) w13_op.(znz_div21) w13_op.(znz_compare) w13_op.(znz_sub). - Definition mod_gt x y := - match x, y with - | N0 wx, N0 wy => reduce_0 (w0_mod_gt wx wy) - | N0 wx, N1 wy => - let wx':= GenBase.extend w0_0W 0 wx in - reduce_1 (w1_mod_gt wx' wy) - | N0 wx, N2 wy => - let wx':= GenBase.extend w0_0W 1 wx in - reduce_2 (w2_mod_gt wx' wy) - | N0 wx, N3 wy => - let wx':= GenBase.extend w0_0W 2 wx in - reduce_3 (w3_mod_gt wx' wy) - | N0 wx, N4 wy => - let wx':= GenBase.extend w0_0W 3 wx in - reduce_4 (w4_mod_gt wx' wy) - | N0 wx, N5 wy => - let wx':= GenBase.extend w0_0W 4 wx in - reduce_5 (w5_mod_gt wx' wy) - | N0 wx, N6 wy => - let wx':= GenBase.extend w0_0W 5 wx in - reduce_6 (w6_mod_gt wx' wy) - | N0 wx, N7 wy => - let wx':= GenBase.extend w0_0W 6 wx in - reduce_7 (w7_mod_gt wx' wy) - | N0 wx, N8 wy => - let wx':= GenBase.extend w0_0W 7 wx in - reduce_8 (w8_mod_gt wx' wy) - | N0 wx, N9 wy => - let wx':= GenBase.extend w0_0W 8 wx in - reduce_9 (w9_mod_gt wx' wy) - | N0 wx, N10 wy => - let wx':= GenBase.extend w0_0W 9 wx in - reduce_10 (w10_mod_gt wx' wy) - | N0 wx, N11 wy => - let wx':= GenBase.extend w0_0W 10 wx in - reduce_11 (w11_mod_gt wx' wy) - | N0 wx, N12 wy => - let wx':= GenBase.extend w0_0W 11 wx in - reduce_12 (w12_mod_gt wx' wy) - | N0 wx, N13 wy => - let wx':= GenBase.extend w0_0W 12 wx in - reduce_13 (w13_mod_gt wx' wy) - | N0 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w0_0W 13 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N1 wx, N0 wy => reduce_0 (w0_modn1 1 wx wy) - | N1 wx, N1 wy => reduce_1 (w1_mod_gt wx wy) - | N1 wx, N2 wy => - let wx':= GenBase.extend w1_0W 0 wx in - reduce_2 (w2_mod_gt wx' wy) - | N1 wx, N3 wy => - let wx':= GenBase.extend w1_0W 1 wx in - reduce_3 (w3_mod_gt wx' wy) - | N1 wx, N4 wy => - let wx':= GenBase.extend w1_0W 2 wx in - reduce_4 (w4_mod_gt wx' wy) - | N1 wx, N5 wy => - let wx':= GenBase.extend w1_0W 3 wx in - reduce_5 (w5_mod_gt wx' wy) - | N1 wx, N6 wy => - let wx':= GenBase.extend w1_0W 4 wx in - reduce_6 (w6_mod_gt wx' wy) - | N1 wx, N7 wy => - let wx':= GenBase.extend w1_0W 5 wx in - reduce_7 (w7_mod_gt wx' wy) - | N1 wx, N8 wy => - let wx':= GenBase.extend w1_0W 6 wx in - reduce_8 (w8_mod_gt wx' wy) - | N1 wx, N9 wy => - let wx':= GenBase.extend w1_0W 7 wx in - reduce_9 (w9_mod_gt wx' wy) - | N1 wx, N10 wy => - let wx':= GenBase.extend w1_0W 8 wx in - reduce_10 (w10_mod_gt wx' wy) - | N1 wx, N11 wy => - let wx':= GenBase.extend w1_0W 9 wx in - reduce_11 (w11_mod_gt wx' wy) - | N1 wx, N12 wy => - let wx':= GenBase.extend w1_0W 10 wx in - reduce_12 (w12_mod_gt wx' wy) - | N1 wx, N13 wy => - let wx':= GenBase.extend w1_0W 11 wx in - reduce_13 (w13_mod_gt wx' wy) - | N1 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w1_0W 12 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N2 wx, N0 wy => reduce_0 (w0_modn1 2 wx wy) - | N2 wx, N1 wy => reduce_1 (w1_modn1 1 wx wy) - | N2 wx, N2 wy => reduce_2 (w2_mod_gt wx wy) - | N2 wx, N3 wy => - let wx':= GenBase.extend w2_0W 0 wx in - reduce_3 (w3_mod_gt wx' wy) - | N2 wx, N4 wy => - let wx':= GenBase.extend w2_0W 1 wx in - reduce_4 (w4_mod_gt wx' wy) - | N2 wx, N5 wy => - let wx':= GenBase.extend w2_0W 2 wx in - reduce_5 (w5_mod_gt wx' wy) - | N2 wx, N6 wy => - let wx':= GenBase.extend w2_0W 3 wx in - reduce_6 (w6_mod_gt wx' wy) - | N2 wx, N7 wy => - let wx':= GenBase.extend w2_0W 4 wx in - reduce_7 (w7_mod_gt wx' wy) - | N2 wx, N8 wy => - let wx':= GenBase.extend w2_0W 5 wx in - reduce_8 (w8_mod_gt wx' wy) - | N2 wx, N9 wy => - let wx':= GenBase.extend w2_0W 6 wx in - reduce_9 (w9_mod_gt wx' wy) - | N2 wx, N10 wy => - let wx':= GenBase.extend w2_0W 7 wx in - reduce_10 (w10_mod_gt wx' wy) - | N2 wx, N11 wy => - let wx':= GenBase.extend w2_0W 8 wx in - reduce_11 (w11_mod_gt wx' wy) - | N2 wx, N12 wy => - let wx':= GenBase.extend w2_0W 9 wx in - reduce_12 (w12_mod_gt wx' wy) - | N2 wx, N13 wy => - let wx':= GenBase.extend w2_0W 10 wx in - reduce_13 (w13_mod_gt wx' wy) - | N2 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w2_0W 11 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N3 wx, N0 wy => reduce_0 (w0_modn1 3 wx wy) - | N3 wx, N1 wy => reduce_1 (w1_modn1 2 wx wy) - | N3 wx, N2 wy => reduce_2 (w2_modn1 1 wx wy) - | N3 wx, N3 wy => reduce_3 (w3_mod_gt wx wy) - | N3 wx, N4 wy => - let wx':= GenBase.extend w3_0W 0 wx in - reduce_4 (w4_mod_gt wx' wy) - | N3 wx, N5 wy => - let wx':= GenBase.extend w3_0W 1 wx in - reduce_5 (w5_mod_gt wx' wy) - | N3 wx, N6 wy => - let wx':= GenBase.extend w3_0W 2 wx in - reduce_6 (w6_mod_gt wx' wy) - | N3 wx, N7 wy => - let wx':= GenBase.extend w3_0W 3 wx in - reduce_7 (w7_mod_gt wx' wy) - | N3 wx, N8 wy => - let wx':= GenBase.extend w3_0W 4 wx in - reduce_8 (w8_mod_gt wx' wy) - | N3 wx, N9 wy => - let wx':= GenBase.extend w3_0W 5 wx in - reduce_9 (w9_mod_gt wx' wy) - | N3 wx, N10 wy => - let wx':= GenBase.extend w3_0W 6 wx in - reduce_10 (w10_mod_gt wx' wy) - | N3 wx, N11 wy => - let wx':= GenBase.extend w3_0W 7 wx in - reduce_11 (w11_mod_gt wx' wy) - | N3 wx, N12 wy => - let wx':= GenBase.extend w3_0W 8 wx in - reduce_12 (w12_mod_gt wx' wy) - | N3 wx, N13 wy => - let wx':= GenBase.extend w3_0W 9 wx in - reduce_13 (w13_mod_gt wx' wy) - | N3 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w3_0W 10 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N4 wx, N0 wy => reduce_0 (w0_modn1 4 wx wy) - | N4 wx, N1 wy => reduce_1 (w1_modn1 3 wx wy) - | N4 wx, N2 wy => reduce_2 (w2_modn1 2 wx wy) - | N4 wx, N3 wy => reduce_3 (w3_modn1 1 wx wy) - | N4 wx, N4 wy => reduce_4 (w4_mod_gt wx wy) - | N4 wx, N5 wy => - let wx':= GenBase.extend w4_0W 0 wx in - reduce_5 (w5_mod_gt wx' wy) - | N4 wx, N6 wy => - let wx':= GenBase.extend w4_0W 1 wx in - reduce_6 (w6_mod_gt wx' wy) - | N4 wx, N7 wy => - let wx':= GenBase.extend w4_0W 2 wx in - reduce_7 (w7_mod_gt wx' wy) - | N4 wx, N8 wy => - let wx':= GenBase.extend w4_0W 3 wx in - reduce_8 (w8_mod_gt wx' wy) - | N4 wx, N9 wy => - let wx':= GenBase.extend w4_0W 4 wx in - reduce_9 (w9_mod_gt wx' wy) - | N4 wx, N10 wy => - let wx':= GenBase.extend w4_0W 5 wx in - reduce_10 (w10_mod_gt wx' wy) - | N4 wx, N11 wy => - let wx':= GenBase.extend w4_0W 6 wx in - reduce_11 (w11_mod_gt wx' wy) - | N4 wx, N12 wy => - let wx':= GenBase.extend w4_0W 7 wx in - reduce_12 (w12_mod_gt wx' wy) - | N4 wx, N13 wy => - let wx':= GenBase.extend w4_0W 8 wx in - reduce_13 (w13_mod_gt wx' wy) - | N4 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w4_0W 9 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N5 wx, N0 wy => reduce_0 (w0_modn1 5 wx wy) - | N5 wx, N1 wy => reduce_1 (w1_modn1 4 wx wy) - | N5 wx, N2 wy => reduce_2 (w2_modn1 3 wx wy) - | N5 wx, N3 wy => reduce_3 (w3_modn1 2 wx wy) - | N5 wx, N4 wy => reduce_4 (w4_modn1 1 wx wy) - | N5 wx, N5 wy => reduce_5 (w5_mod_gt wx wy) - | N5 wx, N6 wy => - let wx':= GenBase.extend w5_0W 0 wx in - reduce_6 (w6_mod_gt wx' wy) - | N5 wx, N7 wy => - let wx':= GenBase.extend w5_0W 1 wx in - reduce_7 (w7_mod_gt wx' wy) - | N5 wx, N8 wy => - let wx':= GenBase.extend w5_0W 2 wx in - reduce_8 (w8_mod_gt wx' wy) - | N5 wx, N9 wy => - let wx':= GenBase.extend w5_0W 3 wx in - reduce_9 (w9_mod_gt wx' wy) - | N5 wx, N10 wy => - let wx':= GenBase.extend w5_0W 4 wx in - reduce_10 (w10_mod_gt wx' wy) - | N5 wx, N11 wy => - let wx':= GenBase.extend w5_0W 5 wx in - reduce_11 (w11_mod_gt wx' wy) - | N5 wx, N12 wy => - let wx':= GenBase.extend w5_0W 6 wx in - reduce_12 (w12_mod_gt wx' wy) - | N5 wx, N13 wy => - let wx':= GenBase.extend w5_0W 7 wx in - reduce_13 (w13_mod_gt wx' wy) - | N5 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w5_0W 8 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N6 wx, N0 wy => reduce_0 (w0_modn1 6 wx wy) - | N6 wx, N1 wy => reduce_1 (w1_modn1 5 wx wy) - | N6 wx, N2 wy => reduce_2 (w2_modn1 4 wx wy) - | N6 wx, N3 wy => reduce_3 (w3_modn1 3 wx wy) - | N6 wx, N4 wy => reduce_4 (w4_modn1 2 wx wy) - | N6 wx, N5 wy => reduce_5 (w5_modn1 1 wx wy) - | N6 wx, N6 wy => reduce_6 (w6_mod_gt wx wy) - | N6 wx, N7 wy => - let wx':= GenBase.extend w6_0W 0 wx in - reduce_7 (w7_mod_gt wx' wy) - | N6 wx, N8 wy => - let wx':= GenBase.extend w6_0W 1 wx in - reduce_8 (w8_mod_gt wx' wy) - | N6 wx, N9 wy => - let wx':= GenBase.extend w6_0W 2 wx in - reduce_9 (w9_mod_gt wx' wy) - | N6 wx, N10 wy => - let wx':= GenBase.extend w6_0W 3 wx in - reduce_10 (w10_mod_gt wx' wy) - | N6 wx, N11 wy => - let wx':= GenBase.extend w6_0W 4 wx in - reduce_11 (w11_mod_gt wx' wy) - | N6 wx, N12 wy => - let wx':= GenBase.extend w6_0W 5 wx in - reduce_12 (w12_mod_gt wx' wy) - | N6 wx, N13 wy => - let wx':= GenBase.extend w6_0W 6 wx in - reduce_13 (w13_mod_gt wx' wy) - | N6 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w6_0W 7 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N7 wx, N0 wy => reduce_0 (w0_modn1 7 wx wy) - | N7 wx, N1 wy => reduce_1 (w1_modn1 6 wx wy) - | N7 wx, N2 wy => reduce_2 (w2_modn1 5 wx wy) - | N7 wx, N3 wy => reduce_3 (w3_modn1 4 wx wy) - | N7 wx, N4 wy => reduce_4 (w4_modn1 3 wx wy) - | N7 wx, N5 wy => reduce_5 (w5_modn1 2 wx wy) - | N7 wx, N6 wy => reduce_6 (w6_modn1 1 wx wy) - | N7 wx, N7 wy => reduce_7 (w7_mod_gt wx wy) - | N7 wx, N8 wy => - let wx':= GenBase.extend w7_0W 0 wx in - reduce_8 (w8_mod_gt wx' wy) - | N7 wx, N9 wy => - let wx':= GenBase.extend w7_0W 1 wx in - reduce_9 (w9_mod_gt wx' wy) - | N7 wx, N10 wy => - let wx':= GenBase.extend w7_0W 2 wx in - reduce_10 (w10_mod_gt wx' wy) - | N7 wx, N11 wy => - let wx':= GenBase.extend w7_0W 3 wx in - reduce_11 (w11_mod_gt wx' wy) - | N7 wx, N12 wy => - let wx':= GenBase.extend w7_0W 4 wx in - reduce_12 (w12_mod_gt wx' wy) - | N7 wx, N13 wy => - let wx':= GenBase.extend w7_0W 5 wx in - reduce_13 (w13_mod_gt wx' wy) - | N7 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w7_0W 6 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N8 wx, N0 wy => reduce_0 (w0_modn1 8 wx wy) - | N8 wx, N1 wy => reduce_1 (w1_modn1 7 wx wy) - | N8 wx, N2 wy => reduce_2 (w2_modn1 6 wx wy) - | N8 wx, N3 wy => reduce_3 (w3_modn1 5 wx wy) - | N8 wx, N4 wy => reduce_4 (w4_modn1 4 wx wy) - | N8 wx, N5 wy => reduce_5 (w5_modn1 3 wx wy) - | N8 wx, N6 wy => reduce_6 (w6_modn1 2 wx wy) - | N8 wx, N7 wy => reduce_7 (w7_modn1 1 wx wy) - | N8 wx, N8 wy => reduce_8 (w8_mod_gt wx wy) - | N8 wx, N9 wy => - let wx':= GenBase.extend w8_0W 0 wx in - reduce_9 (w9_mod_gt wx' wy) - | N8 wx, N10 wy => - let wx':= GenBase.extend w8_0W 1 wx in - reduce_10 (w10_mod_gt wx' wy) - | N8 wx, N11 wy => - let wx':= GenBase.extend w8_0W 2 wx in - reduce_11 (w11_mod_gt wx' wy) - | N8 wx, N12 wy => - let wx':= GenBase.extend w8_0W 3 wx in - reduce_12 (w12_mod_gt wx' wy) - | N8 wx, N13 wy => - let wx':= GenBase.extend w8_0W 4 wx in - reduce_13 (w13_mod_gt wx' wy) - | N8 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w8_0W 5 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N9 wx, N0 wy => reduce_0 (w0_modn1 9 wx wy) - | N9 wx, N1 wy => reduce_1 (w1_modn1 8 wx wy) - | N9 wx, N2 wy => reduce_2 (w2_modn1 7 wx wy) - | N9 wx, N3 wy => reduce_3 (w3_modn1 6 wx wy) - | N9 wx, N4 wy => reduce_4 (w4_modn1 5 wx wy) - | N9 wx, N5 wy => reduce_5 (w5_modn1 4 wx wy) - | N9 wx, N6 wy => reduce_6 (w6_modn1 3 wx wy) - | N9 wx, N7 wy => reduce_7 (w7_modn1 2 wx wy) - | N9 wx, N8 wy => reduce_8 (w8_modn1 1 wx wy) - | N9 wx, N9 wy => reduce_9 (w9_mod_gt wx wy) - | N9 wx, N10 wy => - let wx':= GenBase.extend w9_0W 0 wx in - reduce_10 (w10_mod_gt wx' wy) - | N9 wx, N11 wy => - let wx':= GenBase.extend w9_0W 1 wx in - reduce_11 (w11_mod_gt wx' wy) - | N9 wx, N12 wy => - let wx':= GenBase.extend w9_0W 2 wx in - reduce_12 (w12_mod_gt wx' wy) - | N9 wx, N13 wy => - let wx':= GenBase.extend w9_0W 3 wx in - reduce_13 (w13_mod_gt wx' wy) - | N9 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w9_0W 4 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N10 wx, N0 wy => reduce_0 (w0_modn1 10 wx wy) - | N10 wx, N1 wy => reduce_1 (w1_modn1 9 wx wy) - | N10 wx, N2 wy => reduce_2 (w2_modn1 8 wx wy) - | N10 wx, N3 wy => reduce_3 (w3_modn1 7 wx wy) - | N10 wx, N4 wy => reduce_4 (w4_modn1 6 wx wy) - | N10 wx, N5 wy => reduce_5 (w5_modn1 5 wx wy) - | N10 wx, N6 wy => reduce_6 (w6_modn1 4 wx wy) - | N10 wx, N7 wy => reduce_7 (w7_modn1 3 wx wy) - | N10 wx, N8 wy => reduce_8 (w8_modn1 2 wx wy) - | N10 wx, N9 wy => reduce_9 (w9_modn1 1 wx wy) - | N10 wx, N10 wy => reduce_10 (w10_mod_gt wx wy) - | N10 wx, N11 wy => - let wx':= GenBase.extend w10_0W 0 wx in - reduce_11 (w11_mod_gt wx' wy) - | N10 wx, N12 wy => - let wx':= GenBase.extend w10_0W 1 wx in - reduce_12 (w12_mod_gt wx' wy) - | N10 wx, N13 wy => - let wx':= GenBase.extend w10_0W 2 wx in - reduce_13 (w13_mod_gt wx' wy) - | N10 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w10_0W 3 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N11 wx, N0 wy => reduce_0 (w0_modn1 11 wx wy) - | N11 wx, N1 wy => reduce_1 (w1_modn1 10 wx wy) - | N11 wx, N2 wy => reduce_2 (w2_modn1 9 wx wy) - | N11 wx, N3 wy => reduce_3 (w3_modn1 8 wx wy) - | N11 wx, N4 wy => reduce_4 (w4_modn1 7 wx wy) - | N11 wx, N5 wy => reduce_5 (w5_modn1 6 wx wy) - | N11 wx, N6 wy => reduce_6 (w6_modn1 5 wx wy) - | N11 wx, N7 wy => reduce_7 (w7_modn1 4 wx wy) - | N11 wx, N8 wy => reduce_8 (w8_modn1 3 wx wy) - | N11 wx, N9 wy => reduce_9 (w9_modn1 2 wx wy) - | N11 wx, N10 wy => reduce_10 (w10_modn1 1 wx wy) - | N11 wx, N11 wy => reduce_11 (w11_mod_gt wx wy) - | N11 wx, N12 wy => - let wx':= GenBase.extend w11_0W 0 wx in - reduce_12 (w12_mod_gt wx' wy) - | N11 wx, N13 wy => - let wx':= GenBase.extend w11_0W 1 wx in - reduce_13 (w13_mod_gt wx' wy) - | N11 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w11_0W 2 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N12 wx, N0 wy => reduce_0 (w0_modn1 12 wx wy) - | N12 wx, N1 wy => reduce_1 (w1_modn1 11 wx wy) - | N12 wx, N2 wy => reduce_2 (w2_modn1 10 wx wy) - | N12 wx, N3 wy => reduce_3 (w3_modn1 9 wx wy) - | N12 wx, N4 wy => reduce_4 (w4_modn1 8 wx wy) - | N12 wx, N5 wy => reduce_5 (w5_modn1 7 wx wy) - | N12 wx, N6 wy => reduce_6 (w6_modn1 6 wx wy) - | N12 wx, N7 wy => reduce_7 (w7_modn1 5 wx wy) - | N12 wx, N8 wy => reduce_8 (w8_modn1 4 wx wy) - | N12 wx, N9 wy => reduce_9 (w9_modn1 3 wx wy) - | N12 wx, N10 wy => reduce_10 (w10_modn1 2 wx wy) - | N12 wx, N11 wy => reduce_11 (w11_modn1 1 wx wy) - | N12 wx, N12 wy => reduce_12 (w12_mod_gt wx wy) - | N12 wx, N13 wy => - let wx':= GenBase.extend w12_0W 0 wx in - reduce_13 (w13_mod_gt wx' wy) - | N12 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w12_0W 1 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | N13 wx, N0 wy => reduce_0 (w0_modn1 13 wx wy) - | N13 wx, N1 wy => reduce_1 (w1_modn1 12 wx wy) - | N13 wx, N2 wy => reduce_2 (w2_modn1 11 wx wy) - | N13 wx, N3 wy => reduce_3 (w3_modn1 10 wx wy) - | N13 wx, N4 wy => reduce_4 (w4_modn1 9 wx wy) - | N13 wx, N5 wy => reduce_5 (w5_modn1 8 wx wy) - | N13 wx, N6 wy => reduce_6 (w6_modn1 7 wx wy) - | N13 wx, N7 wy => reduce_7 (w7_modn1 6 wx wy) - | N13 wx, N8 wy => reduce_8 (w8_modn1 5 wx wy) - | N13 wx, N9 wy => reduce_9 (w9_modn1 4 wx wy) - | N13 wx, N10 wy => reduce_10 (w10_modn1 3 wx wy) - | N13 wx, N11 wy => reduce_11 (w11_modn1 2 wx wy) - | N13 wx, N12 wy => reduce_12 (w12_modn1 1 wx wy) - | N13 wx, N13 wy => reduce_13 (w13_mod_gt wx wy) - | N13 wx, Nn n wy => - let wx':= extend n w13 (GenBase.extend w13_0W 0 wx) in - reduce_n n ((make_op n).(znz_mod_gt) wx' wy) - | Nn n wx, N0 wy => - let wy':= GenBase.extend w0_0W 12 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N1 wy => - let wy':= GenBase.extend w1_0W 11 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N2 wy => - let wy':= GenBase.extend w2_0W 10 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N3 wy => - let wy':= GenBase.extend w3_0W 9 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N4 wy => - let wy':= GenBase.extend w4_0W 8 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N5 wy => - let wy':= GenBase.extend w5_0W 7 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N6 wy => - let wy':= GenBase.extend w6_0W 6 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N7 wy => - let wy':= GenBase.extend w7_0W 5 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N8 wy => - let wy':= GenBase.extend w8_0W 4 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N9 wy => - let wy':= GenBase.extend w9_0W 3 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N10 wy => - let wy':= GenBase.extend w10_0W 2 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N11 wy => - let wy':= GenBase.extend w11_0W 1 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N12 wy => - let wy':= GenBase.extend w12_0W 0 wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, N13 wy => - let wy':= wy in - reduce_13 (w13_modn1 (S n) wx wy') - | Nn n wx, Nn m wy => + Let mod_gtnm n m wx wy := let mn := Max.max n m in let d := diff n m in let op := make_op mn in - reduce_n mn (op.(znz_mod_gt) - (castm (diff_r n m) (extend_tr wx (snd d))) - (castm (diff_l n m) (extend_tr wy (fst d)))) - end. + reduce_n mn (op.(znz_mod_gt) + (castm (diff_r n m) (extend_tr wx (snd d))) + (castm (diff_l n m) (extend_tr wy (fst d)))). + + Definition mod_gt := Eval lazy beta delta[iter] in + (iter _ + (fun x y => reduce_0 (w0_mod_gt x y)) + (fun n x y => reduce_0 (w0_mod_gt x (GenBase.get_low w_0 (S n) y))) + (fun n x y => reduce_0 (w0_modn1 (S n) x y)) + (fun x y => reduce_1 (w1_mod_gt x y)) + (fun n x y => reduce_1 (w1_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_1 (w1_modn1 (S n) x y)) + (fun x y => reduce_2 (w2_mod_gt x y)) + (fun n x y => reduce_2 (w2_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_2 (w2_modn1 (S n) x y)) + (fun x y => reduce_3 (w3_mod_gt x y)) + (fun n x y => reduce_3 (w3_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_3 (w3_modn1 (S n) x y)) + (fun x y => reduce_4 (w4_mod_gt x y)) + (fun n x y => reduce_4 (w4_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_4 (w4_modn1 (S n) x y)) + (fun x y => reduce_5 (w5_mod_gt x y)) + (fun n x y => reduce_5 (w5_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_5 (w5_modn1 (S n) x y)) + (fun x y => reduce_6 (w6_mod_gt x y)) + (fun n x y => reduce_6 (w6_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_6 (w6_modn1 (S n) x y)) + (fun x y => reduce_7 (w7_mod_gt x y)) + (fun n x y => reduce_7 (w7_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_7 (w7_modn1 (S n) x y)) + (fun x y => reduce_8 (w8_mod_gt x y)) + (fun n x y => reduce_8 (w8_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_8 (w8_modn1 (S n) x y)) + (fun x y => reduce_9 (w9_mod_gt x y)) + (fun n x y => reduce_9 (w9_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_9 (w9_modn1 (S n) x y)) + (fun x y => reduce_10 (w10_mod_gt x y)) + (fun n x y => reduce_10 (w10_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_10 (w10_modn1 (S n) x y)) + (fun x y => reduce_11 (w11_mod_gt x y)) + (fun n x y => reduce_11 (w11_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_11 (w11_modn1 (S n) x y)) + (fun x y => reduce_12 (w12_mod_gt x y)) + (fun n x y => reduce_12 (w12_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_12 (w12_modn1 (S n) x y)) + (fun x y => reduce_13 (w13_mod_gt x y)) + (fun n x y => reduce_13 (w13_mod_gt x (GenBase.get_low W0 (S n) y))) + (fun n x y => reduce_13 (w13_modn1 (S n) x y)) + mod_gtnm). + + Theorem spec_mod_gt: + forall x y, [x] > [y] -> 0 < [y] -> [mod_gt x y] = [x] mod [y]. + Admitted. Definition modulo x y := match compare x y with @@ -3798,6 +3064,16 @@ Module Make (W0:W0Type). | Gt => mod_gt x y end. + Theorem spec_modulo: + forall x y, 0 < [y] -> [modulo x y] = [x] mod [y]. + Admitted. + + (***************************************************************) + (* *) + (* Gcd *) + (* *) + (***************************************************************) + Definition digits x := match x with | N0 _ => w0_op.(znz_digits) @@ -3817,6 +3093,9 @@ Module Make (W0:W0Type). | Nn n _ => (make_op n).(znz_digits) end. + Theorem spec_digits: forall x, 0 <= [x] < 2 ^ Zpos (digits x). + Admitted. + Definition gcd_gt_body a b cont := match compare b zero with | Gt => @@ -3828,13 +3107,13 @@ Module Make (W0:W0Type). | _ => a end. - Fixpoint gcd_gt (p:positive) (cont:t->t->t) (a b:t) {struct p} : t := + Fixpoint gcd_gt_aux (p:positive) (cont:t->t->t) (a b:t) {struct p} : t := gcd_gt_body a b (fun a b => match p with | xH => cont a b - | xO p => gcd_gt p (gcd_gt p cont) a b - | xI p => gcd_gt p (gcd_gt p cont) a b + | xO p => gcd_gt_aux p (gcd_gt_aux p cont) a b + | xI p => gcd_gt_aux p (gcd_gt_aux p cont) a b end). Definition gcd_cont a b := @@ -3843,60 +3122,93 @@ Module Make (W0:W0Type). | _ => a end. + Definition gcd_gt a b := gcd_gt_aux (digits a) gcd_cont a b. + + Theorem spec_gcd_gt: forall a b, + [a] > [b] -> [gcd_gt a b] = Zgcd [a] [b]. + Admitted. + Definition gcd a b := match compare a b with | Eq => a - | Lt => gcd_gt (digits b) gcd_cont b a - | Gt => gcd_gt (digits a) gcd_cont a b + | Lt => gcd_gt b a + | Gt => gcd_gt a b end. -Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (plength p))). + Theorem spec_gcd: forall a b, [gcd a b] = Zgcd [a] [b]. + Admitted. + + (***************************************************************) + (* *) + (* Conversion *) + (* *) + (***************************************************************) + + Definition pheight p := + Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (plength p))). + + Theorem pheight_correct: forall p, + Zpos p < 2 ^ (Zpos (znz_digits w0_op) * 2 ^ (Z_of_nat (pheight p))). + Proof. + intros p; unfold pheight. + assert (F1: forall x, Z_of_nat (Peano.pred (nat_of_P x)) = Zpos x - 1). + intros x. + assert (Zsucc (Z_of_nat (Peano.pred (nat_of_P x))) = Zpos x); auto with zarith. + rewrite <- inj_S. + rewrite <- (fun x => S_pred x 0); auto with zarith. + rewrite Zpos_eq_Z_of_nat_o_nat_of_P; auto. + apply lt_le_trans with 1%nat; auto with zarith. + exact (le_Pmult_nat x 1). + rewrite F1; clear F1. + assert (F2:= (get_height_correct (znz_digits w0_op) (plength p))). + apply Zlt_le_trans with (Zpos (Psucc p)). + rewrite Zpos_succ_morphism; auto with zarith. + apply Zle_trans with (1 := plength_pred_correct (Psucc p)). + rewrite Ppred_succ. + apply Zpower_le_monotone; auto with zarith. + Qed. + Definition of_pos x := let h := pheight x in match h with - | O => reduce_0 (snd (w0_op.(znz_of_pos) x)) - | (S O) => reduce_1 (snd (w1_op.(znz_of_pos) x)) - | (S (S O)) => reduce_2 (snd (w2_op.(znz_of_pos) x)) - | (S (S (S O))) => reduce_3 (snd (w3_op.(znz_of_pos) x)) - | (S (S (S (S O)))) => reduce_4 (snd (w4_op.(znz_of_pos) x)) - | (S (S (S (S (S O))))) => reduce_5 (snd (w5_op.(znz_of_pos) x)) - | (S (S (S (S (S (S O)))))) => reduce_6 (snd (w6_op.(znz_of_pos) x)) - | (S (S (S (S (S (S (S O))))))) => reduce_7 (snd (w7_op.(znz_of_pos) x)) - | (S (S (S (S (S (S (S (S O)))))))) => reduce_8 (snd (w8_op.(znz_of_pos) x)) - | (S (S (S (S (S (S (S (S (S O))))))))) => reduce_9 (snd (w9_op.(znz_of_pos) x)) - | (S (S (S (S (S (S (S (S (S (S O)))))))))) => reduce_10 (snd (w10_op.(znz_of_pos) x)) - | (S (S (S (S (S (S (S (S (S (S (S O))))))))))) => reduce_11 (snd (w11_op.(znz_of_pos) x)) - | (S (S (S (S (S (S (S (S (S (S (S (S O)))))))))))) => reduce_12 (snd (w12_op.(znz_of_pos) x)) - | (S (S (S (S (S (S (S (S (S (S (S (S (S O))))))))))))) => reduce_13 (snd (w13_op.(znz_of_pos) x)) + | 0%nat => reduce_0 (snd (w0_op.(znz_of_pos) x)) + | 1%nat => reduce_1 (snd (w1_op.(znz_of_pos) x)) + | 2%nat => reduce_2 (snd (w2_op.(znz_of_pos) x)) + | 3%nat => reduce_3 (snd (w3_op.(znz_of_pos) x)) + | 4%nat => reduce_4 (snd (w4_op.(znz_of_pos) x)) + | 5%nat => reduce_5 (snd (w5_op.(znz_of_pos) x)) + | 6%nat => reduce_6 (snd (w6_op.(znz_of_pos) x)) + | 7%nat => reduce_7 (snd (w7_op.(znz_of_pos) x)) + | 8%nat => reduce_8 (snd (w8_op.(znz_of_pos) x)) + | 9%nat => reduce_9 (snd (w9_op.(znz_of_pos) x)) + | 10%nat => reduce_10 (snd (w10_op.(znz_of_pos) x)) + | 11%nat => reduce_11 (snd (w11_op.(znz_of_pos) x)) + | 12%nat => reduce_12 (snd (w12_op.(znz_of_pos) x)) + | 13%nat => reduce_13 (snd (w13_op.(znz_of_pos) x)) | _ => let n := minus h 14 in reduce_n n (snd ((make_op n).(znz_of_pos) x)) end. + Theorem spec_of_pos: forall x, + [of_pos x] = Zpos x. + Admitted. + Definition of_N x := match x with | BinNat.N0 => zero | Npos p => of_pos p end. - Definition to_Z x := - match x with - | N0 wx => w0_op.(znz_to_Z) wx - | N1 wx => w1_op.(znz_to_Z) wx - | N2 wx => w2_op.(znz_to_Z) wx - | N3 wx => w3_op.(znz_to_Z) wx - | N4 wx => w4_op.(znz_to_Z) wx - | N5 wx => w5_op.(znz_to_Z) wx - | N6 wx => w6_op.(znz_to_Z) wx - | N7 wx => w7_op.(znz_to_Z) wx - | N8 wx => w8_op.(znz_to_Z) wx - | N9 wx => w9_op.(znz_to_Z) wx - | N10 wx => w10_op.(znz_to_Z) wx - | N11 wx => w11_op.(znz_to_Z) wx - | N12 wx => w12_op.(znz_to_Z) wx - | N13 wx => w13_op.(znz_to_Z) wx - | Nn n wx => (make_op n).(znz_to_Z) wx - end. + Theorem spec_of_N: forall x, + [of_N x] = Z_of_N x. + Admitted. + + (***************************************************************) + (* *) + (* Shift *) + (* *) + (***************************************************************) Definition head0 w := match w with | N0 w=> reduce_0 (w0_op.(znz_head0) w) @@ -3916,6 +3228,13 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple | Nn n w=> reduce_n n ((make_op n).(znz_head0) w) end. + Theorem spec_head00: forall x, [x] = 0 ->[head0 x] = Zpos (digits x). + Admitted. + + Theorem spec_head0: forall x, 0 < [x] -> + 2 ^ (Zpos (digits x) - 1) <= 2 ^ [head0 x] * [x] < 2 ^ Zpos (digits x). + Admitted. + Definition tail0 w := match w with | N0 w=> reduce_0 (w0_op.(znz_tail0) w) | N1 w=> reduce_1 (w1_op.(znz_tail0) w) @@ -3934,6 +3253,13 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple | Nn n w=> reduce_n n ((make_op n).(znz_tail0) w) end. + Theorem spec_tail00: forall x, [x] = 0 ->[tail0 x] = Zpos (digits x). + Admitted. + + Theorem spec_tail0: forall x, + 0 < [x] -> exists y, 0 <= y /\ [x] = (2 * y + 1) * 2 ^ [tail0 x]. + Admitted. + Definition Ndigits x := match x with | N0 _ => N0 w0_op.(znz_zdigits) @@ -3951,256 +3277,10 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple | N12 _ => reduce_12 w12_op.(znz_zdigits) | N13 _ => reduce_13 w13_op.(znz_zdigits) | Nn n _ => reduce_n n (make_op n).(znz_zdigits) - end. - Definition level f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 fn x y: t_ := match x, y with - | N0 wx, N0 wy => f0 wx wy - | N0 wx, N1 wy => f1 (WW w_0 wx) wy - | N0 wx, N2 wy => f2 (extend1 w0 (WW w_0 wx)) wy - | N0 wx, N3 wy => f3 (extend2 w0 (WW w_0 wx)) wy - | N0 wx, N4 wy => f4 (extend3 w0 (WW w_0 wx)) wy - | N0 wx, N5 wy => f5 (extend4 w0 (WW w_0 wx)) wy - | N0 wx, N6 wy => f6 (extend5 w0 (WW w_0 wx)) wy - | N0 wx, N7 wy => f7 (extend6 w0 (WW w_0 wx)) wy - | N0 wx, N8 wy => f8 (extend7 w0 (WW w_0 wx)) wy - | N0 wx, N9 wy => f9 (extend8 w0 (WW w_0 wx)) wy - | N0 wx, N10 wy => f10 (extend9 w0 (WW w_0 wx)) wy - | N0 wx, N11 wy => f11 (extend10 w0 (WW w_0 wx)) wy - | N0 wx, N12 wy => f12 (extend11 w0 (WW w_0 wx)) wy - | N0 wx, N13 wy => f13 (extend12 w0 (WW w_0 wx)) wy - | N0 wx, Nn n wy => - fn n (extend n w13 (extend13 w0 (WW w_0 wx))) wy - | N1 wx, N0 wy => - f1 wx (WW w_0 wy) - | N1 wx, N1 wy => f1 wx wy - | N1 wx, N2 wy => f2 (extend1 w0 wx) wy - | N1 wx, N3 wy => f3 (extend2 w0 wx) wy - | N1 wx, N4 wy => f4 (extend3 w0 wx) wy - | N1 wx, N5 wy => f5 (extend4 w0 wx) wy - | N1 wx, N6 wy => f6 (extend5 w0 wx) wy - | N1 wx, N7 wy => f7 (extend6 w0 wx) wy - | N1 wx, N8 wy => f8 (extend7 w0 wx) wy - | N1 wx, N9 wy => f9 (extend8 w0 wx) wy - | N1 wx, N10 wy => f10 (extend9 w0 wx) wy - | N1 wx, N11 wy => f11 (extend10 w0 wx) wy - | N1 wx, N12 wy => f12 (extend11 w0 wx) wy - | N1 wx, N13 wy => f13 (extend12 w0 wx) wy - | N1 wx, Nn n wy => fn n (extend n w13 (extend13 w0 wx)) wy - | N2 wx, N0 wy => - f2 wx (extend1 w0 (WW w_0 wy)) - | N2 wx, N1 wy => f2 wx (extend1 w0 wy) - | N2 wx, N2 wy => f2 wx wy - | N2 wx, N3 wy => f3 (extend1 w1 wx) wy - | N2 wx, N4 wy => f4 (extend2 w1 wx) wy - | N2 wx, N5 wy => f5 (extend3 w1 wx) wy - | N2 wx, N6 wy => f6 (extend4 w1 wx) wy - | N2 wx, N7 wy => f7 (extend5 w1 wx) wy - | N2 wx, N8 wy => f8 (extend6 w1 wx) wy - | N2 wx, N9 wy => f9 (extend7 w1 wx) wy - | N2 wx, N10 wy => f10 (extend8 w1 wx) wy - | N2 wx, N11 wy => f11 (extend9 w1 wx) wy - | N2 wx, N12 wy => f12 (extend10 w1 wx) wy - | N2 wx, N13 wy => f13 (extend11 w1 wx) wy - | N2 wx, Nn n wy => fn n (extend n w13 (extend12 w1 wx)) wy - | N3 wx, N0 wy => - f3 wx (extend2 w0 (WW w_0 wy)) - | N3 wx, N1 wy => f3 wx (extend2 w0 wy) - | N3 wx, N2 wy => f3 wx (extend1 w1 wy) - | N3 wx, N3 wy => f3 wx wy - | N3 wx, N4 wy => f4 (extend1 w2 wx) wy - | N3 wx, N5 wy => f5 (extend2 w2 wx) wy - | N3 wx, N6 wy => f6 (extend3 w2 wx) wy - | N3 wx, N7 wy => f7 (extend4 w2 wx) wy - | N3 wx, N8 wy => f8 (extend5 w2 wx) wy - | N3 wx, N9 wy => f9 (extend6 w2 wx) wy - | N3 wx, N10 wy => f10 (extend7 w2 wx) wy - | N3 wx, N11 wy => f11 (extend8 w2 wx) wy - | N3 wx, N12 wy => f12 (extend9 w2 wx) wy - | N3 wx, N13 wy => f13 (extend10 w2 wx) wy - | N3 wx, Nn n wy => fn n (extend n w13 (extend11 w2 wx)) wy - | N4 wx, N0 wy => - f4 wx (extend3 w0 (WW w_0 wy)) - | N4 wx, N1 wy => f4 wx (extend3 w0 wy) - | N4 wx, N2 wy => f4 wx (extend2 w1 wy) - | N4 wx, N3 wy => f4 wx (extend1 w2 wy) - | N4 wx, N4 wy => f4 wx wy - | N4 wx, N5 wy => f5 (extend1 w3 wx) wy - | N4 wx, N6 wy => f6 (extend2 w3 wx) wy - | N4 wx, N7 wy => f7 (extend3 w3 wx) wy - | N4 wx, N8 wy => f8 (extend4 w3 wx) wy - | N4 wx, N9 wy => f9 (extend5 w3 wx) wy - | N4 wx, N10 wy => f10 (extend6 w3 wx) wy - | N4 wx, N11 wy => f11 (extend7 w3 wx) wy - | N4 wx, N12 wy => f12 (extend8 w3 wx) wy - | N4 wx, N13 wy => f13 (extend9 w3 wx) wy - | N4 wx, Nn n wy => fn n (extend n w13 (extend10 w3 wx)) wy - | N5 wx, N0 wy => - f5 wx (extend4 w0 (WW w_0 wy)) - | N5 wx, N1 wy => f5 wx (extend4 w0 wy) - | N5 wx, N2 wy => f5 wx (extend3 w1 wy) - | N5 wx, N3 wy => f5 wx (extend2 w2 wy) - | N5 wx, N4 wy => f5 wx (extend1 w3 wy) - | N5 wx, N5 wy => f5 wx wy - | N5 wx, N6 wy => f6 (extend1 w4 wx) wy - | N5 wx, N7 wy => f7 (extend2 w4 wx) wy - | N5 wx, N8 wy => f8 (extend3 w4 wx) wy - | N5 wx, N9 wy => f9 (extend4 w4 wx) wy - | N5 wx, N10 wy => f10 (extend5 w4 wx) wy - | N5 wx, N11 wy => f11 (extend6 w4 wx) wy - | N5 wx, N12 wy => f12 (extend7 w4 wx) wy - | N5 wx, N13 wy => f13 (extend8 w4 wx) wy - | N5 wx, Nn n wy => fn n (extend n w13 (extend9 w4 wx)) wy - | N6 wx, N0 wy => - f6 wx (extend5 w0 (WW w_0 wy)) - | N6 wx, N1 wy => f6 wx (extend5 w0 wy) - | N6 wx, N2 wy => f6 wx (extend4 w1 wy) - | N6 wx, N3 wy => f6 wx (extend3 w2 wy) - | N6 wx, N4 wy => f6 wx (extend2 w3 wy) - | N6 wx, N5 wy => f6 wx (extend1 w4 wy) - | N6 wx, N6 wy => f6 wx wy - | N6 wx, N7 wy => f7 (extend1 w5 wx) wy - | N6 wx, N8 wy => f8 (extend2 w5 wx) wy - | N6 wx, N9 wy => f9 (extend3 w5 wx) wy - | N6 wx, N10 wy => f10 (extend4 w5 wx) wy - | N6 wx, N11 wy => f11 (extend5 w5 wx) wy - | N6 wx, N12 wy => f12 (extend6 w5 wx) wy - | N6 wx, N13 wy => f13 (extend7 w5 wx) wy - | N6 wx, Nn n wy => fn n (extend n w13 (extend8 w5 wx)) wy - | N7 wx, N0 wy => - f7 wx (extend6 w0 (WW w_0 wy)) - | N7 wx, N1 wy => f7 wx (extend6 w0 wy) - | N7 wx, N2 wy => f7 wx (extend5 w1 wy) - | N7 wx, N3 wy => f7 wx (extend4 w2 wy) - | N7 wx, N4 wy => f7 wx (extend3 w3 wy) - | N7 wx, N5 wy => f7 wx (extend2 w4 wy) - | N7 wx, N6 wy => f7 wx (extend1 w5 wy) - | N7 wx, N7 wy => f7 wx wy - | N7 wx, N8 wy => f8 (extend1 w6 wx) wy - | N7 wx, N9 wy => f9 (extend2 w6 wx) wy - | N7 wx, N10 wy => f10 (extend3 w6 wx) wy - | N7 wx, N11 wy => f11 (extend4 w6 wx) wy - | N7 wx, N12 wy => f12 (extend5 w6 wx) wy - | N7 wx, N13 wy => f13 (extend6 w6 wx) wy - | N7 wx, Nn n wy => fn n (extend n w13 (extend7 w6 wx)) wy - | N8 wx, N0 wy => - f8 wx (extend7 w0 (WW w_0 wy)) - | N8 wx, N1 wy => f8 wx (extend7 w0 wy) - | N8 wx, N2 wy => f8 wx (extend6 w1 wy) - | N8 wx, N3 wy => f8 wx (extend5 w2 wy) - | N8 wx, N4 wy => f8 wx (extend4 w3 wy) - | N8 wx, N5 wy => f8 wx (extend3 w4 wy) - | N8 wx, N6 wy => f8 wx (extend2 w5 wy) - | N8 wx, N7 wy => f8 wx (extend1 w6 wy) - | N8 wx, N8 wy => f8 wx wy - | N8 wx, N9 wy => f9 (extend1 w7 wx) wy - | N8 wx, N10 wy => f10 (extend2 w7 wx) wy - | N8 wx, N11 wy => f11 (extend3 w7 wx) wy - | N8 wx, N12 wy => f12 (extend4 w7 wx) wy - | N8 wx, N13 wy => f13 (extend5 w7 wx) wy - | N8 wx, Nn n wy => fn n (extend n w13 (extend6 w7 wx)) wy - | N9 wx, N0 wy => - f9 wx (extend8 w0 (WW w_0 wy)) - | N9 wx, N1 wy => f9 wx (extend8 w0 wy) - | N9 wx, N2 wy => f9 wx (extend7 w1 wy) - | N9 wx, N3 wy => f9 wx (extend6 w2 wy) - | N9 wx, N4 wy => f9 wx (extend5 w3 wy) - | N9 wx, N5 wy => f9 wx (extend4 w4 wy) - | N9 wx, N6 wy => f9 wx (extend3 w5 wy) - | N9 wx, N7 wy => f9 wx (extend2 w6 wy) - | N9 wx, N8 wy => f9 wx (extend1 w7 wy) - | N9 wx, N9 wy => f9 wx wy - | N9 wx, N10 wy => f10 (extend1 w8 wx) wy - | N9 wx, N11 wy => f11 (extend2 w8 wx) wy - | N9 wx, N12 wy => f12 (extend3 w8 wx) wy - | N9 wx, N13 wy => f13 (extend4 w8 wx) wy - | N9 wx, Nn n wy => fn n (extend n w13 (extend5 w8 wx)) wy - | N10 wx, N0 wy => - f10 wx (extend9 w0 (WW w_0 wy)) - | N10 wx, N1 wy => f10 wx (extend9 w0 wy) - | N10 wx, N2 wy => f10 wx (extend8 w1 wy) - | N10 wx, N3 wy => f10 wx (extend7 w2 wy) - | N10 wx, N4 wy => f10 wx (extend6 w3 wy) - | N10 wx, N5 wy => f10 wx (extend5 w4 wy) - | N10 wx, N6 wy => f10 wx (extend4 w5 wy) - | N10 wx, N7 wy => f10 wx (extend3 w6 wy) - | N10 wx, N8 wy => f10 wx (extend2 w7 wy) - | N10 wx, N9 wy => f10 wx (extend1 w8 wy) - | N10 wx, N10 wy => f10 wx wy - | N10 wx, N11 wy => f11 (extend1 w9 wx) wy - | N10 wx, N12 wy => f12 (extend2 w9 wx) wy - | N10 wx, N13 wy => f13 (extend3 w9 wx) wy - | N10 wx, Nn n wy => fn n (extend n w13 (extend4 w9 wx)) wy - | N11 wx, N0 wy => - f11 wx (extend10 w0 (WW w_0 wy)) - | N11 wx, N1 wy => f11 wx (extend10 w0 wy) - | N11 wx, N2 wy => f11 wx (extend9 w1 wy) - | N11 wx, N3 wy => f11 wx (extend8 w2 wy) - | N11 wx, N4 wy => f11 wx (extend7 w3 wy) - | N11 wx, N5 wy => f11 wx (extend6 w4 wy) - | N11 wx, N6 wy => f11 wx (extend5 w5 wy) - | N11 wx, N7 wy => f11 wx (extend4 w6 wy) - | N11 wx, N8 wy => f11 wx (extend3 w7 wy) - | N11 wx, N9 wy => f11 wx (extend2 w8 wy) - | N11 wx, N10 wy => f11 wx (extend1 w9 wy) - | N11 wx, N11 wy => f11 wx wy - | N11 wx, N12 wy => f12 (extend1 w10 wx) wy - | N11 wx, N13 wy => f13 (extend2 w10 wx) wy - | N11 wx, Nn n wy => fn n (extend n w13 (extend3 w10 wx)) wy - | N12 wx, N0 wy => - f12 wx (extend11 w0 (WW w_0 wy)) - | N12 wx, N1 wy => f12 wx (extend11 w0 wy) - | N12 wx, N2 wy => f12 wx (extend10 w1 wy) - | N12 wx, N3 wy => f12 wx (extend9 w2 wy) - | N12 wx, N4 wy => f12 wx (extend8 w3 wy) - | N12 wx, N5 wy => f12 wx (extend7 w4 wy) - | N12 wx, N6 wy => f12 wx (extend6 w5 wy) - | N12 wx, N7 wy => f12 wx (extend5 w6 wy) - | N12 wx, N8 wy => f12 wx (extend4 w7 wy) - | N12 wx, N9 wy => f12 wx (extend3 w8 wy) - | N12 wx, N10 wy => f12 wx (extend2 w9 wy) - | N12 wx, N11 wy => f12 wx (extend1 w10 wy) - | N12 wx, N12 wy => f12 wx wy - | N12 wx, N13 wy => f13 (extend1 w11 wx) wy - | N12 wx, Nn n wy => fn n (extend n w13 (extend2 w11 wx)) wy - | N13 wx, N0 wy => - f13 wx (extend12 w0 (WW w_0 wy)) - | N13 wx, N1 wy => f13 wx (extend12 w0 wy) - | N13 wx, N2 wy => f13 wx (extend11 w1 wy) - | N13 wx, N3 wy => f13 wx (extend10 w2 wy) - | N13 wx, N4 wy => f13 wx (extend9 w3 wy) - | N13 wx, N5 wy => f13 wx (extend8 w4 wy) - | N13 wx, N6 wy => f13 wx (extend7 w5 wy) - | N13 wx, N7 wy => f13 wx (extend6 w6 wy) - | N13 wx, N8 wy => f13 wx (extend5 w7 wy) - | N13 wx, N9 wy => f13 wx (extend4 w8 wy) - | N13 wx, N10 wy => f13 wx (extend3 w9 wy) - | N13 wx, N11 wy => f13 wx (extend2 w10 wy) - | N13 wx, N12 wy => f13 wx (extend1 w11 wy) - | N13 wx, N13 wy => f13 wx wy - | N13 wx, Nn n wy => fn n (extend n w13 (extend1 w12 wx)) wy - | Nn n wx, N0 wy => - fn n wx (extend n w13 (extend13 w0 (WW w_0 wy))) - | Nn n wx, N1 wy => fn n wx (extend n w13 (extend13 w0 wy)) - | Nn n wx, N2 wy => fn n wx (extend n w13 (extend12 w1 wy)) - | Nn n wx, N3 wy => fn n wx (extend n w13 (extend11 w2 wy)) - | Nn n wx, N4 wy => fn n wx (extend n w13 (extend10 w3 wy)) - | Nn n wx, N5 wy => fn n wx (extend n w13 (extend9 w4 wy)) - | Nn n wx, N6 wy => fn n wx (extend n w13 (extend8 w5 wy)) - | Nn n wx, N7 wy => fn n wx (extend n w13 (extend7 w6 wy)) - | Nn n wx, N8 wy => fn n wx (extend n w13 (extend6 w7 wy)) - | Nn n wx, N9 wy => fn n wx (extend n w13 (extend5 w8 wy)) - | Nn n wx, N10 wy => fn n wx (extend n w13 (extend4 w9 wy)) - | Nn n wx, N11 wy => fn n wx (extend n w13 (extend3 w10 wy)) - | Nn n wx, N12 wy => fn n wx (extend n w13 (extend2 w11 wy)) - | Nn n wx, N13 wy => fn n wx (extend n w13 (extend1 w12 wy)) - | Nn n wx, Nn m wy => - let mn := Max.max n m in - let d := diff n m in - fn mn - (castm (diff_r n m) (extend_tr wx (snd d))) - (castm (diff_l n m) (extend_tr wy (fst d))) - end. + Theorem spec_Ndigits: forall x, [Ndigits x] = Zpos (digits x). + Admitted. Definition shiftr0 n x := w0_op.(znz_add_mul_div) (w0_op.(znz_sub) w0_op.(znz_zdigits) n) w0_op.(znz_0) x. Definition shiftr1 n x := w1_op.(znz_add_mul_div) (w1_op.(znz_sub) w1_op.(znz_zdigits) n) w1_op.(znz_0) x. @@ -4218,9 +3298,8 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple Definition shiftr13 n x := w13_op.(znz_add_mul_div) (w13_op.(znz_sub) w13_op.(znz_zdigits) n) w13_op.(znz_0) x. Definition shiftrn n p x := (make_op n).(znz_add_mul_div) ((make_op n).(znz_sub) (make_op n).(znz_zdigits) p) (make_op n).(znz_0) x. - Definition shiftr := - Eval lazy beta delta [level] in - level (fun n x => N0 (shiftr0 n x)) + Definition shiftr := Eval lazy beta delta [same_level] in + same_level _ (fun n x => N0 (shiftr0 n x)) (fun n x => reduce_1 (shiftr1 n x)) (fun n x => reduce_2 (shiftr2 n x)) (fun n x => reduce_3 (shiftr3 n x)) @@ -4236,12 +3315,21 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple (fun n x => reduce_13 (shiftr13 n x)) (fun n p x => reduce_n n (shiftrn n p x)). + Theorem spec_shiftr: forall n x, + [n] <= [Ndigits x] -> [shiftr n x] = [x] / 2 ^ [n]. + Admitted. + Definition safe_shiftr n x := match compare n (Ndigits x) with | Lt => shiftr n x | _ => N0 w_0 end. + Theorem spec_safe_shiftr: forall n x, + [safe_shiftr n x] = [x] / 2 ^ [n]. + Admitted. + + Definition shiftl0 n x := w0_op.(znz_add_mul_div) n x w0_op.(znz_0). Definition shiftl1 n x := w1_op.(znz_add_mul_div) n x w1_op.(znz_0). Definition shiftl2 n x := w2_op.(znz_add_mul_div) n x w2_op.(znz_0). @@ -4257,9 +3345,8 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple Definition shiftl12 n x := w12_op.(znz_add_mul_div) n x w12_op.(znz_0). Definition shiftl13 n x := w13_op.(znz_add_mul_div) n x w13_op.(znz_0). Definition shiftln n p x := (make_op n).(znz_add_mul_div) p x (make_op n).(znz_0). - Definition shiftl := - Eval lazy beta delta [level] in - level (fun n x => N0 (shiftl0 n x)) + Definition shiftl := Eval lazy beta delta [same_level] in + same_level _ (fun n x => N0 (shiftl0 n x)) (fun n x => reduce_1 (shiftl1 n x)) (fun n x => reduce_2 (shiftl2 n x)) (fun n x => reduce_3 (shiftl3 n x)) @@ -4276,30 +3363,56 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple (fun n p x => reduce_n n (shiftln n p x)). + Theorem spec_shiftl: forall n x, + [n] <= [head0 x] -> [shiftl n x] = [x] * 2 ^ [n]. + Admitted. + Definition double_size w := match w with - | N0 w=> N1 (WW w_0 w) - | N1 w=> N2 (extend1 _ w) - | N2 w=> N3 (extend1 _ w) - | N3 w=> N4 (extend1 _ w) - | N4 w=> N5 (extend1 _ w) - | N5 w=> N6 (extend1 _ w) - | N6 w=> N7 (extend1 _ w) - | N7 w=> N8 (extend1 _ w) - | N8 w=> N9 (extend1 _ w) - | N9 w=> N10 (extend1 _ w) - | N10 w=> N11 (extend1 _ w) - | N11 w=> N12 (extend1 _ w) - | N12 w=> N13 (extend1 _ w) - | N13 w=> Nn 0 (extend1 _ w) - | Nn n w=> Nn (S n) (extend1 _ w) + | N0 x => N1 (WW (znz_0 w0_op) x) + | N1 x => N2 (WW (znz_0 w1_op) x) + | N2 x => N3 (WW (znz_0 w2_op) x) + | N3 x => N4 (WW (znz_0 w3_op) x) + | N4 x => N5 (WW (znz_0 w4_op) x) + | N5 x => N6 (WW (znz_0 w5_op) x) + | N6 x => N7 (WW (znz_0 w6_op) x) + | N7 x => N8 (WW (znz_0 w7_op) x) + | N8 x => N9 (WW (znz_0 w8_op) x) + | N9 x => N10 (WW (znz_0 w9_op) x) + | N10 x => N11 (WW (znz_0 w10_op) x) + | N11 x => N12 (WW (znz_0 w11_op) x) + | N12 x => N13 (WW (znz_0 w12_op) x) + | N13 x => Nn 0 (WW (znz_0 w13_op) x) + | Nn n x => Nn (S n) (WW (znz_0 (make_op n)) x) end. + Theorem spec_double_size_digits: + forall x, digits (double_size x) = xO (digits x). + Admitted. + + Theorem spec_double_size: forall x, [double_size x] = [x]. + Admitted. + + Theorem spec_double_size_head0: + forall x, 2 * [head0 x] <= [head0 (double_size x)]. + Admitted. + + Theorem spec_double_size_head0_pos: + forall x, 0 < [head0 (double_size x)]. + Admitted. + Definition safe_shiftl_aux_body cont n x := match compare n (head0 x) with Gt => cont n (double_size x) | _ => shiftl n x end. + Theorem spec_safe_shift_aux_body: forall n p x cont, + 2^ Zpos p <= [head0 x] -> + (forall x, 2 ^ (Zpos p + 1) <= [head0 x]-> + [cont n x] = [x] * 2 ^ [n]) -> + [safe_shiftl_aux_body cont n x] = [x] * 2 ^ [n]. + Admitted. + Fixpoint safe_shiftl_aux p cont n x {struct p} := safe_shiftl_aux_body (fun n x => match p with @@ -4308,9 +3421,22 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple | xI p => safe_shiftl_aux p (safe_shiftl_aux p cont) n x end) n x. - Definition safe_shiftl n x := - safe_shiftl_aux (digits n) (fun n x => N0 w0_op.(znz_0)) n x. - + Theorem spec_safe_shift_aux: forall p q n x cont, + 2 ^ (Zpos q) <= [head0 x] -> + (forall x, 2 ^ (Zpos p + Zpos q) <= [head0 x] -> + [cont n x] = [x] * 2 ^ [n]) -> + [safe_shiftl_aux p cont n x] = [x] * 2 ^ [n]. + Admitted. + + Definition safe_shiftl n x := + safe_shiftl_aux_body + (safe_shiftl_aux_body + (safe_shiftl_aux (digits n) shiftl)) n x. + + Theorem spec_safe_shift: forall n x, + [safe_shiftl n x] = [x] * 2 ^ [n]. + Admitted. + Definition is_even x := match x with | N0 wx => w0_op.(znz_is_even) wx @@ -4330,39 +3456,8 @@ Definition pheight p := Peano.pred (nat_of_P (get_height w0_op.(znz_digits) (ple | Nn n wx => (make_op n).(znz_is_even) wx end. -(* Proof section *) - - Open Scope Z_scope. - Notation "[ x ]" := (to_Z x). - - Theorem succ_spec: forall n, [succ n] = [n] + 1. - Admitted. - - Theorem spec_add: forall x y, [add x y] = [x] + [y]. - Admitted. - - Theorem spec_sub: forall x y, [y] <= [x] -> [sub x y] = [x] - [y]. - Admitted. - - Theorem spec_sub0: forall x y, [x] < [y] -> [sub x y] = 0. - Admitted. - - Theorem spec_compare: forall x y, - match compare x y with - Eq => [x] = [y] - | Lt => [x] < [y] - | Gt => [x] > [y] - end. - Proof. - Admitted. - - Theorem spec_mul: forall x y, [mul x y] =[x] * [y]. - Proof. - Admitted. - - Theorem spec_sqrt : forall x, - [sqrt x] ^ 2 <= [x] < ([sqrt x] + 1) ^ 2. - Proof. + Theorem spec_is_even: forall x, + if is_even x then [x] mod 2 = 0 else [x] mod 2 = 1. Admitted. End Make. |
