Lemma: test
True

Comment: EventML spec properties
exports:                 []
prefix:                  pv11_p1:s
name:                    paxos-v11-part1.esh:s

Comment: ------ pv11_p1 - types ------


Definition: pv11_p1_Ballot_Num
pv11_p1_Ballot_Num() ==  ℤ × Id?

Lemma: pv11_p1_Ballot_Num_wf
pv11_p1_Ballot_Num() ∈ Type

Definition: pv11_p1_abs_Ballot_Num
pv11_p1_abs_Ballot_Num() ==  λx.x

Lemma: pv11_p1_abs_Ballot_Num_wf
pv11_p1_abs_Ballot_Num() ∈ (ℤ × Id?) ─→ pv11_p1_Ballot_Num()

Definition: pv11_p1_rep_Ballot_Num
pv11_p1_rep_Ballot_Num() ==  λx.x

Lemma: pv11_p1_rep_Ballot_Num_wf
pv11_p1_rep_Ballot_Num() ∈ pv11_p1_Ballot_Num() ─→ (ℤ × Id?)

Definition: pv11_p1_mk_bnum
pv11_p1_mk_bnum() ==  λn,loc. (inl <n, loc>)

Lemma: pv11_p1_mk_bnum_wf
pv11_p1_mk_bnum() ∈ ℤ ─→ Id ─→ pv11_p1_Ballot_Num()

Definition: pv11_p1_is_bnum
pv11_p1_is_bnum() ==  λbnum.isl(bnum)

Lemma: pv11_p1_is_bnum_wf
pv11_p1_is_bnum() ∈ pv11_p1_Ballot_Num() ─→ 𝔹

Definition: pv11_p1_upd_bnum
pv11_p1_upd_bnum() ==  λbnum,loc. case bnum of inl(z) => let r,l in pv11_p1_mk_bnum() (r 1) loc inr(z) => bnum

Lemma: pv11_p1_upd_bnum_wf
pv11_p1_upd_bnum() ∈ pv11_p1_Ballot_Num() ─→ Id ─→ pv11_p1_Ballot_Num()

Definition: pv11_p1_dummy_ballot
pv11_p1_dummy_ballot() ==  inr ⋅ 

Lemma: pv11_p1_dummy_ballot_wf
pv11_p1_dummy_ballot() ∈ pv11_p1_Ballot_Num()

Definition: pv11_p1_leq_bnum'
pv11_p1_leq_bnum'(ldrs_uid) ==
  λza,z. let i1,l1 za in let i2,l2 in i1 <i2 ∨b((i1 =z i2) ∧b ldrs_uid l1 ≤ldrs_uid l2)

Lemma: pv11_p1_leq_bnum'_wf
[ldrs_uid:Id ─→ ℤ]. (pv11_p1_leq_bnum'(ldrs_uid) ∈ (ℤ × Id) ─→ (ℤ × Id) ─→ 𝔹)

Definition: pv11_p1_leq_bnum
pv11_p1_leq_bnum(ldrs_uid) ==
  λbn1,bn2. case bn1
            of inl(x1) =>
            case bn2 of inl(x2) => pv11_p1_leq_bnum'(ldrs_uid) x1 x2 inr(z) => ff
            inr(z) =>
            tt

Lemma: pv11_p1_leq_bnum_wf
[ldrs_uid:Id ─→ ℤ]. (pv11_p1_leq_bnum(ldrs_uid) ∈ pv11_p1_Ballot_Num() ─→ pv11_p1_Ballot_Num() ─→ 𝔹)

Definition: pv11_p1_lt_bnum'
pv11_p1_lt_bnum'(ldrs_uid) ==
  λzb,z. let i1,l1 zb in let i2,l2 in i1 <i2 ∨b((i1 =z i2) ∧b ldrs_uid l1 <ldrs_uid l2)

Lemma: pv11_p1_lt_bnum'_wf
[ldrs_uid:Id ─→ ℤ]. (pv11_p1_lt_bnum'(ldrs_uid) ∈ (ℤ × Id) ─→ (ℤ × Id) ─→ 𝔹)

Definition: pv11_p1_lt_bnum
pv11_p1_lt_bnum{ABS:q, paxos-v11-part1.esh:o}(ldrs_uid) ==
  λbn1,bn2. case bn1
            of inl(x1) =>
            case bn2 of inl(x2) => pv11_p1_lt_bnum'(ldrs_uid) x1 x2 inr(z) => ff
            inr(z) =>
            isl(bn2)

Lemma: pv11_p1_lt_bnum_wf
[ldrs_uid:Id ─→ ℤ]. (pv11_p1_lt_bnum(ldrs_uid) ∈ pv11_p1_Ballot_Num() ─→ pv11_p1_Ballot_Num() ─→ 𝔹)

Definition: pv11_p1_eq_bnums
pv11_p1_eq_bnums() ==  λbn1,bn2. (union-deq(ℤ × Id;Unit;product-deq(ℤ;Id;IntDeq;IdDeq);UnitDeq) bn1 bn2)

Lemma: pv11_p1_eq_bnums_wf
pv11_p1_eq_bnums() ∈ pv11_p1_Ballot_Num() ─→ pv11_p1_Ballot_Num() ─→ 𝔹

Lemma: pv11_p1_eq_bnums-assert
[x,y:pv11_p1_Ballot_Num()].  uiff(↑(pv11_p1_eq_bnums() y);x y)

Comment: ------ pv11_p1 - headers ------


Definition: pv11_p1_headers
pv11_p1_headers() ==
  [``pv11_p1 p1a``;
   ``pv11_p1 p1b``;
   ``pv11_p1 p2a``;
   ``pv11_p1 p2b``;
   ``pv11_p1 preempted``;
   ``pv11_p1 adopted``;
   [propose];
   [decision]]

Lemma: pv11_p1_headers_wf
pv11_p1_headers() ∈ Name List

Definition: pv11_p1_headers_no_rep
pv11_p1_headers_no_rep() ==  no_repeats(Name;pv11_p1_headers())

Lemma: pv11_p1_headers_no_rep_wf
pv11_p1_headers_no_rep() ∈ ℙ

Definition: pv11_p1_headers_fun
pv11_p1_headers_fun(Cmd) ==
  λhdr.if name_eq(hdr;``pv11_p1 p1a``) then Id × pv11_p1_Ballot_Num()
       if name_eq(hdr;``pv11_p1 p1b``)
         then Id × pv11_p1_Ballot_Num() × pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)
       if name_eq(hdr;``pv11_p1 p2a``) then Id × pv11_p1_Ballot_Num() × ℤ × Cmd
       if name_eq(hdr;``pv11_p1 p2b``) then Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num()
       if name_eq(hdr;``pv11_p1 preempted``) then pv11_p1_Ballot_Num()
       if name_eq(hdr;``pv11_p1 adopted``) then pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)
       if name_eq(hdr;[propose]) then ℤ × Cmd
       if name_eq(hdr;[decision]) then ℤ × Cmd
       else Top
       fi 

Lemma: pv11_p1_headers_fun_wf
[Cmd:ValueAllType]. (pv11_p1_headers_fun(Cmd) ∈ Name ─→ Type)

Definition: pv11_p1_headers_type
pv11_p1_headers_type{i:l}(Cmd) ==
  {mf:Name ─→ ValueAllType| 
   pv11_p1_headers_no_rep() ∧ (∀hdr∈pv11_p1_headers().(mf hdr) (pv11_p1_headers_fun(Cmd) hdr))} 

Lemma: pv11_p1_headers_type_wf
[Cmd:ValueAllType]. (pv11_p1_headers_type{i:l}(Cmd) ∈ ℙ')

Comment: ------ pv11_p1 - specification ------


Definition: pv11_p1_max_bnum
pv11_p1_max_bnum(ldrs_uid) ==  λbn1,bn2. if pv11_p1_leq_bnum(ldrs_uid) bn1 bn2 then bn2 else bn1 fi 

Lemma: pv11_p1_max_bnum_wf
[ldrs_uid:Id ─→ ℤ]. (pv11_p1_max_bnum(ldrs_uid) ∈ pv11_p1_Ballot_Num() ─→ pv11_p1_Ballot_Num() ─→ pv11_p1_Ballot_Num())

Definition: pv11_p1_pmax
pv11_p1_pmax(Cmd;ldrs_uid) ==
  λpvals.let = λbn,slt,z. let bn',z in let s',z in (slt =z s') ∧b (bn  < bn') in
          let = λz.let bn,z 
                     in let s,c 
                        in ¬b(∃zw∈pvals.g bn zw)_b in
          mapfilter(λx.(snd(x));P;pvals)

Lemma: pv11_p1_pmax_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_pmax(Cmd;ldrs_uid) ∈ ((pv11_p1_Ballot_Num() × ℤ × Cmd) List) ─→ ((ℤ × Cmd) List))

Definition: pv11_p1_update_proposals
pv11_p1_update_proposals(Cmd) ==
  λproposals1,proposals2. (filter(λprp.(¬b(∃prp'∈proposals2.(fst(prp) =z fst(prp')))_b);proposals1) proposals2)

Lemma: pv11_p1_update_proposals_wf
[Cmd:ValueAllType]. (pv11_p1_update_proposals(Cmd) ∈ ((ℤ × Cmd) List) ─→ ((ℤ × Cmd) List) ─→ ((ℤ × Cmd) List))

Definition: pv11_p1_in_domain
pv11_p1_in_domain(Cmd) ==  λx,xys. x ∈b map(λx.(fst(x));xys))

Lemma: pv11_p1_in_domain_wf
[Cmd:ValueAllType]. (pv11_p1_in_domain(Cmd) ∈ ℤ ─→ ((ℤ × Cmd) List) ─→ 𝔹)

Definition: pv11_p1_same_proposal
pv11_p1_same_proposal(Cmd) ==  λzc,z. let slt1,cmd1 zc in let slt2,cmd2 in (slt1 =z slt2)

Lemma: pv11_p1_same_proposal_wf
[Cmd:ValueAllType]. (pv11_p1_same_proposal(Cmd) ∈ (ℤ × Cmd) ─→ (ℤ × Cmd) ─→ 𝔹)

Definition: pv11_p1_same_pvalue
pv11_p1_same_pvalue(Cmd) ==
  λzd,z. let bnum1,prp1 zd 
         in let bnum2,prp2 
            in (pv11_p1_eq_bnums() bnum1 bnum2) ∧b (pv11_p1_same_proposal(Cmd) prp1 prp2)

Lemma: pv11_p1_same_pvalue_wf
[Cmd:ValueAllType]
  (pv11_p1_same_pvalue(Cmd) ∈ (pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ (pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ 𝔹)

Definition: pv11_p1_add_if_new
pv11_p1_add_if_new() ==  λtest,val,lst. if (∃zzc∈lst.test val zzc)_b then lst else lst [val] fi 

Lemma: pv11_p1_add_if_new_wf
pv11_p1_add_if_new() ∈ ∩A:𝕌'. ((A ─→ A ─→ 𝔹) ─→ A ─→ (A List) ─→ (A List))

Definition: pv11_p1_append_news
pv11_p1_append_news(Cmd) ==
  λtest,zzg,zzh. accumulate (with value and list item x):
                  pv11_p1_add_if_new() test a
                 over list:
                   zzh
                 with starting value:
                  zzg)

Lemma: pv11_p1_append_news_wf
[Cmd:ValueAllType]
  (pv11_p1_append_news(Cmd) ∈ ((pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ (pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ 𝔹)
   ─→ ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)
   ─→ ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)
   ─→ ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))

Definition: pv11_p1_threshold
pv11_p1_threshold(accpts) ==  (#(accpts) 1) ÷ 2

Lemma: pv11_p1_threshold_wf
[accpts:bag(Id)]. (pv11_p1_threshold(accpts) ∈ ℤ)

Definition: pv11_p1_p1a'base
pv11_p1_p1a'base(Cmd;mf) ==  Base(``pv11_p1 p1a``)

Lemma: pv11_p1_p1a'base_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p1a'base(Cmd;mf) ∈ EClass(Id × pv11_p1_Ballot_Num()))

Definition: pv11_p1_p1a'base-program
pv11_p1_p1a'base-program(Cmd;mf) ==  base-class-program(``pv11_p1 p1a``)

Lemma: pv11_p1_p1a'base-program_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p1a'base-program(Cmd;mf) ∈ LocalClass(pv11_p1_p1a'base(Cmd;mf)))

Definition: pv11_p1_p1a'broadcast
pv11_p1_p1a'broadcast(Cmd;mf) ==  λlocs,z. bag-map(λl.mk-msg-interface(l;make-Msg(``pv11_p1 p1a``;z));locs)

Lemma: pv11_p1_p1a'broadcast_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p1a'broadcast(Cmd;mf) ∈ bag(Id) ─→ (Id × pv11_p1_Ballot_Num()) ─→ bag(Interface))

Definition: pv11_p1_p1b'base
pv11_p1_p1b'base(Cmd;mf) ==  Base(``pv11_p1 p1b``)

Lemma: pv11_p1_p1b'base_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p1b'base(Cmd;mf) ∈ EClass(Id
   × pv11_p1_Ballot_Num()
   × pv11_p1_Ballot_Num()
   × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))

Definition: pv11_p1_p1b'base-program
pv11_p1_p1b'base-program(Cmd;mf) ==  base-class-program(``pv11_p1 p1b``)

Lemma: pv11_p1_p1b'base-program_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p1b'base-program(Cmd;mf) ∈ LocalClass(pv11_p1_p1b'base(Cmd;mf)))

Definition: pv11_p1_p1b'send
pv11_p1_p1b'send(Cmd;mf) ==  λl,z. mk-msg-interface(l;make-Msg(``pv11_p1 p1b``;z))

Lemma: pv11_p1_p1b'send_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p1b'send(Cmd;mf) ∈ Id
   ─→ (Id × pv11_p1_Ballot_Num() × pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ Interface)

Definition: pv11_p1_p2a'base
pv11_p1_p2a'base(Cmd;mf) ==  Base(``pv11_p1 p2a``)

Lemma: pv11_p1_p2a'base_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p2a'base(Cmd;mf) ∈ EClass(Id × pv11_p1_Ballot_Num() × ℤ × Cmd))

Definition: pv11_p1_p2a'base-program
pv11_p1_p2a'base-program(Cmd;mf) ==  base-class-program(``pv11_p1 p2a``)

Lemma: pv11_p1_p2a'base-program_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p2a'base-program(Cmd;mf) ∈ LocalClass(pv11_p1_p2a'base(Cmd;mf)))

Definition: pv11_p1_p2a'broadcast
pv11_p1_p2a'broadcast(Cmd;mf) ==  λlocs,z. bag-map(λl.mk-msg-interface(l;make-Msg(``pv11_p1 p2a``;z));locs)

Lemma: pv11_p1_p2a'broadcast_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p2a'broadcast(Cmd;mf) ∈ bag(Id) ─→ (Id × pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ bag(Interface))

Definition: pv11_p1_p2b'base
pv11_p1_p2b'base(Cmd;mf) ==  Base(``pv11_p1 p2b``)

Lemma: pv11_p1_p2b'base_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p2b'base(Cmd;mf) ∈ EClass(Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num()))

Definition: pv11_p1_p2b'base-program
pv11_p1_p2b'base-program(Cmd;mf) ==  base-class-program(``pv11_p1 p2b``)

Lemma: pv11_p1_p2b'base-program_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p2b'base-program(Cmd;mf) ∈ LocalClass(pv11_p1_p2b'base(Cmd;mf)))

Definition: pv11_p1_p2b'send
pv11_p1_p2b'send(Cmd;mf) ==  λl,z. mk-msg-interface(l;make-Msg(``pv11_p1 p2b``;z))

Lemma: pv11_p1_p2b'send_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p2b'send(Cmd;mf) ∈ Id ─→ (Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num()) ─→ Interface)

Definition: pv11_p1_preempted'base
pv11_p1_preempted'base(Cmd;mf) ==  Base(``pv11_p1 preempted``)

Lemma: pv11_p1_preempted'base_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_preempted'base(Cmd;mf) ∈ EClass(pv11_p1_Ballot_Num()))

Definition: pv11_p1_preempted'base-program
pv11_p1_preempted'base-program(Cmd;mf) ==  base-class-program(``pv11_p1 preempted``)

Lemma: pv11_p1_preempted'base-program_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_preempted'base-program(Cmd;mf) ∈ LocalClass(pv11_p1_preempted'base(Cmd;mf)))

Definition: pv11_p1_preempted'send
pv11_p1_preempted'send(Cmd;mf) ==  λl,z. mk-msg-interface(l;make-Msg(``pv11_p1 preempted``;z))

Lemma: pv11_p1_preempted'send_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_preempted'send(Cmd;mf) ∈ Id ─→ pv11_p1_Ballot_Num() ─→ Interface)

Definition: pv11_p1_adopted'base
pv11_p1_adopted'base(Cmd;mf) ==  Base(``pv11_p1 adopted``)

Lemma: pv11_p1_adopted'base_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_adopted'base(Cmd;mf) ∈ EClass(pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))

Definition: pv11_p1_adopted'base-program
pv11_p1_adopted'base-program(Cmd;mf) ==  base-class-program(``pv11_p1 adopted``)

Lemma: pv11_p1_adopted'base-program_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_adopted'base-program(Cmd;mf) ∈ LocalClass(pv11_p1_adopted'base(Cmd;mf)))

Definition: pv11_p1_adopted'send
pv11_p1_adopted'send(Cmd;mf) ==  λl,z. mk-msg-interface(l;make-Msg(``pv11_p1 adopted``;z))

Lemma: pv11_p1_adopted'send_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_adopted'send(Cmd;mf) ∈ Id ─→ (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)) ─→ Interface)

Definition: pv11_p1_propose'base
pv11_p1_propose'base(Cmd;mf) ==  Base([propose])

Lemma: pv11_p1_propose'base_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].  (pv11_p1_propose'base(Cmd;mf) ∈ EClass(ℤ × Cmd))

Definition: pv11_p1_propose'base-program
pv11_p1_propose'base-program(Cmd;mf) ==  base-class-program([propose])

