Comment: EventML spec properties
exports:                 []
prefix:                  CLK:s
name:                    clock.esh:s
Comment: ------ CLK - headers ------
⋅
Definition: CLK_headers
CLK_headers() ==  [``CLK msg``]
Lemma: CLK_headers_wf
CLK_headers() ∈ Name List
Definition: CLK_headers_no_rep
CLK_headers_no_rep() ==  no_repeats(Name;CLK_headers())
Lemma: CLK_headers_no_rep_wf
CLK_headers_no_rep() ∈ ℙ
Definition: CLK_headers_fun
CLK_headers_fun(MsgType) ==  λhdr.if name_eq(hdr;``CLK msg``) then MsgType × ℤ else Top fi 
Lemma: CLK_headers_fun_wf
∀[MsgType:ValueAllType]. (CLK_headers_fun(MsgType) ∈ Name ⟶ Type)
Definition: CLK_headers_type
CLK_headers_type{i:l}(MsgType) ==
  {f:Name ⟶ ValueAllType| CLK_headers_no_rep() ∧ (∀hdr∈CLK_headers().(f hdr) = (CLK_headers_fun(MsgType) hdr))} 
Lemma: CLK_headers_type_wf
∀[MsgType:ValueAllType]. (CLK_headers_type{i:l}(MsgType) ∈ ℙ')
Comment: ------ CLK - specification ------
⋅
Definition: CLK_msg'base
CLK_msg'base(MsgType;f) ==  Base(``CLK msg``)
Lemma: CLK_msg'base_wf
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)].  (CLK_msg'base(MsgType;f) ∈ EClass(MsgType × ℤ))
Definition: CLK_msg'base-program
CLK_msg'base-program(MsgType;f) ==  base-class-program(``CLK msg``)
Lemma: CLK_msg'base-program_wf
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_msg'base-program(MsgType;f) ∈ LocalClass(CLK_msg'base(MsgType;f)))
Definition: CLK_msg'send
CLK_msg'send(MsgType;f) ==  λl,z. mk-msg-interface(l;make-Msg(``CLK msg``;z))
Lemma: CLK_msg'send_wf
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_msg'send(MsgType;f) ∈ Id ⟶ (MsgType × ℤ) ⟶ Interface)
Definition: CLK_upd_clock
CLK_upd_clock(MsgType) ==  λslf,z,clock. let z,timestamp = z in imax(timestamp;clock) + 1
Lemma: CLK_upd_clock_wf
∀[MsgType:ValueAllType]. (CLK_upd_clock(MsgType) ∈ Id ⟶ (MsgType × ℤ) ⟶ ℤ ⟶ ℤ)
Definition: CLK_Clock
CLK_Clock(MsgType;f) ==  state-class1(λslf.0;CLK_upd_clock(MsgType);CLK_msg'base(MsgType;f))
Lemma: CLK_Clock_wf
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)].  (CLK_Clock(MsgType;f) ∈ EClass(ℤ))
Lemma: CLK_Clock-functional
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)]. ∀[es:EO+(Message(f))].  CLK_Clock(MsgType;f) is functional
Definition: CLK_ClockFun
CLK_ClockVal(MsgType;f)@e ==  CLK_Clock(MsgType;f)(e)
Lemma: CLK_ClockFun_wf
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)]. ∀[es:EO+(Message(f))]. ∀[e:E].
  (CLK_ClockVal(MsgType;f)@e ∈ ℤ)
