Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl.
import Mt.Thread.Traced
import Mt.System.Basic
import Mt.System.BasicAux
import Mt.Utils.List

namespace Mt.Traced

structure 
TracedSystem: SpecType 1
TracedSystem
(
spec: Spec
spec
:
Spec: Type 1
Spec
) where
state: {spec : Spec} → TracedSystem specspec.State
state
:
spec: Spec
spec
.
State: SpecType
State
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
:
List: Type ?u.8Type ?u.8
List
(
TracedThread: SpecType 1
TracedThread
spec: Spec
spec
) namespace TracedSystem variable {
spec: Spec
spec
:
Spec: Type 1
Spec
} local
instance: {spec : Spec} → IsReservation spec.Reservation
instance
:
IsReservation: TypeType
IsReservation
spec: Spec
spec
.
Reservation: SpecType
Reservation
:=
spec: Spec
spec
.
is_reservation: (self : Spec) → IsReservation self.Reservation
is_reservation
def
ThreadIndex: TracedSystem specType
ThreadIndex
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) :
Type: Type 1
Type
:=
Fin: NatType
Fin
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
length: {α : Type ?u.410} → List αNat
length
def
done: TracedSystem specBool
done
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) :
Bool: Type
Bool
:=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
length: {α : Type ?u.429} → List αNat
length
=
0: ?m.435
0
def
iterate: (s : TracedSystem spec) → ThreadIndex sThread.IterationResult spec
iterate
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) (idx :
s: TracedSystem spec
s
.
ThreadIndex: {spec : Spec} → TracedSystem specType
ThreadIndex
) :
Thread.IterationResult: SpecType 1
Thread.IterationResult
spec: Spec
spec
:= (
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
get: {α : Type ?u.537} → (as : List α) → Fin (List.length as)α
get
idx).
iterate: {spec : Spec} → TracedThread specspec.StateThread.IterationResult spec
iterate
s: TracedSystem spec
s
.
state: {spec : Spec} → TracedSystem specspec.State
state
def
update_thread: TracedSystem specNatspec.Statespec.ReservationThread specTracedSystem spec
update_thread
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) (
idx: Nat
idx
:
Nat: Type
Nat
) (
state: spec.State
state
:
spec: Spec
spec
.
State: SpecType
State
) (
r: spec.Reservation
r
:
spec: Spec
spec
.
Reservation: SpecType
Reservation
) (
cont: Thread spec
cont
:
Thread: SpecType 1
Thread
spec: Spec
spec
) :
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
:={
state: spec.State
state
threads :=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
set: {α : Type ?u.601} → List αNatαList α
set
idx: Nat
idx
cont: Thread spec
cont
,
r: spec.Reservation
r
⟩ } def
remove_thread: TracedSystem specNatspec.StateTracedSystem spec
remove_thread
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) (
idx: Nat
idx
:
Nat: Type
Nat
) (
state: spec.State
state
:
spec: Spec
spec
.
State: SpecType
State
) :
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
:={
state: spec.State
state
threads :=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
eraseIdx: {α : Type ?u.686} → List αNatList α
eraseIdx
idx: Nat
idx
} def
reservations: {spec : Spec} → TracedSystem specspec.Reservation
reservations
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) :
spec: Spec
spec
.
Reservation: SpecType
Reservation
:=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
foldl: {α : Type ?u.739} → {β : Type ?u.738} → (αβα) → αList βα
foldl
env_r: ?m.748
env_r
thread: ?m.751
thread
=>
env_r: ?m.748
env_r
+
thread: ?m.751
thread
.
reservation: {spec : Spec} → TracedThread specspec.Reservation
reservation
)
spec: Spec
spec
.
is_reservation: (self : Spec) → IsReservation self.Reservation
is_reservation
.
empty: {T : Type} → [self : IsReservation T] → T
empty
def
other_reservations: TracedSystem specNatspec.Reservation
other_reservations
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) (
idx: Nat
idx
:
Nat: Type
Nat
) :
spec: Spec
spec
.
Reservation: SpecType
Reservation
:= (
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
eraseIdx: {α : Type ?u.931} → List αNatList α
eraseIdx
idx: Nat
idx
).
foldl: {α : Type ?u.938} → {β : Type ?u.937} → (αβα) → αList βα
foldl
env_r: ?m.947
env_r
thread: ?m.950
thread
=>
env_r: ?m.947
env_r
+
thread: ?m.950
thread
.
reservation: {spec : Spec} → TracedThread specspec.Reservation
reservation
)
spec: Spec
spec
.
is_reservation: (self : Spec) → IsReservation self.Reservation
is_reservation
.
empty: {T : Type} → [self : IsReservation T] → T
empty
theorem
decompose_reservations: ∀ (s : TracedSystem spec) (idx : ThreadIndex s), reservations s = other_reservations s idx.val + (List.get s.threads idx).reservation
decompose_reservations
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) (idx :
s: TracedSystem spec
s
.
ThreadIndex: {spec : Spec} → TracedSystem specType
ThreadIndex
) :
s: TracedSystem spec
s
.
reservations: {spec : Spec} → TracedSystem specspec.Reservation
reservations
=
s: TracedSystem spec
s
.
other_reservations: {spec : Spec} → TracedSystem specNatspec.Reservation
other_reservations
idx.
val: {n : Nat} → Fin nNat
val
+ (
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
get: {α : Type ?u.1100} → (as : List α) → Fin (List.length as)α
get
idx).
reservation: {spec : Spec} → TracedThread specspec.Reservation
reservation
:=
System.Traced.decompose_reservation: ∀ {spec : Spec} (l : List (TracedThread spec)) (idx : Fin (List.length l)) (t : TracedThread spec), t = List.get l idxSystem.Traced.sum_reservations l = System.Traced.sum_reservations (List.eraseIdx l idx.val) + t.reservation
System.Traced.decompose_reservation
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
idx
_: TracedThread ?m.1152
_
rfl: ∀ {α : Sort ?u.1181} {a : α}, a = a
rfl
structure
valid: {spec : Spec} → TracedSystem specProp
valid
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) :
Prop: Type
Prop
where
currently_valid: ∀ {spec : Spec} {s : TracedSystem spec}, valid sSpec.validate spec (reservations s) s.state
currently_valid
:
spec: Spec
spec
.
validate: (self : Spec) → self.Reservationself.StateProp
validate
s: TracedSystem spec
s
.
reservations: {spec : Spec} → TracedSystem specspec.Reservation
reservations
s: TracedSystem spec
s
.
state: {spec : Spec} → TracedSystem specspec.State
state
threads_valid: ∀ {spec : Spec} {s : TracedSystem spec}, valid s∀ (t : TracedThread spec), t s.threadsTracedThread.valid t
threads_valid
: ∀
t: ?m.1214
t
,
t: ?m.1214
t
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
t: ?m.1214
t
.
valid: {spec : Spec} → TracedThread specProp
valid
def
to_system: TracedSystem specSystem spec
to_system
(
s: TracedSystem spec
s
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
) :
System: SpecType 1
System
spec: Spec
spec
:={ state :=
s: TracedSystem spec
s
.
state: {spec : Spec} → TracedSystem specspec.State
state
threads :=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem specList (TracedThread spec)
threads
.
map: {α : Type ?u.1263} → {β : Type ?u.1262} → (αβ) → List αList β
map
λ ⟨
t: Thread spec
t
, _⟩ =>
t: Thread spec
t
panics :=
0: ?m.1279
0
} def
mk_initial: System specTracedSystem spec
mk_initial
(
s: System spec
s
:
System: SpecType 1
System
spec: Spec
spec
) :
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
:={ state :=
s: System spec
s
.
state: {spec : Spec} → System specspec.State
state
threads :=
s: System spec
s
.
threads: {spec : Spec} → System specList (Thread spec)
threads
.
map: {α : Type ?u.1484} → {β : Type ?u.1483} → (αβ) → List αList β
map
λ
t: ?m.1493
t
=> ⟨
t: ?m.1493
t
,
IsReservation.empty: {T : Type} → [self : IsReservation T] → T
IsReservation.empty
⟩ } theorem
mk_initial.valid: ∀ {spec : Spec} (s : System spec), Spec.validate spec IsReservation.empty s.state(∀ (t : Thread spec), t s.threadsThread.valid t) → TracedSystem.valid (mk_initial s)
mk_initial.valid
(
s: System spec
s
:
System: SpecType 1
System
spec: Spec
spec
) (
initial_valid: Spec.validate spec IsReservation.empty s.state
initial_valid
:
spec: Spec
spec
.
validate: (self : Spec) → self.Reservationself.StateProp
validate
IsReservation.empty: {T : Type} → [self : IsReservation T] → T
IsReservation.empty
s: System spec
s
.
state: {spec : Spec} → System specspec.State
state
) (
threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t
threads_valid
: ∀
t: ?m.1583
t
,
t: ?m.1583
t
s: System spec
s
.
threads: {spec : Spec} → System specList (Thread spec)
threads
t: ?m.1583
t
.
valid: {spec : Spec} → Thread specProp
valid
) : (
mk_initial: {spec : Spec} → System specTracedSystem spec
mk_initial
s: System spec
s
).
valid: {spec : Spec} → TracedSystem specProp
valid
:=
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid.nil
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) [] }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head✝: Thread spec