Lemma: pv11_p1_propose'base-program_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_propose'base-program(Cmd;mf) ∈ LocalClass(pv11_p1_propose'base(Cmd;mf)))

Definition: pv11_p1_decision'broadcast
pv11_p1_decision'broadcast(Cmd;mf) ==  λlocs,z. bag-map(λl.mk-msg-interface(l;make-Msg([decision];z));locs)

Lemma: pv11_p1_decision'broadcast_wf
[Cmd:ValueAllType]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_decision'broadcast(Cmd;mf) ∈ bag(Id) ─→ (ℤ × Cmd) ─→ bag(Interface))

Definition: pv11_p1_init_accepted
pv11_p1_init_accepted(Cmd) ==  []

Lemma: pv11_p1_init_accepted_wf
[Cmd:ValueAllType]. (pv11_p1_init_accepted(Cmd) ∈ (pv11_p1_Ballot_Num() × ℤ × Cmd) List)

Definition: pv11_p1_init_acceptor
pv11_p1_init_acceptor(Cmd) ==  <pv11_p1_dummy_ballot(), pv11_p1_init_accepted(Cmd)>

Lemma: pv11_p1_init_acceptor_wf
[Cmd:ValueAllType]. (pv11_p1_init_acceptor(Cmd) ∈ pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))

Definition: pv11_p1_init_slot_num
pv11_p1_init_slot_num() ==  1

Lemma: pv11_p1_init_slot_num_wf
pv11_p1_init_slot_num() ∈ ℤ

Definition: pv11_p1_init_proposals
pv11_p1_init_proposals(Cmd) ==  []

Lemma: pv11_p1_init_proposals_wf
[Cmd:ValueAllType]. (pv11_p1_init_proposals(Cmd) ∈ (ℤ × Cmd) List)

Definition: pv11_p1_init_pvalues
pv11_p1_init_pvalues(Cmd) ==  []

Lemma: pv11_p1_init_pvalues_wf
[Cmd:ValueAllType]. (pv11_p1_init_pvalues(Cmd) ∈ (pv11_p1_Ballot_Num() × ℤ × Cmd) List)

Definition: pv11_p1_init_scout
pv11_p1_init_scout(Cmd;accpts) ==  <accpts, pv11_p1_init_pvalues(Cmd)>

Lemma: pv11_p1_init_scout_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)].
  (pv11_p1_init_scout(Cmd;accpts) ∈ bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))

Definition: pv11_p1_init_ballot_num
pv11_p1_init_ballot_num() ==  λloc.(pv11_p1_mk_bnum() loc)

Lemma: pv11_p1_init_ballot_num_wf
pv11_p1_init_ballot_num() ∈ Id ─→ pv11_p1_Ballot_Num()

Definition: pv11_p1_init_active
pv11_p1_init_active() ==  ff

Lemma: pv11_p1_init_active_wf
pv11_p1_init_active() ∈ 𝔹

Definition: pv11_p1_init_leader
pv11_p1_init_leader(Cmd) ==  λloc.<pv11_p1_init_ballot_num() loc, pv11_p1_init_active(), pv11_p1_init_proposals(Cmd)>

Lemma: pv11_p1_init_leader_wf
[Cmd:ValueAllType]. (pv11_p1_init_leader(Cmd) ∈ Id ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)))

Definition: pv11_p1_on_p1a
pv11_p1_on_p1a(Cmd;ldrs_uid) ==
  λloc,ze,z. let loc,bnum ze in let ballot_num,accepted in <pv11_p1_max_bnum(ldrs_uid) bnum ballot_num, accepted>

Lemma: pv11_p1_on_p1a_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_on_p1a(Cmd;ldrs_uid) ∈ Id
   ─→ (Id × pv11_p1_Ballot_Num())
   ─→ (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))

Definition: pv11_p1_on_p2a
pv11_p1_on_p2a(Cmd;ldrs_uid) ==
  λloc,zf,z. let loc,zg zf 
             in let b,sp zg 
                in let ballot_num,accepted 
                   in let ballot_num' pv11_p1_max_bnum(ldrs_uid) ballot_num in
                       let accepted' if pv11_p1_leq_bnum(ldrs_uid) ballot_num b
                                       then pv11_p1_add_if_new() pv11_p1_same_pvalue(Cmd) <b, sp> accepted
                                       else accepted
                                       fi  in
                       <ballot_num', accepted'>

Lemma: pv11_p1_on_p2a_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_on_p2a(Cmd;ldrs_uid) ∈ Id
   ─→ (Id × pv11_p1_Ballot_Num() × ℤ × Cmd)
   ─→ (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))

Definition: pv11_p1_AcceptorState
pv11_p1_AcceptorState(Cmd;ldrs_uid;mf) ==
  state-class2(λloc.pv11_p1_init_acceptor(Cmd);pv11_p1_on_p1a(Cmd;ldrs_uid);pv11_p1_p1a'base(Cmd;mf);
               pv11_p1_on_p2a(Cmd;ldrs_uid);pv11_p1_p2a'base(Cmd;mf))

Lemma: pv11_p1_AcceptorState_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_AcceptorState(Cmd;ldrs_uid;mf) ∈ EClass(pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))

Lemma: pv11_p1_AcceptorState-functional
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))].
  pv11_p1_AcceptorState(Cmd;ldrs_uid;mf) is functional

Definition: pv11_p1_AcceptorStateFun
pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;mf;es;e) ==  pv11_p1_AcceptorState(Cmd;ldrs_uid;mf)(e)

Lemma: pv11_p1_AcceptorStateFun_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E].
  (pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;mf;es;e) ∈ pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))

Lemma: pv11_p1_AcceptorState-classrel
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  ∀es:EO+(Message(mf)). ∀e:E. ∀v:pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List).
    (v ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;mf)(e) ⇐⇒ pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;mf;es;e))

Definition: pv11_p1_AcceptorState-program
pv11_p1_AcceptorState-program(Cmd;ldrs_uid;mf) ==
  state-class2-program(λloc.pv11_p1_init_acceptor(Cmd);pv11_p1_on_p1a(Cmd;ldrs_uid);pv11_p1_p1a'base-program(Cmd;mf);
                       pv11_p1_on_p2a(Cmd;ldrs_uid);pv11_p1_p2a'base-program(Cmd;mf))

Lemma: pv11_p1_AcceptorState-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_AcceptorState-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_AcceptorState(Cmd;ldrs_uid;mf)))

Lemma: pv11_p1_inv_acc
Cmd:ValueAllType. ∀ldrs_uid:Id ─→ ℤ. ∀mf:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(mf)). ∀e1:E.
z:pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List).
  (z ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;mf)(e1)
   let ballot_num,accepted 
     in (∀bnum:pv11_p1_Ballot_Num(). ∀p:ℤ × Cmd.
           ((<bnum, p> ∈ accepted)  (↑(pv11_p1_leq_bnum(ldrs_uid) bnum ballot_num))))
        ∧ l-ordered(pv11_p1_Ballot_Num() × ℤ × Cmd;pv1,pv2.↑(pv11_p1_leq_bnum(ldrs_uid) (fst(pv1)) (fst(pv2)));accepted)
        ∧ no_repeats(pv11_p1_Ballot_Num() × ℤ × Cmd;accepted))

Lemma: pv11_p1_inc_acc
Cmd:ValueAllType. ∀ldrs_uid:Id ─→ ℤ. ∀mf:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(mf)). ∀e1,e2:E.
zh,z:pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List).
  ((e1 <loc e2)
   zh ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;mf)(e1)
   z ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;mf)(e2)
   let ballot_num1,accepted1 zh 
     in let ballot_num2,accepted2 
        in (↑(pv11_p1_leq_bnum(ldrs_uid) ballot_num1 ballot_num2)) ∧ accepted1 ≤ accepted2)

Definition: pv11_p1_AcceptorsP1a
pv11_p1_AcceptorsP1a(Cmd;ldrs_uid;mf) ==
  let = λloc,zi,z. let ldr,b zi in let bnum,pvals in {pv11_p1_p1b'send(Cmd;mf) ldr <loc, b, bnum, pvals>in
      ((f pv11_p1_p1a'base(Cmd;mf)) pv11_p1_AcceptorState(Cmd;ldrs_uid;mf))

Lemma: pv11_p1_AcceptorsP1a_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_AcceptorsP1a(Cmd;ldrs_uid;mf) ∈ EClass(Interface))

Definition: pv11_p1_AcceptorsP1a-program
pv11_p1_AcceptorsP1a-program(Cmd;ldrs_uid;mf) ==
  let = λloc,zi,z. let ldr,b zi in let bnum,pvals in {pv11_p1_p1b'send(Cmd;mf) ldr <loc, b, bnum, pvals>in
      eclass1-program(f;pv11_p1_p1a'base-program(Cmd;mf)) pv11_p1_AcceptorState-program(Cmd;ldrs_uid;mf)

Lemma: pv11_p1_AcceptorsP1a-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_AcceptorsP1a-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_AcceptorsP1a(Cmd;ldrs_uid;mf)))

Definition: pv11_p1_AcceptorsP2a
pv11_p1_AcceptorsP2a(Cmd;ldrs_uid;mf) ==
  let = λloc,zj,z. let ldr,zk zj 
                     in let b,s,zl zk in 
                        let bnum,z 
                        in {pv11_p1_p2b'send(Cmd;mf) ldr <loc, b, s, bnum>in
      ((f pv11_p1_p2a'base(Cmd;mf)) pv11_p1_AcceptorState(Cmd;ldrs_uid;mf))

Lemma: pv11_p1_AcceptorsP2a_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_AcceptorsP2a(Cmd;ldrs_uid;mf) ∈ EClass(Interface))

Definition: pv11_p1_AcceptorsP2a-program
pv11_p1_AcceptorsP2a-program(Cmd;ldrs_uid;mf) ==
  let = λloc,zj,z. let ldr,zk zj 
                     in let b,s,zl zk in 
                        let bnum,z 
                        in {pv11_p1_p2b'send(Cmd;mf) ldr <loc, b, s, bnum>in
      eclass1-program(f;pv11_p1_p2a'base-program(Cmd;mf)) pv11_p1_AcceptorState-program(Cmd;ldrs_uid;mf)

Lemma: pv11_p1_AcceptorsP2a-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_AcceptorsP2a-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_AcceptorsP2a(Cmd;ldrs_uid;mf)))

Definition: pv11_p1_Acceptor
pv11_p1_Acceptor(Cmd;ldrs_uid;mf) ==  pv11_p1_AcceptorsP1a(Cmd;ldrs_uid;mf) || pv11_p1_AcceptorsP2a(Cmd;ldrs_uid;mf)

Lemma: pv11_p1_Acceptor_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Acceptor(Cmd;ldrs_uid;mf) ∈ EClass(Interface))

Definition: pv11_p1_Acceptor-program
pv11_p1_Acceptor-program(Cmd;ldrs_uid;mf) ==
  pv11_p1_AcceptorsP1a-program(Cmd;ldrs_uid;mf) || pv11_p1_AcceptorsP2a-program(Cmd;ldrs_uid;mf)

Lemma: pv11_p1_Acceptor-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Acceptor-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_Acceptor(Cmd;ldrs_uid;mf)))

Definition: pv11_p1_CommanderNotify
pv11_p1_CommanderNotify(Cmd;accpts;mf) ==
  λbsp.return-loc-bag-class(λldr.(pv11_p1_p2a'broadcast(Cmd;mf) accpts <ldr, bsp>))

Lemma: pv11_p1_CommanderNotify_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_CommanderNotify(Cmd;accpts;mf) ∈ (pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ EClass(Interface))

Definition: pv11_p1_CommanderNotify-program
pv11_p1_CommanderNotify-program(Cmd;accpts;mf) ==
  λbsp.return-loc-bag-class-program(λldr.(pv11_p1_p2a'broadcast(Cmd;mf) accpts <ldr, bsp>))

Lemma: pv11_p1_CommanderNotify-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_CommanderNotify-program(Cmd;accpts;mf) ∈ ∀x:pv11_p1_Ballot_Num() × ℤ × Cmd
                                                      LocalClass(pv11_p1_CommanderNotify(Cmd;accpts;mf) x))

Definition: pv11_p1_on_p2b
pv11_p1_on_p2b() ==
  λbnum,slt,loc,z,waitfor. let acloc,b,s,b' 
                           in if (pv11_p1_eq_bnums() bnum b) ∧b (slt =z s) ∧b (pv11_p1_eq_bnums() bnum b')
                              then waitfor acloc
                              else waitfor
                              fi   

Lemma: pv11_p1_on_p2b_wf
pv11_p1_on_p2b() ∈ pv11_p1_Ballot_Num()
─→ ℤ
─→ Id
─→ (Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
─→ bag(Id)
─→ bag(Id)

Definition: pv11_p1_CommanderState
pv11_p1_CommanderState(Cmd;accpts;mf) ==  λb,s. state-class1(λloc.accpts;pv11_p1_on_p2b() s;pv11_p1_p2b'base(Cmd;mf))

Lemma: pv11_p1_CommanderState_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_CommanderState(Cmd;accpts;mf) ∈ pv11_p1_Ballot_Num() ─→ ℤ ─→ EClass(bag(Id)))

Lemma: pv11_p1_CommanderState-functional
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))].
[x:pv11_p1_Ballot_Num()]. ∀[zzs:ℤ].
  pv11_p1_CommanderState(Cmd;accpts;mf) zzs is functional

Definition: pv11_p1_CommanderStateFun
pv11_p1_CommanderStateFun(Cmd;accpts;mf;x;zzs;es;e) ==  pv11_p1_CommanderState(Cmd;accpts;mf) zzs(e)

Lemma: pv11_p1_CommanderStateFun_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E].
[x:pv11_p1_Ballot_Num()]. ∀[zzs:ℤ].
  (pv11_p1_CommanderStateFun(Cmd;accpts;mf;x;zzs;es;e) ∈ bag(Id))

Lemma: pv11_p1_CommanderState-classrel
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  ∀es:EO+(Message(mf)). ∀e:E. ∀x:pv11_p1_Ballot_Num(). ∀zzs:ℤ. ∀v:bag(Id).
    (v ∈ pv11_p1_CommanderState(Cmd;accpts;mf) zzs(e) ⇐⇒ pv11_p1_CommanderStateFun(Cmd;accpts;mf;x;zzs;es;e))

Definition: pv11_p1_CommanderState-program
pv11_p1_CommanderState-program(Cmd;accpts;mf) ==
  λb,s. state-class1-program(λloc.accpts;pv11_p1_on_p2b() s;pv11_p1_p2b'base-program(Cmd;mf))

Lemma: pv11_p1_CommanderState-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_CommanderState-program(Cmd;accpts;mf) ∈ ∀x:pv11_p1_Ballot_Num(). ∀zzt:ℤ.
                                                     LocalClass(pv11_p1_CommanderState(Cmd;accpts;mf) zzt))

Lemma: pv11_p1_inv_comm
Cmd:ValueAllType. ∀accpts:bag(Id). ∀mf:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(mf)). ∀e1:E.
b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀waitfor:bag(Id).
  (waitfor ∈ pv11_p1_CommanderState(Cmd;accpts;mf) s(e1)  sub-bag(Id;waitfor;accpts))

Lemma: pv11_p1_ord_comm
Cmd:ValueAllType. ∀accpts:bag(Id). ∀mf:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(mf)). ∀e1,e2:E.
b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀waitfor1,waitfor2:bag(Id).
  ((e1 <loc e2)
   waitfor1 ∈ pv11_p1_CommanderState(Cmd;accpts;mf) s(e1)
   waitfor2 ∈ pv11_p1_CommanderState(Cmd;accpts;mf) s(e2)
   sub-bag(Id;waitfor2;waitfor1))

Definition: pv11_p1_commander_output
pv11_p1_commander_output(Cmd;accpts;reps;mf) ==
  λzm,ldr,z,waitfor. let bnum,slt,cmd zm in 
                    let acloc,b,s,b' 
                    in if (pv11_p1_eq_bnums() bnum b) ∧b (slt =z s)
                       then if pv11_p1_eq_bnums() bnum b'
                            then if #(waitfor) <pv11_p1_threshold(accpts)
                                 then pv11_p1_decision'broadcast(Cmd;mf) reps <slt, cmd>
                                 else {}
                                 fi 
                            else {pv11_p1_preempted'send(Cmd;mf) ldr b'}
                            fi 
                       else {}
                       fi   

