Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions theories/Combi/ordtree.v
Original file line number Diff line number Diff line change
Expand Up @@ -273,3 +273,39 @@ exists (size f).-1.
have {eqmax} -> : (size f).-1.+1 = (size f) by case: f eqmax {alld1}.
by apply/all_pred1P/allP => /= t {}/alld1; rewrite depth_tree_eq1.
Qed.


Fixpoint line_ordtree n :=
if n is n0.+1 then OrdNode [:: line_ordtree n0] else OrdNode [::].

Lemma size_line_ordtree n : size_ordtree (line_ordtree n) = n.+1.
Proof. by elim: n => // n /= ->; rewrite addn0. Qed.
Lemma depth_line_ordtree n : depth_ordtree (line_ordtree n) = n.+1.
Proof. by elim: n => // n /= ->; rewrite maxn0. Qed.
Lemma depth_le_size t :
depth_ordtree t <= size_ordtree t
?= iff (t == line_ordtree (size_ordtree t).-1).
Proof.
have dlesz t1 : depth_ordtree t1 <= size_ordtree t1.
elim/indtree: t1 {t} => /=; elim=> [// |t f IHf Ht] /=.
have /Ht ledt : t \in t :: f by rewrite inE eqxx.
have {Ht} /IHf : forall t, t \in f -> depth_ordtree t <= size_ordtree t.
by move=> t0 t0in; apply: Ht; rewrite inE t0in orbT.
rewrite !ltnS -(leq_add2l (size_ordtree t)) => /(leq_trans _); apply.
by rewrite geq_max leq_addl andbT (leq_trans ledt) // leq_addr.
split; first exact: dlesz.
apply/eqP/eqP => [|->]; last by rewrite size_line_ordtree depth_line_ordtree.
elim/indtree: t => /= [[// | t f]] IHf [] Heq.
have /= := dlesz (OrdNode f); rewrite ltnS.
rewrite -(leq_add2l (size_ordtree t)) -Heq.
rewrite leq_max => /orP[]; first last.
by rewrite -{2}(add0n (foldr _ _ _)) leq_add2r leqNgt size_ordtree_pos.
move/leq_trans => /(_ _ (dlesz t)).
rewrite -{2}(addn0 (size_ordtree t)) leq_add2l leqn0 => H0.
move: Heq; have {H0} -> : f = [::].
case: f H0 {IHf} => //= t1 f.
by rewrite -leqn0 geq_max leqNgt depth_ordtree_pos.
rewrite /= maxn0 addn0 => /[dup] + ->.
have {}/IHf/[apply] : t \in t :: f by rewrite inE eqxx.
by case: size_ordtree (size_ordtree_pos t) => //= n _ ->.
Qed.
Loading