Heap_DeleteMin(
Heap_Insert(
Heap_Insert(
Heap_Insert(
Heap_Insert(Heap_Empty() as Heap_H, 5),
3),
8),
1))
Spec: Heap_H_complete.nereus. Convención: · = Heap_Empty() as Heap_H.
Heap_Empty, axioma base: produce singleton.BTree_Create(·, ·, 5) as Heap_H
BTree_Create(·, ·, 5): |L|=0, |R|=0, not(0>0) ✓ → Regla A, descender a L.Heap_Insert(·, 3) = BTree_Create(·, ·, 3).Heap_CombineL(BTree_Create(·, ·, 3), ·, 5): m=3 < x=5 → swap.
BTree_Create(BTree_Create(·, ·, 5) as Heap_H, ·, 3) as Heap_H
BTree_Create(BTree_Create(·, ·, 5), ·, 3): |L|=1, |R|=0, |L|>|R| ✓, perfect(L) ✓ (singleton) → Regla C, descender a R.Heap_Insert(·, 8) = BTree_Create(·, ·, 8).Heap_CombineR(L, BTree_Create(·, ·, 8), 3): m=8 ≥ x=3 → no swap.
BTree_Create(
BTree_Create(·, ·, 5) as Heap_H,
BTree_Create(·, ·, 8) as Heap_H,
3) as Heap_H
BTree_Create(BTree_Create(·,·,5), BTree_Create(·,·,8), 3): |L|=1, |R|=1, not(1>1) ✓ → Regla A, descender a L.Heap_Insert(BTree_Create(·, ·, 5), 1):
BTree_Create(·, ·, 5): |L'|=|R'|=0 → Regla A, descender.Heap_Insert(·, 1) = BTree_Create(·, ·, 1).Heap_CombineL(BTree_Create(·, ·, 1), ·, 5): 1 < 5 → swap: BTree_Create(BTree_Create(·, ·, 5), ·, 1).Heap_CombineL(BTree_Create(BTree_Create(·, ·, 5), ·, 1), BTree_Create(·, ·, 8), 3): m=1 < x=3 → swap.
BTree_Create(
BTree_Create(BTree_Create(·, ·, 5) as Heap_H, ·, 3) as Heap_H,
BTree_Create(·, ·, 8) as Heap_H,
1) as Heap_H
Forma OK: posiciones 1, 2, 3, 4 llenas; el "1" subió desde la posición 4 hasta la raíz. Propiedad heap OK: 1 ≤ 3, 1 ≤ 8, 3 ≤ 5.
Aplicamos Heap_DeleteMin(T) donde T es el heap del paso anterior. Como T no es singleton, se aplica el axioma:
Heap_DeleteMin(BTree_Create(L, R, x) as Heap_H) = Heap_SiftDown( Heap_ReplaceRoot( Heap_RemoveLast(BTree_Create(L, R, x) as Heap_H), Heap_Last(BTree_Create(L, R, x) as Heap_H) ) );
Heap_Last(T)T = BTree_Create(L, R, 1) con |L|=2, |R|=1. |L|>|R| ✓.perfect(L)? L = BTree_Create(BTree_Create(·,·,5), ·, 3): |LL|=1≠|LR|=0 → no perfecto.|L|>|R| ∧ (¬perfect(L) ∨ perfect(R)) = T ∧ (T ∨ T) = T → último en L.Heap_Last(L) con L = BTree_Create(BTree_Create(·,·,5), ·, 3):|L'|=1, |R'|=0, |L'|>|R'|, perfect(L') (singleton). Último en L'.Heap_Last(BTree_Create(·, ·, 5)): singleton → 5.
Resultado: Heap_Last(T) = 5.
Heap_RemoveLast(T)Heap_Last: último en L. Aplico el axioma:Heap_RemoveLast(BTree_Create(L, R, x)) = BTree_Create(Heap_RemoveLast(L), R, x) as Heap_H.Heap_RemoveLast(L) con L = BTree_Create(BTree_Create(·,·,5), ·, 3):BTree_Create(Heap_RemoveLast(BTree_Create(·,·,5)), ·, 3).Heap_RemoveLast(BTree_Create(·,·,5)) = Heap_Empty (caso singleton).BTree_Create(·, ·, 3) as Heap_H.
BTree_Create(
BTree_Create(·, ·, 3) as Heap_H,
BTree_Create(·, ·, 8) as Heap_H,
1) as Heap_H
Heap_ReplaceRoot(..., 5)Heap_ReplaceRoot(BTree_Create(L, R, x), m) = BTree_Create(L, R, m).BTree_Create(
BTree_Create(·, ·, 3) as Heap_H,
BTree_Create(·, ·, 8) as Heap_H,
5) as Heap_H
La propiedad de heap se violó (5 > 3, raíz mayor que su hijo izquierdo). Heap_SiftDown la restaura.
Heap_SiftDownBTree_Create(BTree_Create(·,·,3), BTree_Create(·,·,8), 5): ambos hijos no vacíos → Heap_SDBoth(L, R, 5).
SDBoth con m1 = 3 (raíz de L), m2 = 8 (raíz de R), x = 5:
| Caso | Condición | Aplicable |
|---|---|---|
| (a) | ¬(m1<x) ∧ ¬(m2<x) = ¬(3<5) ∧ ¬(8<5) = F ∧ T | No |
| (b) | (m1<x) ∧ ¬(m2<m1) = (3<5) ∧ ¬(8<3) = T ∧ T | Sí ← |
| (c) | (m2<x) ∧ (m2<m1) = (8<5) ∧ (8<3) = F ∧ F | No |
m1=3. Swap con izquierda y recursar sobre el nuevo L.Heap_SiftDown(BTree_Create(·, ·, 5)) — hoja → no hace nada. Devuelve BTree_Create(·, ·, 5).
BTree_Create(
BTree_Create(·, ·, 5) as Heap_H,
BTree_Create(·, ·, 8) as Heap_H,
3) as Heap_H
| Antes / Después | Heap | Mín | Tamaño | Forma | Heap order |
|---|---|---|---|---|---|
| Antes (4 nodos) | {1, 3, 5, 8} | 1 | 4 | ✓ (posiciones 1–4) | ✓ |
| Después (3 nodos) | {3, 5, 8} | 3 | 3 | ✓ (posiciones 1–3) | ✓ (3 ≤ 5, 3 ≤ 8) |
DeleteMin sacó el mínimo (1) y dejó el heap clásico con 3 elementos: 3 a la raíz, 5 a la izquierda, 8 a la derecha. El "5" venía de la última posición y trepó vía el sift-down hacia donde estaba 3, mientras que 3 (el nuevo mínimo) subió a la raíz.