-cut (O < p)
- [rewrite < sigma_p2.
- apply (trans_eq ? ?
- (sigma_p (S n*S m) (\lambda x:nat.divides_b (x/S m) n)
- (\lambda x:nat.g (x/S m*(p)\sup(x\mod S m)))))
- [apply sym_eq.
- apply (eq_sigma_p_gh g ? (p_ord_times p (S m)))
- [intros.
- lapply (divides_b_true_to_lt_O ? ? H H4).
- apply divides_to_divides_b_true
- [rewrite > (times_n_O O).
- apply lt_times
- [assumption
- |apply lt_O_exp.assumption
- ]
- |apply divides_times
- [apply divides_b_true_to_divides.assumption
- |apply (witness ? ? (p \sup (m-i \mod (S m)))).
- rewrite < exp_plus_times.
- apply eq_f.
- rewrite > sym_plus.
- apply plus_minus_m_m.
- auto
- ]
- ]
- |intros.
- lapply (divides_b_true_to_lt_O ? ? H H4).
- unfold p_ord_times.
- rewrite > (p_ord_exp1 p ? (i \mod (S m)) (i/S m))
- [change with ((i/S m)*S m+i \mod S m=i).
- apply sym_eq.
- apply div_mod.
- apply lt_O_S
- |assumption
- |unfold Not.intro.
- apply H2.
- apply (trans_divides ? (i/ S m))
- [assumption|
- apply divides_b_true_to_divides;assumption]
- |apply sym_times.
- ]
- |intros.
- apply le_S_S.
- apply le_times
- [apply le_S_S_to_le.
- change with ((i/S m) < S n).
- apply (lt_times_to_lt_l m).
- apply (le_to_lt_to_lt ? i)
- [auto|assumption]
- |apply le_exp
- [assumption
- |apply le_S_S_to_le.
- apply lt_mod_m_m.
- apply lt_O_S
+rewrite > sym_times.
+apply eq_sigma_p_sigma_p_times1.
+qed.
+
+
+theorem sigma_p_times:\forall n,m:nat.
+\forall f,f1,f2:nat \to bool.
+\forall g:nat \to nat \to nat.
+\forall g1,g2: nat \to nat.
+(\forall a,b:nat. a < (S n) \to b < (S m) \to (g b a) < (S n)*(S m)) \to
+(\forall a,b:nat. a < (S n) \to b < (S m) \to (g1 (g b a)) = a) \to
+(\forall a,b:nat. a < (S n) \to b < (S m) \to (g2 (g b a)) = b) \to
+(\forall a,b:nat. a < (S n) \to b < (S m) \to f (g b a) = andb (f2 b) (f1 a)) \to
+(sigma_p ((S n) * (S m)) f (\lambda c:nat.(S O))) =
+sigma_p (S n) f1 (\lambda c:nat.(S O)) * sigma_p (S m) f2 (\lambda c:nat.(S O)).
+intros.
+
+rewrite > (sigma_P_SO_to_sigma_p_true ).
+rewrite > (S_pred ((S n)*(S m))) in \vdash (? ? (? % ? ?) ?)
+[ rewrite < (eq_map_iter_i_sigma_p_alwaysTrue (pred ((S n)* (S m)))).
+ rewrite > (permut_to_eq_map_iter_i plus assoc_plus sym_plus ? ? ?
+ (\lambda i.g (div i (S n)) (mod i (S n))))
+ [ rewrite > eq_map_iter_i_sigma_p_alwaysTrue.
+ rewrite < S_pred
+ [ rewrite > eq_sigma_p_sigma_p_times2.
+ apply (trans_eq ? ? (sigma_p (S n) (\lambda c:nat.true)
+ (\lambda a. sigma_p (S m) (\lambda c:nat.true)
+ (\lambda b.(bool_to_nat (f2 b))*(bool_to_nat (f1 a))))))
+ [ apply eq_sigma_p;intros
+ [ reflexivity
+ | apply eq_sigma_p;intros
+ [ reflexivity
+ |
+ rewrite > (div_mod_spec_to_eq (x1*(S n) + x) (S n) ((x1*(S n) + x)/(S n))
+ ((x1*(S n) + x) \mod (S n)) x1 x)
+ [ rewrite > (div_mod_spec_to_eq2 (x1*(S n) + x) (S n) ((x1*(S n) + x)/(S n))
+ ((x1*(S n) + x) \mod (S n)) x1 x)
+ [ rewrite > H3
+ [ apply bool_to_nat_andb
+ | assumption
+ | assumption
+ ]
+ | apply div_mod_spec_div_mod.
+ apply lt_O_S
+ | constructor 1
+ [ assumption
+ | reflexivity
+ ]
+ ]
+ | apply div_mod_spec_div_mod.
+ apply lt_O_S
+ | constructor 1
+ [ assumption
+ | reflexivity
+ ]
+ ]