Advertisement
Guest User

Untitled

a guest
Jul 5th, 2015
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.88 KB | None | 0 0
  1.  
  2. module _ (A : Set) where
  3.  
  4. open import Data.Empty
  5. open import Data.List hiding ([_])
  6. open import Data.Nat
  7. open import Data.Product renaming (map to productMap)
  8. open import Data.Sum renaming (map to sumMap)
  9. open import Data.Unit
  10. open import Function
  11. open import Relation.Binary.PropositionalEquality hiding (preorder; [_])
  12. open import Relation.Nullary
  13.  
  14. open import Data.List.Properties using (length-++; ∷-injective)
  15. open import Data.Nat.Properties.Simple using (+-suc)
  16.  
  17. data Tree : Set where
  18. leaf : Tree
  19. node : (x : A) (l r : Tree) → Tree
  20.  
  21. data InTree (x : A) : Tree → Set where
  22. here : ∀ {l r} → InTree x (node x l r)
  23. left : ∀ {y l r} → InTree x l → InTree x (node y l r)
  24. right : ∀ {y l r} → InTree x r → InTree x (node y l r)
  25.  
  26. data InList (x : A) : List A → Set where
  27. here : ∀ {xs} → InList x (x ∷ xs)
  28. there : ∀ {y xs} → InList x xs → InList x (y ∷ xs)
  29.  
  30. inOrder : Tree → List A
  31. inOrder leaf = []
  32. inOrder (node x l r) = inOrder l ++ x ∷ inOrder r
  33.  
  34. preOrder : Tree → List A
  35. preOrder leaf = []
  36. preOrder (node x l r) = x ∷ preOrder l ++ preOrder r
  37.  
  38. -- Disjointness
  39. DisjLists : List A → List A → Set
  40. DisjLists xs ys = ∀ {x} → InList x xs → ¬ InList x ys
  41.  
  42. DisjTrees : Tree → Tree → Set
  43. DisjTrees t t' = ∀ {x} → InTree x t → ¬ InTree x t'
  44.  
  45. NoDupList : List A → Set
  46. NoDupList [] = ⊤
  47. NoDupList (x ∷ xs) = ¬ InList x xs × NoDupList xs
  48.  
  49. -- A tree is nodup if its subtrees are disjoint and nodup and the root
  50. -- value is not in the subtrees
  51. NoDupTree : Tree → Set
  52. NoDupTree leaf = ⊤
  53. NoDupTree (node x l r) =
  54. ¬ InTree x l × ¬ InTree x r × NoDupTree l × NoDupTree r × DisjTrees l r
  55.  
  56. infixr 5 _^++_ _++^_
  57. _^++_ : ∀ {x xs} ys → InList x xs → InList x (ys ++ xs)
  58. [] ^++ e = e
  59. (_ ∷ ys) ^++ e = there (ys ^++ e)
  60.  
  61. _++^_ : ∀ {x xs} → InList x xs → ∀ ys → InList x (xs ++ ys)
  62. here ++^ ys = here
  63. there e ++^ ys = there (e ++^ ys)
  64.  
  65. listSplit : ∀ {x} xs {ys} → InList x (xs ++ ys) → InList x xs ⊎ InList x ys
  66. listSplit [] here = inj₂ here
  67. listSplit (_ ∷ _) here = inj₁ here
  68. listSplit [] (there e) = sumMap (λ ()) (λ _ → there e) $ listSplit [] e
  69. listSplit (_ ∷ xs) (there e) = sumMap there id $ listSplit xs e
  70.  
  71. InI⇒InT : ∀ {x} t → InList x (inOrder t) → InTree x t
  72. InI⇒InT leaf ()
  73. InI⇒InT (node x l r) e with listSplit (inOrder l) e
  74. ... | inj₁ el = left (InI⇒InT l el)
  75. ... | inj₂ here = here
  76. ... | inj₂ (there er) = right (InI⇒InT r er)
  77.  
  78. InP⇒InT : ∀ {x} t → InList x (preOrder t) → InTree x t
  79. InP⇒InT leaf ()
  80. InP⇒InT (node _ _ _) here = here
  81. InP⇒InT (node x l r) (there e) =
  82. [ left ∘ InP⇒InT l , right ∘ InP⇒InT r ] (listSplit (preOrder l) e)
  83.  
  84. InT⇒InP : ∀ {x} t → InTree x t → InList x (preOrder t)
  85. InT⇒InP leaf ()
  86. InT⇒InP (node x l r) here = here
  87. InT⇒InP (node x l r) (left p) = there (InT⇒InP l p ++^ preOrder r)
  88. InT⇒InP (node x l r) (right p) = there (preOrder l ^++ InT⇒InP r p)
  89.  
  90. ND++ : ∀ xs ys → NoDupList xs → NoDupList ys → DisjLists xs ys → NoDupList (xs ++ ys)
  91. ND++ [] _ _ pys _ = pys
  92. ND++ (_ ∷ xs) ys (px , pxs) pys disj =
  93. ([ px , disj here ] ∘ listSplit xs) , ND++ _ _ pxs pys (disj ∘ there)
  94.  
  95. NDSplit : ∀ xs {ys} → NoDupList (xs ++ ys) → NoDupList xs × NoDupList ys × DisjLists xs ys
  96. NDSplit [] p = tt , p , (λ ())
  97. NDSplit (x ∷ xs) {ys} (px , pxs) with NDSplit xs pxs
  98. ... | ndxs , ndys , disj = (px ∘ flip _++^_ ys , ndxs) , ndys , disj'
  99. where
  100. disj' : DisjLists (x ∷ xs) ys
  101. disj' here e' = px (xs ^++ e')
  102. disj' (there e) e' = disj e e'
  103.  
  104. NDT⇒NDI : ∀ t → NoDupTree t → NoDupList (inOrder t)
  105. NDT⇒NDI leaf _ = tt
  106. NDT⇒NDI (node x l r) (pxl , pxr , pl , pr , disj) =
  107. ND++ _ _ (NDT⇒NDI l pl) (pxr ∘ InI⇒InT r , NDT⇒NDI r pr) disj'
  108. where
  109. disj' : DisjLists (inOrder l) (x ∷ inOrder r)
  110. disj' e here = pxl (InI⇒InT l e)
  111. disj' e (there e') = disj (InI⇒InT l e) (InI⇒InT r e')
  112.  
  113. NDT⇒NDP : ∀ t → NoDupTree t → NoDupList (preOrder t)
  114. NDT⇒NDP leaf _ = tt
  115. NDT⇒NDP (node _ l r) (pxl , pxr , pl , pr , disj) =
  116. ([ pxl ∘ InP⇒InT l , pxr ∘ InP⇒InT r ] ∘ listSplit (preOrder l))
  117. ,
  118. (ND++ _ _ (NDT⇒NDP l pl) (NDT⇒NDP r pr) (λ e e' → disj (InP⇒InT l e) (InP⇒InT r e')))
  119.  
  120. NDP⇒NDT : ∀ t → NoDupList (preOrder t) → NoDupTree t
  121. NDP⇒NDT leaf p = tt
  122. NDP⇒NDT (node x l r) (px , plr) with NDSplit (preOrder l) plr
  123. ... | pl , pr , disj =
  124. (λ e → px (InT⇒InP l e ++^ preOrder r)) ,
  125. (λ e → px (preOrder l ^++ InT⇒InP r e)) ,
  126. NDP⇒NDT l pl ,
  127. NDP⇒NDT r pr ,
  128. (λ e e' → disj (InT⇒InP l e) (InT⇒InP r e'))
  129.  
  130. NDInsert :
  131. ∀ {x} xs xs' {ys ys'}
  132. → NoDupList (xs ++ x ∷ ys)
  133. → NoDupList (xs' ++ x ∷ ys')
  134. → (xs ++ x ∷ ys) ≡ (xs' ++ x ∷ ys')
  135. → xs ≡ xs' × ys ≡ ys'
  136. NDInsert [] [] _ _ p = refl , (proj₂ $ ∷-injective p)
  137. NDInsert [] (_ ∷ xs') _ (px , _) p rewrite proj₁ $ ∷-injective p = ⊥-elim (px (xs' ^++ here))
  138. NDInsert (_ ∷ xs) [] (px , _) _ p rewrite proj₁ $ ∷-injective p = ⊥-elim (px (xs ^++ here))
  139. NDInsert (_ ∷ xs) (x ∷ xs') (px , nda) (px' , ndb) p with ∷-injective p
  140. ... | eqx , p' rewrite eqx = productMap (cong (_∷_ x)) id $ NDInsert _ _ nda ndb p'
  141.  
  142. trav-length : ∀ t → length (inOrder t) ≡ length (preOrder t)
  143. trav-length leaf = refl
  144. trav-length (node x l r) rewrite
  145. length-++ (inOrder l) {x ∷ inOrder r}
  146. | length-++ (preOrder l) {preOrder r}
  147. | trav-length l
  148. | trav-length r
  149. | +-suc (length (preOrder l)) (length (preOrder r))
  150. = refl
  151.  
  152. ++-inj :
  153. {xs xs' ys ys' : List A}
  154. → xs ++ ys ≡ xs' ++ ys' → length xs ≡ length xs'
  155. → xs ≡ xs' × ys ≡ ys'
  156. ++-inj {[]} {_ ∷ _} p1 ()
  157. ++-inj {_ ∷ _} {[]} p1 ()
  158. ++-inj {[]} {[]} p1 p2 = refl , p1
  159. ++-inj {_ ∷ _} {_ ∷ _} p1 p2 with ∷-injective p1
  160. ++-inj {x ∷ _} {.x ∷ _} _ p2 | refl , p1 =
  161. productMap (cong (_∷_ x)) id (++-inj p1 (cong pred p2))
  162.  
  163. travEq :
  164. ∀ t t'
  165. → NoDupTree t
  166. → preOrder t ≡ preOrder t'
  167. → inOrder t ≡ inOrder t'
  168. → t ≡ t'
  169. travEq leaf leaf _ _ _ = refl
  170. travEq leaf (node _ _ _) _ () _
  171. travEq (node _ _ _) leaf _ () _
  172. travEq (node x l r) (node x' l' r') ndt pre ino
  173.  
  174. -- Equality of root values
  175. with ∷-injective pre | ndt
  176. ... | px , pre' | pxl , pxr , pl , pr , disj
  177. rewrite sym px
  178.  
  179. -- Get "NoDupTree t'" proof
  180. with NDP⇒NDT (node x l' r') (subst NoDupList pre (NDT⇒NDP _ ndt))
  181. ... | ndt'
  182.  
  183. -- Equality of inorder subtree traversals
  184. with NDInsert (inOrder l) (inOrder l') (NDT⇒NDI _ ndt) (NDT⇒NDI _ ndt') ino
  185. ... | eqlI , eqrI
  186.  
  187. -- Equality of preorder subtree traversals
  188. with ++-inj {preOrder l}{preOrder l'} pre'
  189. (subst₂ _≡_ (trav-length l) (trav-length l') (cong length eqlI))
  190. ... | eqlP , eqrP
  191.  
  192. -- Finish
  193. rewrite
  194. travEq l l' pl eqlP eqlI
  195. | travEq r r' pr eqrP eqrI
  196. = refl
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement