view RBTree.agda @ 2:7c9b8d601b77 default tip

fix deleteMin
author ryokka
date Thu, 30 May 2019 08:54:03 +0900
parents 7ed7c121d5b8
children
line wrap: on
line source

open import Level renaming (suc to succ ; zero to Zero )
module RBTree where

-- {
-- RBTree,
-- Node,
-- Color,
-- hight,
-- nulln,
-- empty,
-- singleton
-- }

open import Data.List
open import Data.Maybe
open import Data.Nat
open import Data.Bool
open import Data.Empty
open import Relation.Binary.PropositionalEquality
open import Relation.Binary
open import Relation.Binary.Core
open import Relation.Nullary
-- open import Level

-- Builtin Function

_==_ :  ℕ → ℕ → Bool
_==_ x y with compare x y
(x == .(ℕ.suc (x + k))) | less .x k = false
(x == .x) | equal .x = true
(.(ℕ.suc (y + k)) == y) | greater .y k = false

_-_ : ℕ → ℕ → ℕ
ℕ.zero - ℕ.zero = ℕ.zero
ℕ.zero - ℕ.suc y = ℕ.zero
ℕ.suc x - ℕ.zero = ℕ.suc x
ℕ.suc x - ℕ.suc y = x - y

contraposition : {m : Level } {A B : Set m} → (B → A) → (¬ A → ¬ B)
contraposition f = λ x y → x (f y)


compareTri1 : (n : ℕ) → zero <′ suc n
compareTri1 zero =   ≤′-refl
compareTri1 (suc n) =  ≤′-step ( compareTri1 n )

compareTri2 : (n m : ℕ) → n ≤′ m → suc n ≤′ suc m
compareTri2 _ _  ≤′-refl = ≤′-refl
compareTri2 n (suc m) ( ≤′-step p ) =  ≤′-step { suc n }  ( compareTri2 n m p )

<′dec : Set
<′dec = ∀ m n → Dec ( m ≤′ n )

compareTri6 : ∀ m {n} → ¬ m ≤′ n →  ¬ suc m ≤′ suc n

is≤′ :  <′dec
is≤′  zero zero = yes ≤′-refl
is≤′  zero (suc n) = yes (lemma n)
  where
     lemma :  (n : ℕ) → zero ≤′ suc n
     lemma zero =   ≤′-step  ≤′-refl
     lemma (suc n) =  ≤′-step (lemma n)
is≤′  (suc m) (zero) = no ( λ () )
is≤′  (suc m) (suc n) with is≤′ m n
... | yes p = yes ( compareTri2 _ _ p )
... | no p = no ( compareTri6 _ p )

compareTri20 : {n : ℕ} → ¬ suc n ≤′ zero
compareTri20 ()


compareTri21 : (n m : ℕ) → suc n ≤′ suc m →  n ≤′ m
compareTri21 _ _  ≤′-refl = ≤′-refl
compareTri21 (suc n) zero ( ≤′-step p ) = compareTri23 (suc n) ( ≤′-step p ) p
  where
        compareTri23 : (n : ℕ) → suc n ≤′ suc zero → suc n ≤′ zero →  n ≤′ zero
        compareTri23 zero ( ≤′-step p ) _ =   ≤′-refl
        compareTri23 zero ≤′-refl _ =   ≤′-refl
        compareTri23 (suc n1) ( ≤′-step p ) ()
compareTri21 n (suc m) ( ≤′-step p ) = ≤′-step (compareTri21 _ _ p)
compareTri21 zero zero ( ≤′-step p ) = ≤′-refl


compareTri3 : ∀ m {n} → ¬ m ≡ suc (m + n)
compareTri3 zero    ()
compareTri3 (suc m) eq = compareTri3 m (cong pred eq)

compareTri4' : ∀ m {n} → ¬ n ≡ m → ¬ suc n ≡ suc m
compareTri4' m {n} with n Data.Nat.≟ m
... | yes refl  = λ x y → x refl
... | no  p  = λ x y → p ( cong pred y )

