(* *)
(**************************************************************************)
-set "baseuri" "cic:/matita/nat/exp".
-
include "nat/div_and_mod.ma".
include "nat/lt_arith.ma".
[ O \Rightarrow (S O)
| (S p) \Rightarrow (times n (exp n p)) ].
-interpretation "natural exponent" 'exp a b = (cic:/matita/nat/exp/exp.con a b).
+interpretation "natural exponent" 'exp a b = (exp a b).
theorem exp_plus_times : \forall n,p,q:nat.
n \sup (p + q) = (n \sup p) * (n \sup q).
intro.simplify.rewrite < times_n_SO.reflexivity.
qed.
+theorem exp_SO_n : \forall n:nat. S O = (S O) \sup n.
+intro.elim n
+ [reflexivity
+ |simplify.rewrite < plus_n_O.assumption
+ ]
+qed.
+
+theorem exp_SSO: \forall n. exp n (S(S O)) = n*n.
+intro.simplify.
+rewrite < times_n_SO.
+reflexivity.
+qed.
+
theorem exp_exp_times : \forall n,p,q:nat.
(n \sup p) \sup q = n \sup (p * q).
intros.
]
]
qed.
-
+
theorem lt_exp: \forall n,m,p:nat. S O < p \to n < m \to exp p n < exp p m.
apply nat_elim2
[intros.
]
qed.
+theorem lt_exp1: \forall n,m,p:nat. O < p \to n < m \to exp n p < exp m p.
+intros.
+elim H
+ [rewrite < exp_n_SO.rewrite < exp_n_SO.assumption
+ |simplify.
+ apply lt_times;assumption
+ ]
+qed.
+
+theorem le_exp_to_le:
+\forall a,n,m. S O < a \to exp a n \le exp a m \to n \le m.
+intro.
+apply nat_elim2;intros
+ [apply le_O_n
+ |apply False_ind.
+ apply (le_to_not_lt ? ? H1).
+ simplify.
+ rewrite > times_n_SO.
+ apply lt_to_le_to_lt_times
+ [assumption
+ |apply lt_O_exp.apply lt_to_le.assumption
+ |apply lt_O_exp.apply lt_to_le.assumption
+ ]
+ |simplify in H2.
+ apply le_S_S.
+ apply H
+ [assumption
+ |apply (le_times_to_le a)
+ [apply lt_to_le.assumption|assumption]
+ ]
+ ]
+qed.
+
+theorem le_exp_to_le1 : \forall n,m,p.O < p \to exp n p \leq exp m p \to n \leq m.
+intros;apply not_lt_to_le;intro;apply (lt_to_not_le ? ? ? H1);
+apply lt_exp1;assumption.
+qed.
-
+theorem lt_exp_to_lt:
+\forall a,n,m. S O < a \to exp a n < exp a m \to n < m.
+intros.
+elim (le_to_or_lt_eq n m)
+ [assumption
+ |apply False_ind.
+ apply (lt_to_not_eq ? ? H1).
+ rewrite < H2.
+ reflexivity
+ |apply (le_exp_to_le a)
+ [assumption
+ |apply lt_to_le.
+ assumption
+ ]
+ ]
+qed.
+
+theorem lt_exp_to_lt1:
+\forall a,n,m. O < a \to exp n a < exp m a \to n < m.
+intros.
+elim (le_to_or_lt_eq n m)
+ [assumption
+ |apply False_ind.
+ apply (lt_to_not_eq ? ? H1).
+ rewrite < H2.
+ reflexivity
+ |apply (le_exp_to_le1 ? ? a)
+ [assumption
+ |apply lt_to_le.
+ assumption
+ ]
+ ]
+qed.
+
+theorem times_exp:
+\forall n,m,p. exp n p * exp m p = exp (n*m) p.
+intros.elim p
+ [simplify.reflexivity
+ |simplify.
+ rewrite > assoc_times.
+ rewrite < assoc_times in ⊢ (? ? (? ? %) ?).
+ rewrite < sym_times in ⊢ (? ? (? ? (? % ?)) ?).
+ rewrite > assoc_times in ⊢ (? ? (? ? %) ?).
+ rewrite < assoc_times.
+ rewrite < H.
+ reflexivity
+ ]
+qed.
+
+theorem monotonic_exp1: \forall n.
+monotonic nat le (\lambda x.(exp x n)).
+unfold monotonic. intros.
+simplify.elim n
+ [apply le_n
+ |simplify.
+ apply le_times;assumption
+ ]
+qed.
+
\ No newline at end of file