Lemma: pv11_p1_commander_output_wf
[Cmd:ValueAllType]. ∀[accpts,reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_commander_output(Cmd;accpts;reps;mf) ∈ (pv11_p1_Ballot_Num() × ℤ × Cmd)
   ─→ Id
   ─→ (Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
   ─→ bag(Id)
   ─→ bag(Interface))

Definition: pv11_p1_CommanderOutput
pv11_p1_CommanderOutput(Cmd;accpts;reps;mf) ==
  λz.let bnum,slt,cmd in 
     (((pv11_p1_commander_output(Cmd;accpts;reps;mf) <bnum, slt, cmd> pv11_p1_p2b'base(Cmd;mf)) pv11_p1_CommanderSta\000Cte(Cmd;accpts;mf) bnum slt) once)

Lemma: pv11_p1_CommanderOutput_wf
[Cmd:ValueAllType]. ∀[accpts,reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_CommanderOutput(Cmd;accpts;reps;mf) ∈ (pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ EClass(Interface))

Definition: pv11_p1_CommanderOutput-program
pv11_p1_CommanderOutput-program(Cmd;accpts;reps;mf) ==
  λz.let bnum,slt,cmd in 
     once-class-program(eclass1-program(pv11_p1_commander_output(Cmd;accpts;reps;mf) <bnum, slt, cmd>;pv11_p1_p2b'base-p\000Crogram(Cmd;mf))
                        pv11_p1_CommanderState-program(Cmd;accpts;mf) bnum slt)

Lemma: pv11_p1_CommanderOutput-program_wf
[Cmd:ValueAllType]. ∀[accpts,reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_CommanderOutput-program(Cmd;accpts;reps;mf) ∈ ∀x:pv11_p1_Ballot_Num() × ℤ × Cmd
                                                           LocalClass(pv11_p1_CommanderOutput(Cmd;accpts;reps;mf) x))

Definition: pv11_p1_Commander
pv11_p1_Commander(Cmd;accpts;reps;mf) ==
  λbp.pv11_p1_CommanderNotify(Cmd;accpts;mf) bp || pv11_p1_CommanderOutput(Cmd;accpts;reps;mf) bp

Lemma: pv11_p1_Commander_wf
[Cmd:ValueAllType]. ∀[accpts,reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Commander(Cmd;accpts;reps;mf) ∈ (pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ EClass(Interface))

Definition: pv11_p1_Commander-program
pv11_p1_Commander-program(Cmd;accpts;reps;mf) ==
  λbp.pv11_p1_CommanderNotify-program(Cmd;accpts;mf) bp || pv11_p1_CommanderOutput-program(Cmd;accpts;reps;mf) bp

Lemma: pv11_p1_Commander-program_wf
[Cmd:ValueAllType]. ∀[accpts,reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Commander-program(Cmd;accpts;reps;mf) ∈ ∀x:pv11_p1_Ballot_Num() × ℤ × Cmd
                                                     LocalClass(pv11_p1_Commander(Cmd;accpts;reps;mf) x))

Definition: pv11_p1_ScoutNotify
pv11_p1_ScoutNotify(Cmd;accpts;mf) ==  λb.return-loc-bag-class(λldr.(pv11_p1_p1a'broadcast(Cmd;mf) accpts <ldr, b>))

Lemma: pv11_p1_ScoutNotify_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_ScoutNotify(Cmd;accpts;mf) ∈ pv11_p1_Ballot_Num() ─→ EClass(Interface))

Definition: pv11_p1_ScoutNotify-program
pv11_p1_ScoutNotify-program(Cmd;accpts;mf) ==
  λb.return-loc-bag-class-program(λldr.(pv11_p1_p1a'broadcast(Cmd;mf) accpts <ldr, b>))

Lemma: pv11_p1_ScoutNotify-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_ScoutNotify-program(Cmd;accpts;mf) ∈ ∀x:pv11_p1_Ballot_Num()
                                                  LocalClass(pv11_p1_ScoutNotify(Cmd;accpts;mf) x))

Definition: pv11_p1_on_p1b
pv11_p1_on_p1b(Cmd) ==
  λbnum,loc,zn,z. let acloc,b,b',pvals zn 
                  in let waitfor,pvalues 
                     in if (pv11_p1_eq_bnums() bnum b) ∧b (pv11_p1_eq_bnums() bnum b')
                        then let waitfor' waitfor acloc in
                              let pvalues' pv11_p1_append_news(Cmd) pv11_p1_same_pvalue(Cmd) pvalues pvals in
                              <waitfor', pvalues'>
                        else <waitfor, pvalues>
                        fi   

Lemma: pv11_p1_on_p1b_wf
[Cmd:ValueAllType]
  (pv11_p1_on_p1b(Cmd) ∈ pv11_p1_Ballot_Num()
   ─→ Id
   ─→ (Id × pv11_p1_Ballot_Num() × pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ (bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ (bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))

Definition: pv11_p1_ScoutState
pv11_p1_ScoutState(Cmd;accpts;mf) ==
  λb.state-class1(λloc.pv11_p1_init_scout(Cmd;accpts);pv11_p1_on_p1b(Cmd) b;pv11_p1_p1b'base(Cmd;mf))

Lemma: pv11_p1_ScoutState_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_ScoutState(Cmd;accpts;mf) ∈ pv11_p1_Ballot_Num()
   ─→ EClass(bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))

Lemma: pv11_p1_ScoutState-functional
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))].
[x:pv11_p1_Ballot_Num()].
  pv11_p1_ScoutState(Cmd;accpts;mf) is functional

Definition: pv11_p1_ScoutStateFun
pv11_p1_ScoutStateFun(Cmd;accpts;mf;x;es;e) ==  pv11_p1_ScoutState(Cmd;accpts;mf) x(e)

Lemma: pv11_p1_ScoutStateFun_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E].
[x:pv11_p1_Ballot_Num()].
  (pv11_p1_ScoutStateFun(Cmd;accpts;mf;x;es;e) ∈ bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))

Lemma: pv11_p1_ScoutState-classrel
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  ∀es:EO+(Message(mf)). ∀e:E. ∀x:pv11_p1_Ballot_Num(). ∀v:bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List).
    (v ∈ pv11_p1_ScoutState(Cmd;accpts;mf) x(e) ⇐⇒ pv11_p1_ScoutStateFun(Cmd;accpts;mf;x;es;e))

Definition: pv11_p1_ScoutState-program
pv11_p1_ScoutState-program(Cmd;accpts;mf) ==
  λb.state-class1-program(λloc.pv11_p1_init_scout(Cmd;accpts);pv11_p1_on_p1b(Cmd) b;pv11_p1_p1b'base-program(Cmd;mf))

Lemma: pv11_p1_ScoutState-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_ScoutState-program(Cmd;accpts;mf) ∈ ∀x:pv11_p1_Ballot_Num(). LocalClass(pv11_p1_ScoutState(Cmd;accpts;mf) x))

Lemma: pv11_p1_inv_scout
Cmd:ValueAllType. ∀accpts:bag(Id). ∀mf:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(mf)). ∀e1:E.
b:pv11_p1_Ballot_Num(). ∀z:bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List).
  (z ∈ pv11_p1_ScoutState(Cmd;accpts;mf) b(e1)  let waitfor,pvalues in sub-bag(Id;waitfor;accpts))

Lemma: pv11_p1_ord_scout
Cmd:ValueAllType. ∀accpts:bag(Id). ∀mf:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(mf)). ∀e1,e2:E.
b:pv11_p1_Ballot_Num(). ∀zo,z:bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List).
  ((e1 <loc e2)
   zo ∈ pv11_p1_ScoutState(Cmd;accpts;mf) b(e1)
   z ∈ pv11_p1_ScoutState(Cmd;accpts;mf) b(e2)
   let waitfor1,pvalues1 zo 
     in let waitfor2,pvalues2 
        in sub-bag(Id;waitfor2;waitfor1) ∧ pvalues1 ⊆ pvalues2)

Definition: pv11_p1_scout_output
pv11_p1_scout_output(Cmd;accpts;mf) ==
  λbnum,ldr,zp,z. let a,b,b',pvals zp 
                  in let waitfor,pvalues 
                     in if pv11_p1_eq_bnums() bnum b
                        then if pv11_p1_eq_bnums() bnum b'
                             then if #(waitfor) <pv11_p1_threshold(accpts)
                                  then {pv11_p1_adopted'send(Cmd;mf) ldr <bnum, pvalues>}
                                  else {}
                                  fi 
                             else {pv11_p1_preempted'send(Cmd;mf) ldr b'}
                             fi 
                        else {}
                        fi   

Lemma: pv11_p1_scout_output_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_scout_output(Cmd;accpts;mf) ∈ pv11_p1_Ballot_Num()
   ─→ Id
   ─→ (Id × pv11_p1_Ballot_Num() × pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ (bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ bag(Interface))

Definition: pv11_p1_ScoutOutput
pv11_p1_ScoutOutput(Cmd;accpts;mf) ==
  λb.(((pv11_p1_scout_output(Cmd;accpts;mf) pv11_p1_p1b'base(Cmd;mf)) pv11_p1_ScoutState(Cmd;accpts;mf) b) once)

Lemma: pv11_p1_ScoutOutput_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_ScoutOutput(Cmd;accpts;mf) ∈ pv11_p1_Ballot_Num() ─→ EClass(Interface))

Definition: pv11_p1_ScoutOutput-program
pv11_p1_ScoutOutput-program(Cmd;accpts;mf) ==
  λb.once-class-program(eclass1-program(pv11_p1_scout_output(Cmd;accpts;mf) b;pv11_p1_p1b'base-program(Cmd;mf))
                        pv11_p1_ScoutState-program(Cmd;accpts;mf) b)

Lemma: pv11_p1_ScoutOutput-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_ScoutOutput-program(Cmd;accpts;mf) ∈ ∀x:pv11_p1_Ballot_Num()
                                                  LocalClass(pv11_p1_ScoutOutput(Cmd;accpts;mf) x))

Definition: pv11_p1_Scout
pv11_p1_Scout(Cmd;accpts;mf) ==  λb.pv11_p1_ScoutNotify(Cmd;accpts;mf) || pv11_p1_ScoutOutput(Cmd;accpts;mf) b

Lemma: pv11_p1_Scout_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Scout(Cmd;accpts;mf) ∈ pv11_p1_Ballot_Num() ─→ EClass(Interface))

Definition: pv11_p1_Scout-program
pv11_p1_Scout-program(Cmd;accpts;mf) ==
  λb.pv11_p1_ScoutNotify-program(Cmd;accpts;mf) || pv11_p1_ScoutOutput-program(Cmd;accpts;mf) b

Lemma: pv11_p1_Scout-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Scout-program(Cmd;accpts;mf) ∈ ∀x:pv11_p1_Ballot_Num(). LocalClass(pv11_p1_Scout(Cmd;accpts;mf) x))

Definition: pv11_p1_on_propose
pv11_p1_on_propose(Cmd) ==
  λloc,zq,z. let s,p zq 
             in let ballot_num,active,proposals in 
                let proposals' if pv11_p1_in_domain(Cmd) proposals
                                 then proposals
                                 else pv11_p1_add_if_new() pv11_p1_same_proposal(Cmd) <s, p> proposals
                                 fi  in
                    <ballot_num, active, proposals'>

Lemma: pv11_p1_on_propose_wf
[Cmd:ValueAllType]
  (pv11_p1_on_propose(Cmd) ∈ Id
   ─→ (ℤ × Cmd)
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List))
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)))

Definition: pv11_p1_when_adopted
pv11_p1_when_adopted(Cmd;ldrs_uid) ==
  λloc,zr,z. let bnum,pvals zr 
             in let ballot_num,active,proposals in 
                if pv11_p1_eq_bnums() bnum ballot_num
                then let proposals' pv11_p1_update_proposals(Cmd) proposals (pv11_p1_pmax(Cmd;ldrs_uid) pvals) in
                         <ballot_num, tt, proposals'>
                else <ballot_num, active, proposals>
                fi 

Lemma: pv11_p1_when_adopted_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_when_adopted(Cmd;ldrs_uid) ∈ Id
   ─→ (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List))
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)))

Definition: pv11_p1_when_preempted
pv11_p1_when_preempted(Cmd;ldrs_uid) ==
  λldr,bnum,z. let ballot_num,active,proposals in 
              if (pv11_p1_is_bnum() bnum) ∧b (ballot_num  < bnum)
              then <pv11_p1_upd_bnum() bnum ldr, ff, proposals>
              else <ballot_num, active, proposals>
              fi 

Lemma: pv11_p1_when_preempted_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_when_preempted(Cmd;ldrs_uid) ∈ Id
   ─→ pv11_p1_Ballot_Num()
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List))
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)))

Definition: pv11_p1_LeaderState
pv11_p1_LeaderState(Cmd;ldrs_uid;mf) ==
  memory-class3(pv11_p1_init_leader(Cmd);pv11_p1_on_propose(Cmd);pv11_p1_propose'base(Cmd;mf);
                pv11_p1_when_adopted(Cmd;ldrs_uid);pv11_p1_adopted'base(Cmd;mf);pv11_p1_when_preempted(Cmd;ldrs_uid)
                ;pv11_p1_preempted'base(Cmd;mf))

Lemma: pv11_p1_LeaderState_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderState(Cmd;ldrs_uid;mf) ∈ EClass(pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)))

Lemma: pv11_p1_LeaderState-functional
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))].
  pv11_p1_LeaderState(Cmd;ldrs_uid;mf) is functional

Definition: pv11_p1_LeaderStateFun
pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e) ==  pv11_p1_LeaderState(Cmd;ldrs_uid;mf)(e)

Lemma: pv11_p1_LeaderStateFun_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E].
  (pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e) ∈ pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List))

Lemma: pv11_p1_LeaderState-classrel
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  ∀es:EO+(Message(mf)). ∀e:E. ∀v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
    (v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;mf)(e) ⇐⇒ pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e))

Definition: pv11_p1_LeaderState-program
pv11_p1_LeaderState-program(Cmd;ldrs_uid;mf) ==
  memory-class3-program(pv11_p1_init_leader(Cmd);pv11_p1_on_propose(Cmd);pv11_p1_propose'base-program(Cmd;mf);
                        pv11_p1_when_adopted(Cmd;ldrs_uid);pv11_p1_adopted'base-program(Cmd;mf);
                        pv11_p1_when_preempted(Cmd;ldrs_uid);pv11_p1_preempted'base-program(Cmd;mf))

Lemma: pv11_p1_LeaderState-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderState-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_LeaderState(Cmd;ldrs_uid;mf)))

Lemma: pv11_p1_ldr_ord
Cmd:ValueAllType. ∀ldrs_uid:Id ─→ ℤ. ∀mf:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(mf)). ∀e1,e2:E.
zs,z:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
  ((e1 <loc e2)
   zs ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;mf)(e1)
   z ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;mf)(e2)
   let bnum1,active1,proposals1 zs in 
     let bnum2,active2,proposals2 in 
     ↑(pv11_p1_leq_bnum(ldrs_uid) bnum1 bnum2))

Definition: pv11_p1_leader_propose
pv11_p1_leader_propose(Cmd) ==
  λloc,zt,z. let slt,p zt 
             in let ballot_num,active,proposals in 
                if active ∧b b(pv11_p1_in_domain(Cmd) slt proposals)) then {<ballot_num, slt, p>else {} fi 

Lemma: pv11_p1_leader_propose_wf
[Cmd:ValueAllType]
  (pv11_p1_leader_propose(Cmd) ∈ Id
   ─→ (ℤ × Cmd)
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List))
   ─→ bag(pv11_p1_Ballot_Num() × ℤ × Cmd))

Definition: pv11_p1_LeaderPropose
pv11_p1_LeaderPropose(Cmd;ldrs_uid;mf) ==
  ((pv11_p1_leader_propose(Cmd) pv11_p1_propose'base(Cmd;mf)) pv11_p1_LeaderState(Cmd;ldrs_uid;mf))

Lemma: pv11_p1_LeaderPropose_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderPropose(Cmd;ldrs_uid;mf) ∈ EClass(pv11_p1_Ballot_Num() × ℤ × Cmd))

Definition: pv11_p1_LeaderPropose-program
pv11_p1_LeaderPropose-program(Cmd;ldrs_uid;mf) ==
  eclass1-program(pv11_p1_leader_propose(Cmd);pv11_p1_propose'base-program(Cmd;mf))
  pv11_p1_LeaderState-program(Cmd;ldrs_uid;mf)

Lemma: pv11_p1_LeaderPropose-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderPropose-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_LeaderPropose(Cmd;ldrs_uid;mf)))

Definition: pv11_p1_leader_adopted
pv11_p1_leader_adopted(Cmd;ldrs_uid) ==
  λloc,zu,z. let bnum,pvals zu 
             in let ballot_num,active,proposals in 
                if pv11_p1_eq_bnums() bnum ballot_num
                then map(λsp.<bnum, sp>;pv11_p1_update_proposals(Cmd) proposals (pv11_p1_pmax(Cmd;ldrs_uid) pvals))
                else {}
                fi 

Lemma: pv11_p1_leader_adopted_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_leader_adopted(Cmd;ldrs_uid) ∈ Id
   ─→ (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List))
   ─→ bag(pv11_p1_Ballot_Num() × ℤ × Cmd))

Definition: pv11_p1_LeaderAdopted
pv11_p1_LeaderAdopted(Cmd;ldrs_uid;mf) ==
  ((pv11_p1_leader_adopted(Cmd;ldrs_uid) pv11_p1_adopted'base(Cmd;mf)) pv11_p1_LeaderState(Cmd;ldrs_uid;mf))

Lemma: pv11_p1_LeaderAdopted_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderAdopted(Cmd;ldrs_uid;mf) ∈ EClass(pv11_p1_Ballot_Num() × ℤ × Cmd))

Definition: pv11_p1_LeaderAdopted-program
pv11_p1_LeaderAdopted-program(Cmd;ldrs_uid;mf) ==
  eclass1-program(pv11_p1_leader_adopted(Cmd;ldrs_uid);pv11_p1_adopted'base-program(Cmd;mf))
  pv11_p1_LeaderState-program(Cmd;ldrs_uid;mf)

Lemma: pv11_p1_LeaderAdopted-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderAdopted-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_LeaderAdopted(Cmd;ldrs_uid;mf)))

Definition: pv11_p1_leader_preempted
pv11_p1_leader_preempted(Cmd;ldrs_uid) ==
  λldr,bnum,z. let ballot_num,zv,z in 
              if (pv11_p1_is_bnum() bnum) ∧b (ballot_num  < bnum) then {pv11_p1_upd_bnum() bnum ldr} else {} fi 

Lemma: pv11_p1_leader_preempted_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_leader_preempted(Cmd;ldrs_uid) ∈ Id
   ─→ pv11_p1_Ballot_Num()
   ─→ (pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List))
   ─→ bag(pv11_p1_Ballot_Num()))

Definition: pv11_p1_LeaderPreempted
pv11_p1_LeaderPreempted(Cmd;ldrs_uid;mf) ==
  ((pv11_p1_leader_preempted(Cmd;ldrs_uid) pv11_p1_preempted'base(Cmd;mf)) pv11_p1_LeaderState(Cmd;ldrs_uid;mf))

Lemma: pv11_p1_LeaderPreempted_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderPreempted(Cmd;ldrs_uid;mf) ∈ EClass(pv11_p1_Ballot_Num()))

Definition: pv11_p1_LeaderPreempted-program
pv11_p1_LeaderPreempted-program(Cmd;ldrs_uid;mf) ==
  eclass1-program(pv11_p1_leader_preempted(Cmd;ldrs_uid);pv11_p1_preempted'base-program(Cmd;mf))
  pv11_p1_LeaderState-program(Cmd;ldrs_uid;mf)

Lemma: pv11_p1_LeaderPreempted-program_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_LeaderPreempted-program(Cmd;ldrs_uid;mf) ∈ LocalClass(pv11_p1_LeaderPreempted(Cmd;ldrs_uid;mf)))

Definition: pv11_p1_SpawnFirstScout
pv11_p1_SpawnFirstScout(Cmd;accpts;mf) ==  on-loc-class(λldr.(pv11_p1_Scout(Cmd;accpts;mf) (pv11_p1_mk_bnum() ldr)))

Lemma: pv11_p1_SpawnFirstScout_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_SpawnFirstScout(Cmd;accpts;mf) ∈ EClass(Interface))

