proposition: Lemma is_tree_ppg_spec: forall (P : V -> Prop) root, is_tree (predicate_partialgraph g P) root <-> forall y, g |= root ~o~> y satisfying P -> exists ! p, g |= p is root ~o~> y satisfying P.
proof: Proof. intros. unfold is_tree. split; intros. + rewrite reachable_by_eq_partialgraph_reachable in H0. specialize (H _ H0). destruct H as [p [? ?]]. exists p. split; intros. - rewrite reachable_by_path_eq_partialgraph_reachable; auto. - rewrite reachable_by_path_eq_partialgraph_reachable in H2. apply H1; auto. + rewrite <- reachable_by_eq_partialgraph_reachable in H0. specialize (H _ H0). destruct H as [p [? ?]]. exists p. split; intros. - rewrite <- reachable_by_path_eq_partialgraph_reachable; auto. - rewrite <- reachable_by_path_eq_partialgraph_reachable in H2. apply H1; auto. Qed.
imports: Coq.Arith.Arith Coq.Logic.ProofIrrelevance Coq.Logic.FunctionalExtensionality Coq.Classes.Morphisms Coq.Classes.Equivalence CertiGraph.lib.Coqlib CertiGraph.lib.Ensembles_ext CertiGraph.lib.relation_list CertiGraph.lib.List_ext CertiGraph.lib.Equivalence_ext CertiGraph.lib.EquivDec_ext VST.msl.Coqlib2 CertiGraph.graph.graph_model CertiGraph.graph.path_lemmas CertiGraph.graph.reachable_ind CertiGraph.graph.graph_gen CertiGraph.graph.graph_relation