tail✝: List (Thread spec)


currently_valid.cons
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝) }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid.nil
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) [] }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid.nil
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) [] }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head✝: Thread spec

tail✝: List (Thread spec)


currently_valid.cons
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝) }) s.state

Goals accomplished! 🐙
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


currently_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head✝: Thread spec

tail✝: List (Thread spec)


currently_valid.cons
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝) }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head✝: Thread spec

tail✝: List (Thread spec)


currently_valid.cons
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝) }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head: Thread spec

tail: List (Thread spec)

IH: Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail }) s.state


currently_valid.cons
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head :: tail) }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head✝: Thread spec

tail✝: List (Thread spec)


currently_valid.cons
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝) }) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head: Thread spec

tail: List (Thread spec)

IH: Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail }) s.state


currently_valid.cons
Spec.validate spec (List.foldl (fun env_r thread => env_r + thread.reservation) IsReservation.empty (List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail)) s.state
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

head✝: Thread spec

tail✝: List (Thread spec)


currently_valid.cons
Spec.validate spec (reservations { state := s.state, threads := List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝) }) s.state

Goals accomplished! 🐙
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

t: TracedThread spec

t_hyp: t (mk_initial s).threads


threads_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

t: TracedThread spec

t_hyp: t List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads


threads_valid
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