Definition: pv11_p1_SpawnFirstScout-program
pv11_p1_SpawnFirstScout-program(Cmd;accpts;mf) ==
  on-loc-class-program(λldr.(pv11_p1_Scout-program(Cmd;accpts;mf) (pv11_p1_mk_bnum() ldr)))

Lemma: pv11_p1_SpawnFirstScout-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_SpawnFirstScout-program(Cmd;accpts;mf) ∈ LocalClass(pv11_p1_SpawnFirstScout(Cmd;accpts;mf)))

Definition: pv11_p1_Leader
pv11_p1_Leader(Cmd;accpts;ldrs_uid;reps;mf) ==
  pv11_p1_SpawnFirstScout(Cmd;accpts;mf) || pv11_p1_LeaderPropose(Cmd;ldrs_uid;mf)
                                            || pv11_p1_LeaderAdopted(Cmd;ldrs_uid;mf)
                                             >z> pv11_p1_Commander(Cmd;accpts;reps;mf) z
  || pv11_p1_LeaderPreempted(Cmd;ldrs_uid;mf) >z> pv11_p1_Scout(Cmd;accpts;mf) z

Lemma: pv11_p1_Leader_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Leader(Cmd;accpts;ldrs_uid;reps;mf) ∈ EClass(Interface))

Definition: pv11_p1_Leader-program
pv11_p1_Leader-program(Cmd;accpts;ldrs_uid;reps;mf) ==
  pv11_p1_SpawnFirstScout-program(Cmd;accpts;mf) || pv11_p1_LeaderPropose-program(Cmd;ldrs_uid;mf)
                                                    || pv11_p1_LeaderAdopted-program(Cmd;ldrs_uid;mf)
                                                     >>= λz.(pv11_p1_Commander-program(Cmd;accpts;reps;mf) z)
  || pv11_p1_LeaderPreempted-program(Cmd;ldrs_uid;mf) >>= λz.(pv11_p1_Scout-program(Cmd;accpts;mf) z)

Lemma: pv11_p1_Leader-program_wf
[Cmd:ValueAllType]. ∀[accpts:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_Leader-program(Cmd;accpts;ldrs_uid;reps;mf) ∈ LocalClass(pv11_p1_Leader(Cmd;accpts;ldrs_uid;reps;mf)))

Definition: pv11_p1_main
pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf) ==
  pv11_p1_Leader(Cmd;accpts;ldrs_uid;reps;mf)@ldrs || pv11_p1_Acceptor(Cmd;ldrs_uid;mf)@accpts

Lemma: pv11_p1_main_wf
[Cmd:ValueAllType]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf) ∈ EClass(Interface))

Definition: pv11_p1_main-program
pv11_p1_main-program(Cmd;accpts;ldrs;ldrs_uid;reps;mf) ==
  (pv11_p1_Leader-program(Cmd;accpts;ldrs_uid;reps;mf))@ldrs || (pv11_p1_Acceptor-program(Cmd;ldrs_uid;mf))@accpts

Lemma: pv11_p1_main-program_wf
[Cmd:ValueAllType]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_main-program(Cmd;accpts;ldrs;ldrs_uid;reps;mf) ∈ LocalClass(pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)))

Comment: ------ pv11_p1 - extra ------


Definition: pv11_p1_headers_internal
pv11_p1_headers_internal() ==
  [``pv11_p1 p1a``; ``pv11_p1 p1b``; ``pv11_p1 p2a``; ``pv11_p1 p2b``; ``pv11_p1 preempted``; ``pv11_p1 adopted``]

Lemma: pv11_p1_headers_internal_wf
pv11_p1_headers_internal() ∈ Name List

Definition: pv11_p1_headers_no_inputs
pv11_p1_headers_no_inputs() ==
  [``pv11_p1 p1a``;
   ``pv11_p1 p1b``;
   ``pv11_p1 p2a``;
   ``pv11_p1 p2b``;
   ``pv11_p1 preempted``;
   ``pv11_p1 adopted``;
   [decision]]

Lemma: pv11_p1_headers_no_inputs_wf
pv11_p1_headers_no_inputs() ∈ Name List

Definition: pv11_p1_headers_no_inputs_types
pv11_p1_headers_no_inputs_types(Cmd) ==
  [<``pv11_p1 p1a``, Id × pv11_p1_Ballot_Num()>;
   <``pv11_p1 p1b``, Id × pv11_p1_Ballot_Num() × pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)>;
   <``pv11_p1 p2a``, Id × pv11_p1_Ballot_Num() × ℤ × Cmd>;
   <``pv11_p1 p2b``, Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num()>;
   <``pv11_p1 preempted``, pv11_p1_Ballot_Num()>;
   <``pv11_p1 adopted``, pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)>;
   <[decision], ℤ × Cmd>]

Lemma: pv11_p1_headers_no_inputs_types_wf
[Cmd:ValueAllType]. (pv11_p1_headers_no_inputs_types(Cmd) ∈ (Name × Type) List)

Definition: pv11_p1_message-constraint
pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; mf; es) ==
  eo-msg-interface-constraint(es;pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf);pv11_p1_headers_no_inputs();mf)

Lemma: pv11_p1_message-constraint_wf
[Cmd:ValueAllType]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
[es:EO+(Message(mf))].
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; mf; es) ∈ ℙ)

Definition: pv11_p1_messages-delivered
pv11_p1_messages-delivered{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; mf; es) ==
  eo-msgs-interface-delivered(es;pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf);mf)

Lemma: pv11_p1_messages-delivered_wf
[Cmd:ValueAllType]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
[es:EO+(Message(mf))].
  (pv11_p1_messages-delivered{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; mf; es) ∈ ℙ)

Lemma: pv11_p1-ilf
(∀[loc:Id]. ∀[accpts:bag(Id)]. ∀[Cmd:{T:Type| valueall-type(T)} ]. ∀[mf:pv11_p1_headers_type{i:l}(Cmd)].
 ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[m:Message(mf)].
   {<d, i, m> ∈ ((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc) pv11_p1_p1b'base(Cmd;mf)) o
                pv11_p1_ScoutState(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc))(e)
   ⇐⇒ ((header(e) ``pv11_p1 p1b``)
       ∧ has-es-info-type(es;e;mf;Id
         × pv11_p1_Ballot_Num()
         × pv11_p1_Ballot_Num()
         × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
       ∧ ((pv11_p1_init_ballot_num() loc) (fst(snd(msgval(e)))))
       ∧ (d 0)
       ∧ (i loc(e))
       ∧ (↓(((pv11_p1_init_ballot_num() loc) (fst(snd(snd(msgval(e))))))
           ∧ #(fst(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_init_ballot_num() loc;es;e))) < pv11_p1_threshold(accpts)
           ∧ (m
             make-Msg(``pv11_p1 adopted``;<pv11_p1_init_ballot_num() loc
                                            snd(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_init_ballot_num() 
                                                                                      loc;es;e))
                                            >)))
           ∨ ((¬((pv11_p1_init_ballot_num() loc) (fst(snd(snd(msgval(e)))))))
             ∧ (m make-Msg(``pv11_p1 preempted``;fst(snd(snd(msgval(e))))))))})
∧ (∀[z3:ℤ]. ∀[z1:pv11_p1_Ballot_Num()]. ∀[reps,accpts:bag(Id)]. ∀[Cmd:{T:Type| valueall-type(T)} ]. ∀[z4:Cmd].
   ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[m:Message(mf)].
     {<d, i, m> ∈ ((pv11_p1_commander_output(Cmd;accpts;reps;mf) <z1, z3, z4> pv11_p1_p2b'base(Cmd;mf)) pv11_p1_Comm\000CanderState(Cmd;accpts;mf) z1 z3)(e)
     ⇐⇒ ((header(e) ``pv11_p1 p2b``)
         ∧ has-es-info-type(es;e;mf;Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num()))
         ∧ ((z1 (fst(snd(msgval(e))))) ∧ (z3 (fst(snd(snd(msgval(e)))))))
         ∧ (d 0)
         ∧ (↓((z1 (snd(snd(snd(msgval(e))))))
             ∧ #(pv11_p1_CommanderStateFun(Cmd;accpts;mf;z1;z3;es;e)) < pv11_p1_threshold(accpts)
             ∧ i ↓∈ reps
             ∧ (m make-Msg([decision];<z3, z4>)))
             ∨ ((¬(z1 (snd(snd(snd(msgval(e)))))))
               ∧ (i loc(e))
               ∧ (m make-Msg(``pv11_p1 preempted``;snd(snd(snd(msgval(e))))))))})
∧ (∀[loc:Id]. ∀[param:pv11_p1_Ballot_Num()]. ∀[accpts:bag(Id)]. ∀[Cmd:{T:Type| valueall-type(T)} ].
   ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[m:Message(mf)].
     {<d, i, m> ∈ ((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_upd_bnum() param loc) pv11_p1_p1b'base(Cmd;mf)) o
                  pv11_p1_ScoutState(Cmd;accpts;mf) (pv11_p1_upd_bnum() param loc))(e)
     ⇐⇒ ((header(e) ``pv11_p1 p1b``)
         ∧ has-es-info-type(es;e;mf;Id
           × pv11_p1_Ballot_Num()
           × pv11_p1_Ballot_Num()
           × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
         ∧ ((pv11_p1_upd_bnum() param loc) (fst(snd(msgval(e)))))
         ∧ (d 0)
         ∧ (i loc(e))
         ∧ (↓(((pv11_p1_upd_bnum() param loc) (fst(snd(snd(msgval(e))))))
             ∧ #(fst(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_upd_bnum() param 
                                                         loc;es;e))) < pv11_p1_threshold(accpts)
             ∧ (m
               make-Msg(``pv11_p1 adopted``;<pv11_p1_upd_bnum() param loc
                                              snd(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_upd_bnum() param 
                                                                                        loc;es;e))
                                              >)))
             ∨ ((¬((pv11_p1_upd_bnum() param loc) (fst(snd(snd(msgval(e)))))))
               ∧ (m make-Msg(``pv11_p1 preempted``;fst(snd(snd(msgval(e))))))))})
∧ (∀[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
   ∀[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[m:Message(mf)].
     {<d, i, m> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
     ⇐⇒ ↓(loc(e) ↓∈ ldrs
          ∧ ((((((d 0) ∧ (m make-Msg(``pv11_p1 p1a``;<loc(e), pv11_p1_init_ballot_num() loc(e)>)) ∧ i ↓∈ accpts) ∧ (\000C↑first(e)))
            ∨ ((no ((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc(e)) o
                    pv11_p1_p1b'base(Cmd;mf)) pv11_p1_ScoutState(Cmd;accpts;mf) 
                                                (pv11_p1_init_ballot_num() loc(e))) prior to e)
              ∧ <d, i, m> ∈ {((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc(e)) o
                              pv11_p1_p1b'base(Cmd;mf)) pv11_p1_ScoutState(Cmd;accpts;mf) 
                                                          (pv11_p1_init_ballot_num() loc(e)))}(e)))
            ∨ (∃e':{e':E| e' ≤loc 
                ∃z1:pv11_p1_Ballot_Num()
                 ∃z3:ℤ
                  ∃z4:Cmd
                   (((((header(e') [propose]) ∧ has-es-info-type(es;e';mf;ℤ × Cmd))
                   ∧ ((↑(fst(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))))
                     ∧ (¬↑(pv11_p1_in_domain(Cmd) (fst(msgval(e'))) 
                           (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))))))
                   ∧ (z1 (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))))
                   ∧ (<z3, z4> msgval(e')))
                   ∨ (((header(e') ``pv11_p1 adopted``)
                      ∧ has-es-info-type(es;e';mf;pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
                     ∧ ((fst(msgval(e'))) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))))
                     ∧ ((<z3, z4> ↓∈ snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))
                       ∧ (∃p2:Cmd. (<z3, p2> ∈ pv11_p1_pmax(Cmd;ldrs_uid) (snd(msgval(e')))))))
                       ∨ (∃v2:pv11_p1_Ballot_Num()
                           (<v2, z3, z4> ↓∈ snd(msgval(e'))
                           ∧ (∃z5:pv11_p1_Ballot_Num(). ∃z8:Cmd. ((↑(v2 ... ...)) ∧ ...))))))
                     ∧ ...))
                   ∧ ...)))
            ∨ ...))
          ∨ ...})

Lemma: pv11_p1-p1a
[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹]. ∀[i1:Id].
[p:pv11_p1_Ballot_Num()].
  (<d, i, mk-msg(auth;``pv11_p1 p1a``;<i1, p>)> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
  ⇐⇒ loc(e) ↓∈ ldrs
      ∧ i ↓∈ accpts
      ∧ (d 0)
      ∧ auth pv11_p1_init_active()
      ∧ (i1 loc(e))
      ∧ (↓((p (pv11_p1_init_ballot_num() loc(e))) ∧ (↑first(e)))
          ∨ ((header(e) ``pv11_p1 preempted``)
            ∧ has-es-info-type(es;e;mf;pv11_p1_Ballot_Num())
            ∧ (↑(pv11_p1_is_bnum() msgval(e)))
            ∧ (↑(fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e))  < msgval(e)))
            ∧ (p (pv11_p1_upd_bnum() msgval(e) loc(e))))))

Lemma: pv11_p1-p1b
[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹]. ∀[i1:Id].
[p,p1:pv11_p1_Ballot_Num()]. ∀[L:(pv11_p1_Ballot_Num() × ℤ × Cmd) List].
  (<d, i, mk-msg(auth;``pv11_p1 p1b``;<i1, p, p1, L>)> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
  ⇐⇒ loc(e) ↓∈ accpts
      ∧ ((header(e) ``pv11_p1 p1a``) ∧ has-es-info-type(es;e;mf;Id × pv11_p1_Ballot_Num()))
      ∧ (d 0)
      ∧ (i (fst(msgval(e))))
      ∧ auth pv11_p1_init_active()
      ∧ (i1 loc(e))
      ∧ (p (snd(msgval(e))))
      ∧ (<p1, L> pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;mf;es;e)))

Lemma: pv11_p1-p2a
[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹]. ∀[i1:Id].
[p:pv11_p1_Ballot_Num()]. ∀[k:ℤ]. ∀[v:Cmd].
  (<d, i, mk-msg(auth;``pv11_p1 p2a``;<i1, p, k, v>)> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
  ⇐⇒ loc(e) ↓∈ ldrs
      ∧ i ↓∈ accpts
      ∧ (d 0)
      ∧ auth pv11_p1_init_active()
      ∧ (i1 loc(e))
      ∧ (↓(((header(e) [propose]) ∧ has-es-info-type(es;e;mf;ℤ × Cmd))
          ∧ ((↑(fst(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e)))))
            ∧ (¬↑(pv11_p1_in_domain(Cmd) (fst(msgval(e))) (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e)))))))
          ∧ (p (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e))))
          ∧ (<k, v> msgval(e)))
          ∨ (((header(e) ``pv11_p1 adopted``)
             ∧ has-es-info-type(es;e;mf;pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
            ∧ ((fst(msgval(e))) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e))))
            ∧ ((<k, v> ↓∈ snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e)))
              ∧ (∃p2:Cmd. (<k, p2> ∈ pv11_p1_pmax(Cmd;ldrs_uid) (snd(msgval(e)))))))
              ∨ (∃v2:pv11_p1_Ballot_Num()
                  (<v2, k, v> ↓∈ snd(msgval(e))
                  ∧ (∃z5:pv11_p1_Ballot_Num(). ∃z8:Cmd. ((↑(v2  < z5)) ∧ (<z5, k, z8> ∈ snd(msgval(e)))))))))
            ∧ (p (fst(msgval(e)))))))

Lemma: pv11_p1-p2b
[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹]. ∀[i1:Id].
[p:pv11_p1_Ballot_Num()]. ∀[k:ℤ]. ∀[p1:pv11_p1_Ballot_Num()].
  (<d, i, mk-msg(auth;``pv11_p1 p2b``;<i1, p, k, p1>)> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
  ⇐⇒ loc(e) ↓∈ accpts
      ∧ ((header(e) ``pv11_p1 p2a``) ∧ has-es-info-type(es;e;mf;Id × pv11_p1_Ballot_Num() × ℤ × Cmd))
      ∧ (d 0)
      ∧ (i (fst(msgval(e))))
      ∧ auth pv11_p1_init_active()
      ∧ (i1 loc(e))
      ∧ (p (fst(snd(msgval(e)))))
      ∧ (k (fst(snd(snd(msgval(e))))))
      ∧ (p1 (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;mf;es;e)))))

