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: Spec → Type 1
TracedSystem
(
spec: Spec
spec
:
Spec: Type 1
Spec
) where
state: {spec : Spec} → TracedSystem spec → spec.State
state
:
spec: Spec
spec
.
State: Spec → Type
State
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
:
List: Type ?u.8 → Type ?u.8
List
(
TracedThread: Spec → Type 1
TracedThread
spec: Spec
spec
) namespace TracedSystem variable {
spec: Spec
spec
:
Spec: Type 1
Spec
} local
instance: {spec : Spec} → IsReservation spec.Reservation
instance
:
IsReservation: Type → Type
IsReservation
spec: Spec
spec
.
Reservation: Spec → Type
Reservation
:=
spec: Spec
spec
.
is_reservation: (self : Spec) → IsReservation self.Reservation
is_reservation
def
ThreadIndex: TracedSystem spec → Type
ThreadIndex
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) :
Type: Type 1
Type
:=
Fin: Nat → Type
Fin
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
.
length: {α : Type ?u.410} → List α → Nat
length
def
done: TracedSystem spec → Bool
done
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) :
Bool: Type
Bool
:=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
.
length: {α : Type ?u.429} → List α → Nat
length
=
0: ?m.435
0
def
iterate: (s : TracedSystem spec) → ThreadIndex s → Thread.IterationResult spec
iterate
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) (idx :
s: TracedSystem spec
s
.
ThreadIndex: {spec : Spec} → TracedSystem spec → Type
ThreadIndex
) :
Thread.IterationResult: Spec → Type 1
Thread.IterationResult
spec: Spec
spec
:= (
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
.
get: {α : Type ?u.537} → (as : List α) → Fin (List.length as) → α
get
idx).
iterate: {spec : Spec} → TracedThread spec → spec.State → Thread.IterationResult spec
iterate
s: TracedSystem spec
s
.
state: {spec : Spec} → TracedSystem spec → spec.State
state
def
update_thread: TracedSystem spec → Nat → spec.State → spec.Reservation → Thread spec → TracedSystem spec
update_thread
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) (
idx: Nat
idx
:
Nat: Type
Nat
) (
state: spec.State
state
:
spec: Spec
spec
.
State: Spec → Type
State
) (
r: spec.Reservation
r
:
spec: Spec
spec
.
Reservation: Spec → Type
Reservation
) (
cont: Thread spec
cont
:
Thread: Spec → Type 1
Thread
spec: Spec
spec
) :
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
:={
state: spec.State
state
threads :=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (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 spec → Nat → spec.State → TracedSystem spec
remove_thread
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) (
idx: Nat
idx
:
Nat: Type
Nat
) (
state: spec.State
state
:
spec: Spec
spec
.
State: Spec → Type
State
) :
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
:={
state: spec.State
state
threads :=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
.
eraseIdx: {α : Type ?u.686} → List α → Nat → List α
eraseIdx
idx: Nat
idx
} def
reservations: {spec : Spec} → TracedSystem spec → spec.Reservation
reservations
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) :
spec: Spec
spec
.
Reservation: Spec → Type
Reservation
:=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (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 spec → spec.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 spec → Nat → spec.Reservation
other_reservations
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) (
idx: Nat
idx
:
Nat: Type
Nat
) :
spec: Spec
spec
.
Reservation: Spec → Type
Reservation
:= (
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
.
eraseIdx: {α : Type ?u.931} → List α → Nat → List α
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 spec → spec.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: Spec → Type 1
TracedSystem
spec: Spec
spec
) (idx :
s: TracedSystem spec
s
.
ThreadIndex: {spec : Spec} → TracedSystem spec → Type
ThreadIndex
) :
s: TracedSystem spec
s
.
reservations: {spec : Spec} → TracedSystem spec → spec.Reservation
reservations
=
s: TracedSystem spec
s
.
other_reservations: {spec : Spec} → TracedSystem spec → Nat → spec.Reservation
other_reservations
idx.
val: {n : Nat} → Fin n → Nat
val
+ (
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
.
get: {α : Type ?u.1100} → (as : List α) → Fin (List.length as) → α
get
idx).
reservation: {spec : Spec} → TracedThread spec → spec.Reservation
reservation
:=
System.Traced.decompose_reservation: ∀ {spec : Spec} (l : List (TracedThread spec)) (idx : Fin (List.length l)) (t : TracedThread spec), t = List.get l idx → System.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 spec → List (TracedThread spec)
threads
idx
_: TracedThread ?m.1152
_
rfl: ∀ {α : Sort ?u.1181} {a : α}, a = a
rfl
structure
valid: {spec : Spec} → TracedSystem spec → Prop
valid
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) :
Prop: Type
Prop
where
currently_valid: ∀ {spec : Spec} {s : TracedSystem spec}, valid s → Spec.validate spec (reservations s) s.state
currently_valid
:
spec: Spec
spec
.
validate: (self : Spec) → self.Reservation → self.State → Prop
validate
s: TracedSystem spec
s
.
reservations: {spec : Spec} → TracedSystem spec → spec.Reservation
reservations
s: TracedSystem spec
s
.
state: {spec : Spec} → TracedSystem spec → spec.State
state
threads_valid: ∀ {spec : Spec} {s : TracedSystem spec}, valid s → ∀ (t : TracedThread spec), t ∈ s.threads → TracedThread.valid t
threads_valid
: ∀
t: ?m.1214
t
,
t: ?m.1214
t
∈
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (TracedThread spec)
threads
→
t: ?m.1214
t
.
valid: {spec : Spec} → TracedThread spec → Prop
valid
def
to_system: TracedSystem spec → System spec
to_system
(
s: TracedSystem spec
s
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
) :
System: Spec → Type 1
System
spec: Spec
spec
:={ state :=
s: TracedSystem spec
s
.
state: {spec : Spec} → TracedSystem spec → spec.State
state
threads :=
s: TracedSystem spec
s
.
threads: {spec : Spec} → TracedSystem spec → List (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 spec → TracedSystem spec
mk_initial
(
s: System spec
s
:
System: Spec → Type 1
System
spec: Spec
spec
) :
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
:={ state :=
s: System spec
s
.
state: {spec : Spec} → System spec → spec.State
state
threads :=
s: System spec
s
.
threads: {spec : Spec} → System spec → List (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.threads → Thread.valid t) → TracedSystem.valid (mk_initial s)
mk_initial.valid
(
s: System spec
s
:
System: Spec → Type 1
System
spec: Spec
spec
) (
initial_valid: Spec.validate spec IsReservation.empty s.state
initial_valid
:
spec: Spec
spec
.
validate: (self : Spec) → self.Reservation → self.State → Prop
validate
IsReservation.empty: {T : Type} → [self : IsReservation T] → T
IsReservation.empty
s: System spec
s
.
state: {spec : Spec} → System spec → spec.State
state
) (
threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.valid t
threads_valid
: ∀
t: ?m.1583
t
,
t: ?m.1583
t
∈
s: System spec
s
.
threads: {spec : Spec} → System spec → List (Thread spec)
threads
→
t: ?m.1583
t
.
valid: {spec : Spec} → Thread spec → Prop
valid
) : (
mk_initial: {spec : Spec} → System spec → TracedSystem spec
mk_initial
s: System spec
s
).
valid: {spec : Spec} → TracedSystem spec → Prop
valid
:=
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.valid t


spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.valid t


spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.valid t


spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t
spec: Spec

s: System spec

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

threads_valid: ∀ (t : Thread spec), t ∈ s.threads → Thread.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.threads → Thread.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.threads → Thread.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.threads → Thread.valid t


threads_valid
∀ (t : TracedThread spec), t ∈ (mk_initial s).threads → TracedThread.valid t

Goals accomplished! 🐙
theorem
mk_initial.cancels_to_system: ∀ {spec : Spec} {s : System spec}, s.panics = 0 → to_system (mk_initial s) = s
mk_initial.cancels_to_system
{
s: System spec
s
:
System: Spec → Type 1
System
spec: Spec
spec
} (
no_panics_yet: s.panics = 0
no_panics_yet
:
s: System spec
s
.
panics: {spec : Spec} → System spec → Nat
panics
=
0: ?m.2978
0
) : (
mk_initial: {spec : Spec} → System spec → TracedSystem spec
mk_initial
s: System spec
s
).
to_system: {spec : Spec} → TracedSystem spec → System 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 ts → valid ts → System.iterate s idx = s' → ∃ ts', to_system ts' = s' ∧ valid ts'
valid_by_iteration
(
s: System spec
s
s': System spec
s'
:
System: Spec → Type 1
System
spec: Spec
spec
) {idx :
s: System spec
s
.
ThreadIndex: {spec : Spec} → System spec → Type
ThreadIndex
} {
ts: TracedSystem spec
ts
:
TracedSystem: Spec → Type 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 spec → System spec
to_system
) (
ts_valid: valid ts
ts_valid
:
ts: TracedSystem spec
ts
.
valid: {spec : Spec} → TracedSystem spec → Prop
valid
) (
iteration: System.iterate s idx = s'
iteration
:
s: System spec
s
.
iterate: {spec : Spec} → (s : System spec) → System.ThreadIndex s → System spec
iterate
idx =
s': System spec
s'
) : ∃
ts': TracedSystem spec
ts'
:
TracedSystem: Spec → Type 1
TracedSystem
spec: Spec
spec
,
ts': TracedSystem spec
ts'
.
to_system: {spec : Spec} → TracedSystem spec → System spec
to_system
=
s': System spec
s'
∧
ts': TracedSystem spec
ts'
.
valid: {spec : Spec} → TracedSystem spec → Prop
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 }.threads → TracedThread.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 }.threads → TracedThread.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 }.threads → TracedThread.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 }.threads → TracedThread.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 }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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' } }.threads → TracedThread.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