t: TracedThread spec

t_hyp: t List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads

w✝: Thread spec


threads_valid.intro
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

t: TracedThread spec

t_hyp: t List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads

t_orig: Thread spec

t_orig_hyp: t_orig s.threads t = { thread := t_orig, reservation := IsReservation.empty }


threads_valid.intro
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

t: TracedThread spec

t_hyp: t List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads

t_orig: Thread spec

t_orig_hyp: t_orig s.threads t = { thread := t_orig, reservation := IsReservation.empty }


threads_valid.intro
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

t: TracedThread spec

t_hyp: t List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads

t_orig: Thread spec

t_orig_hyp: t_orig s.threads t = { thread := t_orig, reservation := IsReservation.empty }


threads_valid.intro
TracedThread.valid { thread := t_orig, reservation := IsReservation.empty }
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t

t: TracedThread spec

t_hyp: t List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads

t_orig: Thread spec

t_orig_hyp: t_orig s.threads t = { thread := t_orig, reservation := IsReservation.empty }


threads_valid.intro
TracedThread.valid { thread := t_orig, reservation := IsReservation.empty }
spec: Spec

s: System spec

initial_valid: Spec.validate spec IsReservation.empty s.state

threads_valid: ∀ (t : Thread spec), t s.threadsThread.valid t


threads_valid
∀ (t : TracedThread spec), t (mk_initial s).threadsTracedThread.valid t

Goals accomplished! 🐙
theorem
mk_initial.cancels_to_system: ∀ {spec : Spec} {s : System spec}, s.panics = 0to_system (mk_initial s) = s
mk_initial.cancels_to_system
{
s: System spec
s
:
System: SpecType 1
System
spec: Spec
spec
} (
no_panics_yet: s.panics = 0
no_panics_yet
:
s: System spec
s
.
panics: {spec : Spec} → System specNat
panics
=
0: ?m.2978
0
) : (
mk_initial: {spec : Spec} → System specTracedSystem spec
mk_initial
s: System spec
s
).
to_system: {spec : Spec} → TracedSystem specSystem spec
to_system
=
s: System spec
s
:=
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


spec: Spec

s: System spec

no_panics_yet: s.panics = 0


{ state := s.state, threads := List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads), panics := 0 } = s
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


spec: Spec

s: System spec

no_panics_yet: s.panics = 0


