From Stdlib Require Import List Lia
  Logic.FunctionalExtensionality Logic.PropExtensionality.
Import ListNotations.

Definition node := list bool.

Definition isleaf (height : nat) (p : node) : Prop :=
  length p = height.

Definition in_complete_tree (height : nat) (p : node) : Prop :=
  length p ≤ height.

Definition prefix (p q : node) : Prop :=
  ∃ r, q = p ++ r.

Lemma prefix_refl (p : node) : prefix p p.

Lemma prefix_nil (p : node) : prefix [] p.

Lemma prefix_trans (p q r : node) :
  prefix p q → prefix q r → prefix p r.

Lemma prefix_length_le (p q : node) :
  prefix p q → length p ≤ length q.

Lemma prefix_eq_of_equal_length (p q : node) :
  prefix p q → length p = length q → p = q.

Definition occupied_leaf
    (height : nat) (bitmap : node → Prop) (p : node) : Prop :=
  isleaf height p ∧ bitmap p.

Definition nonempty_bitmap (height : nat) (bitmap : node → Prop) : Prop :=
  ∃ p, occupied_leaf height bitmap p.

Definition induced_nodes
    (height : nat) (bitmap : node → Prop) (p : node) : Prop :=
  ∃ l, isleaf height l ∧ bitmap l ∧ prefix p l.

Record rooted_connected_subtree
    (height : nat) (subtree : node → Prop) : Prop := {
  subtree_in_tree :
    ∀ p, subtree p → in_complete_tree height p;
  subtree_root :
    subtree [];
  subtree_ancestor_closed :
    ∀ p q, prefix p q → subtree q → subtree p;
}.

Definition contains_occupied_leaves
    (height : nat) (bitmap subtree : node → Prop) : Prop :=
  ∀ l, isleaf height l → bitmap l → subtree l.

Definition contains_exactly_occupied_leaves
    (height : nat) (bitmap subtree : node → Prop) : Prop :=
  ∀ l, isleaf height l → (subtree l ↔ bitmap l).

Definition every_node_on_occupied_path
    (height : nat) (bitmap subtree : node → Prop) : Prop :=
  ∀ p, subtree p → ∃ l, isleaf height l ∧ bitmap l ∧ prefix p l.

Definition minimal_connected_subtree
    (height : nat) (bitmap subtree : node → Prop) : Prop :=
  rooted_connected_subtree height subtree ∧
  contains_exactly_occupied_leaves height bitmap subtree ∧
  every_node_on_occupied_path height bitmap subtree ∧
  ∀ candidate,
    rooted_connected_subtree height candidate →
    contains_occupied_leaves height bitmap candidate →
    ∀ p, subtree p → candidate p.

Lemma induced_nodes_in_tree height bitmap :
  ∀ p, induced_nodes height bitmap p → in_complete_tree height p.

Lemma induced_nodes_root height bitmap :
  nonempty_bitmap height bitmap →
  induced_nodes height bitmap [].

Lemma induced_nodes_ancestor_closed height bitmap :
  ∀ p q,
    prefix p q →
    induced_nodes height bitmap q →
    induced_nodes height bitmap p.

Lemma induced_nodes_rooted_connected height bitmap :
  nonempty_bitmap height bitmap →
  rooted_connected_subtree height (induced_nodes height bitmap).

Lemma induced_nodes_exact_leaves height bitmap :
  contains_exactly_occupied_leaves height bitmap
    (induced_nodes height bitmap).

Lemma induced_nodes_path_property height bitmap :
  every_node_on_occupied_path height bitmap
    (induced_nodes height bitmap).

Lemma induced_nodes_minimal height bitmap :
  ∀ candidate,
    rooted_connected_subtree height candidate →
    contains_occupied_leaves height bitmap candidate →
    ∀ p,
      induced_nodes height bitmap p → candidate p.

Theorem induced_nodes_minimal_connected_subtree height bitmap :
  nonempty_bitmap height bitmap →
  minimal_connected_subtree height bitmap
    (induced_nodes height bitmap).

Lemma minimal_connected_subtree_iff_induced height bitmap subtree :
  minimal_connected_subtree height bitmap subtree →
  ∀ p, subtree p ↔ induced_nodes height bitmap p.

Theorem induced_subtree_exists_unique height bitmap :
  nonempty_bitmap height bitmap →
  ∃! subtree,
    minimal_connected_subtree height bitmap subtree.

Theorem merkle_commitments_induced_subtree_lemma height bitmap :
  nonempty_bitmap height bitmap →
  ∃! subtree,
    rooted_connected_subtree height subtree ∧
    contains_exactly_occupied_leaves height bitmap subtree ∧
    every_node_on_occupied_path height bitmap subtree ∧
    (∀ candidate,
      rooted_connected_subtree height candidate →
      contains_occupied_leaves height bitmap candidate →
      ∀ p, subtree p → candidate p).

This page has been generated by coqdoc