Lemma: pv11_p1-preempted
[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹].
[p:pv11_p1_Ballot_Num()].
  (<d, i, mk-msg(auth;``pv11_p1 preempted``;p)> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
  ⇐⇒ loc(e) ↓∈ ldrs
      ∧ (↓(((no ((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc(e)) pv11_p1_p1b'base(Cmd;mf)) o
                pv11_p1_ScoutState(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc(e))) prior to e)
          ∧ ((header(e) ``pv11_p1 p1b``)
            ∧ has-es-info-type(es;e;mf;Id
              × pv11_p1_Ballot_Num()
              × pv11_p1_Ballot_Num()
              × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
          ∧ ((pv11_p1_init_ballot_num() loc(e)) (fst(snd(msgval(e)))))
          ∧ (d 0)
          ∧ (i loc(e))
          ∧ ((pv11_p1_init_ballot_num() loc(e)) (fst(snd(snd(msgval(e)))))))
          ∧ auth pv11_p1_init_active()
          ∧ (p (fst(snd(snd(msgval(e)))))))
          ∨ (∃z4:Cmd
              ∃e':{e':E| e' ≤loc 
               ((header(e) ``pv11_p1 p2b``)
               ∧ has-es-info-type(es;e;mf;Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
               ∧ (d 0)
               ∧ ((fst(snd(msgval(e)))) (snd(snd(snd(msgval(e)))))))
               ∧ (i loc(e))
               ∧ auth pv11_p1_init_active()
               ∧ (p (snd(snd(snd(msgval(e))))))
               ∧ ((((header(e') [propose]) ∧ has-es-info-type(es;e';mf;ℤ × Cmd))
                 ∧ ((↑(fst(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))))
                   ∧ (¬↑(pv11_p1_in_domain(Cmd) (fst(msgval(e'))) 
                         (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))))))
                 ∧ ((fst(snd(msgval(e)))) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))))
                 ∧ (<fst(snd(snd(msgval(e)))), z4> msgval(e')))
                 ∨ (((header(e') ``pv11_p1 adopted``)
                    ∧ has-es-info-type(es;e';mf;pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
                   ∧ ((fst(msgval(e'))) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))))
                   ∧ ((<fst(snd(snd(msgval(e)))), z4> ↓∈ snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))
                     ∧ (∃p2:Cmd. (<fst(snd(snd(msgval(e)))), p2> ∈ pv11_p1_pmax(Cmd;ldrs_uid) (snd(msgval(e')))))))
                     ∨ (∃v2:pv11_p1_Ballot_Num()
                         (<v2, fst(snd(snd(msgval(e)))), z4> ↓∈ snd(msgval(e'))
                         ∧ (∃z5:pv11_p1_Ballot_Num()
                               ∃z8:Cmd. ((↑(v2  < z5)) ∧ (<z5, fst(snd(snd(msgval(e)))), z8> ∈ snd(msgval(e')))))))))
                   ∧ ((fst(snd(msgval(e)))) (fst(msgval(e'))))))
               ∧ (no ((pv11_p1_commander_output(Cmd;accpts;reps;mf) <fst(snd(msgval(e))), fst(snd(snd(msgval(e)))), z4> \000Co pv11_p1_p2b'base(Cmd;mf)) o
                     pv11_p1_CommanderState(Cmd;accpts;mf) (fst(snd(msgval(e)))) (fst(snd(snd(msgval(e)))))) between e'
                  and e))))
          ∨ (∃e':{e':E| e' ≤loc 
              ((((header(e') ``pv11_p1 preempted``) ∧ has-es-info-type(es;e';mf;pv11_p1_Ballot_Num()))
               ∧ (↑(pv11_p1_is_bnum() msgval(e')))
               ∧ (↑(fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))  < msgval(e'))))
              ∧ (no ((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_upd_bnum() msgval(e') loc(e')) o
                     pv11_p1_p1b'base(Cmd;mf)) pv11_p1_ScoutState(Cmd;accpts;mf) 
                                                 (pv11_p1_upd_bnum() msgval(e') loc(e'))) between e' and e)
              ∧ ((header(e) ``pv11_p1 p1b``)
                ∧ has-es-info-type(es;e;mf;Id
                  × pv11_p1_Ballot_Num()
                  × pv11_p1_Ballot_Num()
                  × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
              ∧ ((pv11_p1_upd_bnum() msgval(e') loc(e')) (fst(snd(msgval(e)))))
              ∧ (d 0)
              ∧ (i loc(e))
              ∧ ((pv11_p1_upd_bnum() msgval(e') loc(e')) (fst(snd(snd(msgval(e)))))))
              ∧ auth pv11_p1_init_active()
              ∧ (p (fst(snd(snd(msgval(e))))))))))

Lemma: pv11_p1-adopted
[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹].
[p:pv11_p1_Ballot_Num()]. ∀[L:(pv11_p1_Ballot_Num() × ℤ × Cmd) List].
  (<d, i, mk-msg(auth;``pv11_p1 adopted``;<p, L>)> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
  ⇐⇒ loc(e) ↓∈ ldrs
      ∧ (↓((no ((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc(e)) pv11_p1_p1b'base(Cmd;mf)) o
               pv11_p1_ScoutState(Cmd;accpts;mf) (pv11_p1_init_ballot_num() loc(e))) prior to e)
          ∧ ((header(e) ``pv11_p1 p1b``)
            ∧ has-es-info-type(es;e;mf;Id
              × pv11_p1_Ballot_Num()
              × pv11_p1_Ballot_Num()
              × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
          ∧ ((pv11_p1_init_ballot_num() loc(e)) (fst(snd(msgval(e)))))
          ∧ (d 0)
          ∧ (i loc(e))
          ∧ ((pv11_p1_init_ballot_num() loc(e)) (fst(snd(snd(msgval(e))))))
          ∧ #(fst(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_init_ballot_num() 
                                                      loc(e);es;e))) < pv11_p1_threshold(accpts)
          ∧ auth pv11_p1_init_active()
          ∧ (p (pv11_p1_init_ballot_num() loc(e)))
          ∧ (L (snd(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_init_ballot_num() loc(e);es;e)))))
          ∨ (∃e':{e':E| e' ≤loc 
              ((((header(e') ``pv11_p1 preempted``) ∧ has-es-info-type(es;e';mf;pv11_p1_Ballot_Num()))
               ∧ (↑(pv11_p1_is_bnum() msgval(e')))
               ∧ (↑(fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))  < msgval(e'))))
              ∧ (no ((pv11_p1_scout_output(Cmd;accpts;mf) (pv11_p1_upd_bnum() msgval(e') loc(e')) o
                     pv11_p1_p1b'base(Cmd;mf)) pv11_p1_ScoutState(Cmd;accpts;mf) 
                                                 (pv11_p1_upd_bnum() msgval(e') loc(e'))) between e' and e)
              ∧ ((header(e) ``pv11_p1 p1b``)
                ∧ has-es-info-type(es;e;mf;Id
                  × pv11_p1_Ballot_Num()
                  × pv11_p1_Ballot_Num()
                  × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
              ∧ ((pv11_p1_upd_bnum() msgval(e') loc(e')) (fst(snd(msgval(e)))))
              ∧ (d 0)
              ∧ (i loc(e))
              ∧ ((pv11_p1_upd_bnum() msgval(e') loc(e')) (fst(snd(snd(msgval(e))))))
              ∧ #(fst(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_upd_bnum() msgval(e') 
                                                          loc(e');es.e';e))) < pv11_p1_threshold(accpts)
              ∧ auth pv11_p1_init_active()
              ∧ (p (pv11_p1_upd_bnum() msgval(e') loc(e')))
              ∧ (L (snd(pv11_p1_ScoutStateFun(Cmd;accpts;mf;pv11_p1_upd_bnum() msgval(e') loc(e');es.e';e))))))))

Lemma: pv11_p1-decision
[Cmd:{T:Type| valueall-type(T)} ]. ∀[accpts,ldrs:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)].
[mf:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(mf))]. ∀[e:E]. ∀[d:ℤ]. ∀[i:Id]. ∀[auth:𝔹]. ∀[k:ℤ]. ∀[v:Cmd].
  (<d, i, mk-msg(auth;[decision];<k, v>)> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;mf)(e)
  ⇐⇒ loc(e) ↓∈ ldrs
      ∧ (↓∃e':{e':E| e' ≤loc 
           ((header(e) ``pv11_p1 p2b``)
           ∧ has-es-info-type(es;e;mf;Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
           ∧ (d 0)
           ∧ ((fst(snd(msgval(e)))) (snd(snd(snd(msgval(e))))))
           ∧ #(pv11_p1_CommanderStateFun(Cmd;accpts;mf;fst(snd(msgval(e)));fst(snd(snd(msgval(e))));es.e';e)) < ...
           ∧ i ↓∈ reps
           ∧ auth pv11_p1_init_active()
           ∧ (k (fst(snd(snd(msgval(e))))))
           ∧ ((((header(e') [propose]) ∧ has-es-info-type(es;e';mf;ℤ × Cmd))
             ∧ ((↑(fst(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))))
               ∧ (¬↑(pv11_p1_in_domain(Cmd) (fst(msgval(e'))) 
                     (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))))))
             ∧ ((fst(snd(msgval(e)))) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))))
             ∧ (<fst(snd(snd(msgval(e)))), v> msgval(e')))
             ∨ (((header(e') ``pv11_p1 adopted``)
                ∧ has-es-info-type(es;e';mf;pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
               ∧ ((fst(msgval(e'))) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e'))))
               ∧ ((<fst(snd(snd(msgval(e)))), v> ↓∈ snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;mf;es;e')))
                 ∧ (∃p2:Cmd. (<fst(snd(snd(msgval(e)))), p2> ∈ pv11_p1_pmax(Cmd;ldrs_uid) (snd(msgval(e')))))))
                 ∨ (∃v2:pv11_p1_Ballot_Num()
                     (<v2, fst(snd(snd(msgval(e)))), v> ↓∈ snd(msgval(e'))
                     ∧ (∃z5:pv11_p1_Ballot_Num()
                           ∃z8:Cmd. ((↑(v2  < z5)) ∧ (<z5, fst(snd(snd(msgval(e)))), z8> ∈ snd(msgval(e')))))))))
               ∧ ((fst(snd(msgval(e)))) (fst(msgval(e'))))))
           ∧ (no ((pv11_p1_commander_output(Cmd;accpts;reps;mf) <fst(snd(msgval(e))), fst(snd(snd(msgval(e)))), v> pv1\000C1_p1_p2b'base(Cmd;mf)) o
                 pv11_p1_CommanderState(Cmd;accpts;mf) (fst(snd(msgval(e)))) (fst(snd(snd(msgval(e)))))) between e' and
              e))))

Lemma: pv11_p1_pmax_wf
[Cmd:ValueAllType]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_pmax(Cmd;ldrs_uid) ∈ ((pv11_p1_Ballot_Num() × ℤ × Cmd) List) ─→ ((ℤ × Cmd) List))

Lemma: pv11_p1_in_domain_wf
[Cmd:ValueAllType]. (pv11_p1_in_domain(Cmd) ∈ ℤ ─→ ((ℤ × Cmd) List) ─→ 𝔹)

Comment: ----- header property --------------------
Shouldn't we generated this automatically ?

Lemma: pv11_p1_headers-property
[Cmd:ValueAllType]
  ∀f:pv11_p1_headers_type{i:l}(Cmd)
    (((f ``pv11_p1 p1a``) (Id × pv11_p1_Ballot_Num()))
    ∧ ((f ``pv11_p1 p1b``)
      (Id × pv11_p1_Ballot_Num() × pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
    ∧ ((f ``pv11_p1 p2a``) (Id × pv11_p1_Ballot_Num() × ℤ × Cmd))
    ∧ ((f ``pv11_p1 p2b``) (Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num()))
    ∧ ((f ``pv11_p1 preempted``) pv11_p1_Ballot_Num())
    ∧ ((f ``pv11_p1 adopted``) (pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)))
    ∧ ((f [propose]) (ℤ × Cmd))
    ∧ ((f [decision]) (ℤ × Cmd)))

Lemma: pv11_p1_lt_bnum_trans
ldrs_uid:Id ─→ ℤ. ∀b1,b2,b3:pv11_p1_Ballot_Num().  ((↑(b1  < b2))  (↑(b2  < b3))  (↑(b1  < b3)))

Lemma: pv11_p1_lt_bnum_trans1
ldrs_uid:Id ─→ ℤ. ∀b1,b2,b3:pv11_p1_Ballot_Num().
  ((↑(b1  < b2))  (↑(pv11_p1_leq_bnum(ldrs_uid) b2 b3))  (↑(b1  < b3)))

Lemma: pv11_p1_lt_bnum_trans2
ldrs_uid:Id ─→ ℤ. ∀b1,b2,b3:pv11_p1_Ballot_Num().
  ((↑(pv11_p1_leq_bnum(ldrs_uid) b1 b2))  (↑(b2  < b3))  (↑(b1  < b3)))

Lemma: pv11_p1_lt_bnum_irrefl
ldrs_uid:Id ─→ ℤ. ∀b:pv11_p1_Ballot_Num().  (¬↑(b  < b))

Lemma: pv11_p1_lt_bnum_irrefl2
ldrs_uid:Id ─→ ℤ. ∀b:pv11_p1_Ballot_Num().  ((↑(b  < b))  False)

Lemma: pv11_p1_lt_bnum_implies_not
ldrs_uid:Id ─→ ℤ. ∀b1,b2:pv11_p1_Ballot_Num().  ((↑(b1  < b2))  (¬↑(b2  < b1)))

Lemma: pv11_p1_lt_bnum_implies_not2
ldrs_uid:Id ─→ ℤ. ∀b1,b2:pv11_p1_Ballot_Num().  ((↑(b1  < b2))  (↑(b2  < b1))  False)

Lemma: pv11_p1_lt_bnum_implies_not3
ldrs_uid:Id ─→ ℤ. ∀b1,b2:pv11_p1_Ballot_Num().  ((↑(pv11_p1_leq_bnum(ldrs_uid) b2 b1))  (↑(b1  < b2))  False)

Lemma: pv11_p1_lt_bnum_upd
ldrs_uid:Id ─→ ℤ. ∀b:pv11_p1_Ballot_Num(). ∀l:Id.  ((↑(pv11_p1_is_bnum() b))  (↑(b  < (pv11_p1_upd_bnum() l))))

Lemma: pv11_p1_leq_bnum_implies_eq
ldrs_uid:Id ─→ ℤ. ∀b,b':pv11_p1_Ballot_Num().
  (Inj(Id;ℤ;ldrs_uid)  (↑(pv11_p1_leq_bnum(ldrs_uid) b'))  (↑(pv11_p1_leq_bnum(ldrs_uid) b' b))  (b b'))

Lemma: pv11_p1_leq_bnum_implies_eq_or_lt
ldrs_uid:Id ─→ ℤ. ∀b1,b2:pv11_p1_Ballot_Num().
  (Inj(Id;ℤ;ldrs_uid)  (↑(pv11_p1_leq_bnum(ldrs_uid) b1 b2))  ((b1 b2) ∨ (↑(b1  < b2))))

Lemma: pv11_p1_leq_bnum_linorder
ldrs_uid:Id ─→ ℤ(Inj(Id;ℤ;ldrs_uid)  Linorder(pv11_p1_Ballot_Num();b1,b2.↑(pv11_p1_leq_bnum(ldrs_uid) b1 b2)))

Lemma: not-pv11_p1_leq_bnum
ldrs_uid:Id ─→ ℤ. ∀b,b':pv11_p1_Ballot_Num().
  (Inj(Id;ℤ;ldrs_uid)  (¬↑(pv11_p1_leq_bnum(ldrs_uid) b'))  (↑(b'  < b)))

Lemma: pv11_p1_leq_bnum_refl
ldrs_uid:Id ─→ ℤ. ∀b:pv11_p1_Ballot_Num().  (↑(pv11_p1_leq_bnum(ldrs_uid) b))

Lemma: pv11_p1_leq_bnum_dummy
ldrs_uid:Id ─→ ℤ. ∀b:pv11_p1_Ballot_Num().  (↑(pv11_p1_leq_bnum(ldrs_uid) pv11_p1_dummy_ballot() b))

Lemma: pv11_p1_leq_bnum_dummy_eq
ldrs_uid:Id ─→ ℤ. ∀b:pv11_p1_Ballot_Num().  (pv11_p1_leq_bnum(ldrs_uid) pv11_p1_dummy_ballot() tt)

Lemma: pv11_p1_leq_bnum_max
ldrs_uid:Id ─→ ℤ. ∀b,b':pv11_p1_Ballot_Num().  (↑(pv11_p1_leq_bnum(ldrs_uid) (pv11_p1_max_bnum(ldrs_uid) b' b)))

Lemma: pv11_p1_leq_bnum_max2
ldrs_uid:Id ─→ ℤ. ∀b,b':pv11_p1_Ballot_Num().  (↑(pv11_p1_leq_bnum(ldrs_uid) (pv11_p1_max_bnum(ldrs_uid) b')))

Lemma: pv11_p1_leq_bnum_or
ldrs_uid:Id ─→ ℤ. ∀b1,b2:pv11_p1_Ballot_Num().
  ((↑(pv11_p1_leq_bnum(ldrs_uid) b1 b2)) ∨ (↑(pv11_p1_leq_bnum(ldrs_uid) b2 b1)))

Lemma: pv11_p1_max_bnum_dummy
ldrs_uid:Id ─→ ℤ. ∀b:pv11_p1_Ballot_Num().  ((pv11_p1_max_bnum(ldrs_uid) pv11_p1_dummy_ballot()) b)

Lemma: pv11_p1_max_bnum_if_leq
ldrs_uid:Id ─→ ℤ. ∀b1,b2:pv11_p1_Ballot_Num().
  ((↑(pv11_p1_leq_bnum(ldrs_uid) b1 b2))  ((pv11_p1_max_bnum(ldrs_uid) b1 b2) b2))

Lemma: pv11_p1_max_bnum_comm
[ldrs_uid:Id ─→ ℤ]. ∀[b1,b2:pv11_p1_Ballot_Num()].
  (pv11_p1_max_bnum(ldrs_uid) b1 b2) (pv11_p1_max_bnum(ldrs_uid) b2 b1) supposing Inj(Id;ℤ;ldrs_uid)

Lemma: pv11_p1_add_if_new_iff
Cmd:ValueAllType. ∀p,x:ℤ × Cmd. ∀proposals:(ℤ × Cmd) List.
  ((p ∈ pv11_p1_add_if_new() pv11_p1_same_proposal(Cmd) proposals)
  ⇐⇒ (p ∈ proposals) ∨ if (∃z∈proposals.pv11_p1_same_proposal(Cmd) z)_b then False else fi )

Lemma: pv11_p1_add_if_new_iff2
A:Type. ∀p,x:A. ∀L:A List. ∀test:A ─→ A ─→ 𝔹.
  ((p ∈ pv11_p1_add_if_new() test L) ⇐⇒ (p ∈ L) ∨ if (∃z∈L.test z)_b then False else fi )

Lemma: pv11_p1_add_if_new_if
Cmd:ValueAllType. ∀p:ℤ × Cmd. ∀proposals:(ℤ × Cmd) List.
  ((¬↑(pv11_p1_in_domain(Cmd) (fst(p)) proposals))  (p ∈ pv11_p1_add_if_new() pv11_p1_same_proposal(Cmd) proposals))

Lemma: pv11_p1_pmax_desc
Cmd:ValueAllType. ∀ldrs_uid:Id ─→ ℤ. ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((<s, c> ∈ pv11_p1_pmax(Cmd;ldrs_uid) pvals)
   (∃b:pv11_p1_Ballot_Num()
       ((<b, s, c> ∈ pvals)
       ∧ (∀b':pv11_p1_Ballot_Num(). ∀c':Cmd.  ((<b', s, c'> ∈ pvals)  (↑(pv11_p1_leq_bnum(ldrs_uid) b' b)))))))

Lemma: pv11_p1_pmax_desc_iff
Cmd:ValueAllType. ∀ldrs_uid:Id ─→ ℤ. ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((<s, c> ∈ pv11_p1_pmax(Cmd;ldrs_uid) pvals)
  ⇐⇒ ∃b:pv11_p1_Ballot_Num()
       ((<b, s, c> ∈ pvals)
       ∧ (∀b':pv11_p1_Ballot_Num(). ∀c':Cmd.  ((<b', s, c'> ∈ pvals)  (↑(pv11_p1_leq_bnum(ldrs_uid) b' b))))))

Lemma: pv11_p1_pmax_desc_implies
Cmd:ValueAllType. ∀ldrs_uid:Id ─→ ℤ. ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List. ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ.
c:Cmd.
  ((<b, s, c> ∈ pvals)  (∃c':Cmd. (<s, c'> ∈ pv11_p1_pmax(Cmd;ldrs_uid) pvals)))

Lemma: pv11_p1_upd_desc
Cmd:ValueAllType. ∀proposals1,proposals2:(ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((<s, c> ∈ pv11_p1_update_proposals(Cmd) proposals1 proposals2)
   ((<s, c> ∈ proposals2) ∨ ((<s, c> ∈ proposals1) ∧ (∃c':Cmd. (<s, c'> ∈ proposals2))))))

Lemma: pv11_p1_upd_desc_iff
Cmd:ValueAllType. ∀proposals1,proposals2:(ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((<s, c> ∈ pv11_p1_update_proposals(Cmd) proposals1 proposals2)
  ⇐⇒ (<s, c> ∈ proposals2) ∨ ((<s, c> ∈ proposals1) ∧ (∃c':Cmd. (<s, c'> ∈ proposals2)))))

Lemma: pv11_p1_upd_left
Cmd:ValueAllType. ∀proposals1,proposals2:(ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((<s, c> ∈ proposals1)  (∃c':Cmd. (<s, c'> ∈ pv11_p1_update_proposals(Cmd) proposals1 proposals2)))

Lemma: pv11_p1_upd_right
Cmd:ValueAllType. ∀proposals1,proposals2:(ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((<s, c> ∈ proposals2)  (∃c':Cmd. (<s, c'> ∈ pv11_p1_update_proposals(Cmd) proposals1 proposals2)))

Lemma: pv11_p1_acc_p2a
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List). ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd.
  (v ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e)
   let bnum,accepted 
     in (<b, s, c> ∈ accepted)  (∃e':E. ∃l:Id. (e' ≤loc e  ∧ <l, b, s, c> ∈ pv11_p1_p2a'base(Cmd;f)(e'))))

Lemma: pv11_p1_acc_fun_p2a
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd.
  ((<b, s, c> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)))
   (∃e':E. ∃l:Id. (e' ≤loc e  ∧ <l, b, s, c> ∈ pv11_p1_p2a'base(Cmd;f)(e'))))

Lemma: pv11_p1_acc_fun_p2a_pv
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
p:pv11_p1_Ballot_Num() × ℤ × Cmd.
  ((p ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)))
   (∃e':E. ∃l:Id. (e' ≤loc e  ∧ <l, p> ∈ pv11_p1_p2a'base(Cmd;f)(e'))))

Lemma: pv11_p1_ldr_loc_bnum
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
  (v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e)
   let bnum,active,proposals in 
     ∃n:ℤ(bnum (pv11_p1_mk_bnum() loc(e))))

Lemma: pv11_p1_ldr_fun_loc_bnum
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
  ∃n:ℤ((fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e))) (pv11_p1_mk_bnum() loc(e)))

Lemma: pv11_p1_ldr_mem_propose
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
v1,v2:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
p:ℤ × Cmd pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List) pv11_p1_Ballot_Num().
  ((e1 <loc e2)
   p ∈ pv11_p1_propose'base(Cmd;f) (+) pv11_p1_adopted'base(Cmd;f) (+) pv11_p1_preempted'base(Cmd;f)(e1)
   v1 ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e1)
   v2 ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e2)
   case p
      of inl(x) =>
      let s,c 
      in let bnum1,active1,proposals1 v1 in 
         let bnum2,active2,proposals2 v2 in 
         (¬↑(pv11_p1_in_domain(Cmd) proposals1))  (↑(pv11_p1_in_domain(Cmd) proposals2))
      inr(x) =>
      True)

Lemma: pv11_p1_ldr_mem_propose2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bnum1,bnum2:pv11_p1_Ballot_Num(). ∀active1,active2:𝔹. ∀proposals1,proposals2:(ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((e1 <loc e2)
   <s, c> ∈ pv11_p1_propose'base(Cmd;f)(e1)
   <bnum1, active1, proposals1> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e1)
   <bnum2, active2, proposals2> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e2)
   (¬↑(pv11_p1_in_domain(Cmd) proposals1))
   (↑(pv11_p1_in_domain(Cmd) proposals2)))

Lemma: pv11_p1_ldr_fun_mem_propose
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
p:ℤ × Cmd pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List) pv11_p1_Ballot_Num().
  ((e1 <loc e2)
   p ∈ pv11_p1_propose'base(Cmd;f) (+) pv11_p1_adopted'base(Cmd;f) (+) pv11_p1_preempted'base(Cmd;f)(e1)
   case p
      of inl(x) =>
      (¬↑(pv11_p1_in_domain(Cmd) (fst(x)) (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1))))))
       (↑(pv11_p1_in_domain(Cmd) (fst(x)) (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e2))))))
      inr(x) =>
      True)

Lemma: pv11_p1_ldr_fun_mem_propose2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ. ∀s:ℤ. ∀c:Cmd.
  ((e1 <loc e2)
   <s, c> ∈ pv11_p1_propose'base(Cmd;f)(e1)
   (¬↑(pv11_p1_in_domain(Cmd) (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1))))))
   (↑(pv11_p1_in_domain(Cmd) (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e2)))))))

Lemma: pv11_p1_ldr_mem_preempted
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
v1,v2:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
p:ℤ × Cmd pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List) pv11_p1_Ballot_Num().
  ((e1 <loc e2)
   p ∈ pv11_p1_propose'base(Cmd;f) (+) pv11_p1_adopted'base(Cmd;f) (+) pv11_p1_preempted'base(Cmd;f)(e1)
   v1 ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e1)
   v2 ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e2)
   let bnum1,active1,proposals1 v1 in 
     let bnum2,active2,proposals2 v2 in 
     case p
      of inl(x) =>
      True
      inr(x) =>
      case x
       of inl(x) =>
       True
       inr(bnum) =>
       (↑(bnum1  < bnum))  (↑(pv11_p1_leq_bnum(ldrs_uid) (pv11_p1_upd_bnum() bnum loc(e1)) bnum2)))

Lemma: pv11_p1_ldr_active
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
  (v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e)
   let bnum,active,proposals1 in 
     (↑active)
      (∃e':E
          ∃pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List. (e' ≤loc e  ∧ <bnum, pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e'))))

Lemma: pv11_p1_ldr_active2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
  (v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e)
   let bnum,active,proposals1 in 
     (↑active)
      (↓∃e':E
           ∃pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List
            ∃proposals:(ℤ × Cmd) List
             ∃b:𝔹
              ((e' <loc e)
              ∧ <bnum, pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e')
              ∧ <bnum, b, proposals> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e'))))

Lemma: pv11_p1_ldr_active_fun
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
  ((↑(fst(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e)))))
   (↓∃e':E
        ∃pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List
         ((e' <loc e)
         ∧ <fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e)), pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e')
         ∧ ((fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e))) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e')))))))

Lemma: pv11_p1_ldr_pos
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
  (v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e)
   let bnum,active,proposals1 in 
     ↑(pv11_p1_leq_bnum(ldrs_uid) (pv11_p1_init_ballot_num() loc(e)) bnum))

Lemma: pv11_p1_ldr_fun_pos
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
  (↑(pv11_p1_leq_bnum(ldrs_uid) (pv11_p1_init_ballot_num() loc(e)) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e)))))

Lemma: pv11_p1_ldr_fun_ord
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
  ((e1 <loc e2)
   (↑(pv11_p1_leq_bnum(ldrs_uid) (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1))) 
        (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e2))))))

Lemma: pv11_p1_scout_from_acc
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts:bag(Id).
s:bag(Id) × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List). ∀bnum:pv11_p1_Ballot_Num().
  (s ∈ pv11_p1_ScoutState(Cmd;accpts;f) bnum(e)
   let waitfor,pvalues 
     in ∀p:pv11_p1_Ballot_Num() × ℤ × Cmd
          ((p ∈ pvalues)
           (∃e':E
               ∃l:Id
                ∃r:(pv11_p1_Ballot_Num() × ℤ × Cmd) List
                 (e' ≤loc e  ∧ <l, bnum, bnum, r> ∈ pv11_p1_p1b'base(Cmd;f)(e') ∧ (p ∈ r)))))

Lemma: pv11_p1_scout_fun_from_acc
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts:bag(Id).
b:pv11_p1_Ballot_Num(). ∀p:pv11_p1_Ballot_Num() × ℤ × Cmd.
  ((p ∈ snd(pv11_p1_ScoutStateFun(Cmd;accpts;f;b;es;e)))
   (∃e':E
       ∃l:Id
        ∃r:(pv11_p1_Ballot_Num() × ℤ × Cmd) List. (e' ≤loc e  ∧ <l, b, b, r> ∈ pv11_p1_p1b'base(Cmd;f)(e') ∧ (p ∈ r))))

Lemma: pv11_p1_scout_fun_from_acc2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀p:pv11_p1_Ballot_Num() × ℤ × Cmd.
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (p ∈ snd(pv11_p1_ScoutStateFun(Cmd;accpts;f;b;es;e)))
   (↓∃e':E. ((e' < e) ∧ (p ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e'))))))

Lemma: pv11_p1_acc_state_fun_eq
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)
  if e ∈b pv11_p1_p1a'base(Cmd;f) (+) pv11_p1_p2a'base(Cmd;f)
      then if first(e)
           then pv11_p1_on_p1a(Cmd;ldrs_uid) pv11_p1_on_p2a(Cmd;ldrs_uid) loc(e) 
                pv11_p1_p1a'base(Cmd;f) (+) pv11_p1_p2a'base(Cmd;f)@e 
                pv11_p1_init_acceptor(Cmd)
           else pv11_p1_on_p1a(Cmd;ldrs_uid) pv11_p1_on_p2a(Cmd;ldrs_uid) loc(e) 
                pv11_p1_p1a'base(Cmd;f) (+) pv11_p1_p2a'base(Cmd;f)@e 
                pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;pred(e))
           fi 
    if first(e) then pv11_p1_init_acceptor(Cmd)
    else pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;pred(e))
    fi )

Lemma: pv11_p1_acc_state_fun_eq2
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)
  if e ∈b pv11_p1_p1a'base(Cmd;f)
      then if first(e)
           then pv11_p1_on_p1a(Cmd;ldrs_uid) loc(e) pv11_p1_p1a'base(Cmd;f)@e pv11_p1_init_acceptor(Cmd)
           else pv11_p1_on_p1a(Cmd;ldrs_uid) loc(e) pv11_p1_p1a'base(Cmd;f)@e 
                pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;pred(e))
           fi 
    if e ∈b pv11_p1_p2a'base(Cmd;f)
      then if first(e)
           then pv11_p1_on_p2a(Cmd;ldrs_uid) loc(e) pv11_p1_p2a'base(Cmd;f)@e pv11_p1_init_acceptor(Cmd)
           else pv11_p1_on_p2a(Cmd;ldrs_uid) loc(e) pv11_p1_p2a'base(Cmd;f)@e 
                pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;pred(e))
           fi 
    if first(e) then pv11_p1_init_acceptor(Cmd)
    else pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;pred(e))
    fi )

Lemma: pv11_p1_ldr_state_fun_eq
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[ldrs_uid:Id ─→ ℤ].
  (pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e)
  if first(e) then pv11_p1_init_leader(Cmd) loc(e)
    if pred(e) ∈b pv11_p1_propose'base(Cmd;f)
      then pv11_p1_on_propose(Cmd) loc(e) pv11_p1_propose'base(Cmd;f)@pred(e) 
           pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;pred(e))
    if pred(e) ∈b pv11_p1_adopted'base(Cmd;f)
      then pv11_p1_when_adopted(Cmd;ldrs_uid) loc(e) pv11_p1_adopted'base(Cmd;f)@pred(e) 
           pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;pred(e))
    if pred(e) ∈b pv11_p1_preempted'base(Cmd;f)
      then pv11_p1_when_preempted(Cmd;ldrs_uid) loc(e) pv11_p1_preempted'base(Cmd;f)@pred(e) 
           pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;pred(e))
    else pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;pred(e))
    fi )

Lemma: pv11_p1_ldr_state_eq
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[ldrs_uid:Id ─→ ℤ].
[v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)].
  uiff(v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e);↓if first(e) then (pv11_p1_init_leader(Cmd) loc(e))
                                                   if pred(e) ∈b pv11_p1_propose'base(Cmd;f)
                                                     then ∃x:ℤ × Cmd
                                                           ∃s:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)
                                                            (x ∈ pv11_p1_propose'base(Cmd;f)(pred(e))
                                                            ∧ s ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
                                                            ∧ (v (pv11_p1_on_propose(Cmd) loc(e) s)))
                                                   if pred(e) ∈b pv11_p1_adopted'base(Cmd;f)
                                                     then ∃x:pv11_p1_Ballot_Num()
                                                             × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)
                                                           ∃s:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)
                                                            (x ∈ pv11_p1_adopted'base(Cmd;f)(pred(e))
                                                            ∧ s ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
                                                            ∧ (v (pv11_p1_when_adopted(Cmd;ldrs_uid) loc(e) s)))
                                                   if pred(e) ∈b pv11_p1_preempted'base(Cmd;f)
                                                     then ∃x:pv11_p1_Ballot_Num()
                                                           ∃s:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)
                                                            (x ∈ pv11_p1_preempted'base(Cmd;f)(pred(e))
                                                            ∧ s ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
                                                            ∧ (v (pv11_p1_when_preempted(Cmd;ldrs_uid) loc(e) s)))
                                                   else v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
                                                   fi )

Lemma: pv11_p1_ldr_state_eq2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
  uiff(v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e);if first(e) then (pv11_p1_init_leader(Cmd) loc(e))
  if pred(e) ∈b pv11_p1_propose'base(Cmd;f)
    then ∃x:ℤ × Cmd
          ∃s:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)
           (x ∈ pv11_p1_propose'base(Cmd;f)(pred(e))
           ∧ s ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
           ∧ (v (pv11_p1_on_propose(Cmd) loc(e) s)))
  if pred(e) ∈b pv11_p1_adopted'base(Cmd;f)
    then ∃x:pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List)
          ∃s:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)
           (x ∈ pv11_p1_adopted'base(Cmd;f)(pred(e))
           ∧ s ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
           ∧ (v (pv11_p1_when_adopted(Cmd;ldrs_uid) loc(e) s)))
  if pred(e) ∈b pv11_p1_preempted'base(Cmd;f)
    then ∃x:pv11_p1_Ballot_Num()
          ∃s:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List)
           (x ∈ pv11_p1_preempted'base(Cmd;f)(pred(e))
           ∧ s ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
           ∧ (v (pv11_p1_when_preempted(Cmd;ldrs_uid) loc(e) s)))
  else v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(pred(e))
  fi )

Lemma: pv11_p1_ldr_mem_adopted
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
v1,v2:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
p:ℤ × Cmd pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List) pv11_p1_Ballot_Num().
  ((e1 <loc e2)
   p ∈ pv11_p1_propose'base(Cmd;f) (+) pv11_p1_adopted'base(Cmd;f) (+) pv11_p1_preempted'base(Cmd;f)(e1)
   v1 ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e1)
   v2 ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e2)
   case p
      of inl(x) =>
      True
      inr(x) =>
      case x
       of inl(x) =>
       let bnum,pvals 
       in let bnum1,active1,proposals1 v1 in 
          let bnum2,active2,proposals2 v2 in 
          (bnum1 bnum)
           (∀s:ℤ. ∀b:pv11_p1_Ballot_Num(). ∀c:Cmd.
                (((<s, c> ∈ proposals1) ∨ (<b, s, c> ∈ pvals))  (↑(pv11_p1_in_domain(Cmd) proposals2))))
       inr(x) =>
       True)

Lemma: pv11_p1_ldr_fun_mem_adopted
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((e1 <loc e2)
   <fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1)), pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e1)
   ((↓(<s, c> ∈ snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1)))))
     ∨ (∃b:pv11_p1_Ballot_Num(). (↓(<b, s, c> ∈ pvals))))
   (↑(pv11_p1_in_domain(Cmd) (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e2)))))))

Lemma: pv11_p1_ldr_proposal3
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List). ∀s:ℤ. ∀c:Cmd.
  (v ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e)
   (<s, c> ∈ snd(snd(v)))
   (∃e':E
       ∃bnum:pv11_p1_Ballot_Num()
        ∃active:𝔹
         ∃proposals:(ℤ × Cmd) List
          ((e' <loc e)
          ∧ <bnum, active, proposals> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e')
          ∧ (∀e'':E. ∀x:pv11_p1_Ballot_Num() × 𝔹 × ((ℤ × Cmd) List).
               ((e' <loc e'')  e'' ≤loc e   x ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e'')  (<s, c> ∈ snd(snd(x)))))
          ∧ ((<s, c> ∈ pv11_p1_propose'base(Cmd;f)(e') ∧ (¬↑(pv11_p1_in_domain(Cmd) proposals)))
            ∨ (∃pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List
                ∃b:pv11_p1_Ballot_Num()
                 (<bnum, pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e')
                 ∧ (<b, s, c> ∈ pvals)
                 ∧ (∀b':pv11_p1_Ballot_Num(). ∀c':Cmd.
                      ((<b', s, c'> ∈ pvals)  (↑(pv11_p1_leq_bnum(ldrs_uid) b' b))))))))))

Lemma: pv11_p1_ldr_fun_proposal3
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ. ∀s:ℤ. ∀c:Cmd.
  ((<s, c> ∈ snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e))))
   (∃e':E
       ((e' <loc e)
       ∧ (∀e'':E. ((e' <loc e'')  e'' ≤loc e   (<s, c> ∈ snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e''))))))
       ∧ ((<s, c> ∈ pv11_p1_propose'base(Cmd;f)(e')
         ∧ (¬↑(pv11_p1_in_domain(Cmd) (snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e')))))))
         ∨ (∃pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List
             ∃b:pv11_p1_Ballot_Num()
              (<fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e')), pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e')
              ∧ (<b, s, c> ∈ pvals)
              ∧ (∀b':pv11_p1_Ballot_Num(). ∀c':Cmd.
                   ((<b', s, c'> ∈ pvals)  (↑(pv11_p1_leq_bnum(ldrs_uid) b' b))))))))))

Lemma: pv11_p1_adopted_from_init_or_preempted
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum:pv11_p1_Ballot_Num(). ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   <bnum, pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e)
   (↓(bnum (pv11_p1_init_ballot_num() loc(e)))
       ∨ (∃e':E
           ∃bnum1,bnum2:pv11_p1_Ballot_Num()
            ∃b:𝔹
             ∃proposals:(ℤ × Cmd) List
              ((e' <loc e)
              ∧ bnum1 ∈ pv11_p1_preempted'base(Cmd;f)(e')
              ∧ <bnum2, b, proposals> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e')
              ∧ (↑(bnum2  < bnum1))
              ∧ (bnum (pv11_p1_upd_bnum() bnum1 loc(e)))))))

Lemma: pv11_p1_adopted_from_acceptor
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum:pv11_p1_Ballot_Num(). ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd.
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   <bnum, pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e)
   (<b, s, c> ∈ pvals)
   (↓∃e':E
        ∃accepted:(pv11_p1_Ballot_Num() × ℤ × Cmd) List
         ((e' < e) ∧ <bnum, accepted> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e') ∧ (<b, s, c> ∈ accepted))))

Lemma: pv11_p1_scout_state_fun_eq
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[bnum:pv11_p1_Ballot_Num()].
[accpts:bag(Id)].
  (pv11_p1_ScoutStateFun(Cmd;accpts;f;bnum;es;e)
  if e ∈b pv11_p1_p1b'base(Cmd;f)
      then if first(e)
           then pv11_p1_on_p1b(Cmd) bnum loc(e) pv11_p1_p1b'base(Cmd;f)@e pv11_p1_init_scout(Cmd;accpts)
           else pv11_p1_on_p1b(Cmd) bnum loc(e) pv11_p1_p1b'base(Cmd;f)@e 
                pv11_p1_ScoutStateFun(Cmd;accpts;f;bnum;es;pred(e))
           fi 
    if first(e) then pv11_p1_init_scout(Cmd;accpts)
    else pv11_p1_ScoutStateFun(Cmd;accpts;f;bnum;es;pred(e))
    fi )

Lemma: pv11_p1_commander_state_fun_eq
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[accpts:bag(Id)].
[b:pv11_p1_Ballot_Num()]. ∀[s:ℤ].
  (pv11_p1_CommanderStateFun(Cmd;accpts;f;b;s;es;e)
  if e ∈b pv11_p1_p2b'base(Cmd;f)
      then if first(e)
           then pv11_p1_on_p2b() loc(e) pv11_p1_p2b'base(Cmd;f)@e accpts
           else pv11_p1_on_p2b() loc(e) pv11_p1_p2b'base(Cmd;f)@e 
                pv11_p1_CommanderStateFun(Cmd;accpts;f;b;s;es;pred(e))
           fi 
    if first(e) then accpts
    else pv11_p1_CommanderStateFun(Cmd;accpts;f;b;s;es;pred(e))
    fi )

Lemma: pv11_p1_unique_adopted
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum:pv11_p1_Ballot_Num(). ∀pvals1,pvals2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
proposals1,proposals2:(ℤ × Cmd) List. ∀b1,b2:𝔹.
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   <bnum, pvals1> ∈ pv11_p1_adopted'base(Cmd;f)(e1)
   <bnum, pvals2> ∈ pv11_p1_adopted'base(Cmd;f)(e2)
   <bnum, b1, proposals1> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e1)
   <bnum, b2, proposals2> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e2)
   e1 ≤loc e2 
   (pvals1 pvals2))

Lemma: pv11_p1_unique_adopted_fun
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum:pv11_p1_Ballot_Num(). ∀pvals1,pvals2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   <bnum, pvals1> ∈ pv11_p1_adopted'base(Cmd;f)(e1)
   <bnum, pvals2> ∈ pv11_p1_adopted'base(Cmd;f)(e2)
   (bnum (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1))))
   (bnum (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e2))))
   e1 ≤loc e2 
   (pvals1 pvals2))

Lemma: pv11_p1_unique_adopted_fun2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum:pv11_p1_Ballot_Num(). ∀pvals1,pvals2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   <bnum, pvals1> ∈ pv11_p1_adopted'base(Cmd;f)(e1)
   <bnum, pvals2> ∈ pv11_p1_adopted'base(Cmd;f)(e2)
   (bnum (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1))))
   (bnum (fst(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e2))))
   (loc(e1) loc(e2))
   (pvals1 pvals2))

Lemma: pv11_p1_adopted_prior
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
bnum:pv11_p1_Ballot_Num(). ∀active:𝔹. ∀proposals:(ℤ × Cmd) List. ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
b':pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c,c':Cmd.
  ((¬↑first(e))
   <bnum, active, proposals> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e)
   (<s, c> ∈ proposals)
   <bnum, pvals> ∈ pv11_p1_adopted'base(Cmd;f)(pred(e))
   (<b', s, c'> ∈ pvals)
   (↓∃b:pv11_p1_Ballot_Num(). ((<b, s, c> ∈ pvals) ∧ (↑(pv11_p1_leq_bnum(ldrs_uid) b' b)))))

Lemma: pv11_p1_ldr_state_propose_pred
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bnum:pv11_p1_Ballot_Num(). ∀active:𝔹. ∀proposals:(ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((e1 <loc e2)
   <bnum, active, proposals> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e1)
   (header(e1) [propose])
   has-es-info-type(es;e1;f;ℤ × Cmd)
   (<s, c> msgval(e1))
   (¬↑(pv11_p1_in_domain(Cmd) proposals))
   (∃e:{e:E| ¬↑first(e)} 
       ((e1 pred(e)) ∧ e ≤loc e2  ∧ <bnum, active, pv11_p1_add_if_new() pv11_p1_same_proposal(Cmd) <s, c> proposals> ∈\000C pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e))))

Lemma: pv11_p1_ldr_fun_state_propose_pred
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bnum:pv11_p1_Ballot_Num(). ∀active:𝔹. ∀proposals:(ℤ × Cmd) List. ∀s:ℤ. ∀c:Cmd.
  ((e1 <loc e2)
   (<bnum, active, proposals> pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1))
   (header(e1) [propose])
   has-es-info-type(es;e1;f;ℤ × Cmd)
   (<s, c> msgval(e1))
   (¬↑(pv11_p1_in_domain(Cmd) proposals))
   (∃e:{e:E| ¬↑first(e)} 
       ((e1 pred(e)) ∧ e ≤loc e2  ∧ (<bnum, active, pv11_p1_add_if_new() pv11_p1_same_proposal(Cmd) <s, c> proposals> \000C= pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e)))))

Lemma: pv11_p1_ldr_state_adopted_pred
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bnum:pv11_p1_Ballot_Num(). ∀active:𝔹. ∀proposals:(ℤ × Cmd) List. ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  ((e1 <loc e2)
   <bnum, active, proposals> ∈ pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e1)
   (header(e1) ``pv11_p1 adopted``)
   (<bnum, pvals> msgval(e1))
   (∃e:{e:E| ¬↑first(e)} 
       ((e1 pred(e))
       ∧ e ≤loc e2 
       ∧ <bnum, tt, pv11_p1_update_proposals(Cmd) proposals (pv11_p1_pmax(Cmd;ldrs_uid) pvals)> ∈
          pv11_p1_LeaderState(Cmd;ldrs_uid;f)(e))))

Lemma: pv11_p1_ldr_fun_state_adopted_pred
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bnum:pv11_p1_Ballot_Num(). ∀active:𝔹. ∀proposals:(ℤ × Cmd) List. ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  ((e1 <loc e2)
   (<bnum, active, proposals> pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e1))
   (header(e1) ``pv11_p1 adopted``)
   (<bnum, pvals> msgval(e1))
   (∃e:{e:E| ¬↑first(e)} 
       ((e1 pred(e))
       ∧ e ≤loc e2 
       ∧ (<bnum, tt, pv11_p1_update_proposals(Cmd) proposals (pv11_p1_pmax(Cmd;ldrs_uid) pvals)>
         pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e)))))

Definition: pv11_p1_p2a'send
pv11_p1_p2a'send(Cmd;f) ==  λl,z. mk-msg-interface(l;make-Msg(``pv11_p1 p2a``;z))

Lemma: pv11_p1_p2a'send_wf
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)].
  (pv11_p1_p2a'send(Cmd;f) ∈ Id ─→ (Id × pv11_p1_Ballot_Num() × ℤ × Cmd) ─→ Interface)

Definition: pv11_p1_decision'send
pv11_p1_decision'send(Cmd;f) ==  λl,z. mk-msg-interface(l;make-Msg([decision];z))

Lemma: pv11_p1_decision'send_wf
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)].  (pv11_p1_decision'send(Cmd;f) ∈ Id ─→ (ℤ × Cmd) ─→ Interface)

Lemma: pv11_p1_bnum_p2a
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
accpts,ldrs,reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀i,l:Id. ∀s:ℤ. ∀c:Cmd.
  (pv11_p1_p2a'send(Cmd;f) i <l, b, s, c> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e)
   (∃n:ℤ(↑(pv11_p1_eq_bnums() (pv11_p1_mk_bnum() l)))))

Lemma: pv11_p1_bnum_p2a_loc
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
accpts,ldrs,reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀i,l:Id. ∀s:ℤ. ∀c:Cmd.
  (pv11_p1_p2a'send(Cmd;f) i <l, b, s, c> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e)
   (∃n:ℤ(↑(pv11_p1_eq_bnums() (pv11_p1_mk_bnum() loc(e))))))

Lemma: pv11_p1_about_threshold
[T:Type]. ∀[as,bs:bag(T)].  (#(as) < (#(as bs) 1) ÷  #(as) < #(bs))

Lemma: pv11_p1_inc_acc_pvals_fun
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bsp:pv11_p1_Ballot_Num() × ℤ × Cmd.
  (e1 ≤loc e2 
   (bsp ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e1)))
   (bsp ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e2))))

Lemma: pv11_p1_inc_acc_bnum_fun
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
  (e1 ≤loc e2 
   (↑(pv11_p1_leq_bnum(ldrs_uid) (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e1))) 
        (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e2))))))

Lemma: pv11_p1_acc_state_from_p2a
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
v:pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List). ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd.
  (Inj(Id;ℤ;ldrs_uid)
   v ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e)
   let bnum,accepted 
     in (<b, s, c> ∈ accepted)
         (↓∃e':E
              ∃l:Id
               (e' ≤loc 
               ∧ <l, b, s, c> ∈ pv11_p1_p2a'base(Cmd;f)(e')
               ∧ (b (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e'))))
               ∧ (∀e'':E
                    (e' ≤loc e'' 
                     e'' ≤loc 
                     (<b, s, c> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e''))))))))

Lemma: pv11_p1_acc_state_from_p2a_fun
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd.
  (Inj(Id;ℤ;ldrs_uid)
   (<b, s, c> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)))
   (↓∃e':E
        ∃l:Id
         (e' ≤loc 
         ∧ <l, b, s, c> ∈ pv11_p1_p2a'base(Cmd;f)(e')
         ∧ (b (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e'))))
         ∧ (∀e'':E
              (e' ≤loc e''   e'' ≤loc e   (<b, s, c> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e''))))))))

Lemma: pv11_p1_A1
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bnum1,bnum2:pv11_p1_Ballot_Num(). ∀accepted1,accepted2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  ((e1 <loc e2)
   <bnum1, accepted1> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e1)
   <bnum2, accepted2> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e2)
   (↑(pv11_p1_leq_bnum(ldrs_uid) bnum1 bnum2)))

Lemma: pv11_p1_A2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ldrs_uid:Id ─→ ℤ.
bnum1,bnum2:pv11_p1_Ballot_Num(). ∀accepted1,accepted2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List. ∀b:pv11_p1_Ballot_Num().
pv:ℤ × Cmd. ∀loc:Id.
  (Inj(Id;ℤ;ldrs_uid)
   (¬↑first(e))
   <bnum2, accepted2> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e)
   <bnum1, accepted1> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(pred(e))
   (<b, pv> ∈ accepted2)
   (<b, pv> ∈ accepted1))
   (b bnum2))

Lemma: pv11_p1_A3
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀ldrs_uid:Id ─→ ℤ.
bnum1,bnum2:pv11_p1_Ballot_Num(). ∀accepted1,accepted2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  ((e1 <loc e2)
   <bnum1, accepted1> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e1)
   <bnum2, accepted2> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e2)
   (∀pv:pv11_p1_Ballot_Num() × ℤ × Cmd. ((pv ∈ accepted1)  (pv ∈ accepted2))))

Lemma: pv11_p1_A4_C1
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum1,bnum2:pv11_p1_Ballot_Num(). ∀accepted1,accepted2:(pv11_p1_Ballot_Num()
                                                                                          × ℤ
                                                                                          × Cmd) List. ∀i1,i2,l:Id.
b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀p1,p2:Cmd.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   ((<bnum1, accepted1> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e1)
     ∧ <bnum2, accepted2> ∈ pv11_p1_AcceptorState(Cmd;ldrs_uid;f)(e2)
     ∧ (<b, s, p1> ∈ accepted1)
     ∧ (<b, s, p2> ∈ accepted2))
     ∨ (pv11_p1_p2a'send(Cmd;f) i1 <l, b, s, p1> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e1)
       ∧ pv11_p1_p2a'send(Cmd;f) i2 <l, b, s, p2> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e2)))
   (p1 p2))

Lemma: pv11_p1_A4_C1_funA
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀p1,p2:Cmd.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (<b, s, p1> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e1)))
   (<b, s, p2> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e2)))
   (p1 p2))

Lemma: pv11_p1_A4_C1_funC
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀i1,i2,l1,l2:Id. ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀p1,p2:Cmd.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   pv11_p1_p2a'send(Cmd;f) i1 <l1, b, s, p1> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e1)
   pv11_p1_p2a'send(Cmd;f) i2 <l2, b, s, p2> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e2)
   (p1 p2))

