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