compareTri4 : ∀ m {n} → ¬ n ≡ m → ¬ suc n ≡ suc m
compareTri4 m = contraposition ( λ x → cong pred x )

-- compareTri6 : ∀ m {n} → ¬ m ≤′ n →  ¬ suc m ≤′ suc n
compareTri6  m {n} = λ x y → x (compareTri21 _ _ y)

compareTri5 : ∀ m {n} → ¬ m <′ n →  ¬ suc m <′ suc n
compareTri5  m {n}  = compareTri6 (suc m)


compareTri :  Trichotomous  _≡_ _<′_
compareTri zero zero = tri≈ ( λ ()) refl ( λ ())
compareTri zero (suc n) = tri< ( compareTri1 n )  ( λ ()) ( λ ())
compareTri (suc n) zero = tri> ( λ ()) ( λ ()) ( compareTri1 n )
compareTri (suc n) (suc m) with compareTri n m
... | tri< p q r = tri<  (compareTri2 (suc n) m p ) (compareTri4 _ q) ( compareTri5 _ r )
... | tri≈ p refl r = tri≈ (compareTri5 _ p) refl ( compareTri5 _ r )
... | tri> p q r = tri> ( compareTri5 _ p ) (compareTri4 _ q) (compareTri2 (suc m) n r )


data Color : Set where
  red : Color
  black : Color

record Node {a : Set} : Set where
  inductive
  field
    color : Color
    blackHeight : ℕ
    right : Node {a}
    datum : ℕ
    left : Node {a}
open Node

-- node は node であり 部分的に分けられた redblacktree そのもの

data RBTree {n : Level} (a : Set n) : Set n where
    leaf : RBTree a
    node : Color → ℕ → RBTree a → ℕ → RBTree a → RBTree a


record RBTreeBDel {n : Level} (a : Set n) : Set n where
  field
    tree : RBTree a
    bool : Bool
open RBTreeBDel