Lemma: CLK_Clock-classrel
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  ∀es:EO+(Message(f)). ∀e:E. ∀v:ℤ.  (v ∈ CLK_Clock(MsgType;f)(e) 
⇐⇒ v = CLK_ClockVal(MsgType;f)@e)
Definition: CLK_Clock-program
CLK_Clock-program(MsgType;f) ==  state-class1-program(λslf.0;CLK_upd_clock(MsgType);CLK_msg'base-program(MsgType;f))
Lemma: CLK_Clock-program_wf
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_Clock-program(MsgType;f) ∈ LocalClass(CLK_Clock(MsgType;f)))
Lemma: CLK_stric_inc
∀MsgType:ValueAllType. ∀f:CLK_headers_type{i:l}(MsgType). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀clock1,clock2:ℤ.
  ((∃a:MsgType × ℤ. ∃e:E. ((e1 <loc e) ∧ e ≤loc e2  ∧ a ∈ CLK_msg'base(MsgType;f)(e)))
  
⇒ (e1 <loc e2)
  
⇒ clock1 ∈ CLK_Clock(MsgType;f)(e1)
  
⇒ clock2 ∈ CLK_Clock(MsgType;f)(e2)
  
⇒ clock1 < clock2)
Definition: CLK_mk_reply
CLK_mk_reply(MsgType;reply;f) ==
  λslf,z,clock. let msg_val,z = z 
                in let new_msg,recipient = reply slf msg_val 
                   in {CLK_msg'send(MsgType;f) recipient <new_msg, clock>}
Lemma: CLK_mk_reply_wf
∀[MsgType:ValueAllType]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_mk_reply(MsgType;reply;f) ∈ Id ⟶ (MsgType × ℤ) ⟶ ℤ ⟶ bag(Interface))
Definition: CLK_Reply
CLK_Reply(MsgType;reply;f) ==  ((CLK_mk_reply(MsgType;reply;f) o CLK_msg'base(MsgType;f)) o CLK_Clock(MsgType;f))
Lemma: CLK_Reply_wf
∀[MsgType:ValueAllType]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_Reply(MsgType;reply;f) ∈ EClass(Interface))
Definition: CLK_Reply-program
CLK_Reply-program(MsgType;reply;f) ==
  eclass1-program(CLK_mk_reply(MsgType;reply;f);CLK_msg'base-program(MsgType;f)) o CLK_Clock-program(MsgType;f)
Lemma: CLK_Reply-program_wf
∀[MsgType:ValueAllType]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_Reply-program(MsgType;reply;f) ∈ LocalClass(CLK_Reply(MsgType;reply;f)))
Definition: CLK_main
CLK_main(MsgType;locs;reply;f) ==  CLK_Reply(MsgType;reply;f)@locs
Lemma: CLK_main_wf
∀[MsgType:ValueAllType]. ∀[locs:bag(Id)]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_main(MsgType;locs;reply;f) ∈ EClass(Interface))
Definition: CLK_main-program
CLK_main-program(MsgType;locs;reply;f) ==  (CLK_Reply-program(MsgType;reply;f))@locs
Lemma: CLK_main-program_wf
∀[MsgType:ValueAllType]. ∀[locs:bag(Id)]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_main-program(MsgType;locs;reply;f) ∈ LocalClass(CLK_main(MsgType;locs;reply;f)))
Comment: ------ CLK - extra ------
⋅
Definition: CLK_headers_internal
CLK_headers_internal() ==  [``CLK msg``]
Lemma: CLK_headers_internal_wf
CLK_headers_internal() ∈ Name List
Definition: CLK_headers_no_inputs
CLK_headers_no_inputs() ==  [``CLK msg``]
Lemma: CLK_headers_no_inputs_wf
CLK_headers_no_inputs() ∈ Name List
Definition: CLK_headers_no_inputs_types
CLK_headers_no_inputs_types(MsgType) ==  [<``CLK msg``, MsgType × ℤ>]
Lemma: CLK_headers_no_inputs_types_wf
∀[MsgType:ValueAllType]. (CLK_headers_no_inputs_types(MsgType) ∈ (Name × Type) List)
Definition: CLK_message-constraint
CLK_message-constraint{i:l}(MsgType;locs;reply;f) ==
  msg-interface-constraint{i:l}(CLK_main(MsgType;locs;reply;f);CLK_headers_internal();f)
Lemma: CLK_message-constraint_wf
∀[MsgType:ValueAllType]. ∀[locs:bag(Id)]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_message-constraint{i:l}(MsgType;locs;reply;f) ∈ ℙ')
Definition: CLK_messages-delivered
CLK_messages-delivered{i:l}(MsgType;locs;reply;f) ==  msgs-interface-delivered{i:l}(CLK_main(MsgType;locs;reply;f);f)
Lemma: CLK_messages-delivered_wf
∀[MsgType:ValueAllType]. ∀[locs:bag(Id)]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)]. ∀[f:CLK_headers_type{i:l}(MsgType)].
  (CLK_messages-delivered{i:l}(MsgType;locs;reply;f) ∈ ℙ')
Lemma: CLK-ilf
∀[MsgType:{T:Type| valueall-type(T)} ]. ∀[locs:bag(Id)]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)].
∀[f:CLK_headers_type{i:l}(MsgType)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[m:Message(f)].
  {<d, i, m> ∈ CLK_main(MsgType;locs;reply;f)(e)
  
⇐⇒ loc(e) ↓∈ locs
      ∧ ((header(e) = ``CLK msg``) ∧ has-es-info-type(es;e;f;MsgType × ℤ))
      ∧ (d = 0)
      ∧ (i = (snd((reply loc(e) (fst(msgval(e)))))))
      ∧ (m = make-Msg(``CLK msg``;<fst((reply loc(e) (fst(msgval(e))))), CLK_ClockVal(MsgType;f)@e>))}
Lemma: CLK-msg
∀[MsgType:{T:Type| valueall-type(T)} ]. ∀[locs:bag(Id)]. ∀[reply:Id ⟶ MsgType ⟶ (MsgType × Id)].
∀[f:CLK_headers_type{i:l}(MsgType)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹]. ∀[v:MsgType]. ∀[k:ℤ].
  (<d, i, mk-msg(auth;``CLK msg``;<v, k>)> ∈ CLK_main(MsgType;locs;reply;f)(e)
  
⇐⇒ loc(e) ↓∈ locs
      ∧ ((header(e) = ``CLK msg``) ∧ has-es-info-type(es;e;f;MsgType × ℤ))
      ∧ (d = 0)
      ∧ (i = (snd((reply loc(e) (fst(msgval(e)))))))
      ∧ auth = ff
      ∧ (v = (fst((reply loc(e) (fst(msgval(e)))))))
      ∧ (k = CLK_ClockVal(MsgType;f)@e))
Lemma: CLK_main-opt1
∀[MsgType,locs,reply,f:Top].
  (CLK_main-program(MsgType;locs;reply;f) 
  ~ λi.case i ∈b locs
        of inl() =>
        fix((λmk-hdf,clock. (inl (λv.let x,y = v 
                                     in let x@0,y@0 = y 
                                        in case name_eq(x@0;``CLK msg``)
                                            of inl(x5) =>
                                            let z,timestamp = y@0 
                                            in let x1 ⟵ eval a = timestamp in
                                                         eval b = clock in
                                                           if (b) < (a)  then a + 1  else (b + 1)
                                               in let v3 ⟵ (CLK_mk_reply(MsgType;reply;f) i <z, timestamp> x1) @ []
                                                  in <mk-hdf x1, v3>
                                            | inr(x5) =>
                                            let x2 ⟵ clock
                                            in <mk-hdf x2, []>)))) 
        0
        | inr() =>
        inr ⋅ )
Lemma: CLK_main-opt2
∀[MsgType,locs,reply,f:Top].
  (CLK_main-program(MsgType;locs;reply;f) 
  ~ λi.case i ∈b locs
        of inl() =>
        fix((λmk-hdf,clock. (inl (λv.let x,y = v 
                                     in let x@0,y@0 = y 
                                        in case name_eq(x@0;``CLK msg``)
                                            of inl(x5) =>
                                            let z,timestamp = y@0 
                                            in let x1 ⟵ eval a = timestamp in
                                                         eval b = clock in
                                                           if (b) < (a)  then a + 1  else (b + 1)
                                               in let v3 ⟵ (CLK_mk_reply(MsgType;reply;f) i <z, timestamp> x1) @ []
                                                  in <mk-hdf x1, v3>
                                            | inr(x5) =>
                                            let x2 ⟵ clock
                                            in <mk-hdf x2, []>)))) 
        0
        | inr() =>
        inr ⋅ )
Lemma: CLK_strict_inc2
∀MsgType:ValueAllType. ∀f:CLK_headers_type{i:l}(MsgType). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀clock1,clock2:ℤ.
  ((∃e:E. ((e1 <loc e) ∧ e ≤loc e2  ∧ (↑e ∈b CLK_msg'base(MsgType;f))))
  
⇒ (e1 <loc e2)
  
⇒ clock1 ∈ CLK_Clock(MsgType;f)(e1)
  
⇒ clock2 ∈ CLK_Clock(MsgType;f)(e2)
  
⇒ clock1 < clock2)
Lemma: CLK_ClockFun-eq
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)]. ∀[es:EO+(Message(f))]. ∀[e:E].
  CLK_ClockVal(MsgType;f)@e
  = (imax(snd(CLK_msg'base(MsgType;f)@e);if first(e) then 0 else CLK_ClockVal(MsgType;f)@pred(e) fi ) + 1) 
  supposing ∀e:E. (↑e ∈b CLK_msg'base(MsgType;f))
Lemma: CLK_ClockFun-eq2
∀[MsgType:ValueAllType]. ∀[f:CLK_headers_type{i:l}(MsgType)]. ∀[es:EO+(Message(f))]. ∀[e:E].
  (CLK_ClockVal(MsgType;f)@e
  = if e ∈b CLK_msg'base(MsgType;f)
      then if first(e)
           then imax(snd(CLK_msg'base(MsgType;f)@e);0) + 1
           else imax(snd(CLK_msg'base(MsgType;f)@e);CLK_ClockVal(MsgType;f)@pred(e)) + 1
           fi 
    if first(e) then 0
    else CLK_ClockVal(MsgType;f)@pred(e)
    fi )
Lemma: CLK-prop
∀MsgType:ValueAllType. ∀locs:bag(Id). ∀reply:Id ⟶ MsgType ⟶ (MsgType × Id). ∀f:CLK_headers_type{i:l}(MsgType).
∀es:EO+(Message(f)). ∀e1,e2:E. ∀clock1,clock2:ℤ.
  (CLK_message-constraint{i:l}(MsgType;locs;reply;f)
  
⇒ (∀e:E. (↑e ∈b CLK_msg'base(MsgType;f)))
  
⇒ e1 ⟶ e2
  
⇒ clock1 ∈ CLK_Clock(MsgType;f)(e1)
  
⇒ clock2 ∈ CLK_Clock(MsgType;f)(e2)
  
⇒ clock1 < clock2)
Lemma: CLK-prop2
∀MsgType:ValueAllType. ∀locs:bag(Id). ∀reply:Id ⟶ MsgType ⟶ (MsgType × Id). ∀f:CLK_headers_type{i:l}(MsgType).
∀es:EO+(Message(f)). ∀e1,e2:E. ∀clock1,clock2:ℤ.
  ((∀e:E. (↑e ∈b CLK_msg'base(MsgType;f)))
  
⇒ e1 ⟶ e2
  
⇒ clock1 ∈ CLK_Clock(MsgType;f)(e1)
  
⇒ clock2 ∈ CLK_Clock(MsgType;f)(e2)
  
⇒ clock1 < clock2)
Home
Index