Lemma: pv11_p1_append_news_iff
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id). ∀ldrs_uid:Id ─→ ℤ.
reps:bag(Id). ∀pv:pv11_p1_Ballot_Num() × ℤ × Cmd. ∀L1,L2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (∀x∈L1 L2.∃e:E. (x ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e))))
   ((pv ∈ pv11_p1_append_news(Cmd) pv11_p1_same_pvalue(Cmd) L1 L2) ⇐⇒ (pv ∈ L1) ∨ (pv ∈ L2)))

Lemma: pv11_p1_append_news_iff2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id). ∀ldrs_uid:Id ─→ ℤ.
reps:bag(Id). ∀pv:pv11_p1_Ballot_Num() × ℤ × Cmd. ∀L1,L2:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (∀x∈L1 L2.↓∃e:E. (x ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e))))
   ((pv ∈ pv11_p1_append_news(Cmd) pv11_p1_same_pvalue(Cmd) L1 L2) ⇐⇒ (pv ∈ L1) ∨ (pv ∈ L2)))

Lemma: pv11_p1_scout_state_subset_pvals
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀bnum:pv11_p1_Ballot_Num().
accpts,ldrs:bag(Id). ∀ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id).
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (header(e) ``pv11_p1 p1b``)
   has-es-info-type(es;e;f;Id × pv11_p1_Ballot_Num() × pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   ((fst(snd(msgval(e)))) bnum)
   ((fst(snd(snd(msgval(e))))) bnum)
   (↓l_subset(pv11_p1_Ballot_Num()
       × ℤ
       × Cmd;snd(snd(snd(msgval(e))));snd(pv11_p1_ScoutStateFun(Cmd;accpts;f;bnum;es;e)))))

