End MINMAX_EFF.

(* Specifications: *)
(*The interpolation for the afterExternal rule*)
Lemma EFF_interp_II_strong: forall m1 m2 nu12
(MInj12 : Mem.inject (as_inj nu12) m1 m2) m1'
(Fwd1: mem_forward m1 m1') nu23 m3
(MInj23 : Mem.inject (as_inj nu23) m2 m3) m3'
(Fwd3: mem_forward m3 m3')
nu' (WDnu' : SM_wd nu')
(SMvalNu' : sm_valid nu' m1' m3')
(MemInjNu' : Mem.inject (as_inj nu') m1' m3')
(ExtIncr: extern_incr (compose_sm nu12 nu23) nu')
(SMInjSep: sm_inject_separated (compose_sm nu12 nu23) nu' m1 m3)
(SMV12: sm_valid nu12 m1 m2)
(SMV23: sm_valid nu23 m2 m3)
(UnchPrivSrc: Mem.unchanged_on (fun b ofs => locBlocksSrc (compose_sm nu12 nu23) b = true /\
pubBlocksSrc (compose_sm nu12 nu23) b = false) m1 m1')
(UnchLOOR13: Mem.unchanged_on (local_out_of_reach (compose_sm nu12 nu23) m1) m3 m3')
(GlueInvNu: SM_wd nu12 /\ SM_wd nu23 /\
locBlocksTgt nu12 = locBlocksSrc nu23 /\
extBlocksTgt nu12 = extBlocksSrc nu23 /\
(forall b, pubBlocksTgt nu12 b = true ->
pubBlocksSrc nu23 b = true) /\
(forall b, frgnBlocksTgt nu12 b = true ->
frgnBlocksSrc nu23 b = true))
(Norm12: forall b1 b2 d1, extern_of nu12 b1 = Some(b2,d1) ->
exists b3 d2, extern_of nu23 b2 = Some(b3, d2)),
exists m2', exists nu12', exists nu23', nu'=compose_sm nu12' nu23' /\
extern_incr nu12 nu12' /\ extern_incr nu23 nu23' /\
Mem.inject (as_inj nu12') m1' m2' /\ mem_forward m2 m2' /\
Mem.inject (as_inj nu23') m2' m3' /\
sm_inject_separated nu12 nu12' m1 m2 /\
sm_inject_separated nu23 nu23' m2 m3 /\
sm_valid nu12' m1' m2' /\ sm_valid nu23' m2' m3' /\
(SM_wd nu12' /\ SM_wd nu23' /\
locBlocksTgt nu12' = locBlocksSrc nu23' /\
extBlocksTgt nu12' = extBlocksSrc nu23' /\
(forall b, pubBlocksTgt nu12' b = true ->
pubBlocksSrc nu23' b = true) /\
(forall b, frgnBlocksTgt nu12' b = true ->
frgnBlocksSrc nu23' b = true)) /\
(forall b1 b2 d1, extern_of nu12' b1 = Some(b2,d1) ->
exists b3 d2, extern_of nu23' b2 = Some(b3, d2)) /\
Mem.unchanged_on (fun b ofs => locBlocksSrc nu23 b = true /\
pubBlocksSrc nu23 b = false) m2 m2' /\
Mem.unchanged_on (local_out_of_reach nu12 m1) m2 m2' /\
(forall b1 b2 d1, as_inj nu12' b1 = Some(b2,d1) ->
as_inj nu12 b1 = Some(b2,d1) \/
exists b3 d, as_inj nu' b1 = Some(b3,d)) /\
(forall b2 b3 d2, as_inj nu23' b2 = Some(b3,d2) ->
as_inj nu23 b2 = Some(b3,d2) \/
exists b1 d, as_inj nu' b1 = Some(b3,d)) /\
(forall b1 b2 ofs2, as_inj nu12' b1 = Some(b2,ofs2) ->
(as_inj nu12 b1 = Some (b2,ofs2)) \/
(b1 = Mem.nextblock m1 /\ b2 = Mem.nextblock m2 /\ ofs2 = 0) \/
(exists m, (b1 = Mem.nextblock m1 + m /\ b2=Mem.nextblock m2 + m)%positive /\ ofs2=0)) /\
(forall b2 b3 ofs3, as_inj nu23' b2 = Some(b3,ofs3) ->
(as_inj nu23 b2 = Some (b3,ofs3)) \/
(b2 = Mem.nextblock m2 /\ as_inj nu' (Mem.nextblock m1) = Some(b3,ofs3)) \/
(exists m, (b2 = Mem.nextblock m2 + m)%positive /\
as_inj nu' ((Mem.nextblock m1+m)%positive) = Some(b3,ofs3))).