module _ { n m : Level} {a : Set n} {cg : Set m} where
  -- _,_ : (tree : RBTree a) → (b : Bool) → Set
  -- leaf , false = (leaf , false)
  -- leaf , true = {!!}
  -- (node x x₁ t x₂ t₁) , bb = {!!}


  hight? : RBTree a → ℕ
  hight? leaf = 0
  hight? (node c h l x r) = h

  isLeaf : RBTree a → Bool
  isLeaf leaf = true
  isLeaf (node x x₁ t x₂ t₁) = false

  empty : RBTree a
  empty = leaf

  singleton : ℕ → RBTree a
  singleton x = (node black 1 leaf x leaf)

  isMember : ℕ → RBTree ℕ → Bool
  isMember _ leaf = false
  isMember x (node _ _ l y r) with compare x y
  isMember x (node _ _ l y r) | less x k = isMember x l
  isMember x (node _ _ l x r) | equal x = true
  isMember x (node _ _ l y r) | greater y k = isMember x r

  blacks? : RBTree a → ℕ
  blacks? = blacks' 0
    where
      blacks' : ℕ → RBTree a → ℕ
      blacks' n leaf = (n + 1)
      blacks' n (node red _ l _ r) = (blacks' n l) + (blacks' n r)
      blacks' n (node black _ l _ r) = (blacks' (n + 1) l) + (blacks' (n + 1) r)

  reds : Color → RBTree a → Bool
  reds _ leaf = true
  reds red (node x x₁ t x₂ t₁) = false
  reds black (node c x₁ l x₂ r) = reds c l ∧ reds c r

  turnR : RBTree a → (RBTree a → cg) → cg
  turnR leaf  cg = cg leaf
  turnR (node _ h l x r) cg = cg (node red h l x r)

  turnB : RBTree a → (RBTree a → cg) → cg
  turnB leaf cg = cg leaf
  turnB (node _ h l x r) cg = cg (node black h l x r)

  minimum : RBTree ℕ → ℕ
  minimum (node c h leaf x r) = x
  minimum (node c h l x r) = minimum l
  minimum leaf = 774

  maximum : RBTree ℕ → ℕ
  maximum (node c x₁ t x leaf) = x
  maximum (node x x₁ t x₂ r) = maximum r
  maximum leaf = 0

  isRed : RBTree a → Bool
  isRed (node red x₁ t x₂ t₁) = true
  isRed _ = false

  isColorSame : Color → Color → (Bool → cg) → cg
  isColorSame red red cg = cg true
  isColorSame red black cg = cg false
  isColorSame black red cg = cg false
  isColorSame black black cg = cg true

  node→ℕ : Maybe (RBTree a) → Maybe ℕ
  node→ℕ (just leaf) = nothing
  node→ℕ (just (node x x₁ x₂ x₃ x₄)) = just x₃
  node→ℕ nothing = nothing


-- basic operations
-- Code Gear Style (CPS : Contination Passing Style)

-- balance




module _ { n m : Level} {a : Set n} {cg : Set m}  where

  balanceL' :  ℕ → RBTree a → ℕ → RBTree a → (RBTree a → cg) → cg
  balanceL' h (node red h1 (node red hl a x b) y c) z d cg = cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceL' h (node red _ a x (node red _ b y c)) z d cg = cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceL' h l x r cg = cg (node black h l x r)

  balanceR' : ℕ -> RBTree a -> ℕ -> RBTree a -> (RBTree a → cg) → cg
  balanceR' h a x (node red _ b y (node red _ c z d)) cg =  cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceR' h a x (node red _ (node red _ b y c) z d) cg = cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceR' h l x r cg = cg (node black h l x r)

  balanceL : Color → ℕ → RBTree a → ℕ → RBTree a → (RBTree a → cg) → cg
  balanceL black h (node red h1 (node red hl a x b) y c) z d cg = cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceL black h (node red _ a x (node red _ b y c)) z d cg = cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceL k h l x r cg = cg (node k h l x r)

  balanceR : Color → ℕ -> RBTree a -> ℕ -> RBTree a -> (RBTree a → cg) → cg
  balanceR black h a x (node red _ b y (node red _ c z d)) cg = cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceR black h a x (node red _ (node red _ b y c) z d) cg = cg (node red (h + 1) (node black h a x b) y (node black h c z d))
  balanceR k h l x r cg = cg (node k h l x r)

-- unbalance

  -- unbalanceL' : Color → ℕ -> RBTree a -> a -> RBTree a -> (RBTreeBDel a → cg) → cg
  -- unbalanceL' c h l@(node black _ _ _ _) x r cg = isColorSame c black ( λ issame → cg record { tree = {!!} ; bool = issame })
  -- unbalanceL' c h l x r cg = {!!}

  unbalanceL : Color → ℕ → RBTree a → ℕ → RBTree a → (RBTreeBDel a → cg) → cg
  unbalanceL c h l@(node black _ _ _ _) x r cg = turnR l (λ tl → (balanceL black h tl x r (λ t → isColorSame {n} {m} {a} {_} c black (λ issame → cg record {tree = t ; bool = issame}))))
  unbalanceL black h l@(node red lh ll lx lr@(node black _ _ _ _)) x r  cg = turnR lr (λ tlr → balanceL black h tlr x r (λ t → cg record { tree = (node black lh ll lx t) ; bool = false}))
  unbalanceL c h l x r  cg = cg record {tree = leaf ; bool = false}

  unbalanceR : Color → ℕ → RBTree a → ℕ → RBTree a → (RBTreeBDel a → cg) → cg
  unbalanceR c h l x r@(node black _ _ _ _) cg = turnR r (λ tr → balanceR black h l x r (λ t → isColorSame {n} {m} {a} {_} c black (λ issame → cg record {tree = t ; bool = issame})))
  unbalanceR black h l x (node red rh rl@(node black _ _ _ _) rx rr) cg = turnR rl (λ trl → balanceR black h l x trl (λ t → cg record { tree = (node black rh t rx rr); bool = false}))
  unbalanceR c h l x r cg  = cg record {tree = leaf ; bool = false}



{--
  Insert Function

    All Nodes → ℕ
    search Insert Location → O(log ℕ)
    fix Tree (balanceR,L)  → O(log ℕ)
    Root Child Color Fix   → O(1)
    Total → O(2 log ℕ + 1)
--}

  -- turnRtree : RBTree a → (RBTree a → cg) → cg
  -- turnRtree leaf cg = cg leaf
  -- -- turnRtree (node black h l@(node black _ _ _ _) x r@(node black _ _ _ _)) cg = turnRtree (node red h l x r) cg
  -- turnRtree (node c h l x r) cg = turnRtree r cg

  rootChildFix : RBTree a → (RBTree a → cg) → cg
  rootChildFix (node black h (node black lh ll@(node black llh lll llx llr) lx lr@(node black lrh lrl lrx lrr)) x (node black rh rl@(node black rlh rll rlx rlr) rx rr@(node black rrh rrl rrx rrr))) cg = cg (node black (h - 1) (node red (lh - 1) ll lx lr) x (node red (rh - 1) rl rx rr))
  rootChildFix n cg = cg n

  insert' : ℕ → RBTree a → (RBTree a → cg) → cg
  insert' kx leaf cg = cg (node red 1 leaf kx leaf)

  insert' kx (node black h l x r) cg with compare kx x
  insert' kx (node black h l x r) cg | less kx k = insert' kx l (λ t → balanceL' h t x r (λ tt → cg tt))
  insert' kx s@(node black h l x r) cg | equal kx = cg s
  insert' kx (node black h l x r) cg | greater x k = insert' kx r (λ t → balanceR' h l x t (λ tt → cg tt))

  insert' kx (node red h l x r) cg with compare kx x
  insert' kx (node red h l x r) cg | less kx k = insert' kx l (λ t → cg (node red h t x r))
  insert' kx s@(node red h l x r) cg | equal kx = cg s
  insert' kx (node red h l x r) cg | greater x k = insert' kx r (λ t → cg (node red h l x t))

  insert : ℕ → RBTree a → (RBTree a → cg) → cg
  insert kx t cg = insert' kx t (λ t1 → turnB t1 (λ t2 → rootChildFix t2 cg))


  get : ℕ → RBTree a → (Maybe (RBTree a) → cg) → cg
  get x leaf cg = cg nothing
  get x (node c h l x1 r) cg with compareTri x x1
  get x (node c h l x1 r) cg | tri< a ¬b ¬c = get x l cg
  get x t@(node c h l x1 r) cg | tri≈ ¬a b ¬c = cg (just t)
  get x (node c h l x1 r) cg | tri> ¬a ¬b c₁ = get x r cg



{- Check Balance, Color rule and hight calc -}

-- create RBTree from Nat List
fromList : List ℕ → RBTree ℕ
fromList [] = empty {_} {_} {ℕ} {Set}
fromList (x ∷ l) = (maketree x (empty {_} {_} {ℕ} {Set}) (λ t → fromList' l t (λ tt → tt)))
  where
    module _  {l : Level} {cg1 : Set l} {a : Set} where
      maketree : ℕ → RBTree a → (RBTree a → cg1) → cg1
      maketree x t1 cg = insert x t1 cg
      fromList' : List ℕ → RBTree a → (RBTree a → cg1) → cg1
      fromList' [] t cg = cg t
      fromList' (x1 ∷ nl) t cg = maketree x1 t (λ tt → fromList' nl tt (λ ttt → cg ttt))


c1 = fromList (1 ∷ 2 ∷ 3 ∷ 4 ∷ 5 ∷ 6 ∷ 7 ∷ 8 ∷ 9 ∷ [])
c2 = fromList (5 ∷ 1 ∷ 2 ∷ 3 ∷ 4 ∷ 6 ∷ 7 ∷ 8 ∷ 9 ∷ [])
c3 = fromList (8 ∷ 7 ∷ 6 ∷ 1 ∷ 2 ∷ 5 ∷ 4 ∷ 3 ∷ 9 ∷ [])

cget = get 6 c1 (λ a → a)


proof-leaf : {l : Level} {D : Set l} (n : ℕ) → insert {_} {_} {ℕ} {Set} n leaf (λ t1 → get n t1 (λ n1 → (just n ≡ (node→ℕ {_} {_} {ℕ} {ℕ} n1))))
proof-leaf n with n Data.Nat.≟ n | compareTri n n
proof-leaf n | yes p | tri< a ¬b ¬c = ⊥-elim (¬b p)
proof-leaf n | yes p | tri≈ ¬a b ¬c = refl
proof-leaf n | yes p | tri> ¬a ¬b c = ⊥-elim (¬b p)
proof-leaf n | no ¬p | tri< a ¬b ¬c = ⊥-elim (¬c a)
proof-leaf n | no ¬p | tri≈ ¬a b ¬c = refl
proof-leaf n | no ¬p | tri> ¬a ¬b c = ⊥-elim (¬a c)




-- 任意の木だと insert でノードをどこに入れるか決められず計算が進まない
-- 任意の木の root が Nothing のケースはもちろんできる
-- proof1 : {l : Level} {D : Set l} (n : ℕ) → (t : RBTree D) → insert n t (λ t1 → get n t1 (λ n1 → (just n ≡ (root→ℕ n1))))
-- proof1 n t with n Data.Nat.≟ n | compareTri n n
-- proof1 n t | yes p | tri< a ¬b ¬c = ⊥-elim (¬b p)
-- proof1 n t | yes p | tri> ¬a ¬b c = ⊥-elim (¬b p)
-- proof1 n t | no ¬p | tri< a ¬b ¬c = ⊥-elim (¬c a)
-- proof1 n t | no ¬p | tri> ¬a ¬b c = ⊥-elim (¬a c)
-- proof1 n leaf | yes p | tri≈ ¬a b ¬c with compareTri n n
-- proof1 n leaf | yes p | tri≈ ¬a b ¬c | tri< a ¬b ¬c₁ = ⊥-elim (¬b p)
-- proof1 n leaf | yes p | tri≈ ¬a b ¬c | tri≈ ¬a₁ b₁ ¬c₁ = refl
-- proof1 n leaf | yes p | tri≈ ¬a b ¬c | tri> ¬a₁ ¬b c = ⊥-elim (¬b p)
-- proof1 n (node x x₁ t x₂ t₁) | yes p | tri≈ ¬a b ¬c = {!!}
-- proof1 n t | no ¬p | tri≈ ¬a b ¬c = {!!}


{--
書くなら全ての探索が木の高さ分で終わることを証明しとく必要がありそう
あと探索で木の高さが消化されていくことも示す
stack の push は存在してるデータ構造に関係なく上に乗るから任意のstack で証明できる
Tree でデータの保存を確かめるには…?

tree で証明するくらいだったら、親子関係、
rb 含めると、色関係、枝の長さ、になりそう?
--}

module _ { n m : Level} {a : Set n} {cg : Set m}  where

{--
deleteMin' は後ろに bool(Color の変更情報?)を持ちながら再帰する
再帰に一つ関数が挟まってるけど互いに呼んでるからどう書くべきかわからん

```Haskell Source
deleteMin' (Node c h l x r)               = if d then (tD, m) else (tD', m)

((l', d), m) = deleteMin' l
tD  = unbalancedR c (h-1) l' x r
tD' = (Node c h l' x r, False)
```

たぶん ((l', d), m) の形になると deleteMin' がしたい
~~RBTreeBDel の bool 情報はleaf に着いたかどうかだけ~~ → ではなく unbalance する必要があるのかの確認

ん、じゃあ node の左に leaf がついてる最小パターン探せばいいのでは?

あるパターンは (leaf x leaf), (leaf x r) の2パターンと r が red のケースを含めて 3パターン
その上のノードからそれを確認すれば良いので
(node c h (node lc lh leaf lx leaf) x r) と lr が存在するケースを確認すると良い
終わった tree に対して unbalance するかしないかを確定させたら終わり
--}



  {-# TERMINATING #-}
  deleteMin' : RBTree ℕ → (RBTreeBDel ℕ → cg) → cg

  deleteMin' leaf cg = cg record {tree = leaf ; bool = false} -- unreachable case
  deleteMin' (node black _ leaf x leaf) cg = cg record {tree = leaf ; bool = true}
  deleteMin' (node black _ leaf x r@(node red _ _ _ _)) cg = turnB r (λ tr → cg record {tree = tr ; bool = false})
  deleteMin' (node red _ leaf x r) cg = cg record {tree = r ; bool = false}
  deleteMin' (node c h l x r) cg = deleteMin' l (λ dt → delCheck {n} {m} {a} dt (λ dct → cg dct))
    where
      delCheck : { n m : Level} {a : Set n} {cg : Set m} → RBTreeBDel ℕ → (RBTreeBDel ℕ → cg) → cg
      delCheck bt cg with (bool bt)
      delCheck record { tree = leaf ; bool = b } cg | false = cg record {tree = (node red 100 leaf 100 leaf) ; bool = b } -- unreachable case
      delCheck record { tree = leaf ; bool = b } cg | true = unbalanceR c (h - 1) leaf x r (λ result → cg result)
      -- delCheck record { tree = (node x₁ x₂ t₁ x₃ t₂) ; bool = b } cg | false = cg record {tree = (node x₁ x₂ t₁ x₃ t₂) ; bool = false}
      delCheck record { tree = (node x₁ x₂ t₁ x₃ t₂) ; bool = b } cg | _ = unbalanceR c (h - 1) (node x₁ x₂ t₁ x₃ t₂) x r (λ result → cg result)

{--
deleteMin では最後に帰ってきたやつを turnB
型は rbtree → (rbtree → cg) → cg

rbtree が tree のとき deleteMin' tree
((s, _), _) は RBTreeBDel から RBTree への変換なので outPutTree
--}

  deleteMin : RBTree ℕ → (RBTree ℕ → cg) → cg
  deleteMin leaf cg = cg leaf
  deleteMin tree cg = deleteMin' tree (λ dt → outPutTree {n} {m} {a} dt (λ dct → turnB dct (λ dctb → cg dctb)))
    where
      outPutTree : { n m : Level} {a : Set n} {cg : Set m} → RBTreeBDel ℕ → (RBTree ℕ → cg) → cg
      outPutTree record { tree = s ; bool = b } cg = cg s


  -- > delCheck の node があって false のケースも unbalanceしなきゃいけなかった
  d1 = deleteMin (fromList (3 ∷ 1 ∷ 2 ∷ 4 ∷ 5 ∷ 6 ∷ 7 ∷ []))
  l1 = fromList (1 ∷ 2 ∷ 3 ∷ 4 ∷ 5 ∷ 6 ∷ 7 ∷ [])
  l2 = fromList ( 2 ∷ 3 ∷ 4 ∷ 5 ∷ 6 ∷ 7 ∷ [])
  d2 = deleteMin (fromList ( 2 ∷ 3 ∷ 4 ∷ 5 ∷ 6 ∷ 7 ∷ []))


-- delete' : {a : Set} → ℕ → RBTree ℕ → RBTreeBDel ℕ
-- delete' _ leaf = record { t = leaf ; b = false}
-- delete' x (node c h l y r) with compare x y
-- delete' x (node c h l y r) | less .x k = delCheck (delete' {ℕ} x l)
--   where
--     delCheck : RBTreeBDel ℕ → RBTreeBDel ℕ
--     delCheck bt with (b bt)
--     delCheck record { t = leaf ; b = b } | false = record {t = (node red 100 leaf 100 leaf) ; b = b } -- unreachable case
--     delCheck record { t = leaf ; b = b } | true = unbalanceR {ℕ} c (h - 1) leaf x r
--     delCheck record { t = (node x₁ x₂ t₁ x₃ t₂) ; b = b } | false = deleteMin' (node x₁ x₂ t₁ x₃ t₂)
--     delCheck record { t = (node x₁ (x₂) t₁ x₃ t₂) ; b = b } | true = unbalanceR {ℕ} c (h - 1) (node x₁ x₂ t₁ x₃ t₂) x r
-- delete' x (node c h l y r) | greater .y k = delCheck (delete' {ℕ} x r)
--   where
--     delCheck : RBTreeBDel ℕ → RBTreeBDel ℕ
--     delCheck bt with (b bt)
--     delCheck record { t = leaf ; b = b } | false = record {t = (node red 100 leaf 100 leaf) ; b = b } -- unreachable case
--     delCheck record { t = leaf ; b = b } | true = unbalanceR {ℕ} c (h - 1) leaf x r
--     delCheck record { t = (node x₁ x₂ t₁ x₃ t₂) ; b = b } | false = deleteMin' (node x₁ x₂ t₁ x₃ t₂)
--     delCheck record { t = (node x₁ (x₂) t₁ x₃ t₂) ; b = b } | true = unbalanceR {ℕ} c (h - 1) (node x₁ x₂ t₁ x₃ t₂) x r
-- delete' x (node c h l .x leaf) | equal .x with checkColor {ℕ} c black
-- delete' x (node c h l .x leaf) | equal .x | false = record {t = l ; b = false}
-- delete' x (node c h l .x leaf) | equal .x | true = blackify l
--   where
--     blackify : RBTree ℕ → RBTreeBDel ℕ
--     blackify (node red x₂ a x₃ a₁) = record {t = turnB {ℕ} (node red x₂ a x₃ a₁) ; b = false}
--     blackify s = record {t = s; b = true}
-- delete' x (node c h l .x (node x₁ x₂ r x₃ r₁)) | equal .x with r
-- delete' x (node c h l .x (node x₁ x₂ r x₃ r₁)) | equal .x | leaf with checkColor {ℕ} c black
-- delete' x (node c h l .x (node x₁ x₂ r x₃ r₁)) | equal .x | leaf | false = blackify l
--   where
--     blackify : RBTree ℕ → RBTreeBDel ℕ
--     blackify (node red x₂ a x₃ a₁) = record {t = turnB {ℕ} (node red x₂ a x₃ a₁) ; b = false}
--     blackify s = record {t = s; b = true}
-- delete' x (node c h l .x (node x₁ x₂ r x₃ r₁)) | equal .x | leaf | true = record {t = l ; b = false}
-- delete' x (node c h l .x (node x₁ x₂ r x₃ r₁)) | equal .x | node x₄ x₅ rnod x₆ rnod₁ = {!!}

--   -- where
--   -- delCheck : RBTreeBDel ℕ → RBTreeBDel ℕ
--   -- delCheck bt with (b bt)
--   -- delCheck record { t = leaf ; b = b } | false = record {t = (node red 100 leaf 100 leaf) ; b = b } -- unreachable case
--   -- delCheck record { t = leaf ; b = b } | true = unbalanceR {ℕ} c (h - 1) leaf x r
--   -- delCheck record { t = (node x₁ x₂ t₁ x₃ t₂) ; b = b } | false = deleteMin' (node x₁ x₂ t₁ x₃ t₂)
--   -- delCheck record { t = (node x₁ (x₂) t₁ x₃ t₂) ; b = b } | true = unbalanceR {ℕ} c (h - 1) (node x₁ x₂ t₁ x₃ t₂) x r
-- -- 謎フラグがtrue なら バランスしろとのお達しなのでどっかで持ちましょうはい。
-- -- 多分 record で適当に持つのがよいっぽい

-- delete : {a : Set} → ℕ → RBTree ℕ → RBTree ℕ
-- delete kx t = turnB {ℕ} (outPutTree (delete' {ℕ} kx t))
--   where
--     outPutTree : RBTreeBDel ℕ → RBTree ℕ
--     outPutTree record { t = s ; b = b } = s

-- proofs
-- isOrdered : RBTree a → Bool
-- isOrdered t = {!!}

-- isBlackSame : RBTree a → Bool
-- isBlackSame t = {!!}

-- isBalanced : RBTree a → Bool
-- isBalanced t = {!!}