Lemma: pv11_p1_scout_state_from_p1bs
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀start,e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum:pv11_p1_Ballot_Num(). ∀waitfor:bag(Id).
pvalues:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  (start ≤loc 
   Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (<waitfor, pvalues> pv11_p1_ScoutStateFun(Cmd;accpts;f;bnum;es.start;e))
   (↓∃L:E List
        ((waitfor [i∈accpts|¬bi ∈b map(λe.loc(e);L))])
        ∧ (∀pv:pv11_p1_Ballot_Num() × ℤ × Cmd
             ((pv ∈ pvalues) ⇐⇒ (pv ∈ concat(map(λe.(snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)));L)))))
        ∧ (∀e':E
             ((e' ∈ L)
              ((e' < e) ∧ loc(e') ↓∈ accpts ∧ (bnum (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e'))))))))))

Lemma: pv11_p1_acc_rcv_p2a
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (header(e) ``pv11_p1 p2a``)
   has-es-info-type(es;e;f;Id × pv11_p1_Ballot_Num() × ℤ × Cmd)
   (∃e':E. ∃i,l:Id. pv11_p1_p2a'send(Cmd;f) i <l, snd(msgval(e))> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e'))
   ((fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e))) (fst(snd(msgval(e)))))
   (↓(snd(msgval(e)) ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)))))

Lemma: pv11_p1_acc_rcv_p2a2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (header(e) ``pv11_p1 p2a``)
   has-es-info-type(es;e;f;Id × pv11_p1_Ballot_Num() × ℤ × Cmd)
   ((fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e))) (fst(snd(msgval(e)))))
   (↓(snd(msgval(e)) ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)))))

