Fixpoint first_activations_and_semi_rec (proof_tree : cbv) : list cbv :=
match proof_tree with
| cbv_constr lp _ _ _ _          => flat_map first_activations_and_semi_rec lp
| cbv_split lp p _ _ _ _         => first_activations_and_semi_rec p ++ flat_map first_activations_and_semi_rec lp
| cbv_update _ _ _ _ _ _ _ as p' => [p']
| cbv_read _ _ _ as p'           => [p']
end.
Definition first_activations_and_semi (proof_tree : cbv) : list cbv :=
match proof_tree with
| cbv_constr lp _ _ _ _    => []
| cbv_split lp p _ _ _ _   => []
| cbv_update _ _ p _ _ _ _ => first_activations_and_semi_rec p
| cbv_read _ _ _           => []
end.

Lemma cache_consistent p :
wf p ->
exists C,
cache_beq (cache_right p) (C ++ cache_left p) = true /\
(forall t, assoc_cache t C <> None -> assoc_cache t (cache_left p) = None).