1+ From mathcomp Require Import all_ssreflect.
2+
3+ Set Implicit Arguments .
4+ Unset Printing Implicit Defensive.
5+
6+ Require Import ClassicalExtras.
7+ Require Import MyNotation.
8+ Require Import Setoid .
9+ Require Import FunctionalExtensionality.
10+
11+ Require Import Galois.
12+ Require Import LanguageModel.
13+ Require Import TraceModel.
14+ Require Import Properties.
15+ Require Import ChainModel.
16+
17+ Require Import Robust2relSafetyProperty.
18+ (* Require Import Robust2relTraceProperty.
19+ Require Import Robust2relTraceCriterion. *)
20+
21+ Require Import PropExtensionality.
22+ Definition prop_extensionality := propositional_extensionality.
23+
24+ Section Robust2relSafetyCriterion.
25+
26+ Variable Source Target: Language.
27+ Variable compilation_chain : CompilationChain Source Target.
28+
29+ Variable T_evs S_evs : Events.
30+ Variable T_end S_end : Endstates.
31+
32+ Locate Safety.
33+
34+ Local Definition trace__S:= @trace S_evs S_end.
35+ Local Definition finpref__S := @finpref S_evs S_end.
36+ Local Definition trace__T := @trace T_evs T_end.
37+ Local Definition finpref__T := @finpref T_evs T_end.
38+
39+ Local Definition prop__S := prop trace__S.
40+ Local Definition Safety__S := @Safety2 S_evs S_end.
41+ Local Definition prop__T := prop trace__T.
42+ Local Definition Safety__T := @Safety2 T_evs T_end.
43+
44+ Variable Source_Semantics : Semantics Source trace__S.
45+ Variable Target_Semantics : Semantics Target trace__T.
46+
47+ Local Definition sem__S := sem Source_Semantics.
48+ Local Definition sem__T := sem Target_Semantics.
49+ Local Definition par__S := par Source.
50+ Local Definition par__T := par Target.
51+ Local Definition ctx__S := ctx Source.
52+ Local Definition ctx__T := ctx Target.
53+ Local Definition rsat__S := rsat2 Source_Semantics.
54+ Local Definition rsat__T := rsat2 Target_Semantics.
55+
56+ Local Definition cmp := compile_par Source Target compilation_chain.
57+
58+ Local Notation "P ↓" := (cmp P) (at level 50).
59+ (* CA: don't understand why this does not work
60+
61+ Local Notation " C [ P ] " := (plug _ P C) (at level 50).
62+ *)
63+ Local Definition plug__S:= plug Source.
64+ Local Definition plug__T := plug Target.
65+
66+ Variable rel : trace__S -> trace__T -> Prop.
67+
68+ Local Definition σ : (trace__T * trace__T -> Prop ) -> (trace__S * trace__S -> Prop ) :=
69+ γ (@induced_connection_prod (trace__T) (trace__S) rel).
70+
71+ Local Definition τ : (trace__S * trace__S -> Prop ) -> (trace__T * trace__T -> Prop ) :=
72+ α (@induced_connection_prod (trace__T) (trace__S) rel).
73+
74+ Local Definition induced_adj : Adjunction_law τ σ :=
75+ adjunction_law (induced_connection_prod rel).
76+
77+
78+ Local Definition σR2rSP := σR2rSP compilation_chain
79+ Source_Semantics Target_Semantics
80+ σ.
81+
82+ Local Definition s2Cl_τR2rTP := s2Cl_τR2rTP compilation_chain
83+ Source_Semantics Target_Semantics
84+ τ.
85+
86+ Definition rel_R2rSC : Prop :=
87+ forall C__T P1 P2 t1 t2 m1 m2,
88+ prefix m1 t1 ->
89+ prefix m2 t2 ->
90+ sem__T (plug__T (P1 ↓) C__T) t1 ->
91+ sem__T (plug__T (P2 ↓) C__T) t2 ->
92+ exists C__S t1' t2' s1 s2,
93+ rel s1 t1' /\ rel s2 t2' /\ prefix m1 t1' /\ prefix m2 t2' /\
94+ sem__S (plug__S P1 C__S) s1 /\ sem__S (plug__S P2 C__S) s2.
95+
96+ Theorem rel_R2rSC_σR2rSP : rel_R2rSC <-> σR2rSP.
97+ Proof .
98+ have G2 : Galois_snd τ σ by firstorder.
99+ split.
100+ - move => Htilde P1 P2 π HSafety. setoid_rewrite contra_σR2rP.
101+ move => [C__T [t1 [t2 [Hsemt1 [Hsemt2 Hnot_t]]]]].
102+ destruct (HSafety t1 t2 Hnot_t) as [m1 [m2 [Hpref_m1_t1 [Hpref_m2_t2 m_witness]]]].
103+ destruct (Htilde C__T P1 P2 t1 t2 m1 m2) as
104+ [C__S [t1' [t2' [s1 [s2 [Hrel_s1_t1' [Hrel_s2_t2' [Hpref_m1_t1' [Hpref_m2_t2' [Hsem_s1 Hsem_s2]]]]]]]]]]; auto.
105+ exists C__S, s1, s2. split; auto. split; auto => Hσs.
106+ have Ht0 : π (t1', t2').
107+ { apply: G2; auto. now exists (s1, s2). }
108+ by apply: (m_witness t1' t2').
109+ - move => H_RP C__T P1 P2 t1 t2 m1 m2 Hpref_m1_t1 Hpref_m2_t2 Hsemt1 Hsemt2.
110+ have HSafetyπ : Safety__T (fun t => ~ prefix m1 (fst t) \/ ~ prefix m2 (snd t)).
111+ { move => t1' t2' /=. rewrite de_morgan2. move => [prefix_m1_t1' prefix_m2_t2'].
112+ rewrite <- dne in prefix_m1_t1', prefix_m2_t2'.
113+ exists m1, m2.
114+ repeat split; auto.
115+ move => t0 t00 m1_t0 m2_t0. rewrite de_morgan2. by repeat (rewrite -dne).
116+ }
117+ move : (H_RP P1 P2 (fun t => ~ prefix m1 (fst t) \/ ~ prefix m2 (snd t)) HSafetyπ).
118+ setoid_rewrite contra_σR2rP => Himp. destruct Himp as [C__S [s1 [s2 [Hsem_s1 [Hsem_s2 Hσ]]]]].
119+ exists C__T, t1, t2. repeat split; auto.
120+ rewrite de_morgan2 /=. by repeat (rewrite -dne).
121+ move: Hσ. rewrite /σ. rewrite not_forall_ex_not.
122+ move => [[t1' t2'] H].
123+ move/not_imp: H => [rel1 H].
124+ move/not_imp: H => [rel2 H].
125+ simpl in *. move/de_morgan2: H. repeat (rewrite -dne). move => [pref1 pref2].
126+ by exists C__S, t1', t2', s1, s2.
127+ Qed .
128+
129+ Theorem rel_R2rSC_2sCl_τR2rTP : rel_R2rSC <-> s2Cl_τR2rTP.
130+ Proof .
131+ setoid_rewrite <- (Adj_σR2rSP_iff_s2Cl_τR2rTP _ _ _ induced_adj).
132+ exact rel_R2rSC_σR2rSP.
133+ Qed .
134+
135+ End Robust2relSafetyCriterion.
0 commit comments