proposition: Lemma mark_reverse_unmarked_strong: forall m1 root m2, mark m1 root m2 -> forall n1 n2, ReachDecidable g root (negateP m1) -> g |= n1 ~o~> n2 satisfying (negateP m2) -> (predicate_partialgraph g (Complement _ (reachable_by g root (negateP m1)))) |= n1 ~o~> n2 satisfying (negateP m1).
proof: Proof. intros. rewrite reachable_by_eq_partialgraph_reachable. rewrite partial_partialgraph. rewrite <- reachable_by_eq_partialgraph_reachable. eapply reachable_by_weaken; [| eauto]. change (@app_node_pred _ (negateP m2)) with (Complement _ (projT1 m2)). change (@app_node_pred _ (negateP m1)) with (Complement _ (projT1 m1)). rewrite Intersection_Complement. apply Complement_Included_rev. intro x; unfold Ensembles.In. rewrite Union_spec. apply mark_marked_strong; auto. 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