{ state := s.state, threads := List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads), panics := 0 } = s
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


s.state = s.state List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads 0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


s.state = s.state List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads 0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


spec: Spec

s: System spec

no_panics_yet: s.panics = 0


left
s.state = s.state
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads 0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


spec: Spec

s: System spec

no_panics_yet: s.panics = 0


left
s.state = s.state
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


left
s.state = s.state
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads 0 = s.panics

Goals accomplished! 🐙
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.right
0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.right
0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left.nil
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) []) = []
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head✝: Thread spec

tail✝: List (Thread spec)


right.left.cons
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝)) = head✝ :: tail✝
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.right
0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left.nil
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) []) = []
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left.nil
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) []) = []
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head✝: Thread spec

tail✝: List (Thread spec)


right.left.cons
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝)) = head✝ :: tail✝

Goals accomplished! 🐙
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.left
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) s.threads) = s.threads
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.right
0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head✝: Thread spec

tail✝: List (Thread spec)


right.left.cons
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝)) = head✝ :: tail✝
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head✝: Thread spec

tail✝: List (Thread spec)


right.left.cons
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝)) = head✝ :: tail✝
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head: Thread spec

tail: List (Thread spec)

IH: List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail) = tail


right.left.cons
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head :: tail)) = head :: tail
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head✝: Thread spec

tail✝: List (Thread spec)


right.left.cons
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝)) = head✝ :: tail✝
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head: Thread spec

tail: List (Thread spec)

IH: List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail) = tail


right.left.cons
head :: List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail) = head :: tail
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head✝: Thread spec

tail✝: List (Thread spec)


right.left.cons
List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) (head✝ :: tail✝)) = head✝ :: tail✝
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head: Thread spec

tail: List (Thread spec)

IH: List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail) = tail


right.left.cons
head :: List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail) = head :: tail
spec: Spec

s: System spec

no_panics_yet: s.panics = 0

head: Thread spec

tail: List (Thread spec)

IH: List.map (fun x => x.thread) (List.map (fun t => { thread := t, reservation := IsReservation.empty }) tail) = tail


right.left.cons
head :: tail = head :: tail

Goals accomplished! 🐙
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.right
0 = s.panics
spec: Spec

s: System spec

no_panics_yet: s.panics = 0


right.right
0 = s.panics

Goals accomplished! 🐙
theorem
valid_by_iteration: ∀ (s s' : System spec) {idx : System.ThreadIndex s} {ts : TracedSystem spec}, s = to_system tsvalid tsSystem.iterate s idx = s'ts', to_system ts' = s' valid ts'
valid_by_iteration
(
s: System spec
s
s': System spec
s'
:
System: SpecType 1
System
spec: Spec
spec
) {idx :
s: System spec
s
.
ThreadIndex: {spec : Spec} → System specType
ThreadIndex
} {
ts: TracedSystem spec
ts
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
} (
has_traced_system: s = to_system ts
has_traced_system
:
s: System spec
s
=
ts: TracedSystem spec
ts
.
to_system: {spec : Spec} → TracedSystem specSystem spec
to_system
) (
ts_valid: valid ts
ts_valid
:
ts: TracedSystem spec
ts
.
valid: {spec : Spec} → TracedSystem specProp
valid
) (
iteration: System.iterate s idx = s'
iteration
:
s: System spec
s
.
iterate: {spec : Spec} → (s : System spec) → System.ThreadIndex sSystem spec
iterate
idx =
s': System spec
s'
) : ∃
ts': TracedSystem spec
ts'
:
TracedSystem: SpecType 1
TracedSystem
spec: Spec
spec
,
ts': TracedSystem spec
ts'
.
to_system: {spec : Spec} → TracedSystem specSystem spec
to_system
=
s': System spec
s'
ts': TracedSystem spec
ts'
.
valid: {spec : Spec} → TracedSystem specProp
valid
:=
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: (if Thread.block_until (List.get s.threads idx) s.state = true then match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics } else s) = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: (if Thread.block_until (List.get s.threads idx) s.state = true then match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics } else s) = s'

blocked_until: Thread.block_until (List.get s.threads idx) s.state = false


false
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: (if Thread.block_until (List.get s.threads idx) s.state = true then match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics } else s) = s'

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: (if Thread.block_until (List.get s.threads idx) s.state = true then match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics } else s) = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: (if Thread.block_until (List.get s.threads idx) s.state = true then match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics } else s) = s'

