diff options
author | Andres Erbsen <andreser@mit.edu> | 2017-04-06 15:47:12 -0400 |
---|---|---|
committer | Andres Erbsen <andreser@mit.edu> | 2017-04-06 15:47:12 -0400 |
commit | f8cc64c7ca411828cac5cad2958959b0d779d683 (patch) | |
tree | 1c74a6bf6bc92522db7451e3c0dd748c57a2ece3 /src/BaseSystemProofs.v | |
parent | 33b1e92e1a71f284461e0c8d1d22b1d28b29bd7a (diff) |
start removing BaseSystem
Diffstat (limited to 'src/BaseSystemProofs.v')
-rw-r--r-- | src/BaseSystemProofs.v | 710 |
1 files changed, 0 insertions, 710 deletions
diff --git a/src/BaseSystemProofs.v b/src/BaseSystemProofs.v deleted file mode 100644 index 409d8b7db..000000000 --- a/src/BaseSystemProofs.v +++ /dev/null @@ -1,710 +0,0 @@ -Require Import Coq.Lists.List Coq.micromega.Psatz. -Require Import Crypto.Util.ListUtil Crypto.Util.CaseUtil Crypto.Util.ZUtil. -Require Import Coq.ZArith.ZArith Coq.ZArith.Zdiv. -Require Import Coq.omega.Omega Coq.Numbers.Natural.Peano.NPeano Coq.Arith.Arith. -Require Import Crypto.BaseSystem. -Require Import Crypto.Util.Notations. -Import Morphisms. -Local Open Scope Z. - -Local Infix ".+" := add. - -Local Hint Extern 1 (@eq Z _ _) => ring. - -Section BaseSystemProofs. - Context `(base_vector : BaseVector). - - Lemma decode'_truncate : forall bs us, decode' bs us = decode' bs (firstn (length bs) us). - Proof using Type. - unfold decode'; intros; f_equal; apply combine_truncate_l. - Qed. - - Lemma decode'_splice : forall xs ys bs, - decode' bs (xs ++ ys) = - decode' (firstn (length xs) bs) xs + decode' (skipn (length xs) bs) ys. - Proof using Type. - unfold decode'. - induction xs; destruct ys, bs; boring. - + rewrite combine_truncate_r. - do 2 rewrite Z.add_0_r; auto. - + unfold accumulate. - apply Z.add_assoc. - Qed. - - Lemma add_rep : forall bs us vs, decode' bs (add us vs) = decode' bs us + decode' bs vs. - Proof using Type. - unfold decode', accumulate; induction bs; destruct us, vs; boring; ring. - Qed. - - Lemma decode_nil : forall bs, decode' bs nil = 0. - Proof using Type. - - auto. - Qed. - Hint Rewrite decode_nil. - - Lemma decode_base_nil : forall us, decode' nil us = 0. - Proof using Type. - intros; rewrite decode'_truncate; auto. - Qed. - - Hint Rewrite decode_base_nil. - - Lemma mul_each_rep : forall bs u vs, - decode' bs (mul_each u vs) = u * decode' bs vs. - Proof using Type. - unfold decode', accumulate; induction bs; destruct vs; boring; ring. - Qed. - - Lemma base_eq_1cons: base = 1 :: skipn 1 base. - Proof using Type*. - pose proof (b0_1 0) as H. - destruct base; compute in H; try discriminate; boring. - Qed. - - Lemma decode'_cons : forall x1 x2 xs1 xs2, - decode' (x1 :: xs1) (x2 :: xs2) = x1 * x2 + decode' xs1 xs2. - Proof using Type. - unfold decode', accumulate; boring; ring. - Qed. - Hint Rewrite decode'_cons. - - Lemma decode_cons : forall x us, - decode base (x :: us) = x + decode base (0 :: us). - Proof using Type*. - unfold decode; intros. - rewrite base_eq_1cons. - autorewrite with core; ring_simplify; auto. - Qed. - - Lemma decode'_map_mul : forall v xs bs, - decode' (map (Z.mul v) bs) xs = - Z.mul v (decode' bs xs). - Proof using Type. - unfold decode'. - induction xs; destruct bs; boring. - unfold accumulate; simpl; nia. - Qed. - - Lemma decode_map_mul : forall v xs, - decode (map (Z.mul v) base) xs = - Z.mul v (decode base xs). - Proof using Type. - unfold decode; intros; apply decode'_map_mul. - Qed. - - Lemma sub_rep : forall bs us vs, decode' bs (sub us vs) = decode' bs us - decode' bs vs. - Proof using Type. - induction bs; destruct us; destruct vs; boring; ring. - Qed. - - Lemma nth_default_base_nonzero : forall d, d <> 0 -> - forall i, nth_default d base i <> 0. - Proof using Type*. - intros. - rewrite nth_default_eq. - destruct (nth_in_or_default i base d). - + auto using Z.positive_is_nonzero, base_positive. - + congruence. - Qed. - - Lemma nth_default_base_pos : forall d, 0 < d -> - forall i, 0 < nth_default d base i. - Proof using Type*. - intros. - rewrite nth_default_eq. - destruct (nth_in_or_default i base d). - + apply Z.gt_lt; auto using base_positive. - + congruence. - Qed. - - Lemma mul_each_base : forall us bs c, - decode' bs (mul_each c us) = decode' (mul_each c bs) us. - Proof using Type. - induction us; destruct bs; boring; ring. - Qed. - - Hint Rewrite (@nth_default_nil Z). - Hint Rewrite (@firstn_nil Z). - Hint Rewrite (@skipn_nil Z). - - Lemma base_app : forall us low high, - decode' (low ++ high) us = decode' low (firstn (length low) us) + decode' high (skipn (length low) us). - Proof using Type. - induction us; destruct low; boring. - Qed. - - Lemma base_mul_app : forall low c us, - decode' (low ++ mul_each c low) us = decode' low (firstn (length low) us) + - c * decode' low (skipn (length low) us). - Proof using Type. - intros. - rewrite base_app; f_equal. - rewrite <- mul_each_rep. - rewrite mul_each_base. - reflexivity. - Qed. - - Lemma zeros_rep : forall bs n, decode' bs (zeros n) = 0. - Proof using Type. - - induction bs; destruct n; boring. - Qed. - Lemma length_zeros : forall n, length (zeros n) = n. - Proof using Type. - - induction n; boring. - Qed. - Hint Rewrite length_zeros. - - Lemma app_zeros_zeros : forall n m, zeros n ++ zeros m = zeros (n + m)%nat. - Proof using Type. - induction n; boring. - Qed. - Hint Rewrite app_zeros_zeros. - - Lemma zeros_app0 : forall m, zeros m ++ 0 :: nil = zeros (S m). - Proof using Type. - induction m; boring. - Qed. - Hint Rewrite zeros_app0. - - Lemma nth_default_zeros : forall n i, nth_default 0 (BaseSystem.zeros n) i = 0. - Proof using Type. - induction n; intros; [ cbv [BaseSystem.zeros]; apply nth_default_nil | ]. - rewrite <-zeros_app0, nth_default_app. - rewrite length_zeros. - destruct (lt_dec i n); auto. - destruct (eq_nat_dec i n); subst. - + rewrite Nat.sub_diag; apply nth_default_cons. - + apply nth_default_out_of_bounds. - cbv [length]; omega. - Qed. - - Lemma rev_zeros : forall n, rev (zeros n) = zeros n. - Proof using Type. - induction n; boring. - Qed. - Hint Rewrite rev_zeros. - - Hint Unfold nth_default. - - Lemma decode_single : forall n bs x, - decode' bs (zeros n ++ x :: nil) = nth_default 0 bs n * x. - Proof using Type. - induction n; destruct bs; boring. - Qed. - Hint Rewrite decode_single. - - Lemma peel_decode : forall xs ys x y, decode' (x::xs) (y::ys) = x*y + decode' xs ys. - Proof using Type. - boring. - Qed. - Hint Rewrite zeros_rep peel_decode. - - Lemma decode_Proper : Proper (Logic.eq ==> (Forall2 Logic.eq) ==> Logic.eq) decode'. - Proof using Type. - repeat intro; subst. - revert y y0 H0; induction x0; intros. - + inversion H0. rewrite !decode_nil. - reflexivity. - + inversion H0; subst. - destruct y as [|y0 y]; [rewrite !decode_base_nil; reflexivity | ]. - specialize (IHx0 y _ H4). - rewrite !peel_decode. - f_equal; auto. - Qed. - - Lemma decode_highzeros : forall xs bs n, decode' bs (xs ++ zeros n) = decode' bs xs. - Proof using Type. - induction xs; destruct bs; boring. - Qed. - - Lemma mul_bi'_zeros : forall n m, mul_bi' base n (zeros m) = zeros m. - Proof using Type. - - induction m; boring. - Qed. - Hint Rewrite mul_bi'_zeros. - - Lemma nth_error_base_nonzero : forall n x, - nth_error base n = Some x -> x <> 0. - Proof using Type*. - eauto using (@nth_error_value_In Z), Z.gt0_neq0, base_positive. - Qed. - - Hint Rewrite plus_0_r. - - Lemma mul_bi_single : forall m n x, - (n + m < length base)%nat -> - decode base (mul_bi base n (zeros m ++ x :: nil)) = nth_default 0 base m * x * nth_default 0 base n. - Proof using Type*. - unfold mul_bi, decode. - destruct m; simpl; simpl_list; simpl; intros. { - pose proof nth_error_base_nonzero as nth_nonzero. - case_eq base; [intros; boring | intros z l base_eq]. - specialize (b0_1 0); intro b0_1'. - rewrite base_eq in *. - rewrite nth_default_cons in b0_1'. - rewrite b0_1' in *. - unfold crosscoef. - autounfold; autorewrite with core. - unfold nth_default. - nth_tac. - rewrite Z.mul_1_r. - rewrite Z_div_same_full. - destruct x; ring. - eapply nth_nonzero; eauto. - } { - ssimpl_list. - autorewrite with core. - rewrite app_assoc. - autorewrite with core. - unfold crosscoef; simpl; ring_simplify. - rewrite Nat.add_1_r. - rewrite base_good by auto. - rewrite Z_div_mult by (apply base_positive; rewrite nth_default_eq; apply nth_In; auto). - rewrite <- Z.mul_assoc. - rewrite <- Z.mul_comm. - rewrite <- Z.mul_assoc. - rewrite <- Z.mul_assoc. - destruct (Z.eq_dec x 0); subst; try ring. - rewrite Z.mul_cancel_l by auto. - rewrite <- base_good by auto. - ring. - } - Qed. - - Lemma set_higher' : forall vs x, vs++x::nil = vs .+ (zeros (length vs) ++ x :: nil). - Proof using Type. - - induction vs; boring; f_equal; ring. - Qed. - - Lemma set_higher : forall bs vs x, - decode' bs (vs++x::nil) = decode' bs vs + nth_default 0 bs (length vs) * x. - Proof using Type. - intros. - rewrite set_higher'. - rewrite add_rep. - f_equal. - apply decode_single. - Qed. - - Lemma zeros_plus_zeros : forall n, zeros n = zeros n .+ zeros n. - Proof using Type. - - induction n; auto. - simpl; f_equal; auto. - Qed. - - Lemma mul_bi'_n_nil : forall n, mul_bi' base n nil = nil. - Proof using Type. - unfold mul_bi; auto. - Qed. - Hint Rewrite mul_bi'_n_nil. - - Lemma add_nil_l : forall us, nil .+ us = us. - Proof using Type. - - induction us; auto. - Qed. - Hint Rewrite add_nil_l. - - Lemma add_nil_r : forall us, us .+ nil = us. - Proof using Type. - - induction us; auto. - Qed. - Hint Rewrite add_nil_r. - - Lemma add_first_terms : forall us vs a b, - (a :: us) .+ (b :: vs) = (a + b) :: (us .+ vs). - Proof using Type. - - auto. - Qed. - Hint Rewrite add_first_terms. - - Lemma mul_bi'_cons : forall n x us, - mul_bi' base n (x :: us) = x * crosscoef base n (length us) :: mul_bi' base n us. - Proof using Type. - unfold mul_bi'; auto. - Qed. - - Lemma add_same_length : forall us vs l, (length us = l) -> (length vs = l) -> - length (us .+ vs) = l. - Proof using Type. - induction us, vs; boring. - erewrite (IHus vs (pred l)); boring. - Qed. - - Hint Rewrite app_nil_l. - Hint Rewrite app_nil_r. - - Lemma add_snoc_same_length : forall l us vs a b, - (length us = l) -> (length vs = l) -> - (us ++ a :: nil) .+ (vs ++ b :: nil) = (us .+ vs) ++ (a + b) :: nil. - Proof using Type. - induction l, us, vs; boring; discriminate. - Qed. - - Lemma mul_bi'_add : forall us n vs l - (Hlus: length us = l) - (Hlvs: length vs = l), - mul_bi' base n (rev (us .+ vs)) = - mul_bi' base n (rev us) .+ mul_bi' base n (rev vs). - Proof using Type. - (* TODO(adamc): please help prettify this *) - induction us using rev_ind; - try solve [destruct vs; boring; congruence]. - destruct vs using rev_ind; boring; clear IHvs; simpl_list. - erewrite (add_snoc_same_length (pred l) us vs _ _); simpl_list. - repeat rewrite mul_bi'_cons; rewrite add_first_terms; simpl_list. - rewrite (IHus n vs (pred l)). - replace (length us) with (pred l). - replace (length vs) with (pred l). - rewrite (add_same_length us vs (pred l)). - f_equal; ring. - - erewrite length_snoc; eauto. - erewrite length_snoc; eauto. - erewrite length_snoc; eauto. - erewrite length_snoc; eauto. - erewrite length_snoc; eauto. - erewrite length_snoc; eauto. - erewrite length_snoc; eauto. - erewrite length_snoc; eauto. - Qed. - - Lemma zeros_cons0 : forall n, 0 :: zeros n = zeros (S n). - Proof using Type. - - auto. - Qed. - - Lemma add_leading_zeros : forall n us vs, - (zeros n ++ us) .+ (zeros n ++ vs) = zeros n ++ (us .+ vs). - Proof using Type. - induction n; boring. - Qed. - - Lemma rev_add_rev : forall us vs l, (length us = l) -> (length vs = l) -> - (rev us) .+ (rev vs) = rev (us .+ vs). - Proof using Type. - induction us, vs; boring; try solve [subst; discriminate]. - rewrite (add_snoc_same_length (pred l) _ _ _ _) by (subst; simpl_list; omega). - rewrite (IHus vs (pred l)) by omega; auto. - Qed. - Hint Rewrite rev_add_rev. - - Lemma mul_bi'_length : forall us n, length (mul_bi' base n us) = length us. - Proof using Type. - induction us, n; boring. - Qed. - Hint Rewrite mul_bi'_length. - - Lemma add_comm : forall us vs, us .+ vs = vs .+ us. - Proof using Type. - induction us, vs; boring; f_equal; auto. - Qed. - - Hint Rewrite rev_length. - - Lemma mul_bi_add_same_length : forall n us vs l, - (length us = l) -> (length vs = l) -> - mul_bi base n (us .+ vs) = mul_bi base n us .+ mul_bi base n vs. - Proof using Type. - unfold mul_bi; boring. - rewrite add_leading_zeros. - erewrite mul_bi'_add; boring. - erewrite rev_add_rev; boring. - Qed. - - Lemma add_zeros_same_length : forall us, us .+ (zeros (length us)) = us. - Proof using Type. - induction us; boring; f_equal; omega. - Qed. - - Hint Rewrite add_zeros_same_length. - Hint Rewrite minus_diag. - - Lemma add_trailing_zeros : forall us vs, (length us >= length vs)%nat -> - us .+ vs = us .+ (vs ++ (zeros (length us - length vs)%nat)). - Proof using Type. - induction us, vs; boring; f_equal; boring. - Qed. - - Lemma length_add_ge : forall us vs, (length us >= length vs)%nat -> - (length (us .+ vs) <= length us)%nat. - Proof using Type. - intros. - rewrite add_trailing_zeros by trivial. - erewrite add_same_length by (pose proof app_length; boring); omega. - Qed. - - Lemma add_length_le_max : forall us vs, - (length (us .+ vs) <= max (length us) (length vs))%nat. - Proof using Type. - intros; case_max; (rewrite add_comm; apply length_add_ge; omega) || - (apply length_add_ge; omega) . - Qed. - - Lemma sub_nil_length: forall us : digits, length (sub nil us) = length us. - Proof using Type. - induction us; boring. - Qed. - - Lemma sub_length : forall us vs, - (length (sub us vs) = max (length us) (length vs))%nat. - Proof using Type. - induction us, vs; boring. - rewrite sub_nil_length; auto. - Qed. - - Lemma mul_bi_length : forall us n, length (mul_bi base n us) = (length us + n)%nat. - Proof using Type. - pose proof mul_bi'_length; unfold mul_bi. - destruct us; repeat progress (simpl_list; boring). - Qed. - Hint Rewrite mul_bi_length. - - Lemma mul_bi_trailing_zeros : forall m n us, - mul_bi base n us ++ zeros m = mul_bi base n (us ++ zeros m). - Proof using Type. - unfold mul_bi. - induction m; intros; try solve [boring]. - rewrite <- zeros_app0. - rewrite app_assoc. - repeat progress (boring; rewrite rev_app_distr). - Qed. - - Lemma mul_bi_add_longer : forall n us vs, - (length us >= length vs)%nat -> - mul_bi base n (us .+ vs) = mul_bi base n us .+ mul_bi base n vs. - Proof using Type. - boring. - rewrite add_trailing_zeros by auto. - rewrite (add_trailing_zeros (mul_bi base n us) (mul_bi base n vs)) - by (repeat (rewrite mul_bi_length); omega). - erewrite mul_bi_add_same_length by - (eauto; simpl_list; rewrite length_zeros; omega). - rewrite mul_bi_trailing_zeros. - repeat (f_equal; boring). - Qed. - - Lemma mul_bi_add : forall n us vs, - mul_bi base n (us .+ vs) = (mul_bi base n us) .+ (mul_bi base n vs). - Proof using Type. - intros; pose proof mul_bi_add_longer. - destruct (le_ge_dec (length us) (length vs)). { - rewrite add_comm. - rewrite (add_comm (mul_bi base n us)). - boring. - } { - boring. - } - Qed. - - Lemma mul_bi_rep : forall i vs, - (i + length vs < length base)%nat -> - decode base (mul_bi base i vs) = decode base vs * nth_default 0 base i. - Proof using Type*. - unfold decode. - induction vs using rev_ind; intros; try solve [unfold mul_bi; boring]. - assert (i + length vs < length base)%nat by - (rewrite app_length in *; boring). - - rewrite set_higher. - ring_simplify. - rewrite <- IHvs by auto; clear IHvs. - rewrite <- mul_bi_single by auto. - rewrite <- add_rep. - rewrite <- mul_bi_add. - rewrite set_higher'. - auto. - Qed. - - Local Notation mul' := (mul' base). - Local Notation mul := (mul base). - - Lemma mul'_rep : forall us vs, - (length us + length vs <= length base)%nat -> - decode base (mul' (rev us) vs) = decode base us * decode base vs. - Proof using Type*. - unfold decode. - induction us using rev_ind; boring. - - assert (length us + length vs < length base)%nat by - (rewrite app_length in *; boring). - - ssimpl_list. - rewrite add_rep. - boring. - rewrite set_higher. - rewrite mul_each_rep. - rewrite mul_bi_rep by auto. - unfold decode; ring. - Qed. - - Lemma mul_rep : forall us vs, - (length us + length vs <= length base)%nat -> - decode base (mul us vs) = decode base us * decode base vs. - Proof using Type*. - exact mul'_rep. - Qed. - - Lemma mul'_length: forall us vs, - (length (mul' us vs) <= length us + length vs)%nat. - Proof using Type. - pose proof add_length_le_max. - induction us; boring. - unfold mul_each. - simpl_list; case_max; boring; omega. - Qed. - - Lemma mul_length: forall us vs, - (length (mul us vs) <= length us + length vs)%nat. - Proof using Type. - intros; unfold BaseSystem.mul. - rewrite mul'_length. - rewrite rev_length; omega. - Qed. - - Lemma add_length_exact : forall us vs, - length (us .+ vs) = max (length us) (length vs). - Proof using Type. - induction us; destruct vs; boring. - Qed. - - Hint Rewrite add_length_exact : distr_length. - - Lemma mul'_length_exact_full: forall us vs, - (length (mul' us vs) = match length us with - | 0 => 0%nat - | _ => pred (length us + length vs) - end)%nat. - Proof using Type. - induction us; intros; try solve [boring]. - unfold BaseSystem.mul'; fold mul'. - unfold mul_each. - rewrite add_length_exact, map_length, mul_bi_length, length_cons. - destruct us. - + rewrite Max.max_0_r. simpl; omega. - + rewrite Max.max_l; [ omega | ]. - rewrite IHus by ( congruence || simpl in *; omega). - simpl; omega. - Qed. - - Hint Rewrite mul'_length_exact_full : distr_length. - - (* TODO(@jadephilipoom, from jgross): one of these conditions isn't - needed. Should it be dropped, or was there a reason to keep it? *) - Lemma mul'_length_exact: forall us vs, - (length us <= length vs)%nat -> us <> nil -> - (length (mul' us vs) = pred (length us + length vs))%nat. - Proof using Type. - intros; rewrite mul'_length_exact_full; destruct us; simpl; congruence. - Qed. - - Lemma mul_length_exact_full: forall us vs, - (length (mul us vs) = match length us with - | 0 => 0 - | _ => pred (length us + length vs) - end)%nat. - Proof using Type. - intros; unfold BaseSystem.mul; autorewrite with distr_length; reflexivity. - Qed. - - Hint Rewrite mul_length_exact_full : distr_length. - - (* TODO(@jadephilipoom, from jgross): one of these conditions isn't - needed. Should it be dropped, or was there a reason to keep it? *) - Lemma mul_length_exact: forall us vs, - (length us <= length vs)%nat -> us <> nil -> - (length (mul us vs) = pred (length us + length vs))%nat. - Proof using Type. - intros; unfold BaseSystem.mul. - rewrite mul'_length_exact; rewrite ?rev_length; try omega. - intro rev_nil. - match goal with H : us <> nil |- _ => apply H end. - apply length0_nil; rewrite <-rev_length, rev_nil. - reflexivity. - Qed. - Definition encode'_zero z max : encode' base z max 0%nat = nil := eq_refl. - Definition encode'_succ z max i : encode' base z max (S i) = - encode' base z max i ++ ((z mod (nth_default max base (S i))) / (nth_default max base i)) :: nil := eq_refl. - Opaque encode'. - Hint Resolve encode'_zero encode'_succ. - - Lemma encode'_length : forall z max i, length (encode' base z max i) = i. - Proof using Type. - induction i; auto. - rewrite encode'_succ, app_length, IHi. - cbv [length]. - omega. - Qed. - - (* States that each element of the base is a positive integer multiple of the previous - element, and that max is a positive integer multiple of the last element. Ideally this - would have a better name. *) - Definition base_max_succ_divide max := forall i, (S i <= length base)%nat -> - Z.divide (nth_default max base i) (nth_default max base (S i)). - - Lemma encode'_spec : forall z max, 0 < max -> - base_max_succ_divide max -> forall i, (i <= length base)%nat -> - decode' base (encode' base z max i) = z mod (nth_default max base i). - Proof using Type*. - induction i; intros. - + rewrite encode'_zero, b0_1, Z.mod_1_r. - apply decode_nil. - + rewrite encode'_succ, set_higher. - rewrite IHi by omega. - rewrite encode'_length, (Z.add_comm (z mod nth_default max base i)). - replace (nth_default 0 base i) with (nth_default max base i) by - (rewrite !nth_default_eq; apply nth_indep; omega). - match goal with H1 : base_max_succ_divide _, H2 : (S i <= length base)%nat, H3 : 0 < max |- _ => - specialize (H1 i H2); - rewrite (Znumtheory.Zmod_div_mod _ _ _ (nth_default_base_pos _ H _) - (nth_default_base_pos _ H _) H0) end. - rewrite <-Z.div_mod by (apply Z.positive_is_nonzero, Z.lt_gt; auto using nth_default_base_pos). - reflexivity. - Qed. - - Lemma encode_rep : forall z max, 0 <= z < max -> - base_max_succ_divide max -> decode base (encode base z max) = z. - Proof using Type*. - unfold encode; intros. - rewrite encode'_spec, nth_default_out_of_bounds by (omega || auto). - apply Z.mod_small; omega. - Qed. - -End BaseSystemProofs. - -Hint Rewrite @add_length_exact @mul'_length_exact_full @mul_length_exact_full @encode'_length @sub_length : distr_length. - -Section MultiBaseSystemProofs. - Context base0 (base_vector0 : @BaseVector base0) base1 (base_vector1 : @BaseVector base1). - - Lemma decode_short_initial : forall (us : digits), - (firstn (length us) base0 = firstn (length us) base1) - -> decode base0 us = decode base1 us. - Proof using Type. - intros us H. - unfold decode, decode'. - rewrite (combine_truncate_r us base0), (combine_truncate_r us base1), H. - reflexivity. - Qed. - - Lemma mul_rep_two_base : forall (us vs : digits), - (length us + length vs <= length base1)%nat - -> firstn (length us) base0 = firstn (length us) base1 - -> firstn (length vs) base0 = firstn (length vs) base1 - -> (decode base0 us) * (decode base0 vs) = decode base1 (mul base1 us vs). - Proof using base_vector1. - intros. - rewrite mul_rep by trivial. - apply f_equal2; apply decode_short_initial; assumption. - Qed. - -End MultiBaseSystemProofs. |