proposition: Lemma si_reachable_by: forall (g1 g2: PreGraph V E) (p1 p2: V -> Prop) x y, g1 ~=~ g2 -> vertex_prop_coincide g1 g2 p1 p2 -> (g1 |= x ~o~> y satisfying p1 <-> g2 |= x ~o~> y satisfying p2).
proof: Proof. cut (forall (g1 g2: PreGraph V E) p1 p2 (x y : V), g1 ~=~ g2 -> vertex_prop_coincide g1 g2 p1 p2 -> g1 |= x ~o~> y satisfying p1 -> g2 |= x ~o~> y satisfying p2). 1: intros; split; apply H; [| | symmetry | apply vertex_prop_coincide_sym]; auto. intros. rewrite reachable_by_eq_subgraph_reachable in H1 |- *. assert (forall x, vvalid (predicate_subgraph g1 p1) x <-> vvalid (predicate_subgraph g2 p2) x). 1: { intros; simpl; unfold predicate_vvalid. destruct H as [? _]. specialize (H x0). specialize (H0 x0). hnf in H0. tauto. } assert (forall x y, edge (predicate_subgraph g1 p1) x y <-> edge (predicate_subgraph g2 p2) x y). 1: { apply si_subgraph_edge. + auto. + intros. specialize (H0 x0). tauto. } pose proof (edge_equiv_reachable_equiv (predicate_subgraph g1 p1) (predicate_subgraph g2 p2) H2 H3). destruct (H4 x) as [? _]. apply H5. 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