From stdpp Require Import prelude finite.From VLSM.Lib Require Import Preamble StdppExtras Measurable. From VLSM.Core Require Import VLSM PreloadedVLSM MessageDependencies.
ELMO: Basic Definitions and Results for UMO, MO and ELMO
Section sec_base_ELMO. Context {Address : Type} `{EqDecision Address}.
Messages can be labeled as either sent or received.
Inductive Label : Type := | Receive | Send. Inductive State : Type := MkState { obs : list Observation; adr : Address; } with Observation : Type := MkObservation { label : Label; message : Message; } (** A [Message] is a wrapper for [State]. *) with Message : Type := MkMessage { state : State; }.
States, Observations and Messages are printed like ordinary inductive
types, using their constructor names, instead of as records with the
{| ... |} notation.
Add Printing Constructor State Observation Message.
Two states are equal when they have equal observations and equal addresses.
Address: Type
EqDecision0: EqDecision Address∀ s1 s2 : State, obs s1 = obs s2 → adr s1 = adr s2 → s1 = s2by intros [] []; cbn; congruence. Qed.Address: Type
EqDecision0: EqDecision Address∀ s1 s2 : State, obs s1 = obs s2 → adr s1 = adr s2 → s1 = s2Address: Type
EqDecision0: EqDecision Address∀ m1 m2 : Message, obs (state m1) = obs (state m2) → adr (state m1) = adr (state m2) → m1 = m2by intros [[]] [[]]; cbn; congruence. Qed.Address: Type
EqDecision0: EqDecision Address∀ m1 m2 : Message, obs (state m1) = obs (state m2) → adr (state m1) = adr (state m2) → m1 = m2Address: Type
EqDecision0: EqDecision Address∀ ob1 ob2 : Observation, label ob1 = label ob2 → message ob1 = message ob2 → ob1 = ob2by intros [] []; cbn; congruence. Qed.Address: Type
EqDecision0: EqDecision Address∀ ob1 ob2 : Observation, label ob1 = label ob2 → message ob1 = message ob2 → ob1 = ob2
Labels, States, Observations and Messages have decidable equality.
Address: Type
EqDecision0: EqDecision AddressEqDecision Labelby intros x y; unfold Decision; decide equality. Defined.Address: Type
EqDecision0: EqDecision AddressEqDecision LabelAddress: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : State, {x = y} + {x ≠ y}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : Observation, {x = y} + {x ≠ y}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : Message, {x = y} + {x ≠ y}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : State, {x = y} + {x ≠ y}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : Observation, {x = y} + {x ≠ y}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : Message, {x = y} + {x ≠ y}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : State, {x = y} + {x ≠ y}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}
x, y: State
obs0: list Observation
adr0: Address
obs1: list Observation
adr1: Address
a: obs0 = obs1{adr0 = adr1} + {adr0 ≠ adr1}Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}
x, y: State
obs0: list Observation
adr0: Address
obs1: list Observation
adr1: Address{obs0 = obs1} + {obs0 ≠ obs1}by apply EqDecision0.Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}
x, y: State
obs0: list Observation
adr0: Address
obs1: list Observation
adr1: Address
a: obs0 = obs1{adr0 = adr1} + {adr0 ≠ adr1}by decide equality.Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}
x, y: State
obs0: list Observation
adr0: Address
obs1: list Observation
adr1: Address{obs0 = obs1} + {obs0 ≠ obs1}by do 2 decide equality.Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : Observation, {x = y} + {x ≠ y}by intros x y; decide equality. Defined. #[export] Instance EqDecision_State : EqDecision State := State_eq_dec. #[export] Instance EqDecision_Observation : EqDecision Observation := Observation_eq_dec. #[export] Instance EqDecision_Message : EqDecision Message := Message_eq_dec.Address: Type
EqDecision0: EqDecision Address
State_eq_dec: ∀ x y : State, {x = y} + {x ≠ y}
Observation_eq_dec: ∀ x y : Observation, {x = y} + {x ≠ y}
Message_eq_dec: ∀ x y : Message, {x = y} + {x ≠ y}∀ x y : Message, {x = y} + {x ≠ y}
A notion of size for States, Observations and Messages.
Fixpoint sizeState (s : State) : nat := 1 + fold_right (fun ob sizeObs => sizeObservation ob + sizeObs) 0 (obs s) with sizeObservation (ob : Observation) : nat := 1 + sizeMessage (message ob) with sizeMessage (msg : Message) : nat := 1 + sizeState (state msg).Address: Type
EqDecision0: EqDecision Address
ob: ObservationsizeObservation ob = 2 + sizeState (state (message ob))by destruct ob as [? []]. Qed.Address: Type
EqDecision0: EqDecision Address
ob: ObservationsizeObservation ob = 2 + sizeState (state (message ob))
Extending States with new Observations
Definition addObservation' (ob : Observation) (obs : list Observation) : list Observation := ob :: obs.Address: Type
EqDecision0: EqDecision Address
P: list Observation → Prop
Hempty: P []
Hadd: ∀ (ob : Observation) (obs : list Observation), P obs → P (addObservation' ob obs)∀ obs : list Observation, P obsexact (list_ind P Hempty Hadd). Qed.Address: Type
EqDecision0: EqDecision Address
P: list Observation → Prop
Hempty: P []
Hadd: ∀ (ob : Observation) (obs : list Observation), P obs → P (addObservation' ob obs)∀ obs : list Observation, P obsAddress: Type
EqDecision0: EqDecision Address
P: list Observation → Set
Hempty: P []
Hadd: ∀ (ob : Observation) (obs : list Observation), P obs → P (addObservation' ob obs)∀ obs : list Observation, P obsexact (list_rec P Hempty Hadd). Defined.Address: Type
EqDecision0: EqDecision Address
P: list Observation → Set
Hempty: P []
Hadd: ∀ (ob : Observation) (obs : list Observation), P obs → P (addObservation' ob obs)∀ obs : list Observation, P obsAddress: Type
EqDecision0: EqDecision Address
P: list Observation → Type
Hempty: P []
Hadd: ∀ (ob : Observation) (obs : list Observation), P obs → P (addObservation' ob obs)∀ obs : list Observation, P obsexact (list_rect P Hempty Hadd). Defined. Definition addObservation (ob : Observation) (s : State) : State := MkState (addObservation' ob (obs s)) (adr s). Notation "s <+> ob" := (addObservation ob s) (left associativity, at level 50).Address: Type
EqDecision0: EqDecision Address
P: list Observation → Type
Hempty: P []
Hadd: ∀ (ob : Observation) (obs : list Observation), P obs → P (addObservation' ob obs)∀ obs : list Observation, P obs
The induction principle addObservation_ind considers a State
as built up using addObservation from an initial state.
Address: Type
EqDecision0: EqDecision Address
P: State → Prop
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)∀ obs : State, P obsAddress: Type
EqDecision0: EqDecision Address
P: State → Prop
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)∀ obs : State, P obsAddress: Type
EqDecision0: EqDecision Address
P: State → Prop
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)
obs: list Observation
a: AddressP (MkState obs a)by apply (Hadd ob) in IHobs. Qed.Address: Type
EqDecision0: EqDecision Address
P: State → Prop
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)
a: Address
ob: Observation
obs0: list Observation
IHobs: P (MkState obs0 a)P (MkState (addObservation' ob obs0) a)Address: Type
EqDecision0: EqDecision Address
P: State → Set
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)∀ obs : State, P obsAddress: Type
EqDecision0: EqDecision Address
P: State → Set
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)∀ obs : State, P obsAddress: Type
EqDecision0: EqDecision Address
P: State → Set
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)
obs: list Observation
a: AddressP (MkState obs a)by apply (Hadd ob) in IHobs. Defined.Address: Type
EqDecision0: EqDecision Address
P: State → Set
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)
a: Address
ob: Observation
obs0: list Observation
IHobs: P (MkState obs0 a)P (MkState (addObservation' ob obs0) a)Address: Type
EqDecision0: EqDecision Address
P: State → Type
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)∀ obs : State, P obsAddress: Type
EqDecision0: EqDecision Address
P: State → Type
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)∀ obs : State, P obsAddress: Type
EqDecision0: EqDecision Address
P: State → Type
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)
obs: list Observation
a: AddressP (MkState obs a)by apply (Hadd ob) in IHobs. Defined.Address: Type
EqDecision0: EqDecision Address
P: State → Type
Hempty: ∀ a : Address, P (MkState [] a)
Hadd: ∀ (ob : Observation) (s : State), P s → P (s <+> ob)
a: Address
ob: Observation
obs0: list Observation
IHobs: P (MkState obs0 a)P (MkState (addObservation' ob obs0) a)
This induction principle is like addObservation_ind, but
also provides an induction hypothesis for the State contained
in the message of the added observation.
Definition addObservation_both_ind
(P : State -> Prop)
(Hinit : forall a, P (MkState [] a))
(Hadd : forall [s l ms], P s -> P ms -> P (s <+> MkObservation l (MkMessage ms))) :
forall s, P s :=
fix rec s :=
let '(MkState ol a) := s in
let Hcons := fun '(MkObservation _ (MkMessage ms)) _ IHol' => Hadd IHol' (rec ms)
in list_ind _ (Hinit a) Hcons ol.
A property on sizeState of addObservation.
Useful because a Fixpoint can't be unfolded unless
the argument is in the form of a constructor application.
Address: Type
EqDecision0: EqDecision Address
s: State
ob: ObservationsizeState (s <+> ob) = sizeState s + sizeObservation obby destruct s; cbn; lia. Qed. Definition addObservations (obs' : list Observation) (s : State) : State := MkState (obs' ++ (obs s)) (adr s). Notation "s <++> obs" := (addObservations obs s) (left associativity, at level 50). Definition addObservationToMessage (ob : Observation) (m : Message) : Message := MkMessage (state m <+> ob). Notation "m <*> ob" := (addObservationToMessage ob m) (left associativity, at level 50). Definition addObservationsToMessage (obs' : list Observation) (m : Message) : Message := MkMessage (state m <++> obs'). Notation "m <**> obs" := (addObservationsToMessage obs m) (left associativity, at level 50).Address: Type
EqDecision0: EqDecision Address
s: State
ob: ObservationsizeState (s <+> ob) = sizeState s + sizeObservation ob
<+> is injective in both arguments.
Address: Type
EqDecision0: EqDecision Address∀ (ob1 ob2 : Observation) (s1 s2 : State), s1 <+> ob1 = s2 <+> ob2 → ob1 = ob2 ∧ s1 = s2Address: Type
EqDecision0: EqDecision Address∀ (ob1 ob2 : Observation) (s1 s2 : State), s1 <+> ob1 = s2 <+> ob2 → ob1 = ob2 ∧ s1 = s2by split; [| apply eq_State]. Qed.Address: Type
EqDecision0: EqDecision Address
ob2: Observation
s1, s2: State
H0: obs s1 = obs s2
H1: adr s1 = adr s2ob2 = ob2 ∧ s1 = s2
Adding an observation to a state results in a different state.
Address: Type
EqDecision0: EqDecision Address∀ (ob : Observation) (s : State), s <+> ob ≠ sAddress: Type
EqDecision0: EqDecision Address∀ (ob : Observation) (s : State), s <+> ob ≠ sAddress: Type
EqDecision0: EqDecision Address
ob: Observation
obs: list Observation
adr: Address
Heq: addObservation' ob obs = obsFalseby apply (app_inv_tail _ [ob] []) in Heq. Qed.Address: Type
EqDecision0: EqDecision Address
ob: Observation
obs: list Observation
adr: Address
Heq: ob :: obs = obsFalse
Adding no observations does not change the state.
Address: Type
EqDecision0: EqDecision Address∀ s : State, s <++> [] = sby intros []. Qed.Address: Type
EqDecision0: EqDecision Address∀ s : State, s <++> [] = s
Adding a single observation is compatible with adding many observations at
once, in the obvious way.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (obs' : list Observation), s <+> ob <++> obs' = s <++> (obs' ++ [ob])Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (obs' : list Observation), s <+> ob <++> obs' = s <++> (obs' ++ [ob])by apply eq_State; cbn; [rewrite <- app_assoc |]. Qed.Address: Type
EqDecision0: EqDecision Address
s: State
ob: Observation
obs': list Observations <+> ob <++> obs' = s <++> (obs' ++ [ob])Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (obs' : list Observation), s <++> obs' <+> ob = s <++> (ob :: obs')Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (obs' : list Observation), s <++> obs' <+> ob = s <++> (ob :: obs')by apply eq_State; cbn. Qed.Address: Type
EqDecision0: EqDecision Address
s: State
ob: Observation
obs': list Observations <++> obs' <+> ob = s <++> (ob :: obs')
An observation in s <+> ob is either the added observation ob
or an observation in the original state.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob ob' : Observation), ob' ∈ obs (s <+> ob) ↔ ob' = ob ∨ ob' ∈ obs sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (ob ob' : Observation), ob' ∈ obs (s <+> ob) ↔ ob' = ob ∨ ob' ∈ obs sAddress: Type
EqDecision0: EqDecision Address
s_obs: list Observation
a: Address
ob, ob': Observationob' ∈ obs (MkState s_obs a <+> ob) ↔ ob' = ob ∨ ob' ∈ obs (MkState s_obs a)by apply elem_of_cons. Qed.Address: Type
EqDecision0: EqDecision Address
s_obs: list Observation
a: Address
ob, ob': Observationob' ∈ ob :: s_obs ↔ ob' = ob ∨ ob' ∈ s_obs
The immediate substate relation. May be used to prove that
a State does not contain itself.
Inductive immediate_substate : State -> State -> Prop := | substate_prev : forall s ob, immediate_substate s (s <+> ob) | substate_new : forall s ob, immediate_substate (state (message ob)) (s <+> ob).Address: Type
EqDecision0: EqDecision Addresswf immediate_substateAddress: Type
EqDecision0: EqDecision Addresswf immediate_substateAddress: Type
EqDecision0: EqDecision Address
a: Address∀ y : State, immediate_substate y (MkState [] a) → Acc immediate_substate yAddress: Type
EqDecision0: EqDecision Address
s1: State
l: Label
s2: State
IHs1: Acc immediate_substate s1
IHs2: Acc immediate_substate s2∀ y : State, immediate_substate y (s1 <+> MkObservation l (MkMessage s2)) → Acc immediate_substate yby inversion 1.Address: Type
EqDecision0: EqDecision Address
a: Address∀ y : State, immediate_substate y (MkState [] a) → Acc immediate_substate yby inversion 1; [rewrite (eq_State y s1) | subst y]. Qed.Address: Type
EqDecision0: EqDecision Address
s1: State
l: Label
s2: State
IHs1: Acc immediate_substate s1
IHs2: Acc immediate_substate s2∀ y : State, immediate_substate y (s1 <+> MkObservation l (MkMessage s2)) → Acc immediate_substate y
Definition isSend (ob : Observation) : Prop := match label ob with | Send => True | Receive => False end. Definition isReceive (ob : Observation) : Prop := match label ob with | Send => False | Receive => True end.Address: Type
EqDecision0: EqDecision Address
ob: ObservationDecision (isSend ob)by destruct ob as [[] m]; cbn; typeclasses eauto. Defined.Address: Type
EqDecision0: EqDecision Address
ob: ObservationDecision (isSend ob)Address: Type
EqDecision0: EqDecision Address
ob: ObservationDecision (isReceive ob)by destruct ob as [[] m]; cbn; typeclasses eauto. Defined. Definition messages' (obs : list Observation) : list Message := map message obs. Definition messages (st : State) : list Message := messages' (obs st). Definition sentMessages' (obs : list Observation) : list Message := map message (filter isSend obs). Definition sentMessages (st : State) : list Message := sentMessages' (obs st). Definition receivedMessages' (obs : list Observation) : list Message := map message (filter isReceive obs). Definition receivedMessages (st : State) : list Message := receivedMessages' (obs st). Definition receivedAddresses (st : State) : list Address := map (fun m => adr (state m)) (receivedMessages st).Address: Type
EqDecision0: EqDecision Address
ob: ObservationDecision (isReceive ob)Address: Type
EqDecision0: EqDecision Address
B: Type
f: Observation → B
P: Observation → Prop
P_dec: ∀ a : Observation, Decision (P a)∀ (s : State) (ob : Observation) (v : B), v ∈ map f (filter P (obs (s <+> ob))) ↔ v = f ob ∧ P ob ∨ v ∈ map f (filter P (obs s))Address: Type
EqDecision0: EqDecision Address
B: Type
f: Observation → B
P: Observation → Prop
P_dec: ∀ a : Observation, Decision (P a)∀ (s : State) (ob : Observation) (v : B), v ∈ map f (filter P (obs (s <+> ob))) ↔ v = f ob ∧ P ob ∨ v ∈ map f (filter P (obs s))Address: Type
EqDecision0: EqDecision Address
B: Type
f: Observation → B
P: Observation → Prop
P_dec: ∀ a : Observation, Decision (P a)
s: State
ob: Observation
v: Bv ∈ map f (filter P (obs (s <+> ob))) ↔ v = f ob ∧ P ob ∨ v ∈ map f (filter P (obs s))Address: Type
EqDecision0: EqDecision Address
B: Type
f: Observation → B
P: Observation → Prop
P_dec: ∀ a : Observation, Decision (P a)
s: State
ob: Observation
v: B(∃ y : Observation, v = f y ∧ y ∈ filter P (obs (s <+> ob))) ↔ v = f ob ∧ P ob ∨ (∃ y : Observation, v = f y ∧ y ∈ filter P (obs s))Address: Type
EqDecision0: EqDecision Address
B: Type
f: Observation → B
P: Observation → Prop
P_dec: ∀ a : Observation, Decision (P a)
s: State
ob: Observation
v: B(∃ y : Observation, v = f y ∧ P y ∧ y ∈ obs (s <+> ob)) ↔ v = f ob ∧ P ob ∨ (∃ y : Observation, v = f y ∧ P y ∧ y ∈ obs s)Address: Type
EqDecision0: EqDecision Address
B: Type
f: Observation → B
P: Observation → Prop
P_dec: ∀ a : Observation, Decision (P a)
s: State
ob: Observation
v: B(∃ y : Observation, v = f y ∧ P y ∧ y ∈ ob :: obs s) ↔ v = f ob ∧ P ob ∨ (∃ y : Observation, v = f y ∧ P y ∧ y ∈ obs s)by split; intros H; decompose [and or ex] H; subst; eauto. Qed.Address: Type
EqDecision0: EqDecision Address
B: Type
f: Observation → B
P: Observation → Prop
P_dec: ∀ a : Observation, Decision (P a)
s: State
ob: Observation
v: B(∃ y : Observation, v = f y ∧ P y ∧ (y = ob ∨ y ∈ obs s)) ↔ v = f ob ∧ P ob ∨ (∃ y : Observation, v = f y ∧ P y ∧ y ∈ obs s)
When a message belongs to the sentMessages of some state, then the state
contains a corresponding observation which was sent. The converse also holds.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (m : Message), m ∈ sentMessages s ↔ MkObservation Send m ∈ obs sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (m : Message), m ∈ sentMessages s ↔ MkObservation Send m ∈ obs sAddress: Type
EqDecision0: EqDecision Address
s: State
m: Messagem ∈ map message (filter isSend (obs s)) ↔ MkObservation Send m ∈ obs sAddress: Type
EqDecision0: EqDecision Address
s: State
m: Message(∃ y : Observation, m = message y ∧ isSend y ∧ y ∈ obs s) ↔ MkObservation Send m ∈ obs sby intros ([[] ?] & -> & []); cbn in *. Qed.Address: Type
EqDecision0: EqDecision Address
s: State
m: Message(∃ y : Observation, m = message y ∧ isSend y ∧ y ∈ obs s) → MkObservation Send m ∈ obs s
A message in sentMessages (s <+> ob) is either in
sentMessages s or is the message in the new observation ob,
and can only be the message from ob if that is a Send observation.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (m : Message), m ∈ sentMessages (s <+> ob) ↔ m = message ob ∧ isSend ob ∨ m ∈ sentMessages sby apply elem_of_map_filter_addObservation. Qed.Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (m : Message), m ∈ sentMessages (s <+> ob) ↔ m = message ob ∧ isSend ob ∨ m ∈ sentMessages sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), sentMessages (s <+> ob) = (if decide (isSend ob) then message ob :: sentMessages s else sentMessages s)Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), sentMessages (s <+> ob) = (if decide (isSend ob) then message ob :: sentMessages s else sentMessages s)Address: Type
EqDecision0: EqDecision Address
s: State
ob: ObservationsentMessages (s <+> ob) = (if decide (isSend ob) then message ob :: sentMessages s else sentMessages s)by destruct (decide (isSend ob)). Qed.Address: Type
EqDecision0: EqDecision Address
s: State
ob: Observationmap message (if decide (isSend ob) then ob :: filter isSend (obs s) else filter isSend (obs s)) = (if decide (isSend ob) then message ob :: map message (filter isSend (obs s)) else map message (filter isSend (obs s)))
When a message belongs to the receivedMessages of some state, then the state
contains a corresponding observation which was received. The converse also holds.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (m : Message), m ∈ receivedMessages s ↔ MkObservation Receive m ∈ obs sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (m : Message), m ∈ receivedMessages s ↔ MkObservation Receive m ∈ obs sAddress: Type
EqDecision0: EqDecision Address
s: State
m: Messagem ∈ map message (filter isReceive (obs s)) ↔ MkObservation Receive m ∈ obs sAddress: Type
EqDecision0: EqDecision Address
s: State
m: Message(∃ y : Observation, m = message y ∧ isReceive y ∧ y ∈ obs s) ↔ MkObservation Receive m ∈ obs sby intros ([[] ?] & -> & []); cbn in *. Qed.Address: Type
EqDecision0: EqDecision Address
s: State
m: Message(∃ y : Observation, m = message y ∧ isReceive y ∧ y ∈ obs s) → MkObservation Receive m ∈ obs s
A message in receivedMessages (s <+> ob) is either in
receivedMessages s or is the message in the new observation ob,
and can only be the message from ob if that is a Receive observation.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (m : Message), m ∈ receivedMessages (s <+> ob) ↔ m = message ob ∧ isReceive ob ∨ m ∈ receivedMessages sby apply elem_of_map_filter_addObservation. Qed.Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (m : Message), m ∈ receivedMessages (s <+> ob) ↔ m = message ob ∧ isReceive ob ∨ m ∈ receivedMessages sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), receivedMessages (s <+> ob) = (if decide (isReceive ob) then message ob :: receivedMessages s else receivedMessages s)Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), receivedMessages (s <+> ob) = (if decide (isReceive ob) then message ob :: receivedMessages s else receivedMessages s)Address: Type
EqDecision0: EqDecision Address
s: State
ob: ObservationreceivedMessages (s <+> ob) = (if decide (isReceive ob) then message ob :: receivedMessages s else receivedMessages s)by destruct (decide (isReceive ob)). Qed.Address: Type
EqDecision0: EqDecision Address
s: State
ob: Observationmap message (if decide (isReceive ob) then ob :: filter isReceive (obs s) else filter isReceive (obs s)) = (if decide (isReceive ob) then message ob :: map message (filter isReceive (obs s)) else map message (filter isReceive (obs s)))Address: Type
EqDecision0: EqDecision Address∀ (s : State) (m : Message), m ∈ messages s ↔ m ∈ sentMessages s ∨ m ∈ receivedMessages sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (m : Message), m ∈ messages s ↔ m ∈ sentMessages s ∨ m ∈ receivedMessages sAddress: Type
EqDecision0: EqDecision Address
s: State
m: Messagem ∈ map message (obs s) ↔ m ∈ sentMessages s ∨ m ∈ receivedMessages sAddress: Type
EqDecision0: EqDecision Address
s: State
m: Message(∃ y : Observation, m = message y ∧ y ∈ obs s) ↔ MkObservation Send m ∈ obs s ∨ MkObservation Receive m ∈ obs sAddress: Type
EqDecision0: EqDecision Address
s: State
m: Message(∃ y : Observation, m = message y ∧ y ∈ obs s) → MkObservation Send m ∈ obs s ∨ MkObservation Receive m ∈ obs sAddress: Type
EqDecision0: EqDecision Address
s: State
m: MessageMkObservation Send m ∈ obs s ∨ MkObservation Receive m ∈ obs s → ∃ y : Observation, m = message y ∧ y ∈ obs sby intros [[[]] [-> Hm]]; auto.Address: Type
EqDecision0: EqDecision Address
s: State
m: Message(∃ y : Observation, m = message y ∧ y ∈ obs s) → MkObservation Send m ∈ obs s ∨ MkObservation Receive m ∈ obs sby intros []; (eexists; split; [| eauto]). Qed.Address: Type
EqDecision0: EqDecision Address
s: State
m: MessageMkObservation Send m ∈ obs s ∨ MkObservation Receive m ∈ obs s → ∃ y : Observation, m = message y ∧ y ∈ obs s
A message in s <+> ob is either the message of the added
observation ob or a message in the original state.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (m : Message), m ∈ messages (s <+> ob) ↔ m = message ob ∨ m ∈ messages sby intros; apply elem_of_cons. Qed.Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (m : Message), m ∈ messages (s <+> ob) ↔ m = message ob ∨ m ∈ messages sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), messages (s <+> ob) = message ob :: messages sdone. Qed.Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), messages (s <+> ob) = message ob :: messages s
An address in receivedAddresses (s <+> ob) is either in
receivedAddresses s or is the address from the message in the
new observation ob, and can only be from ob if that is
a Receive observation.
Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (a : Address), a ∈ receivedAddresses (s <+> ob) ↔ a = adr (state (message ob)) ∧ isReceive ob ∨ a ∈ receivedAddresses sAddress: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation) (a : Address), a ∈ receivedAddresses (s <+> ob) ↔ a = adr (state (message ob)) ∧ isReceive ob ∨ a ∈ receivedAddresses sAddress: Type
EqDecision0: EqDecision Address
s: State
ob: Observation
a: Addressa ∈ receivedAddresses (s <+> ob) ↔ a = adr (state (message ob)) ∧ isReceive ob ∨ a ∈ receivedAddresses sby rewrite !map_map, elem_of_map_filter_addObservation. Qed.Address: Type
EqDecision0: EqDecision Address
s: State
ob: Observation
a: Addressa ∈ map (λ m : Message, adr (state m)) (map message (filter isReceive (obs (s <+> ob)))) ↔ a = adr (state (message ob)) ∧ isReceive ob ∨ a ∈ map (λ m : Message, adr (state m)) (map message (filter isReceive (obs s)))Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), receivedAddresses (s <+> ob) = (if decide (isReceive ob) then adr (state (message ob)) :: receivedAddresses s else receivedAddresses s)Address: Type
EqDecision0: EqDecision Address∀ (s : State) (ob : Observation), receivedAddresses (s <+> ob) = (if decide (isReceive ob) then adr (state (message ob)) :: receivedAddresses s else receivedAddresses s)Address: Type
EqDecision0: EqDecision Address
s: State
ob: ObservationreceivedAddresses (s <+> ob) = (if decide (isReceive ob) then adr (state (message ob)) :: receivedAddresses s else receivedAddresses s)by destruct (decide (isReceive ob)). Qed. End sec_base_ELMO. Notation "s <+> ob" := (addObservation ob s) (left associativity, at level 50). Notation "s <++> obs" := (addObservations obs s) (left associativity, at level 50). Notation "m <*> ob" := (addObservationToMessage ob m) (left associativity, at level 50). Notation "m <**> obs" := (addObservationsToMessage obs m) (left associativity, at level 50). Section sec_BaseELMO_Observations. Context {Address : Type} `{EqDecision Address} (State := @State Address) (Observation := @Observation Address) (Message := @Message Address) . Definition ELMO_component_type : VLSMType Message := {| VLSM.state := State; VLSM.label := Label; |}.Address: Type
EqDecision0: EqDecision Address
s: State
ob: Observationmap (λ m : Message, adr (state m)) (map message (if decide (isReceive ob) then ob :: filter isReceive (obs s) else filter isReceive (obs s))) = (if decide (isReceive ob) then adr (state (message ob)) :: map (λ m : Message, adr (state m)) (receivedMessages s) else map (λ m : Message, adr (state m)) (receivedMessages s))
We can extract a trace from a list of Observations.
Fixpoint observations2trace (obs : list Observation) (adr : Address)
: list (transition_item ELMO_component_type) :=
match obs with
| [] => []
| MkObservation Send msg as ob :: obs =>
let s' := MkState obs adr in
let msg' := MkMessage s' in
let ob' := MkObservation Send msg' in
let obs' := addObservation' ob' obs in
let dest := MkState obs' adr in
observations2trace obs adr ++
[Build_transition_item ELMO_component_type Send None dest (Some msg')]
| MkObservation Receive msg as ob :: obs =>
let dest := MkState (ob :: obs) adr in
observations2trace obs adr ++
[Build_transition_item ELMO_component_type Receive (Some msg) dest None]
end.
A state contains a list of observations, so we can extract a trace from a state.
Definition state2trace (s : State) : list transition_item :=
observations2trace (obs s) (adr s).
Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (ob : Observation), ob ∈ obs s → sizeState (state (message ob)) < sizeState sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (ob : Observation), ob ∈ obs s → sizeState (state (message ob)) < sizeState sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
ob: BaseELMO.Observation
s: BaseELMO.State
IHs: ∀ ob : Observation, ob ∈ obs s → sizeState (state (message ob)) < sizeState s
H: ob ∈ obs (s <+> ob)sizeState (state (message ob)) < sizeState (s <+> ob)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
ob: BaseELMO.Observation
s: BaseELMO.State
IHs: ∀ ob : Observation, ob ∈ obs s → sizeState (state (message ob)) < sizeState s
ob0: Observation
H: ob0 ∈ obs (s <+> ob)
H2: ob0 ∈ obs ssizeState (state (message ob0)) < sizeState (s <+> ob)by destruct ob as [? []]; unfold sizeState; cbn; lia.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
ob: BaseELMO.Observation
s: BaseELMO.State
IHs: ∀ ob : Observation, ob ∈ obs s → sizeState (state (message ob)) < sizeState s
H: ob ∈ obs (s <+> ob)sizeState (state (message ob)) < sizeState (s <+> ob)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
ob: BaseELMO.Observation
s: BaseELMO.State
IHs: ∀ ob : Observation, ob ∈ obs s → sizeState (state (message ob)) < sizeState s
ob0: Observation
H: ob0 ∈ obs (s <+> ob)
H2: ob0 ∈ obs ssizeState (state (message ob0)) < sizeState (s <+> ob)by destruct s, ob as [? []]; unfold sizeState; cbn; lia. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
ob: BaseELMO.Observation
s: BaseELMO.State
IHs: ∀ ob : Observation, ob ∈ obs s → sizeState (state (message ob)) < sizeState s
ob0: Observation
H: ob0 ∈ obs (s <+> ob)
H2: ob0 ∈ obs ssizeState s < sizeState (s <+> ob)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (m : Message), m ∈ messages s → sizeState (state m) < sizeState sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (m : Message), m ∈ messages s → sizeState (state m) < sizeState sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: State
m: Message
Hm: m ∈ messages ssizeState (state m) < sizeState sby apply obs_sizeState. Qed. Inductive rec_obs : State -> Observation -> Prop := | rec_new : forall (s : State) (ob : Observation), rec_obs (s <+> ob) ob | rec_prev : forall (s : State) (ob' ob : Observation), rec_obs s ob -> rec_obs (s <+> ob') ob | rec_recv : forall (s : State) (m : Message) (ob : Observation), rec_obs (state m) ob -> rec_obs (s <+> MkObservation Receive m) ob. Equations rec_obs_fn (s : State) : listset Observation by wf (sizeState s) lt := | {| obs := [] |} => ∅ | {| obs := o :: os; adr := a |} => {[ o ]} ∪ rec_obs_fn (state (message o)) ∪ rec_obs_fn {| obs := os; adr := a |}.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: State
o: BaseELMO.Observation
Hobs: o ∈ obs ssizeState (state (message o)) < sizeState sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (o : BaseELMO.Observation) (os : list BaseELMO.Observation) (a : Address), (∀ x : State, sizeState x < sizeState {| obs := o :: os; adr := a |} → listset Observation) → sizeState (state (message o)) < sizeState {| obs := o :: os; adr := a |}by intros [? []] os a _; unfold sizeState; cbn; lia. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (o : BaseELMO.Observation) (os : list BaseELMO.Observation) (a : Address), (∀ x : State, sizeState x < sizeState {| obs := o :: os; adr := a |} → listset Observation) → sizeState (state (message o)) < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (o : BaseELMO.Observation) (os : list BaseELMO.Observation) (a : Address), (∀ x : State, sizeState x < sizeState {| obs := o :: os; adr := a |} → listset Observation) → sizeState {| obs := os; adr := a |} < sizeState {| obs := o :: os; adr := a |}by intros [? []] os a _; unfold sizeState; cbn; lia. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (o : BaseELMO.Observation) (os : list BaseELMO.Observation) (a : Address), (∀ x : State, sizeState x < sizeState {| obs := o :: os; adr := a |} → listset Observation) → sizeState {| obs := os; adr := a |} < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (o : Observation), rec_obs s o → o ∈ rec_obs_fn sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (o : Observation), rec_obs s o → o ∈ rec_obs_fn sby intros [] os a Hindm Hindos o; inversion 1 as [[] ? | [] ? | [] ?]; subst; cbn in *; unfold Observation; rewrite !elem_of_union, ?elem_of_singleton; itauto. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (o : BaseELMO.Observation) (os : list BaseELMO.Observation) (a : Address), (∀ o0 : Observation, rec_obs (state (message o)) o0 → o0 ∈ rec_obs_fn (state (message o))) → (∀ o0 : Observation, rec_obs {| obs := os; adr := a |} o0 → o0 ∈ rec_obs_fn {| obs := os; adr := a |}) → ∀ o0 : Observation, rec_obs {| obs := o :: os; adr := a |} o0 → o0 ∈ {[o]} ∪ rec_obs_fn (state (message o)) ∪ rec_obs_fn {| obs := os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (o : Observation), o ∈ rec_obs_fn s → sizeState (state (message o)) < sizeState sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (s : State) (o : Observation), o ∈ rec_obs_fn s → sizeState (state (message o)) < sizeState sAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ (o : BaseELMO.Observation) (os : list BaseELMO.Observation) (a : Address), (∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))) → (∀ o0 : Observation, o0 ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o0)) < sizeState {| obs := os; adr := a |}) → ∀ o0 : Observation, o0 ∈ {[o]} ∪ rec_obs_fn (state (message o)) ∪ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o0)) < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Heq: o0 ∈ {[o]}sizeState (state (message o0)) < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Ho: o0 ∈ rec_obs_fn (state (message o))sizeState (state (message o0)) < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Hos: o0 ∈ rec_obs_fn {| obs := os; adr := a |}sizeState (state (message o0)) < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Heq: o0 ∈ {[o]}sizeState (state (message o0)) < sizeState {| obs := o :: os; adr := a |}by unfold sizeState; destruct o as [? []]; cbn; lia.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}sizeState (state (message o)) < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Ho: o0 ∈ rec_obs_fn (state (message o))sizeState (state (message o0)) < sizeState {| obs := o :: os; adr := a |}by unfold sizeState; destruct o as [? []]; cbn; lia.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Ho: o0 ∈ rec_obs_fn (state (message o))sizeState (state (message o)) < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Hos: o0 ∈ rec_obs_fn {| obs := os; adr := a |}sizeState (state (message o0)) < sizeState {| obs := o :: os; adr := a |}by unfold sizeState; destruct o as [? []]; cbn; lia. Qed. Definition Message_dependencies (m : Message) : listset Message := list_to_set (map message (obs (state m))). Definition Message_full_dependencies (m : Message) : listset Message := fin_sets.set_map message (rec_obs_fn (state m)).Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
o: BaseELMO.Observation
os: list BaseELMO.Observation
a: Address
Hindo: ∀ o0 : Observation, o0 ∈ rec_obs_fn (state (message o)) → sizeState (state (message o0)) < sizeState (state (message o))
Hindos: ∀ o : Observation, o ∈ rec_obs_fn {| obs := os; adr := a |} → sizeState (state (message o)) < sizeState {| obs := os; adr := a |}
o0: Observation
Hos: o0 ∈ rec_obs_fn {| obs := os; adr := a |}sizeState {| obs := os; adr := a |} < sizeState {| obs := o :: os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
dm, m: Messagedm ∈ Message_full_dependencies m → sizeState (state dm) < sizeState (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
dm, m: Messagedm ∈ Message_full_dependencies m → sizeState (state dm) < sizeState (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
dm, m: Message
Hdm: dm ∈ set_map message (rec_obs_fn (state m))sizeState (state dm) < sizeState (state m)by apply rec_obs_fn_sizeState. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
m: Message
o: BaseELMO.Observation
Ho: o ∈ rec_obs_fn (state m)sizeState (state (message o)) < sizeState (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: TypeFullMessageDependencies Message_dependencies Message_full_dependenciesAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: TypeFullMessageDependencies Message_dependencies Message_full_dependenciesAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type∀ dm m : Message, dm ∈ Message_full_dependencies m ↔ msg_dep_happens_before Message_dependencies dm mAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State∀ dm : Message, dm ∈ set_map message (rec_obs_fn s) ↔ msg_dep_happens_before Message_dependencies dm {| state := s |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
adr: Address
dm: Messagedm ∈ set_map message ∅ → msg_dep_happens_before Message_dependencies dm {| state := {| obs := []; adr := adr |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
adr: Address
dm: Messagemsg_dep_happens_before Message_dependencies dm {| state := {| obs := []; adr := adr |} |} → dm ∈ set_map message ∅Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Messagedm ∈ set_map message ({[{| label := l; message := m |}]} ∪ rec_obs_fn (state (message {| label := l; message := m |})) ∪ rec_obs_fn {| obs := os; adr := a |}) → msg_dep_happens_before Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Messagemsg_dep_happens_before Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} → dm ∈ set_map message ({[{| label := l; message := m |}]} ∪ rec_obs_fn (state (message {| label := l; message := m |})) ∪ rec_obs_fn {| obs := os; adr := a |})by rewrite set_map_empty, elem_of_empty.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
adr: Address
dm: Messagedm ∈ set_map message ∅ → msg_dep_happens_before Message_dependencies dm {| state := {| obs := []; adr := adr |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
adr: Address
dm: Messagemsg_dep_happens_before Message_dependencies dm {| state := {| obs := []; adr := adr |} |} → dm ∈ set_map message ∅Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
adr: Address
dm: Messagedm ∈ ∅ ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies dm y ∧ y ∈ ∅) → dm ∈ set_map message ∅by firstorder.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
adr: Address
dm: MessageFalse ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies dm y ∧ False) → FalseAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Messagedm ∈ set_map message ({[{| label := l; message := m |}]} ∪ rec_obs_fn (state (message {| label := l; message := m |})) ∪ rec_obs_fn {| obs := os; adr := a |}) → msg_dep_happens_before Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hdm: o ∈ {[{| label := l; message := m |}]} ∪ rec_obs_fn (state (message {| label := l; message := m |})) ∪ rec_obs_fn {| obs := os; adr := a |}msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hdm: (o = {| label := l; message := m |} ∨ o ∈ rec_obs_fn (state m)) ∨ o ∈ rec_obs_fn {| obs := os; adr := a |}msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}msg_dep_happens_before Message_dependencies (message {| label := l; message := m |}) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}msg_dep_happens_before Message_dependencies (message {| label := l; message := m |}) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}msg_dep_rel Message_dependencies (message {| label := l; message := m |}) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}by rewrite elem_of_union, elem_of_singleton; left.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}m ∈ {[m]} ∪ list_to_set (map message os)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state m)) ↔ msg_dep_happens_before Message_dependencies dm {| state := state m |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)msg_dep_happens_before Message_dependencies (message o) mAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state m)) ↔ msg_dep_happens_before Message_dependencies dm {| state := state m |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)msg_dep_happens_before Message_dependencies m {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}by destruct m; apply Hindm, elem_of_map; cbn; eexists; split.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state m)) ↔ msg_dep_happens_before Message_dependencies dm {| state := state m |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)msg_dep_happens_before Message_dependencies (message o) mAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state m)) ↔ msg_dep_happens_before Message_dependencies dm {| state := state m |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)msg_dep_happens_before Message_dependencies m {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state m)) ↔ msg_dep_happens_before Message_dependencies dm {| state := state m |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)msg_dep_rel Message_dependencies m {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}by rewrite elem_of_union, elem_of_singleton; left.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state m)) ↔ msg_dep_happens_before Message_dependencies dm {| state := state m |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hm: o ∈ rec_obs_fn (state m)m ∈ {[m]} ∪ list_to_set (map message os)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: message o ∈ set_map message (rec_obs_fn {| obs := os; adr := a |})msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}(∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}) → msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}(∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}) → msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}
Hext: ∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}msg_dep_rel Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies (message o) y ∧ msg_dep_rel Message_dependencies y {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hdep: msg_dep_rel Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}
Hext: ∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}msg_dep_rel Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies (message o) y ∧ msg_dep_rel Message_dependencies y {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
dm: Message
Hhb: msg_dep_happens_before Message_dependencies (message o) dm
Hdep: msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |}
Hext: ∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}msg_dep_rel Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies (message o) y ∧ msg_dep_rel Message_dependencies y {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |})by left; apply Hext.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hdep: msg_dep_rel Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}
Hext: ∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}msg_dep_rel Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies (message o) y ∧ msg_dep_rel Message_dependencies y {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |})by right; eexists; split; [| apply Hext].Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
dm: Message
Hhb: msg_dep_happens_before Message_dependencies (message o) dm
Hdep: msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |}
Hext: ∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}msg_dep_rel Message_dependencies (message o) {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies (message o) y ∧ msg_dep_rel Message_dependencies y {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}∀ dm : Message, msg_dep_rel Message_dependencies dm {| state := {| obs := os; adr := a |} |} → msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}by intros dm; rewrite elem_of_union; right.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
o: BaseELMO.Observation
Hos: o ∈ rec_obs_fn {| obs := os; adr := a |}
Hmos: msg_dep_happens_before Message_dependencies (message o) {| state := {| obs := os; adr := a |} |}∀ dm : Message, dm ∈ list_to_set (map message os) → dm ∈ {[m]} ∪ list_to_set (map message os)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Messagemsg_dep_happens_before Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} → dm ∈ set_map message ({[{| label := l; message := m |}]} ∪ rec_obs_fn (state (message {| label := l; message := m |})) ∪ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: msg_dep_happens_before Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}∃ x : BaseELMO.Observation, dm = message x ∧ x ∈ {[{| label := l; message := m |}]} ∪ rec_obs_fn (state (message {| label := l; message := m |})) ∪ rec_obs_fn {| obs := os; adr := a |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: msg_dep_happens_before Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |}∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: msg_dep_rel Message_dependencies dm {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |} ∨ (∃ y : Message, msg_dep_happens_before Message_dependencies dm y ∧ msg_dep_rel Message_dependencies y {| state := {| obs := {| label := l; message := m |} :: os; adr := a |} |})∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: dm ∈ {[m]} ∪ list_to_set (map message os) ∨ (∃ y : BaseELMO.Message, msg_dep_happens_before Message_dependencies dm y ∧ y ∈ {[m]} ∪ list_to_set (map message os))∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: (dm = m ∨ dm ∈ list_to_set (map message os)) ∨ (∃ y : BaseELMO.Message, msg_dep_happens_before Message_dependencies dm y ∧ (y = m ∨ y ∈ list_to_set (map message os)))∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}∃ x : BaseELMO.Observation, m = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hdm: dm ∈ list_to_set (map message os)∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hos: ∃ y : BaseELMO.Message, msg_dep_happens_before Message_dependencies dm y ∧ (y = m ∨ y ∈ list_to_set (map message os))∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})by eexists; split; [| by left; left].Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}∃ x : BaseELMO.Observation, m = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hdm: dm ∈ list_to_set (map message os)∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hdm: dm ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |} → ∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hdm: dm ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hdm: dm ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |} → ∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})by eexists; split; [| right].Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
y: BaseELMO.Observation
Hdm: message y ∈ list_to_set (map message os)
Hy: y ∈ rec_obs_fn {| obs := os; adr := a |}∃ x : BaseELMO.Observation, message y = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})by apply msg_dep_happens_before_iff_one; left.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hdm: dm ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hos: ∃ y : BaseELMO.Message, msg_dep_happens_before Message_dependencies dm y ∧ (y = m ∨ y ∈ list_to_set (map message os))∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: msg_dep_happens_before Message_dependencies dm m∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
y: BaseELMO.Message
Hb: msg_dep_happens_before Message_dependencies dm y
Hos: y ∈ list_to_set (map message os)∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: msg_dep_happens_before Message_dependencies dm m∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
state_m: BaseELMO.State
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := {| state := state_m |} |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := {| state := state_m |} |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
Hb: msg_dep_happens_before Message_dependencies dm {| state := state_m |}∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := {| state := state_m |} |} ∨ x ∈ rec_obs_fn (state {| state := state_m |})) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})by eexists; split; [| left; right].Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
state_m: BaseELMO.State
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := {| state := state_m |} |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := {| state := state_m |} |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
y: BaseELMO.Observation
Hy: y ∈ rec_obs_fn (state (message {| label := l; message := {| state := state_m |} |}))∃ x : BaseELMO.Observation, message y = message x ∧ ((x = {| label := l; message := {| state := state_m |} |} ∨ x ∈ rec_obs_fn (state {| state := state_m |})) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
y: BaseELMO.Message
Hb: msg_dep_happens_before Message_dependencies dm y
Hos: y ∈ list_to_set (map message os)∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
y: BaseELMO.Message
Hb: msg_dep_happens_before Message_dependencies dm y
Hos: y ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |} → ∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
y: BaseELMO.Message
Hb: msg_dep_happens_before Message_dependencies dm y
Hos: y ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
y: BaseELMO.Message
Hb: msg_dep_happens_before Message_dependencies dm y
Hos: y ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |} → ∃ x : BaseELMO.Observation, dm = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})by eexists; split; [| right].Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
y: BaseELMO.Message
z: BaseELMO.Observation
Hb: msg_dep_happens_before Message_dependencies (message z) y
Hos: y ∈ list_to_set (map message os)
Hz: z ∈ rec_obs_fn {| obs := os; adr := a |}∃ x : BaseELMO.Observation, message z = message x ∧ ((x = {| label := l; message := m |} ∨ x ∈ rec_obs_fn (state m)) ∨ x ∈ rec_obs_fn {| obs := os; adr := a |})Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
y: BaseELMO.Message
Hb: msg_dep_happens_before Message_dependencies dm y
Hos: y ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}by apply msg_dep_happens_before_iff_one; left. Qed. Context `{finite.Finite index} `{Inhabited index} (idx : index -> Address) `{!Inj (=) (=) idx} . Definition adr2idx (a : Address) : option index := head (filter (fun i => idx i = a) (enum index)).Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
s: BaseELMO.State
l: Label
m: BaseELMO.Message
os: list BaseELMO.Observation
a: Address
Hindm: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn (state (message {| label := l; message := m |}))) ↔ msg_dep_happens_before Message_dependencies dm {| state := state (message {| label := l; message := m |}) |}
Hindos: ∀ dm : Message, dm ∈ set_map message (rec_obs_fn {| obs := os; adr := a |}) ↔ msg_dep_happens_before Message_dependencies dm {| state := {| obs := os; adr := a |} |}
dm: Message
y: BaseELMO.Message
Hb: msg_dep_happens_before Message_dependencies dm y
Hos: y ∈ list_to_set (map message os)msg_dep_happens_before Message_dependencies y {| state := {| obs := os; adr := a |} |}Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ i : index, adr2idx (idx i) = Some iAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ i : index, adr2idx (idx i) = Some iAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: indexhead (filter (λ i0 : index, idx i0 = idx i) (enum index)) = Some iAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: index[i] = filter (λ i0 : index, idx i0 = idx i) (enum index)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: index∀ l : list index, NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) lAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l[i] = filter (λ i0 : index, idx i0 = idx i) (a :: l)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l[i] = filter (λ i0 : index, idx i0 = idx i) (a :: l)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = []Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l
Hnil: ∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = [][i] = filter (λ i0 : index, idx i0 = idx i) (a :: l)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = []Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l
i0: index
H1: i0 ∉ l∀ x : index, x ∈ l → idx x ≠ idx i0by eapply inj in Hj; [| done]; subst.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l
i0: index
H1: i0 ∉ l
j: index
Hj: idx j = idx i0j ∉ lAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l
Hnil: ∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = [][i] = filter (λ i0 : index, idx i0 = idx i) (a :: l)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
a: index
l: list index
IHl: NoDup l → a ∈ l → [a] = filter (λ i : index, idx i = idx a) l
Hnodup: NoDup (a :: l)
Hi: a ∈ a :: l
H3: a ∉ l
H4: NoDup l
Hnil: ∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = [][a] = (if decide (idx a = idx a) then a :: filter (λ i : index, idx i = idx a) l else filter (λ i : index, idx i = idx a) l)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l
Hnil: ∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = []
H5: i ∈ l[i] = (if decide (idx a = idx i) then a :: filter (λ i0 : index, idx i0 = idx i) l else filter (λ i0 : index, idx i0 = idx i) l)by rewrite decide_True, Hnil.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
a: index
l: list index
IHl: NoDup l → a ∈ l → [a] = filter (λ i : index, idx i = idx a) l
Hnodup: NoDup (a :: l)
Hi: a ∈ a :: l
H3: a ∉ l
H4: NoDup l
Hnil: ∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = [][a] = (if decide (idx a = idx a) then a :: filter (λ i : index, idx i = idx a) l else filter (λ i : index, idx i = idx a) l)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l
Hnil: ∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = []
H5: i ∈ l[i] = (if decide (idx a = idx i) then a :: filter (λ i0 : index, idx i0 = idx i) l else filter (λ i0 : index, idx i0 = idx i) l)by intro Hcontra; eapply inj in Hcontra; [| done]; subst. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i, a: index
l: list index
IHl: NoDup l → i ∈ l → [i] = filter (λ i0 : index, idx i0 = idx i) l
Hnodup: NoDup (a :: l)
Hi: i ∈ a :: l
H3: a ∉ l
H4: NoDup l
Hnil: ∀ i : index, i ∉ l → filter (λ i0 : index, idx i0 = idx i) l = []
H5: i ∈ lidx a ≠ idx iAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (i : index) (adr : Address), adr2idx adr = Some i → idx i = adrAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (i : index) (adr : Address), adr2idx adr = Some i → idx i = adrAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (i : index) (adr : Address), head (filter (λ i0 : index, idx i0 = adr) (enum index)) = Some i → idx i = adrAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: index
adr: Address
Heq: head (filter (λ i : index, idx i = adr) (enum index)) = Some iidx i = adrAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: index
adr: Address
Heq: head (filter (λ i : index, idx i = adr) (enum index)) = Some ii ∈ filter (λ i : index, idx i = adr) (enum index)by left. Qed. Definition Message_validator : Type := dsig (is_Some ∘ adr2idx). Definition Message_sender (m : Message) : option Message_validator := let a := adr (state m) in match decide (is_Some (adr2idx a)) with | left Ha => Some (dexist a Ha) | _ => None end.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: index
adr: Address
y: list index
Heq: head (i :: y) = Some ii ∈ i :: yAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (m : Message) (v : Message_validator), Message_sender m = Some v → `v = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (m : Message) (v : Message_validator), Message_sender m = Some v → `v = adr (state m)by inversion Hsender. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
v: Message
mv: Message_validator
H1: is_Some (adr2idx (adr (state v)))
Hsender: Some (dexist (adr (state v)) H1) = Some mv`mv = adr (state v)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (m : Message) (v : Message_validator), Message_sender m = Some v ↔ `v = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (m : Message) (v : Message_validator), Message_sender m = Some v ↔ `v = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
v: Message_validator`v = adr (state m) → Message_sender m = Some vAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
v: Message_validator
Hdec: is_Some (adr2idx (adr (state m)))
Hv: `v = adr (state m)Some (dexist (adr (state m)) Hdec) = Some vAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
v: Message_validator
Hdec: ¬ is_Some (adr2idx (adr (state m)))
Hv: `v = adr (state m)None = Some vby f_equal; apply dsig_eq.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
v: Message_validator
Hdec: is_Some (adr2idx (adr (state m)))
Hv: `v = adr (state m)Some (dexist (adr (state m)) Hdec) = Some vby destruct_dec_sig v a Ha Heq; subst v; cbn in Hv; subst a. Qed. Definition Message_sender_index (v : Message_validator) : index := is_Some_proj (proj2_dsig v). Definition Message_sender_index_inv_fn (i : index) : Message_validator := dexist (idx i) (ex_intro _ i (adr2idx_idx i)).Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
v: Message_validator
Hdec: ¬ is_Some (adr2idx (adr (state m)))
Hv: `v = adr (state m)None = Some vAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (i : index) (v : Message_validator), `v = idx i → Message_sender_index v = iAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (i : index) (v : Message_validator), `v = idx i → Message_sender_index v = iAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: index
v: Message_validator
Hv: `v = idx iMessage_sender_index v = iby apply is_Some_proj_elim, adr2idx_idx. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
i: index
Ha: (is_Some ∘ adr2idx) (idx i)Message_sender_index (dexist (idx i) Ha) = iAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (m : Message) (v : Message_validator), Message_sender m = Some v → idx (Message_sender_index v) = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx∀ (m : Message) (v : Message_validator), Message_sender m = Some v → idx (Message_sender_index v) = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
v: Message_validator
Hsender: Message_sender m = Some vidx (Message_sender_index v) = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
v: Message_validator
Hsender: `v = adr (state m)idx (Message_sender_index v) = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
a: Address
Ha: (is_Some ∘ adr2idx) a
Hsender: `(dexist a Ha) = adr (state m)idx (Message_sender_index (dexist a Ha)) = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
Ha: (is_Some ∘ adr2idx) (adr (state m))idx (Message_sender_index (dexist (adr (state m)) Ha)) = adr (state m)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
Ha: (is_Some ∘ adr2idx) (adr (state m))adr2idx (adr (state m)) = Some (Message_sender_index (dexist (adr (state m)) Ha))Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
a: index
Heq: adr2idx (adr (state m)) = Some aadr2idx (adr (state m)) = Some (Message_sender_index (dexist (adr (state m)) (ex_intro (λ x : index, adr2idx (adr (state m)) = Some x) a Heq)))Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
a: index
Heq: adr2idx (adr (state m)) = Some aSome a = Some (Message_sender_index (dexist (adr (state m)) (ex_intro (λ x : index, adr2idx (adr (state m)) = Some x) a Heq)))by symmetry; apply idx_adr2idx. Qed.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
m: Message
a: index
Heq: adr2idx (adr (state m)) = Some aadr (state m) = idx aAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idxInj eq eq Message_sender_indexAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idxInj eq eq Message_sender_indexAddress: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
v1, v2: Message_validatorMessage_sender_index v1 = Message_sender_index v2 → v1 = v2Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
v2: Message_validator
a1: Address
Ha1: (is_Some ∘ adr2idx) a1Message_sender_index (dexist a1 Ha1) = Message_sender_index v2 → dexist a1 Ha1 = v2Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
a1: Address
Ha1: (is_Some ∘ adr2idx) a1
a2: Address
Ha2: (is_Some ∘ adr2idx) a2Message_sender_index (dexist a1 Ha1) = Message_sender_index (dexist a2 Ha2) → dexist a1 Ha1 = dexist a2 Ha2Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
a1: Address
i1: index
Ha1: adr2idx a1 = Some i1
a2: Address
i2: index
Ha2: adr2idx a2 = Some i2Message_sender_index (dexist a1 (ex_intro (λ x : index, adr2idx a1 = Some x) i1 Ha1)) = Message_sender_index (dexist a2 (ex_intro (λ x : index, adr2idx a2 = Some x) i2 Ha2)) → dexist a1 (ex_intro (λ x : index, adr2idx a1 = Some x) i1 Ha1) = dexist a2 (ex_intro (λ x : index, adr2idx a2 = Some x) i2 Ha2)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
a1: Address
i1: index
Ha1: adr2idx a1 = Some i1
a2: Address
i2: index
Ha2: adr2idx a2 = Some i2is_Some_proj (proj2_dsig (dexist a1 (ex_intro (λ x : index, adr2idx a1 = Some x) i1 Ha1))) = is_Some_proj (proj2_dsig (dexist a2 (ex_intro (λ x : index, adr2idx a2 = Some x) i2 Ha2))) → dexist a1 (ex_intro (λ x : index, adr2idx a1 = Some x) i1 Ha1) = dexist a2 (ex_intro (λ x : index, adr2idx a2 = Some x) i2 Ha2)Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
a1: Address
i1: index
Ha1: adr2idx a1 = Some i1
a2: Address
i2: index
Ha2: adr2idx a2 = Some i2i1 = i2 → dexist a1 (ex_intro (λ x : index, adr2idx a1 = Some x) i1 Ha1) = dexist a2 (ex_intro (λ x : index, adr2idx a2 = Some x) i2 Ha2)by apply idx_adr2idx in Ha1, Ha2; subst. Qed. #[export] Instance Message_validator_measurable `{Measurable Address} : Measurable Message_validator := fun v => weight (`v). End sec_BaseELMO_Observations.Address: Type
EqDecision0: EqDecision Address
State:= BaseELMO.State: Type
Observation:= BaseELMO.Observation: Type
Message:= BaseELMO.Message: Type
index: Type
EqDecision1: EqDecision index
H: finite.Finite index
H0: Inhabited index
idx: index → Address
Inj0: Inj eq eq idx
a1: Address
i2: index
Ha1: adr2idx a1 = Some i2
a2: Address
Ha2: adr2idx a2 = Some i2a1 = a2
We want to display State, Observation and Message using constructors
also outside of the current module.
Add Printing Constructor State Observation Message.