Lemma: pv11_p1_commander_state_from_p2bs
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀start,e,e0:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd. ∀waitfor:bag(Id). ∀i,l:Id.
  (start ≤loc 
   Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   pv11_p1_p2a'send(Cmd;f) i <l, b, s, c> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e0)
   (waitfor pv11_p1_CommanderStateFun(Cmd;accpts;f;b;s;es.start;e))
   (↓∃L:E List
        ((waitfor [i∈accpts|¬bi ∈b map(λe.loc(e);L))])
        ∧ (∀e':E
             ((e' ∈ L)
              ((e' < e)
                ∧ loc(e') ↓∈ accpts
                ∧ (b (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e'))))
                ∧ (<b, s, c> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e')))))))))

Lemma: pv11_p1_adopted_from_maj_acceptors
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀bnum:pv11_p1_Ballot_Num(). ∀pvals:(pv11_p1_Ballot_Num() × ℤ × Cmd) List.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   <bnum, pvals> ∈ pv11_p1_adopted'base(Cmd;f)(e)
   (↓∃L:E List
        (#([i∈accpts|¬bi ∈b map(λe.loc(e);L))]) < pv11_p1_threshold(accpts)
        ∧ (∀pv:pv11_p1_Ballot_Num() × ℤ × Cmd
             ((pv ∈ pvals) ⇐⇒ (pv ∈ concat(map(λe.(snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)));L)))))
        ∧ (∀e':E
             ((e' ∈ L)
              ((e' < e) ∧ loc(e') ↓∈ accpts ∧ (bnum (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e'))))))))))

Lemma: pv11_p1_decision_from_maj_acceptors
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀s:ℤ. ∀c:Cmd. ∀i:Id.
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   0 < #(accpts)
   has-es-info-type(es;e;f;Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
   (b (snd(snd(snd(msgval(e))))))
   pv11_p1_decision'send(Cmd;f) i <s, c> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e)
   (↓∃L:E List
        (#([i∈accpts|¬bi ∈b map(λe.loc(e);L))]) < pv11_p1_threshold(accpts)
        ∧ (∀e':E
             ((e' ∈ L)
              ((e' < e)
                ∧ loc(e') ↓∈ accpts
                ∧ (b (fst(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e'))))
                ∧ (<b, s, c> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e')))))))))

Lemma: pv11_p1_overlapping_accs
[accpts,as,bs,cs:bag(Id)].
  (↓∃i:Id. (i ↓∈ bs ∧ i ↓∈ cs)) supposing 
     (#([i∈accpts|¬bbag-deq-member(IdDeq;i;bs)]) < pv11_p1_threshold(accpts) and 
     #(as) < pv11_p1_threshold(accpts) and 
     (accpts (as cs)))

Lemma: pv11_p1_A5_C2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀i,l:Id. ∀b,b':pv11_p1_Ballot_Num(). ∀s:ℤ. ∀p,p':Cmd. ∀as,cs:bag(Id).
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   Inj(Id;ℤ;ldrs_uid)
   (accpts (as cs))
   #(as) < pv11_p1_threshold(accpts)
   (∀a:Id. (a ↓∈ cs  (↓∃e':E. ((a loc(e')) ∧ (<b, s, p> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e')))))))
   ((<b', s, p'> ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)))
     ∨ pv11_p1_p2a'send(Cmd;f) i <l, b', s, p'> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e))
   (↑(b  < b'))
   (p p'))

Definition: pv11_p1_valid-proposal
pv11_p1_valid-proposal(Cmd;es;e;p;f) ==  ↓∃e':E. (e' c≤ e ∧ p ∈ pv11_p1_propose'base(Cmd;f)(e'))

Lemma: pv11_p1_valid-proposal_wf
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀p:ℤ × Cmd.  (pv11_p1_valid-proposal(Cmd;es;e;p;f) ∈ ℙ)

Definition: pv11_p1_valid-proposals
pv11_p1_valid-proposals(Cmd;es;e;L;f) ==  (∀p∈L.pv11_p1_valid-proposal(Cmd;es;e;p;f))

Lemma: pv11_p1_valid-proposals_wf
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀ps:(ℤ × Cmd) List.
    (pv11_p1_valid-proposals(Cmd;es;e;ps;f) ∈ ℙ)

Definition: pv11_p1_valid-LeaderState
pv11_p1_valid-LeaderState(Cmd;ldrs_uid;es;e;f) ==
  pv11_p1_valid-proposals(Cmd;es;e;snd(snd(pv11_p1_LeaderStateFun(Cmd;ldrs_uid;f;es;e)));f)

Lemma: pv11_p1_valid-LeaderState_wf
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀ldrs_uid:Id ─→ ℤ. ∀e:E.
    (pv11_p1_valid-LeaderState(Cmd;ldrs_uid;es;e;f) ∈ ℙ)

Definition: pv11_p1_valid-AcceptorState
pv11_p1_valid-AcceptorState(Cmd;ldrs_uid;es;e;f) ==
  pv11_p1_valid-proposals(Cmd;es;e;map(λp.(snd(p));snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)));f)

Lemma: pv11_p1_valid-AcceptorState_wf
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀ldrs_uid:Id ─→ ℤ. ∀e:E.
    (pv11_p1_valid-AcceptorState(Cmd;ldrs_uid;es;e;f) ∈ ℙ)

Definition: pv11_p1_valid-ScoutState
pv11_p1_valid-ScoutState(Cmd;accpts;b;start;es;e;f) ==
  pv11_p1_valid-proposals(Cmd;es;e;map(λp.(snd(p));snd(pv11_p1_ScoutStateFun(Cmd;accpts;f;b;es.start;e)));f)

Lemma: pv11_p1_valid-ScoutState_wf
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts:bag(Id). ∀b:pv11_p1_Ballot_Num(). ∀e,start:E.
    (((loc(e) loc(start))  start ≤loc  (pv11_p1_valid-ScoutState(Cmd;accpts;b;start;es;e;f) ∈ ℙ))

Definition: pv11_p1_valid-adopted-message
pv11_p1_valid-adopted-message(Cmd;es;e;f) ==  pv11_p1_valid-proposals(Cmd;es;e;map(λp.(snd(p));snd(msgval(e)));f)

Lemma: pv11_p1_valid-adopted-message_wf
Cmd:{T:Type| valueall-type(T)} . ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E.
  (has-es-info-type(es;e;f;pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
   (pv11_p1_valid-adopted-message(Cmd;es;e;f) ∈ ℙ))

Definition: pv11_p1_valid-p1b-message
pv11_p1_valid-p1b-message(Cmd;es;e;f) ==  pv11_p1_valid-proposals(Cmd;es;e;map(λp.(snd(p));snd(snd(snd(msgval(e)))));f)

Lemma: pv11_p1_valid-p1b-message_wf
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E.
    ((header(e) ``pv11_p1 p1b``)  (pv11_p1_valid-p1b-message(Cmd;es;e;f) ∈ ℙ))

Definition: pv11_p1_valid-p2a-message
pv11_p1_valid-p2a-message(Cmd;es;e;f) ==  pv11_p1_valid-proposal(Cmd;es;e;snd(snd(msgval(e)));f)

Lemma: pv11_p1_valid-p2a-message_wf
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E.
    ((header(e) ``pv11_p1 p2a``)  (pv11_p1_valid-p2a-message(Cmd;es;e;f) ∈ ℙ))

Lemma: pv11_p1_valid-proposal-transitivity
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀p:ℤ × Cmd.
    (pv11_p1_valid-proposal(Cmd;es;e;p;f)  (∀e':E. (e c≤ e'  pv11_p1_valid-proposal(Cmd;es;e';p;f))))

Lemma: pv11_p1_valid-proposal-forward
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀e':{e':E| e' ≤loc . ∀p:ℤ × Cmd.
    (pv11_p1_valid-proposal(Cmd;es.e';e;p;f)  pv11_p1_valid-proposal(Cmd;es;e;p;f))

Lemma: pv11_p1_valid-proposal-transitivity-forward
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e:E. ∀p:ℤ × Cmd. ∀e':{e':E| e' ≤loc . ∀e1:{e1:E| 
                                                                                                         e1 ≤loc e' .
    (pv11_p1_valid-proposal(Cmd;es.e1;e';p;f)  pv11_p1_valid-proposal(Cmd;es;e;p;f))

Lemma: pv11_p1_validity-lemma
[Cmd:{T:Type| valueall-type(T)} ]
  ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id). ∀ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id).
    (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
     (∀e:E
          (pv11_p1_valid-AcceptorState(Cmd;ldrs_uid;es;e;f)
          ∧ pv11_p1_valid-LeaderState(Cmd;ldrs_uid;es;e;f)
          ∧ (∀b:pv11_p1_Ballot_Num(). ∀start:E.  (start ≤loc e   pv11_p1_valid-ScoutState(Cmd;accpts;b;start;es;e;f)))
          ∧ ((header(e) ``pv11_p1 adopted``)
             has-es-info-type(es;e;f;pv11_p1_Ballot_Num() × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
             pv11_p1_valid-adopted-message(Cmd;es;e;f))
          ∧ ((header(e) ``pv11_p1 p1b``)
             has-es-info-type(es;e;f;Id
               × pv11_p1_Ballot_Num()
               × pv11_p1_Ballot_Num()
               × ((pv11_p1_Ballot_Num() × ℤ × Cmd) List))
             pv11_p1_valid-p1b-message(Cmd;es;e;f))
          ∧ ((header(e) ``pv11_p1 p2a``)
             has-es-info-type(es;e;f;Id × pv11_p1_Ballot_Num() × ℤ × Cmd)
             pv11_p1_valid-p2a-message(Cmd;es;e;f)))))

Definition: pv11_p1_consistent-pvalues
pv11_p1_consistent-pvalues(Cmd;x;y) ==  ((fst(x)) (fst(y)))  ((fst(snd(x))) (fst(snd(y))))  (x y)

Lemma: pv11_p1_consistent-pvalues_wf
[Cmd:Type]. ∀[x,y:pv11_p1_Ballot_Num() × ℤ × Cmd].  (pv11_p1_consistent-pvalues(Cmd;x;y) ∈ ℙ)

Definition: pv11_p1_from-p2a
pv11_p1_from-p2a{i:l}(Cmd;es;e;x) ==  (header(e) ``pv11_p1 p2a``) ∧ (x (snd(msgval(e))))

Lemma: pv11_p1_from-p2a_wf
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[e:E]. ∀[x:pv11_p1_Ballot_Num()
                                                                                             × ℤ
                                                                                             × Cmd].
  (pv11_p1_from-p2a{i:l}(Cmd;es;e;x) ∈ ℙ')

Definition: pv11_p1_pvalue
pv11_p1_pvalue{i:l}(Cmd;ldrs_uid;accpts;es;e;x;f) ==
  (x ∈ snd(pv11_p1_AcceptorStateFun(Cmd;ldrs_uid;f;es;e)))
  ∨ (∃b:pv11_p1_Ballot_Num(). ∃start:E. (start ≤loc e  ∧ (x ∈ snd(pv11_p1_ScoutStateFun(Cmd;accpts;f;b;es.start;e)))))
  ∨ ((header(e) ``pv11_p1 p1b``) ∧ (x ∈ snd(snd(snd(msgval(e))))))
  ∨ ((header(e) ``pv11_p1 p2a``) ∧ (x (snd(msgval(e)))))
  ∨ ((header(e) ``pv11_p1 adopted``) ∧ (x ∈ snd(msgval(e))))

Lemma: pv11_p1_pvalue_wf
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[accpts:bag(Id)]. ∀[ldrs_uid:Id ─→ ℤ].
[e:E]. ∀[x:pv11_p1_Ballot_Num() × ℤ × Cmd].
  (pv11_p1_pvalue{i:l}(Cmd;ldrs_uid;accpts;es;e;x;f) ∈ ℙ')

Lemma: pv11_p1_pvalue_from_p2a
Cmd:{T:Type| valueall-type(T)} . ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id).
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (∀e:E. ∀p:pv11_p1_Ballot_Num() × ℤ × Cmd.
        (pv11_p1_pvalue{i:l}(Cmd;ldrs_uid;accpts;es;e;p;f)
         (↓∃e':E. (e' c≤ e ∧ pv11_p1_from-p2a{i:l}(Cmd;es;e';p))))))

Definition: pv11_p1_decision
pv11_p1_decision{i:l}(Cmd;f;accpts;ldrs;ldrs_uid;reps;es;e;k;v) ==
  ∃delay:ℤ. ∃client:Id. make-msg-interface(delay;client;make-Msg([decision];<k, v>)) ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs\000C_uid;reps;f)(e)

Lemma: pv11_p1_decision_wf
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[accpts,ldrs:bag(Id)].
[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[e:E]. ∀[k:ℤ]. ∀[v:Cmd].
  (pv11_p1_decision{i:l}(Cmd;f;accpts;ldrs;ldrs_uid;reps;es;e;k;v) ∈ ℙ')

Lemma: pv11_p1_decision_from_p2a
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[accpts,ldrs:bag(Id)].
[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[e:E]. ∀[k:ℤ]. ∀[v:Cmd].
  ∀a:Id
    (pv11_p1_decision{i:l}(Cmd;f;accpts;ldrs;ldrs_uid;reps;es;e;k;v)
     has-es-info-type(es;e;f;Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
     a ↓∈ accpts
     (↓∃e':E
          (e' ≤loc 
          ∧ (k (fst(snd(snd(msgval(e))))))
          ∧ ((fst(snd(msgval(e)))) (snd(snd(snd(msgval(e))))))
          ∧ pv11_p1_p2a'send(Cmd;f) a <loc(e), fst(snd(msgval(e))), k, v> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f\000C)(e'))))

Lemma: pv11_p1_decision_from_p2a_acc
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[accpts,ldrs:bag(Id)].
[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[e:E]. ∀[s:ℤ]. ∀[c:Cmd]. ∀[a:Id].
  (Inj(Id;ℤ;ldrs_uid)
   pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   pv11_p1_decision{i:l}(Cmd;f;accpts;ldrs;ldrs_uid;reps;es;e;s;c)
   has-es-info-type(es;e;f;Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
   a ↓∈ accpts
   (↓∃e':E
        ((e' < e)
        ∧ loc(e') ↓∈ accpts
        ∧ (s (fst(snd(snd(msgval(e))))))
        ∧ ((fst(snd(msgval(e)))) (snd(snd(snd(msgval(e))))))
        ∧ <loc(e), snd(snd(snd(msgval(e)))), s, c> ∈ pv11_p1_p2a'base(Cmd;f)(e'))))

Lemma: pv11_p1_consistency_lemma
Cmd:{T:Type| valueall-type(T)} . ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id).
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   Inj(Id;ℤ;ldrs_uid)
   (∀e:E. ∀b:pv11_p1_Ballot_Num(). ∀k:ℤ. ∀v:Cmd.
        (pv11_p1_pvalue{i:l}(Cmd;ldrs_uid;accpts;es;e;<b, k, v>;f)
         (∀e':E. ∀w:Cmd.
              (pv11_p1_decision{i:l}(Cmd;f;accpts;ldrs;ldrs_uid;reps;es;e';k;w)
               has-es-info-type(es;e';f;Id × pv11_p1_Ballot_Num() × ℤ × pv11_p1_Ballot_Num())
               (↑(pv11_p1_leq_bnum(ldrs_uid) (snd(snd(snd(msgval(e'))))) b))
               (w v))))))

Definition: pv11_p1_messages-delivered-w-omissions-accpts
pv11_p1_messages-delivered-w-omissions-accpts{i:l}(es;flrs;Cmd;accpts;ldrs;ldrs_uid;reps;f) ==
  msgs-interface-with-omissions-sub{i:l}(pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f);flrs;accpts;f)

Lemma: pv11_p1_messages-delivered-w-omissions-accpts_wf
[Cmd:{T:Type| valueall-type(T)} ]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[accpts,ldrs:bag(Id)].
[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[flrs:ℤ].
  (pv11_p1_messages-delivered-w-omissions-accpts{i:l}(es;flrs;Cmd;accpts;ldrs;ldrs_uid;reps;f) ∈ ℙ')

Definition: pv11_p1_messages-delivered-w-omissions-ldrs
pv11_p1_messages-delivered-w-omissions-ldrs{i:l}(es;flrs;Cmd;accpts;ldrs;ldrs_uid;reps;f) ==
  msgs-interface-with-omissions-sub{i:l}(pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f);flrs;ldrs;f)

Lemma: pv11_p1_messages-delivered-w-omissions-ldrs_wf
[Cmd:{T:Type| valueall-type(T)} ]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)]. ∀[es:EO+(Message(f))]. ∀[accpts,ldrs:bag(Id)].
[ldrs_uid:Id ─→ ℤ]. ∀[reps:bag(Id)]. ∀[flrs:ℤ].
  (pv11_p1_messages-delivered-w-omissions-ldrs{i:l}(es;flrs;Cmd;accpts;ldrs;ldrs_uid;reps;f) ∈ ℙ')

Definition: pv11_p1_decision'base
pv11_p1_decision'base(Cmd;f) ==  Base([decision])

Lemma: pv11_p1_decision'base_wf
[Cmd:ValueAllType]. ∀[f:pv11_p1_headers_type{i:l}(Cmd)].  (pv11_p1_decision'base(Cmd;f) ∈ EClass(ℤ × Cmd))

Lemma: pv11_p1-validity
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id). ∀ldrs_uid:Id ─→ ℤ.
reps:bag(Id).
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   (∀e:E. ∀i:Id. ∀p:ℤ × Cmd.
        (pv11_p1_decision'send(Cmd;f) p ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e)
         pv11_p1_valid-proposal(Cmd;es;e;p;f))))

Lemma: pv11_p1-validity2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id). ∀ldrs_uid:Id ─→ ℤ.
reps:bag(Id).
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   for every p1 in pv11_p1_decision'base(Cmd;f) there is an
     earlier event  with info=m such that
     (msg-header(m) [propose]) ∧ (p1 msg-body(m)))

Lemma: pv11_p1-agreement
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀e1,e2:E. ∀accpts,ldrs:bag(Id).
ldrs_uid:Id ─→ ℤ. ∀reps:bag(Id). ∀i1,i2:Id. ∀s:ℤ. ∀c1,c2:Cmd.
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   Inj(Id;ℤ;ldrs_uid)
   pv11_p1_decision'send(Cmd;f) i1 <s, c1> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e1)
   pv11_p1_decision'send(Cmd;f) i2 <s, c2> ∈ pv11_p1_main(Cmd;accpts;ldrs;ldrs_uid;reps;f)(e2)
   (c1 c2))

Lemma: pv11_p1-agreement2
Cmd:ValueAllType. ∀f:pv11_p1_headers_type{i:l}(Cmd). ∀es:EO+(Message(f)). ∀accpts,ldrs:bag(Id). ∀ldrs_uid:Id ─→ ℤ.
reps:bag(Id).
  (pv11_p1_message-constraint{paxos-v11-part1.esh:o}(Cmd; accpts; ldrs; ldrs_uid; reps; f; es)
   Inj(Id;ℤ;ldrs_uid)
   any p1,p2 from pv11_p1_decision'base(Cmd;f) satisfy
     ((fst(p1)) (fst(p2)))  ((snd(p1)) (snd(p2))))



Home Index