From stdpp Require Import prelude. From VLSM.Lib Require Import Preamble. From VLSM.Core Require Import VLSM.
Core: VLSM Partial Projections
X
partially projects to
VLSM Y
(sharing the same messages) if there exists a partial map partial_trace_project
from traces over X
(pairs of state and list of transitions from that state)
to traces over Y
such that:
- partial_trace_project_preserves_valid_traces, if the projection is defined.
- The projection operation is stable to adding valid prefixes (property
(sX, tX)
yields (sY, tY)
, then for any trace (s'X, preX)
ending in sX
such that (s'X, preX ++ tX)
is a valid trace, then there exists a
trace (s'Y, preY)
ending in sY
such that (s'X, preX ++ tX)
projects
to (s'Y, preY ++ tY)
.
Section sec_VLSM_partial_projection. Record VLSM_partial_projection_type {message : Type} (X Y : VLSM message) (partial_trace_project : state X * list (transition_item X) -> option (state Y * list (transition_item Y))) : Prop := { partial_trace_project_extends_left : forall sX trX sY trY, partial_trace_project (sX, trX) = Some (sY, trY) -> forall s'X preX, finite_trace_last s'X preX = sX -> finite_valid_trace_from X s'X (preX ++ trX) -> exists s'Y preY, partial_trace_project (s'X, preX ++ trX) = Some (s'Y, preY ++ trY) /\ finite_trace_last s'Y preY = sY; }.
We define two kinds of partial projection: VLSM_weak_partial_projection
and VLSM_partial_projection, the main difference between them being that the
"weak" one is not required to preserve initial states.
Although there are no current examples of proper VLSM_weak_partial_projections,
their definition serves as a support base for VLSM_weak_projections.
Record VLSM_weak_partial_projection {message : Type} (X Y : VLSM message) (partial_trace_project : state X * list (transition_item X) -> option (state Y * list (transition_item Y))) : Prop := { weak_partial_projection_type :> VLSM_partial_projection_type X Y partial_trace_project; weak_partial_trace_project_preserves_valid_trace : forall sX trX sY trY, partial_trace_project (sX, trX) = Some (sY, trY) -> finite_valid_trace_from X sX trX -> finite_valid_trace_from Y sY trY; }. Record VLSM_partial_projection {message : Type} (X Y : VLSM message) (partial_trace_project : state X * list (transition_item X) -> option (state Y * list (transition_item Y))) : Prop := { partial_projection_type :> VLSM_partial_projection_type X Y partial_trace_project; partial_trace_project_preserves_valid_trace : forall sX trX sY trY, partial_trace_project (sX, trX) = Some (sY, trY) -> finite_valid_trace X sX trX -> finite_valid_trace Y sY trY; }. Section sec_weak_partial_projection_properties.
Context {message : Type} {X Y : VLSM message} {trace_project : state X * list (transition_item X) -> option (state Y * list (transition_item Y))} (Hsimul : VLSM_weak_partial_projection X Y trace_project) .message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (trX : list transition_item) (sY : state Y) (trY : list transition_item), trace_project (sX, trX) = Some (sY, trY) → finite_valid_trace_from X sX trX → finite_valid_trace_from Y sY trYexact (weak_partial_trace_project_preserves_valid_trace _ _ _ Hsimul). Qed.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (trX : list transition_item) (sY : state Y) (trY : list transition_item), trace_project (sX, trX) = Some (sY, trY) → finite_valid_trace_from X sX trX → finite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (sY : state Y) (trY : list transition_item), trace_project (sX, []) = Some (sY, trY) → valid_state_prop X sX → valid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (sY : state Y) (trY : list transition_item), trace_project (sX, []) = Some (sY, trY) → valid_state_prop X sX → valid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
HsX: valid_state_prop X sXvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
HsX: ∃ (is : state X) (tr : list transition_item), finite_valid_trace_init_to X is sX trvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_init_to X isX sX trXvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_init_to X isX sX trX
HsX: finite_trace_last isX trX = sXvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_from X isX trX
HsX: finite_trace_last isX trX = sXvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_from X isX trX
HsX: finite_trace_last isX trX = sX
Hpr_extends_left: finite_valid_trace_from X isX (trX ++ []) → ∃ (s'Y : state Y) (preY : list transition_item), trace_project (isX, trX ++ []) = Some (s'Y, preY ++ trY) ∧ finite_trace_last s'Y preY = sYvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_from X isX trX
HsX: finite_trace_last isX trX = sX
Hpr_extends_left: ∃ (s'Y : state Y) (preY : list transition_item), trace_project (isX, trX ++ []) = Some (s'Y, preY ++ trY) ∧ finite_trace_last s'Y preY = sYvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_from X isX trX
HsX: finite_trace_last isX trX = sX
isY: state Y
preY: list transition_item
Hpr_tr: trace_project (isX, trX ++ []) = Some (isY, preY ++ trY)
HsY: finite_trace_last isY preY = sYvalid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_from X isX trX
HsX: finite_trace_last isX trX = sX
isY: state Y
preY: list transition_item
Hpr_tr: trace_project (isX, trX) = Some (isY, preY ++ trY)
HsY: finite_trace_last isY preY = sYvalid_state_prop Y sYby apply finite_valid_trace_from_app_iff, proj1, finite_valid_trace_last_pstate in Hinit_to; subst. Qed.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
isX: state X
trX: list transition_item
HtrX: finite_valid_trace_from X isX trX
HsX: finite_trace_last isX trX = sX
isY: state Y
preY: list transition_item
Hpr_tr: trace_project (isX, trX) = Some (isY, preY ++ trY)
HsY: finite_trace_last isY preY = sY
Hinit_to: finite_valid_trace_from Y isY (preY ++ trY)valid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item) (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid_transition X (l itemX) (sX, input itemX) (destination itemX, output itemX) → input_valid_transition Y (l itemY) (sY, input itemY) (destination itemY, output itemY)message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item) (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid_transition X (l itemX) (sX, input itemX) (destination itemX, output itemX) → input_valid_transition Y (l itemY) (sY, input itemY) (destination itemY, output itemY)message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
itemX: transition_item
sY: state Y
itemY: transition_item
Hpr: trace_project (sX, [itemX]) = Some (sY, [itemY])
HtX: input_valid_transition X (l itemX) (sX, input itemX) (destination itemX, output itemX)input_valid_transition Y (l itemY) (sY, input itemY) (destination itemY, output itemY)message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
itemX: transition_item
sY: state Y
itemY: transition_item
Hpr: trace_project (sX, [itemX]) = Some (sY, [itemY])
HtX: finite_valid_trace_from X sX [{| l := l itemX; input := input itemX; destination := destination itemX; output := output itemX |}]input_valid_transition Y (l itemY) (sY, input itemY) (destination itemY, output itemY)by inversion_clear HtX. Qed.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
itemX: transition_item
sY: state Y
itemY: transition_item
Hpr: trace_project (sX, [itemX]) = Some (sY, [itemY])
HtX: finite_valid_trace_from Y sY [itemY]input_valid_transition Y (l itemY) (sY, input itemY) (destination itemY, output itemY)message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item), input_valid_transition_item X sX itemX → ∀ (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid Y (l itemY) (sY, input itemY)message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item), input_valid_transition_item X sX itemX → ∀ (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid Y (l itemY) (sY, input itemY)by eapply VLSM_weak_partial_projection_input_valid_transition. Qed. End sec_weak_partial_projection_properties. Section sec_partial_projection_properties.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_weak_partial_projection X Y trace_project
sX: state X
itemX: transition_item
HitemX: input_valid_transition_item X sX itemX
sY: state Y
itemY: transition_item
Hpr: trace_project (sX, [itemX]) = Some (sY, [itemY])input_valid Y (l itemY) (sY, input itemY)
Context {message : Type} {X Y : VLSM message} {trace_project : state X * list (transition_item X) -> option (state Y * list (transition_item Y))} (Hsimul : VLSM_partial_projection X Y trace_project) .message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (trX : list transition_item) (sY : state Y) (trY : list transition_item), trace_project (sX, trX) = Some (sY, trY) → finite_valid_trace X sX trX → finite_valid_trace Y sY trYexact (partial_trace_project_preserves_valid_trace _ _ _ Hsimul). Qed.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (trX : list transition_item) (sY : state Y) (trY : list transition_item), trace_project (sX, trX) = Some (sY, trY) → finite_valid_trace X sX trX → finite_valid_trace Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (trX : list transition_item) (sY : state Y) (trY : list transition_item), trace_project (sX, trX) = Some (sY, trY) → finite_valid_trace_from X sX trX → finite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (trX : list transition_item) (sY : state Y) (trY : list transition_item), trace_project (sX, trX) = Some (sY, trY) → finite_valid_trace_from X sX trX → finite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
trX: list transition_item
sY: state Y
trY: list transition_item
Hpr_tr: trace_project (sX, trX) = Some (sY, trY)
HtrX: finite_valid_trace_from X sX trXfinite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
trX: list transition_item
sY: state Y
trY: list transition_item
Hpr_tr: trace_project (sX, trX) = Some (sY, trY)
isX: state X
preX: list transition_item
Htr'X: finite_valid_trace X isX (preX ++ trX)
HsX: finite_trace_last isX preX = sXfinite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
trX: list transition_item
sY: state Y
trY: list transition_item
Hpr_tr: trace_project (sX, trX) = Some (sY, trY)
isX: state X
preX: list transition_item
Htr'X: finite_valid_trace X isX (preX ++ trX)
HsX: finite_trace_last isX preX = sX
Hpr_extends_left: finite_valid_trace_from X isX (preX ++ trX) → ∃ (s'Y : state Y) (preY : list transition_item), trace_project (isX, preX ++ trX) = Some (s'Y, preY ++ trY) ∧ finite_trace_last s'Y preY = sYfinite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
trX: list transition_item
sY: state Y
trY: list transition_item
Hpr_tr: trace_project (sX, trX) = Some (sY, trY)
isX: state X
preX: list transition_item
Htr'X: finite_valid_trace X isX (preX ++ trX)
HsX: finite_trace_last isX preX = sX
Hpr_extends_left: ∃ (s'Y : state Y) (preY : list transition_item), trace_project (isX, preX ++ trX) = Some (s'Y, preY ++ trY) ∧ finite_trace_last s'Y preY = sYfinite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
trX: list transition_item
sY: state Y
trY: list transition_item
Hpr_tr: trace_project (sX, trX) = Some (sY, trY)
isX: state X
preX: list transition_item
Htr'X: finite_valid_trace X isX (preX ++ trX)
HsX: finite_trace_last isX preX = sX
isY: state Y
preY: list transition_item
Hpr_tr': trace_project (isX, preX ++ trX) = Some (isY, preY ++ trY)
HsY: finite_trace_last isY preY = sYfinite_valid_trace_from Y sY trYby apply proj1, finite_valid_trace_from_app_iff, proj2 in Hinit_to; subst. Qed.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
trX: list transition_item
sY: state Y
trY: list transition_item
Hpr_tr: trace_project (sX, trX) = Some (sY, trY)
isX: state X
preX: list transition_item
Htr'X: finite_valid_trace X isX (preX ++ trX)
HsX: finite_trace_last isX preX = sX
isY: state Y
preY: list transition_item
Hpr_tr': trace_project (isX, preX ++ trX) = Some (isY, preY ++ trY)
HsY: finite_trace_last isY preY = sY
Hinit_to: finite_valid_trace Y isY (preY ++ trY)finite_valid_trace_from Y sY trYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (sY : state Y) (trY : list transition_item), trace_project (sX, []) = Some (sY, trY) → initial_state_prop sX → initial_state_prop sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (sY : state Y) (trY : list transition_item), trace_project (sX, []) = Some (sY, trY) → initial_state_prop sX → initial_state_prop sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
HsX: initial_state_prop sXinitial_state_prop sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
HsX: initial_state_prop sXfinite_valid_trace X sX []by constructor; apply initial_state_is_valid. Qed. Definition VLSM_partial_projection_weaken : VLSM_weak_partial_projection X Y trace_project := {| weak_partial_projection_type := partial_projection_type _ _ _ Hsimul ; weak_partial_trace_project_preserves_valid_trace := VLSM_partial_projection_finite_valid_trace_from |}.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project
sX: state X
sY: state Y
trY: list transition_item
Hpr: trace_project (sX, []) = Some (sY, trY)
HsX: initial_state_prop sXfinite_valid_trace_from X sX []message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (sY : state Y) (trY : list transition_item), trace_project (sX, []) = Some (sY, trY) → valid_state_prop X sX → valid_state_prop Y sYexact (VLSM_weak_partial_projection_valid_state VLSM_partial_projection_weaken). Qed.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (sY : state Y) (trY : list transition_item), trace_project (sX, []) = Some (sY, trY) → valid_state_prop X sX → valid_state_prop Y sYmessage: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item) (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid_transition X (l itemX) (sX, input itemX) (destination itemX, output itemX) → input_valid_transition Y (l itemY) (sY, input itemY) (destination itemY, output itemY)exact (VLSM_weak_partial_projection_input_valid_transition VLSM_partial_projection_weaken). Qed.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item) (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid_transition X (l itemX) (sX, input itemX) (destination itemX, output itemX) → input_valid_transition Y (l itemY) (sY, input itemY) (destination itemY, output itemY)message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item), input_valid_transition_item X sX itemX → ∀ (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid Y (l itemY) (sY, input itemY)exact (VLSM_weak_partial_projection_input_valid VLSM_partial_projection_weaken). Qed. End sec_partial_projection_properties. End sec_VLSM_partial_projection.message: Type
X, Y: VLSM message
trace_project: state X * list transition_item → option (state Y * list transition_item)
Hsimul: VLSM_partial_projection X Y trace_project∀ (sX : state X) (itemX : transition_item), input_valid_transition_item X sX itemX → ∀ (sY : state Y) (itemY : transition_item), trace_project (sX, [itemX]) = Some (sY, [itemY]) → input_valid Y (l itemY) (sY, input itemY)