blocked_until: Thread.block_until (List.get s.threads idx) s.state = false


false
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: (if Thread.block_until (List.get s.threads idx) s.state = true then match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics } else s) = s'

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: (if Thread.block_until (List.get s.threads idx) s.state = true then match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics } else s) = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = false

iteration: s = s'


false
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = false

iteration: s = s'


false
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = false

iteration: s = s'


false
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = false

iteration: s = s'


false
to_system ts = s' valid ts
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = false

iteration: s = s'


false
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


true
ts', to_system ts' = s' valid ts'

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


ts.state = s.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


ts.state = s.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


ts.state = (to_system ts).state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


ts.state = (to_system ts).state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


ts.state = s.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


ts.state = (to_system ts).state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'


ts.state = s.state

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state


List.length s.threads = List.length ts.threads
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state


List.length s.threads = List.length ts.threads
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state


List.length (to_system ts).threads = List.length ts.threads
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state


List.length (to_system ts).threads = List.length ts.threads
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state


List.length s.threads = List.length ts.threads

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts


(List.get ts.threads idx').thread = List.get s.threads idx
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

this: s.threads = (to_system ts).threads


(List.get ts.threads idx').thread = List.get s.threads idx
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts


(List.get ts.threads idx').thread = List.get s.threads idx
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

this: s.threads = (to_system ts).threads


(List.get ts.threads idx').thread = List.get s.threads idx
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

this: s.threads = (to_system ts).threads


(List.get ts.threads idx').thread = List.get (to_system ts).threads (Utils.Fin.cast idx (_ : List.length s.threads = List.length (to_system ts).threads))
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

this: s.threads = (to_system ts).threads


(List.get ts.threads idx').thread = List.get (to_system ts).threads (Utils.Fin.cast idx (_ : List.length s.threads = List.length (to_system ts).threads))
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts


(List.get ts.threads idx').thread = List.get s.threads idx
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

this: s.threads = (to_system ts).threads


(List.get ts.threads (Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads))).thread = (List.get ts.threads (Utils.Fin.cast (Utils.Fin.cast idx (_ : List.length s.threads = List.length (to_system ts).threads)) (_ : List.length (List.map (fun x => x.thread) ts.threads) = List.length ts.threads))).thread
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts


(List.get ts.threads idx').thread = List.get s.threads idx

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


TracedThread.block_until (List.get ts.threads idx') s.state = true
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Thread.block_until (List.get s.threads idx) s.state = true
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


TracedThread.block_until (List.get ts.threads idx') s.state = true

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Spec.validate spec (env_r + (List.get ts.threads idx').reservation) s.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Spec.validate spec (env_r + (List.get ts.threads idx').reservation) s.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Spec.validate spec (reservations ts) s.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Spec.validate spec (env_r + (List.get ts.threads idx').reservation) s.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Spec.validate spec (reservations ts) ts.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Spec.validate spec (reservations ts) ts.state
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation


Spec.validate spec (env_r + (List.get ts.threads idx').reservation) s.state

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

t_valid: r', let _discr := TracedThread.iterate (List.get ts.threads idx') s.state; match TracedThread.iterate (List.get ts.threads idx') s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

w✝: spec.Reservation


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := TracedThread.iterate (List.get ts.threads idx') s.state; match TracedThread.iterate (List.get ts.threads idx') s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := TracedThread.iterate (List.get ts.threads idx') s.state; match TracedThread.iterate (List.get ts.threads idx') s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get ts.threads idx').thread s.state; match Thread.iterate (List.get ts.threads idx').thread s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := TracedThread.iterate (List.get ts.threads idx') s.state; match TracedThread.iterate (List.get ts.threads idx') s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Panic a✝


true.intro.Panic
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Panic a✝


true.intro.Panic
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }


true.intro
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Panic a✝


true.intro.Panic
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

iteration: (match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } | Thread.IterationResult.Panic state => { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics + 1 } | Thread.IterationResult.Running state thread => { state := state, threads := List.set s.threads idx.val thread, panics := s.panics }) = s'

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

t_valid: let _discr := Thread.iterate (List.get s.threads idx) s.state; match Thread.iterate (List.get s.threads idx) s.state with | Thread.IterationResult.Done s' => Spec.validate spec (env_r + r') s' r' = IsReservation.empty | Thread.IterationResult.Panic a => False | Thread.IterationResult.Running s' cont => Spec.validate spec (env_r + r') s' TracedThread.valid { thread := cont, reservation := r' }

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Panic a✝


true.intro.Panic
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

iteration: { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

iteration: { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
to_system (remove_thread ts idx.val state) = s' valid (remove_thread ts idx.val state)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

iteration: { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
to_system (remove_thread ts idx.val state) = s' valid (remove_thread ts idx.val state)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

iteration: { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
to_system (remove_thread ts idx.val state) = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } valid (remove_thread ts idx.val state)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

iteration: { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
to_system (remove_thread ts idx.val state) = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } valid (remove_thread ts idx.val state)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

iteration: { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
to_system (remove_thread ts idx.val state) = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } valid (remove_thread ts idx.val state)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
to_system (remove_thread ts idx.val state) = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } valid (remove_thread ts idx.val state)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done
to_system { state := state, threads := List.eraseIdx ts.threads idx.val } = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics } valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.left
to_system { state := state, threads := List.eraseIdx ts.threads idx.val } = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.left
to_system { state := state, threads := List.eraseIdx ts.threads idx.val } = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.left
to_system { state := state, threads := List.eraseIdx ts.threads idx.val } = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.left
List.map (fun x => x.thread) (List.eraseIdx ts.threads idx.val) = List.eraseIdx (List.map (fun x => x.thread) ts.threads) idx.val
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.left
to_system { state := state, threads := List.eraseIdx ts.threads idx.val } = { state := state, threads := List.eraseIdx s.threads idx.val, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done a✝

iteration: { state := a✝, threads := List.eraseIdx s.threads idx.val, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝ r' = IsReservation.empty


true.intro.Done
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + IsReservation.empty) state IsReservation.empty = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (IsReservation.empty + other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.eraseIdx ts.threads idx.val }) { state := state, threads := List.eraseIdx ts.threads idx.val }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.eraseIdx ts.threads idx.val }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.eraseIdx ts.threads idx.val }) { state := state, threads := List.eraseIdx ts.threads idx.val }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.eraseIdx ts.threads idx.val }) { state := state, threads := List.eraseIdx ts.threads idx.val }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.eraseIdx ts.threads idx.val }.threadsTracedThread.valid t

Goals accomplished! 🐙
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state r' = IsReservation.empty


true.intro.Done.right
valid { state := state, threads := List.eraseIdx ts.threads idx.val }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.eraseIdx ts.threads idx.val }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.eraseIdx ts.threads idx.val }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty

