proposition: Lemma mark_unmarked: forall m1 root m2 n1 n2, vvalid g root -> ReachDecidable g root (negateP m1)-> mark m1 root m2 -> g |= n1 ~o~> n2 satisfying (negateP m1) -> (g |= n1 ~o~> n2 satisfying (negateP m2)) \/ (m2 n2).
proof: Proof. intros until n2. intros HH ENUMC; intros. destruct H0 as [p ?]. destruct (exists_list_dec _ (epath_to_vpath g p) (fun n => g |= root ~o~> n satisfying (negateP m1))) as [?H | ?H]. 1: apply ENUMC. + right. destruct H as [? _]. apply H. destruct H1 as [n [? ?]]. apply reachable_by_trans with n; trivial. rewrite in_path_eq_epath_to_vpath in H1. 2: destruct H0 as [_ [? _]]; auto. destruct (reachable_by_path_split_in g _ _ _ _ _ H0 H1) as [p1 [p2 [? [? ?]]]]. exists p2. trivial. + left. exists p. destruct H0. split; trivial. clear H0. destruct H2. destruct H as [_ ?]. split; auto. rewrite path_prop_equiv in H2 |-* ; auto. intros x ?. specialize (H2 x H3). specialize (H x). spec H. intro. apply H1. exists x. rewrite in_path_eq_epath_to_vpath; auto. rewrite negateP_spec in H2 |- *; tauto. Qed.
imports: Coq.Logic.ProofIrrelevance CertiGraph.lib.Ensembles_ext Coq.Lists.List Coq.Classes.Morphisms CertiGraph.lib.Coqlib CertiGraph.lib.List_ext CertiGraph.lib.EquivDec_ext VST.msl.Coqlib2 CertiGraph.graph.graph_model CertiGraph.graph.path_lemmas CertiGraph.graph.reachable_computable CertiGraph.graph.reachable_ind CertiGraph.graph.graph_gen CertiGraph.graph.graph_relation CertiGraph.graph.subgraph2