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.Reservation
import Mt.Thread

namespace SampleSimple

structure 
State: Type
State
where
x: StateNat
x
:
Nat: Type
Nat
y: StateNat
y
:
Nat: Type
Nat
def
spec: Mt.Spec
spec
:
Mt.Spec: Type 1
Mt.Spec
:={
State: Type
State
Reservation :=
Nat: Type
Nat
validate := fun (
luft: Nat
luft
:
Nat: Type
Nat
) ⟨
x: Nat
x
,
y: Nat
y
⟩ =>
x: Nat
x
y: Nat
y
+
luft: Nat
luft
} open Mt open Mt.TaskM def
thread1: Thread spec
thread1
:
Thread: SpecType 1
Thread
spec: Spec
spec
:=
mk_thread: {spec : Spec} → {T : Type} → TaskM spec TThread spec
mk_thread
do -- increase x atomically
atomic_read_modify: {spec : Spec} → (spec.Statespec.State) → TaskM spec Unit
atomic_read_modify
λ
s: ?m.526
s
=> {
s: ?m.526
s
with x :=
s: ?m.526
s
.
x: StateNat
x
+
1: ?m.532
1
} -- increase y atomically
atomic_read_modify: {spec : Spec} → (spec.Statespec.State) → TaskM spec Unit
atomic_read_modify
λ
s: ?m.598
s
=> {
s: ?m.598
s
with y :=
s: ?m.598
s
.
y: StateNat
y
+
1: ?m.604
1
}
atomic_assert: {spec : Spec} → (spec.StateBool) → TaskM spec Unit
atomic_assert
fun
x: Nat
x
,
y: Nat
y
⟩ =>
x: Nat
x
y: Nat
y
theorem
thread1_valid: Thread.valid thread1
thread1_valid
:
thread1: Thread spec
thread1
.
valid: {spec : Spec} → Thread specProp
valid
:=

valid thread1.task IsReservation.empty thread1.block_until fun x r => r = IsReservation.empty

valid thread1.task IsReservation.empty thread1.block_until fun x r => r = IsReservation.empty

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty

mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), Thread.block_until thread1 s = trueSpec.validate spec (env_r + IsReservation.empty) sr', let s' := { x := s.x + 1, y := s.y }; Spec.validate spec (env_r + r') s' r' = 1

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + IsReservation.empty) { x := x, y := y }


mu_valid.f_valid
r', let s' := { x := { x := x, y := y }.x + 1, y := { x := x, y := y }.y }; Spec.validate spec (env_luft + r') s' r' = 1

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + IsReservation.empty) { x := x, y := y }


mu_valid.f_valid
let s' := { x := { x := x, y := y }.x + 1, y := { x := x, y := y }.y }; Spec.validate spec (env_luft + 1) s' 1 = 1

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + IsReservation.empty) { x := x, y := y }


mu_valid.f_valid
Spec.validate spec (env_luft + 1) { x := x + 1, y := y }

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + IsReservation.empty) { x := x, y := y }

this: x y + env_luft


mu_valid.f_valid
Spec.validate spec (env_luft + 1) { x := x + 1, y := y }

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + IsReservation.empty) { x := x, y := y }

this: x y + env_luft


mu_valid.f_valid
x + 1 y + env_luft + 1

mu_valid
valid (atomic_read_modify fun s => { x := s.x + 1, y := s.y }) IsReservation.empty thread1.block_until fun x luft => luft = 1

f_valid
∀ (r' : spec.Reservation), Unitr' = 1valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + IsReservation.empty) { x := x, y := y }

this: x y + env_luft


mu_valid.f_valid
x + 1 y + env_luft + 1
env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + IsReservation.empty) { x := x, y := y }

this: x y + env_luft


Nat.add (y + env_luft) 0 x

Goals accomplished! 🐙

Goals accomplished! 🐙
luft: Nat

luft_def: luft = 1


f_valid
valid (do atomic_read_modify fun s => { x := s.x, y := s.y + 1 } atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) luft (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1


f_valid.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + luft) sr', let s' := { x := s.x, y := s.y + 1 }; Spec.validate spec (env_r + r') s' r' = 0
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }


f_valid.mu_valid.f_valid
r', let s' := { x := { x := x, y := y }.x, y := { x := x, y := y }.y + 1 }; Spec.validate spec (env_luft + r') s' r' = 0
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }


f_valid.mu_valid.f_valid
let s' := { x := { x := x, y := y }.x, y := { x := x, y := y }.y + 1 }; Spec.validate spec (env_luft + 0) s' 0 = 0
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }


f_valid.mu_valid.f_valid
Spec.validate spec (env_luft + 0) { x := x, y := y + 1 }
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }


f_valid.mu_valid.f_valid
Spec.validate spec (env_luft + 0) { x := x, y := y + 1 }
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }


f_valid.mu_valid.f_valid
Spec.validate spec (env_luft + 0) { x := x, y := y + 1 }
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }


f_valid.mu_valid.f_valid
Spec.validate spec (env_luft + 0) { x := x, y := y + 1 }
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }


f_valid.mu_valid.f_valid
Spec.validate spec (env_luft + 0) { x := x, y := y + 1 }
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }

this: x y + env_luft + 1


f_valid.mu_valid.f_valid
Spec.validate spec (env_luft + 0) { x := x, y := y + 1 }
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }

this: x y + env_luft + 1


f_valid.mu_valid.f_valid
x y + 1 + env_luft
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }

this: x y + env_luft + 1


f_valid.mu_valid.f_valid
x y + 1 + env_luft
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }

this: x y + env_luft + 1


f_valid.mu_valid.f_valid
x y + env_luft + 1
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }

this: x y + env_luft + 1


f_valid.mu_valid.f_valid
x y + env_luft + 1
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 1

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + 1) { x := x, y := y }

this: x y + env_luft + 1


f_valid.mu_valid.f_valid
x y + env_luft + 1
luft: Nat

luft_def: luft = 1


f_valid.mu_valid
valid (atomic_read_modify fun s => { x := s.x, y := s.y + 1 }) luft (fun x => true) fun x luft => luft = 0
luft: Nat

luft_def: luft = 1


f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙

f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = 0valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) r' (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 0


f_valid.f_valid
valid (atomic_assert fun x => match x with | { x := x, y := y } => decide (x y)) luft (fun x => true) fun x r => r = IsReservation.empty
luft: Nat

luft_def: luft = 0


f_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + luft) s(match s with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0


f_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + luft) s(match s with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0


f_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + luft) s(match s with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }


f_valid.f_valid
(match { x := x, y := y } with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0


f_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + luft) s(match s with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }

this: x y + (env_luft + luft)


f_valid.f_valid
(match { x := x, y := y } with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0


f_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + luft) s(match s with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }

this: x y + (env_luft + luft)


f_valid.f_valid
luft: Nat

luft_def: luft = 0


f_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + luft) s(match s with | { x := x, y := y } => decide (x y)) = true
luft: Nat

luft_def: luft = 0

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }

this: x y + (env_luft + luft)


f_valid.f_valid
luft: Nat

luft_def: luft = 0

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }

this: x y + (env_luft + luft)


y y + (env_luft + luft)

Goals accomplished! 🐙
luft: Nat

luft_def: luft = 0

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }

this: x y + (env_luft + luft)


f_valid.f_valid
luft: Nat

luft_def: luft = 0

env_luft, x, y: Nat

initial_valid: Spec.validate spec (env_luft + luft) { x := x, y := y }

this: x y + (env_luft + luft)


y + (env_luft + luft) x

Goals accomplished! 🐙
end SampleSimple