t: TracedThread spec

t_hyp: t List.eraseIdx ts.threads idx.val


true.intro.Done.right.threads_valid
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Done state

t_valid: Spec.validate spec (other_reservations ts idx.val) state IsReservation.empty = IsReservation.empty


true.intro.Done.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.eraseIdx ts.threads idx.val }.threadsTracedThread.valid t

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

iteration: System.iterate s idx = s'


ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

iteration: { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

iteration: { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
to_system (update_thread ts idx.val state r' cont) = s' valid (update_thread ts idx.val state r' cont)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

iteration: { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
to_system (update_thread ts idx.val state r' cont) = s' valid (update_thread ts idx.val state r' cont)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

iteration: { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
to_system (update_thread ts idx.val state r' cont) = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } valid (update_thread ts idx.val state r' cont)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

iteration: { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
to_system (update_thread ts idx.val state r' cont) = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } valid (update_thread ts idx.val state r' cont)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

iteration: { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
to_system (update_thread ts idx.val state r' cont) = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } valid (update_thread ts idx.val state r' cont)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
to_system (update_thread ts idx.val state r' cont) = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } valid (update_thread ts idx.val state r' cont)
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running
to_system { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } } = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics } valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.left
to_system { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } } = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right
valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.left
to_system { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } } = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.left
to_system { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } } = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right
valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.left
List.map (fun x => x.thread) (List.set ts.threads idx.val { thread := cont, reservation := r' }) = List.set (List.map (fun x => x.thread) ts.threads) idx.val cont
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.left
to_system { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } } = { state := state, threads := List.set s.threads idx.val cont, panics := s.panics }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right
valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }

Goals accomplished! 🐙
spec: Spec

s, s': System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

a✝¹: spec.State

a✝: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running a✝¹ a✝

iteration: { state := a✝¹, threads := List.set s.threads idx.val a✝, panics := s.panics } = s'

t_valid: Spec.validate spec (other_reservations ts idx.val + r') a✝¹ TracedThread.valid { thread := a✝, reservation := r' }


true.intro.Running
ts', to_system ts' = s' valid ts'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right
valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right
valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right
valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec


true.intro.Running.right.currently_valid
Spec.validate spec (reservations ts') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec


true.intro.Running.right.currently_valid
Spec.validate spec (reservations ts') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec


idx.val < List.length ts'.threads

Goals accomplished! 🐙
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'


true.intro.Running.right.currently_valid
Spec.validate spec (reservations ts') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


true.intro.Running.right.currently_valid
Spec.validate spec (reservations ts') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


env_r
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


true.intro.Running.right.currently_valid
Spec.validate spec (reservations ts') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


other_reservations ts' idx''.val
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


List.foldl (fun env_r thread => env_r + thread.reservation) IsReservation.empty (List.eraseIdx ts.threads idx.val)
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


List.foldl (fun env_r thread => env_r + thread.reservation) IsReservation.empty (List.eraseIdx ts.threads idx.val) + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


(List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


List.foldl (fun env_r thread => env_r + thread.reservation) IsReservation.empty (List.eraseIdx ts.threads idx.val) + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


r'
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


List.foldl (fun env_r thread => env_r + thread.reservation) IsReservation.empty (List.eraseIdx ts.threads idx.val)
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = other_reservations ts' idx''.val + (List.get ts'.threads idx'').reservation


env_r
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = env_r + r'


true.intro.Running.right.currently_valid
Spec.validate spec (reservations ts') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = env_r + r'


true.intro.Running.right.currently_valid
Spec.validate spec (env_r + r') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

ts':= update_thread ts idx.val state r' cont: TracedSystem spec

idx'':= { val := idx.val, isLt := (_ : idx.val < List.length ts'.threads) }: ThreadIndex ts'

decompose': reservations ts' = env_r + r'


true.intro.Running.right.currently_valid
Spec.validate spec (env_r + r') ts'.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.currently_valid
Spec.validate spec (reservations { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }) { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.state
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t

Goals accomplished! 🐙
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right
valid { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t List.set ts.threads idx.val { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t List.set ts.threads idx.val { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t List.set ts.threads idx.val { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inr
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t List.set ts.threads idx.val { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t List.set ts.threads idx.val { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t List.set ts.threads idx.val { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inr
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t List.set ts.threads idx.val { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t ts.threads


true.intro.Running.right.threads_valid.inr
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t = { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t = { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t ts.threads


true.intro.Running.right.threads_valid.inr
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t = { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t = { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
TracedThread.valid { thread := cont, reservation := r' }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t = { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
TracedThread.valid { thread := cont, reservation := r' }
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t = { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid.inl
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t ts.threads


true.intro.Running.right.threads_valid.inr

Goals accomplished! 🐙
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }


true.intro.Running.right.threads_valid
∀ (t : TracedThread spec), t { state := state, threads := List.set ts.threads idx.val { thread := cont, reservation := r' } }.threadsTracedThread.valid t
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t ts.threads


true.intro.Running.right.threads_valid.inr
spec: Spec

s: System spec

idx: System.ThreadIndex s

ts: TracedSystem spec

has_traced_system: s = to_system ts

ts_valid: valid ts

blocked_until: Thread.block_until (List.get s.threads idx) s.state = true

ts_state_eq: ts.state = s.state

idx':= Utils.Fin.cast idx (_ : List.length s.threads = List.length ts.threads): ThreadIndex ts

get_idx': (List.get ts.threads idx').thread = List.get s.threads idx

env_r:= other_reservations ts idx.val: spec.Reservation

decompose: reservations ts = env_r + (List.get ts.threads idx').reservation

r': spec.Reservation

state: spec.State

cont: Thread spec

h: Thread.iterate (List.get s.threads idx) s.state = Thread.IterationResult.Running state cont

t_valid: Spec.validate spec (other_reservations ts idx.val + r') state TracedThread.valid { thread := cont, reservation := r' }

t: TracedThread spec

t_hyp: t ts.threads


true.intro.Running.right.threads_valid.inr

Goals accomplished! 🐙
end TracedSystem end Mt.Traced