(** Some properties of [is_path]. *)

(* Specifications: *)
Lemma is_path_pop:
forall s d m,
is_path ((s, d) :: m) -> is_path m.
Lemma is_path_change_last_source:
forall s s' d sigma,
is_path (sigma ++ (s, d) :: nil) ->
is_path (sigma ++ (s', d) :: nil).
Lemma path_sources_dests:
forall s0 d0 sigma,
is_path (sigma ++ (s0, d0) :: nil) ->
List.incl (srcs (sigma ++ (s0, d0) :: nil))
(s0 :: dests (sigma ++ (s0, d0) :: nil)).
Lemma no_read_path:
forall d1 sigma s0 d0,
d1 <> s0 ->
is_path (sigma ++ (s0, d0) :: nil) ->
~In d1 (dests (sigma ++ (s0, d0) :: nil)) ->
no_read (sigma ++ (s0, d0) :: nil) d1.
Lemma is_path_pop:
forall s d m,
is_path ((s, d) :: m) -> is_path m.
Lemma is_path_change_last_source:
forall s s' d sigma,
is_path (sigma ++ (s, d) :: nil) ->
is_path (sigma ++ (s', d) :: nil).
Lemma path_sources_dests:
forall s0 d0 sigma,
is_path (sigma ++ (s0, d0) :: nil) ->
List.incl (srcs (sigma ++ (s0, d0) :: nil))
(s0 :: dests (sigma ++ (s0, d0) :: nil)).
Lemma no_read_path:
forall d1 sigma s0 d0,
d1 <> s0 ->
is_path (sigma ++ (s0, d0) :: nil) ->
~In d1 (dests (sigma ++ (s0, d0) :: nil)) ->
no_read (sigma ++ (s0, d0) :: nil) d1.