2014-11-19 01:57:17 +00:00
|
|
|
import logic data.nat
|
|
|
|
open eq.ops nat
|
|
|
|
|
|
|
|
inductive tree (A : Type) :=
|
|
|
|
leaf : A → tree A,
|
|
|
|
node : tree A → tree A → tree A
|
|
|
|
|
|
|
|
namespace tree
|
|
|
|
|
|
|
|
definition height {A : Type} (t : tree A) : nat :=
|
2015-02-11 20:49:27 +00:00
|
|
|
tree.rec_on t
|
2014-11-19 01:57:17 +00:00
|
|
|
(λ a, zero)
|
|
|
|
(λ t₁ t₂ h₁ h₂, succ (max h₁ h₂))
|
|
|
|
|
|
|
|
definition height_lt {A : Type} : tree A → tree A → Prop :=
|
|
|
|
inv_image lt (@height A)
|
|
|
|
|
|
|
|
definition height_lt.wf (A : Type) : well_founded (@height_lt A) :=
|
|
|
|
inv_image.wf height lt.wf
|
|
|
|
|
|
|
|
theorem height_lt.node_left {A : Type} (t₁ t₂ : tree A) : height_lt t₁ (node t₁ t₂) :=
|
2014-11-30 23:07:09 +00:00
|
|
|
lt_succ_of_le (max.left (height t₁) (height t₂))
|
2014-11-19 01:57:17 +00:00
|
|
|
|
|
|
|
theorem height_lt.node_right {A : Type} (t₁ t₂ : tree A) : height_lt t₂ (node t₁ t₂) :=
|
2014-11-30 23:07:09 +00:00
|
|
|
lt_succ_of_le (max.right (height t₁) (height t₂))
|
2014-11-19 01:57:17 +00:00
|
|
|
|
|
|
|
theorem height_lt.trans {A : Type} : transitive (@height_lt A) :=
|
2014-11-22 08:15:51 +00:00
|
|
|
inv_image.trans lt height @lt.trans
|
2014-11-19 01:57:17 +00:00
|
|
|
|
|
|
|
example : height_lt (leaf 2) (node (leaf 1) (leaf 2)) :=
|
|
|
|
!height_lt.node_right
|
|
|
|
|
|
|
|
example : height_lt (leaf 2) (node (node (leaf 1) (leaf 2)) (leaf 3)) :=
|
|
|
|
height_lt.trans !height_lt.node_right !height_lt.node_left
|
|
|
|
|
|
|
|
end tree
|