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. Style: centered; floating; windowed.
import Mt.Reservation
import Mt.Task
import Mt.Thread

namespace SampleMutex

structure 
Data: Type
Data
where
x: DataNat
x
:
Nat: Type
Nat
y: DataNat
y
:
Nat: Type
Nat
def
Data.valid: DataProp
Data.valid
:
Data: Type
Data
->
Prop: Type
Prop
| ⟨
x: Nat
x
,
y: Nat
y
⟩ =>
x: Nat
x
=
y: Nat
y
abbrev
Reservation: ?m.409
Reservation
:=
Mt.Lock: TypeType
Mt.Lock
Data: Type
Data
structure
State: Type
State
where
data: StateData
data
:
Data: Type
Data
locked: StateBool
locked
:
Bool: Type
Bool
inductive
validate: ReservationStateProp
validate
:
Reservation: Type
Reservation
->
State: Type
State
->
Prop: Type
Prop
where |
unlocked: ∀ {data : Data}, Data.valid datavalidate Mt.Lock.Unlocked { data := data, locked := false }
unlocked
{
data: Data
data
:
Data: Type
Data
} :
data: Data
data
.
valid: DataProp
valid
validate: ReservationStateProp
validate
Mt.Lock.Unlocked: {T : Type} → Mt.Lock T
Mt.Lock.Unlocked
data: Data
data
,
false: Bool
false
⟩ |
locked: ∀ (data : Data), validate (Mt.Lock.Locked data) { data := data, locked := true }
locked
(
data: Data
data
:
Data: Type
Data
) :
validate: ReservationStateProp
validate
(
Mt.Lock.Locked: {T : Type} → TMt.Lock T
Mt.Lock.Locked
data: Data
data
) ⟨
data: Data
data
,
true: Bool
true
def
spec: Mt.Spec
spec
:
Mt.Spec: Type 1
Mt.Spec
:={
State: Type
State
Reservation: Type
Reservation
validate: ReservationStateProp
validate
} 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 -- lock mutex
atomic_blocking_rmr: {spec : Spec} → {T : Type} → (spec.StateBool) → (spec.StateT × spec.State) → TaskM spec T
atomic_blocking_rmr
(λ ⟨_,
locked: Bool
locked
⟩ =>
locked: Bool
locked
=
false: Bool
false
) λ (s :
State: Type
State
) => ⟨
⟨⟩: PUnit
⟨⟩
, {s with locked :=
true: Bool
true
}⟩ -- two atomic modifications, one after the other
atomic_read_modify: {spec : Spec} → (spec.Statespec.State) → TaskM spec Unit
atomic_read_modify
λ
s: ?m.982
s
=> {
s: ?m.982
s
with data :={
s: ?m.982
s
.
data: StateData
data
with x :=
s: ?m.982
s
.
data: StateData
data
.
x: DataNat
x
+
1: ?m.991
1
}}
atomic_read_modify: {spec : Spec} → (spec.Statespec.State) → TaskM spec Unit
atomic_read_modify
λ
s: ?m.1058
s
=> {
s: ?m.1058
s
with data :={
s: ?m.1058
s
.
data: StateData
data
with y :=
s: ?m.1058
s
.
data: StateData
data
.
y: DataNat
y
+
1: ?m.1067
1
}} -- release mutex
atomic_read_modify: {spec : Spec} → (spec.Statespec.State) → TaskM spec Unit
atomic_read_modify
λ
s: ?m.1106
s
=> {
s: ?m.1106
s
with locked :=
false: Bool
false
} def
thread2: Thread spec
thread2
:
Thread: SpecType 1
Thread
spec: Spec
spec
:=
mk_thread: {spec : Spec} → {T : Type} → TaskM spec TThread spec
mk_thread
do -- lock mutex
atomic_blocking_rmr: {spec : Spec} → {T : Type} → (spec.StateBool) → (spec.StateT × spec.State) → TaskM spec T
atomic_blocking_rmr
(λ ⟨_,
locked: Bool
locked
⟩ =>
locked: Bool
locked
=
false: Bool
false
) λ (s :
State: Type
State
) => ⟨
⟨⟩: PUnit
⟨⟩
, {s with locked :=
true: Bool
true
}⟩ -- two atomic reads, one after the other let
px: ?m.1637
px
<-
atomic_read: {spec : Spec} → {T : Type} → (spec.StateT) → TaskM spec T
atomic_read
λ
s: ?m.1631
s
=>
s: ?m.1631
s
.
data: StateData
data
.
x: DataNat
x
let
py: ?m.1658
py
<-
atomic_read: {spec : Spec} → {T : Type} → (spec.StateT) → TaskM spec T
atomic_read
λ
s: ?m.1652
s
=>
s: ?m.1652
s
.
data: StateData
data
.
y: DataNat
y
atomic_assert: {spec : Spec} → (spec.StateBool) → TaskM spec Unit
atomic_assert
λ
_: ?m.1672
_
=>
px: ?m.1637
px
=
py: ?m.1658
py
-- release mutex
atomic_read_modify: {spec : Spec} → (spec.Statespec.State) → TaskM spec Unit
atomic_read_modify
λ
s: ?m.1704
s
=> {
s: ?m.1704
s
with locked :=
false: Bool
false
} theorem
validate.elim_unlocked: ∀ {r : Reservation} {s : State}, validate r ss.locked = falser = Lock.Unlocked Data.valid s.data
validate.elim_unlocked
{
r: ?m.1975
r
s} :
validate: ReservationStateProp
validate
r: ?m.1975
r
s: ?m.1978
s
s: ?m.1978
s
.
locked: StateBool
locked
=
false: Bool
false
r: ?m.1975
r
=
Lock.Unlocked: {T : Type} → Lock T
Lock.Unlocked
s: ?m.1978
s
.
data: StateData
data
.
valid: DataProp
valid
:=

validate r ss.locked = falser = Lock.Unlocked Data.valid s.data
r: Reservation

s: State

is_valid: validate r s

is_unlocked: s.locked = false


r = Lock.Unlocked Data.valid s.data

validate r ss.locked = falser = Lock.Unlocked Data.valid s.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked
Lock.Unlocked = Lock.Unlocked Data.valid { data := data✝, locked := false }.data
data✝: Data

is_unlocked: { data := data✝, locked := true }.locked = false


locked
Lock.Locked data✝ = Lock.Unlocked Data.valid { data := data✝, locked := true }.data

validate r ss.locked = falser = Lock.Unlocked Data.valid s.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked
Lock.Unlocked = Lock.Unlocked Data.valid { data := data✝, locked := false }.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked
Lock.Unlocked = Lock.Unlocked Data.valid { data := data✝, locked := false }.data
data✝: Data

is_unlocked: { data := data✝, locked := true }.locked = false


locked
Lock.Locked data✝ = Lock.Unlocked Data.valid { data := data✝, locked := true }.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked.left
Lock.Unlocked = Lock.Unlocked
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked.right
Data.valid { data := data✝, locked := false }.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked
Lock.Unlocked = Lock.Unlocked Data.valid { data := data✝, locked := false }.data
data✝: Data

is_unlocked: { data := data✝, locked := true }.locked = false


locked
Lock.Locked data✝ = Lock.Unlocked Data.valid { data := data✝, locked := true }.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked.left
Lock.Unlocked = Lock.Unlocked
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked.left
Lock.Unlocked = Lock.Unlocked
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked.right
Data.valid { data := data✝, locked := false }.data

Goals accomplished! 🐙
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked
Lock.Unlocked = Lock.Unlocked Data.valid { data := data✝, locked := false }.data
data✝: Data

is_unlocked: { data := data✝, locked := true }.locked = false


locked
Lock.Locked data✝ = Lock.Unlocked Data.valid { data := data✝, locked := true }.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked.right
Data.valid { data := data✝, locked := false }.data
data✝: Data

is_unlocked: { data := data✝, locked := false }.locked = false


unlocked.right
Data.valid { data := data✝, locked := false }.data

Goals accomplished! 🐙

validate r ss.locked = falser = Lock.Unlocked Data.valid s.data
data✝: Data

is_unlocked: { data := data✝, locked := true }.locked = false


locked
Lock.Locked data✝ = Lock.Unlocked Data.valid { data := data✝, locked := true }.data
data✝: Data

is_unlocked: { data := data✝, locked := true }.locked = false


locked
Lock.Locked data✝ = Lock.Unlocked Data.valid { data := data✝, locked := true }.data

Goals accomplished! 🐙
theorem
validate.elim_locked: ∀ {env_r : Reservation} {d : Data} {s' : State}, validate (env_r + Lock.Locked d) s'env_r = Lock.Unlocked d = s'.data s'.locked = true
validate.elim_locked
{env_r :
Reservation: Type
Reservation
} {
d: Data
d
s': State
s'
} :
validate: ReservationStateProp
validate
(env_r +
Lock.Locked: {T : Type} → TLock T
Lock.Locked
d: ?m.2436
d
)
s': ?m.2439
s'
env_r =
Lock.Unlocked: {T : Type} → Lock T
Lock.Unlocked
d: ?m.2436
d
=
s': ?m.2439
s'
.
data: StateData
data
s': ?m.2439
s'
.
locked: StateBool
locked
=
true: Bool
true
:=
env_r: Reservation

d: Data

s': State


validate (env_r + Lock.Locked d) s'env_r = Lock.Unlocked d = s'.data s'.locked = true
env_r: Reservation

d: Data

s': State

initial_valid: validate (env_r + Lock.Locked d) s'


env_r = Lock.Unlocked d = s'.data s'.locked = true
env_r: Reservation

d: Data

s': State


validate (env_r + Lock.Locked d) s'env_r = Lock.Unlocked d = s'.data s'.locked = true
d: Data

s': State

initial_valid: validate (Lock.Unlocked + Lock.Locked d) s'


Unlocked
Lock.Unlocked = Lock.Unlocked d = s'.data s'.locked = true
d: Data

s': State

a✝: Data

initial_valid: validate (Lock.Locked a✝ + Lock.Locked d) s'


Locked
Lock.Locked a✝ = Lock.Unlocked d = s'.data s'.locked = true
d: Data

s': State

initial_valid: validate (Lock.Invalid + Lock.Locked d) s'


Invalid
Lock.Invalid = Lock.Unlocked d = s'.data s'.locked = true
env_r: Reservation

d: Data

s': State

initial_valid: validate (env_r + Lock.Locked d) s'


env_r = Lock.Unlocked d = s'.data s'.locked = true
d: Data

s': State

initial_valid: validate (Lock.Unlocked + Lock.Locked d) s'


Unlocked
Lock.Unlocked = Lock.Unlocked d = s'.data s'.locked = true
d: Data

s': State

a✝: Data

initial_valid: validate (Lock.Locked a✝ + Lock.Locked d) s'


Locked
Lock.Locked a✝ = Lock.Unlocked d = s'.data s'.locked = true
d: Data

s': State

initial_valid: validate (Lock.Invalid + Lock.Locked d) s'


Invalid
Lock.Invalid = Lock.Unlocked d = s'.data s'.locked = true
env_r: Reservation

d: Data

s': State

initial_valid: validate (env_r + Lock.Locked d) s'


env_r = Lock.Unlocked d = s'.data s'.locked = true

Goals accomplished! 🐙
env_r: Reservation

d: Data

s': State


validate (env_r + Lock.Locked d) s'env_r = Lock.Unlocked d = s'.data s'.locked = true
d: Data


Unlocked.locked.left
Lock.Unlocked = Lock.Unlocked
d: Data


Unlocked.locked.right
d = { data := d, locked := true }.data { data := d, locked := true }.locked = true
env_r: Reservation

d: Data

s': State


validate (env_r + Lock.Locked d) s'env_r = Lock.Unlocked d = s'.data s'.locked = true
d: Data


Unlocked.locked.left
Lock.Unlocked = Lock.Unlocked
d: Data


Unlocked.locked.left
Lock.Unlocked = Lock.Unlocked
d: Data


Unlocked.locked.right
d = { data := d, locked := true }.data { data := d, locked := true }.locked = true

Goals accomplished! 🐙
env_r: Reservation

d: Data

s': State


validate (env_r + Lock.Locked d) s'env_r = Lock.Unlocked d = s'.data s'.locked = true
d: Data


Unlocked.locked.right.left
d = { data := d, locked := true }.data
d: Data


Unlocked.locked.right.right
{ data := d, locked := true }.locked = true
d: Data


Unlocked.locked.right
d = { data := d, locked := true }.data { data := d, locked := true }.locked = true
d: Data


Unlocked.locked.right.left
d = { data := d, locked := true }.data
d: Data


Unlocked.locked.right.right
{ data := d, locked := true }.locked = true
d: Data


Unlocked.locked.right
d = { data := d, locked := true }.data { data := d, locked := true }.locked = true

Goals accomplished! 🐙
theorem
valid_bind_mutex_lock: ∀ {T : Type} {cont : TaskM spec T} {assuming : spec.StateBool} {motive : Tspec.ReservationProp}, (∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive) → valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
valid_bind_mutex_lock
{
T: Type
T
:
Type: Type 1
Type
} {
cont: TaskM spec T
cont
:
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
} {
assuming: ?m.3387
assuming
motive: Tspec.ReservationProp
motive
} (
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
cont_valid
: ∀
x: Nat
x
:
Nat: Type
Nat
,
cont: TaskM spec T
cont
.
valid: {spec : Spec} → {T : Type} → TaskM spec Tspec.Reservation(spec.StateBool) → (Tspec.ReservationProp) → Prop
valid
(
Lock.Locked: {T : Type} → TLock T
Lock.Locked
x: Nat
x
,
x: Nat
x
⟩) (λ
_: ?m.3411
_
=>
true: Bool
true
) (
motive: ?m.3390
motive
)) :
TaskM.valid: {spec : Spec} → {T : Type} → TaskM spec Tspec.Reservation(spec.StateBool) → (Tspec.ReservationProp) → Prop
TaskM.valid
(spec :=
spec: Spec
spec
) (T :=
T: Type
T
) (do
atomic_blocking_rmr: {spec : Spec} → {T : Type} → (spec.StateBool) → (spec.StateT × spec.State) → TaskM spec T
atomic_blocking_rmr
(λ ⟨_,
locked: Bool
locked
⟩ =>
locked: Bool
locked
=
false: Bool
false
) λ (s :
State: Type
State
) => ⟨
⟨⟩: PUnit
⟨⟩
, {s with locked :=
true: Bool
true
}⟩
cont: TaskM spec T
cont
)
Lock.Unlocked: {T : Type} → Lock T
Lock.Unlocked
assuming: ?m.3387
assuming
motive: ?m.3390
motive
:=
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), (match s with | { data := data, locked := locked } => decide (locked = false)) = trueSpec.validate spec (env_r + Lock.Unlocked) sr', let _discr := (PUnit.unit, { data := s.data, locked := true }); match (PUnit.unit, { data := s.data, locked := true }) with | (t, s') => Spec.validate spec (env_r + r') s' Lock.is_locked_and_valid Data.valid r'
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), (match s with | { data := data, locked := locked } => decide (locked = false)) = truevalidate env_r sr', validate (env_r + r') { data := s.data, locked := true } Lock.is_locked_and_valid Data.valid r'
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

env_r: spec.Reservation

s: spec.State

is_unlocked: (match s with | { data := data, locked := locked } => decide (locked = false)) = true

initial_valid: validate env_r s


mu_valid.f_valid
r', validate (env_r + r') { data := s.data, locked := true } Lock.is_locked_and_valid Data.valid r'
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

env_r: spec.Reservation

s: spec.State

is_unlocked: (match s with | { data := data, locked := locked } => decide (locked = false)) = true

initial_valid: validate env_r s


mu_valid.f_valid
validate (env_r + Lock.Locked s.data) { data := s.data, locked := true } Lock.is_locked_and_valid Data.valid (Lock.Locked s.data)
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

env_r: spec.Reservation

s: spec.State

initial_valid: validate env_r s

is_unlocked: s.locked = false


mu_valid.f_valid
validate (env_r + Lock.Locked s.data) { data := s.data, locked := true } Lock.is_locked_and_valid Data.valid (Lock.Locked s.data)
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

env_r: spec.Reservation

s: spec.State

initial_valid: validate env_r s

is_unlocked: s.locked = false

this: env_r = Lock.Unlocked Data.valid s.data


mu_valid.f_valid
validate (env_r + Lock.Locked s.data) { data := s.data, locked := true } Lock.is_locked_and_valid Data.valid (Lock.Locked s.data)
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

env_r: spec.Reservation

s: spec.State

initial_valid: validate env_r s

is_unlocked: s.locked = false

this: env_r = Lock.Unlocked Data.valid s.data


mu_valid.f_valid
validate (Lock.Unlocked + Lock.Locked s.data) { data := s.data, locked := true }
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


mu_valid
valid (atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true })) Lock.Unlocked assuming fun x r => Lock.is_locked_and_valid Data.valid r
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


f_valid
∀ (r' : spec.Reservation), PUnitLock.is_locked_and_valid Data.valid r'valid cont r' (fun x => true) motive

Goals accomplished! 🐙
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

r: spec.Reservation

is_locked_and_valid: Lock.is_locked_and_valid Data.valid r


f_valid
valid cont r (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

is_locked_and_valid: Lock.is_locked_and_valid Data.valid Lock.Unlocked


f_valid.Unlocked
valid cont Lock.Unlocked (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

a✝: Data

is_locked_and_valid: Lock.is_locked_and_valid Data.valid (Lock.Locked a✝)


f_valid.Locked
valid cont (Lock.Locked a✝) (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

is_locked_and_valid: Lock.is_locked_and_valid Data.valid Lock.Invalid


f_valid.Invalid
valid cont Lock.Invalid (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

r: spec.Reservation

is_locked_and_valid: Lock.is_locked_and_valid Data.valid r


f_valid
valid cont r (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

is_locked_and_valid: Lock.is_locked_and_valid Data.valid Lock.Unlocked


f_valid.Unlocked
valid cont Lock.Unlocked (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

a✝: Data

is_locked_and_valid: Lock.is_locked_and_valid Data.valid (Lock.Locked a✝)


f_valid.Locked
valid cont (Lock.Locked a✝) (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

is_locked_and_valid: Lock.is_locked_and_valid Data.valid Lock.Invalid


f_valid.Invalid
valid cont Lock.Invalid (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

r: spec.Reservation

is_locked_and_valid: Lock.is_locked_and_valid Data.valid r


f_valid
valid cont r (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

is_locked_and_valid: Lock.is_locked_and_valid Data.valid Lock.Unlocked


f_valid.Unlocked
valid cont Lock.Unlocked (fun x => true) motive

Goals accomplished! 🐙
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

data0: Data

is_locked_and_valid: Lock.is_locked_and_valid Data.valid (Lock.Locked data0)


f_valid.Locked
valid cont (Lock.Locked data0) (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

data0: Data

x0, y✝: Nat

is_locked_and_valid: Lock.is_locked_and_valid Data.valid (Lock.Locked { x := x0, y := y✝ })


f_valid.Locked
valid cont (Lock.Locked { x := x0, y := y✝ }) (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

data0: Data

x0, y✝: Nat

is_locked_and_valid: Lock.is_locked_and_valid Data.valid (Lock.Locked { x := x0, y := y✝ })


f_valid.Locked
valid cont (Lock.Locked { x := x0, y := y✝ }) (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

x0, y✝: Nat

is_locked_and_valid: Lock.is_locked_and_valid Data.valid (Lock.Locked { x := x0, y := y✝ })


f_valid.Locked
valid cont (Lock.Locked { x := x0, y := y✝ }) (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive

x0: Nat


f_valid.Locked.refl
valid cont (Lock.Locked { x := x0, y := x0 }) (fun x => true) motive
T: Type

cont: TaskM spec T

assuming: spec.StateBool

motive: Tspec.ReservationProp

cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive


valid (do atomic_blocking_rmr (fun x => match x with | { data := data, locked := locked } => decide (locked = false)) fun s => (PUnit.unit, { data := s.data, locked := true }) cont) Lock.Unlocked assuming motive

Goals accomplished! 🐙
theorem
valid_mutex_release: ∀ {assuming : spec.StateBool} {data : Data}, Data.valid datavalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
valid_mutex_release
{
assuming: spec.StateBool
assuming
data: ?m.5451
data
} (
data_valid: Data.valid data
data_valid
:
data: ?m.5451
data
.
valid: DataProp
valid
) :
TaskM.valid: {spec : Spec} → {T : Type} → TaskM spec Tspec.Reservation(spec.StateBool) → (Tspec.ReservationProp) → Prop
TaskM.valid
(spec :=
spec: Spec
spec
) (T :=
Unit: Type
Unit
) (
atomic_read_modify: {spec : Spec} → (spec.Statespec.State) → TaskM spec Unit
atomic_read_modify
λ
s: ?m.5462
s
=> {
s: ?m.5462
s
with locked :=
false: Bool
false
}) (
Lock.Locked: {T : Type} → TLock T
Lock.Locked
data: ?m.5451
data
)
assuming: ?m.5448
assuming
_: ?m.5471
_
r: ?m.5474
r
=>
r: ?m.5474
r
=
Lock.Unlocked: {T : Type} → Lock T
Lock.Unlocked
) :=
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


f_valid
∀ (env_r : spec.Reservation) (s : spec.State), assuming s = trueSpec.validate spec (env_r + Lock.Locked data) sr', let s' := { data := s.data, locked := false }; Spec.validate spec (env_r + r') s' r' = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


f_valid
∀ (env_r : spec.Reservation) (s : spec.State), assuming s = truevalidate (env_r + Lock.Locked data) sr', validate (env_r + r') { data := s.data, locked := false } r' = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }


f_valid
r', validate (env_r + r') { data := { data := data', locked := locked }.data, locked := false } r' = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }


f_valid
validate (env_r + Lock.Unlocked) { data := { data := data', locked := locked }.data, locked := false } Lock.Unlocked = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }

this: data = data'


f_valid
validate (env_r + Lock.Unlocked) { data := { data := data', locked := locked }.data, locked := false } Lock.Unlocked = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }

this: data = data'


f_valid
validate (Lock.Unlocked + Lock.Unlocked) { data := data', locked := false }
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }

this: data = data'


f_valid.a
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }

this: data = data'


f_valid.a
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }

this: data = data'


f_valid.a
assuming: spec.StateBool

data: Data

data_valid: Data.valid data

env_r: spec.Reservation

data': Data

locked: Bool

initial_valid: validate (env_r + Lock.Locked data) { data := data', locked := locked }

this: data = data'


f_valid.a
assuming: spec.StateBool

data: Data

data_valid: Data.valid data


valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked

Goals accomplished! 🐙
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

cont_valid
∀ (x : Nat), valid (do atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked } atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x, y := x }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid
valid (do atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked } atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + Lock.Locked { x := x0, y := x0 }) sr', let s' := { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }; Spec.validate spec (env_r + r') s' r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), Truevalidate (env_r + Lock.Locked { x := x0, y := x0 }) sr', validate (env_r + r') { data := { x := s.data.x + 1, y := s.data.y }, locked := s.locked } r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
r', validate (env_r + r') { data := { x := { data := { x := x, y := y }, locked := locked }.data.x + 1, y := { data := { x := x, y := y }, locked := locked }.data.y }, locked := { data := { x := x, y := y }, locked := locked }.locked } r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
validate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := { data := { x := x, y := y }, locked := locked }.data.x + 1, y := { data := { x := x, y := y }, locked := locked }.data.y }, locked := { data := { x := x, y := y }, locked := locked }.locked } Lock.Locked { x := x0 + 1, y := x0 } = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x + 1, y := y }, locked := true } True
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x + 1, y := y }, locked := true } True
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 = x

y0_def: x0 = y


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x + 1, y := y }, locked := true } True
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 = x

y0_def: x0 = y


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x0 + 1, y := x0 }, locked := true } True
x0: Nat


cont_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := s.data.x + 1, y := src.y }, locked := s.locked }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 }
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 }valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 }


cont_valid.f_valid
valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 }


cont_valid.f_valid
valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 }


cont_valid.f_valid
valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 }


cont_valid.f_valid
valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 }


cont_valid.f_valid
valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid
valid (do atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked } atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + Lock.Locked { x := x0 + 1, y := x0 }) sr', let s' := { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }; Spec.validate spec (env_r + r') s' r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), Truevalidate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) sr', validate (env_r + r') { data := { x := s.data.x, y := s.data.y + 1 }, locked := s.locked } r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.mu_valid.f_valid
r', validate (env_r + r') { data := { x := { data := { x := x, y := y }, locked := locked }.data.x, y := { data := { x := x, y := y }, locked := locked }.data.y + 1 }, locked := { data := { x := x, y := y }, locked := locked }.locked } r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.mu_valid.f_valid
validate (env_r + Lock.Locked { x := x0 + 1, y := x0 + 1 }) { data := { x := { data := { x := x, y := y }, locked := locked }.data.x, y := { data := { x := x, y := y }, locked := locked }.data.y + 1 }, locked := { data := { x := x, y := y }, locked := locked }.locked } Lock.Locked { x := x0 + 1, y := x0 + 1 } = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 + 1 }) { data := { x := x, y := y + 1 }, locked := true } True
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 + 1 }) { data := { x := x, y := y + 1 }, locked := true } True
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 + 1 = x

y0_def: x0 = y


cont_valid.f_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 + 1 }) { data := { x := x, y := y + 1 }, locked := true } True
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0 + 1, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 + 1 = x

y0_def: x0 = y


cont_valid.f_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0 + 1, y := x0 + 1 }) { data := { x := x0 + 1, y := x0 + 1 }, locked := true } True
x0: Nat


cont_valid.f_valid.mu_valid
valid (atomic_read_modify fun s => { data := let src := s.data; { x := src.x, y := s.data.y + 1 }, locked := s.locked }) (Lock.Locked { x := x0 + 1, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0 + 1, y := x0 + 1 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 + 1 }


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 + 1 }


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 + 1 }


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 + 1 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 + 1 }


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 + 1 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

r_def: r = Lock.Locked { x := x0 + 1, y := x0 + 1 }


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 + 1 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 + 1 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 + 1 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 + 1 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.f_valid.f_valid.data_valid
Data.valid { x := x0 + 1, y := x0 + 1 }
x0: Nat


cont_valid.f_valid.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0 + 1, y := x0 + 1 }) (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
theorem
thread2_valid: Thread.valid thread2
thread2_valid
:
thread2: Thread spec
thread2
.
valid: {spec : Spec} → Thread specProp
valid
:=

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

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

cont_valid
∀ (x : Nat), valid (do let px ← atomic_read fun s => s.data.x let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x, y := x }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid
valid (do let px ← atomic_read fun s => s.data.x let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + Lock.Locked { x := x0, y := x0 }) sr', let t := s.data.x; Spec.validate spec (env_r + r') s r' = Lock.Locked { x := x0, y := x0 } t = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat


cont_valid.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), Truevalidate (env_r + Lock.Locked { x := x0, y := x0 }) sr', validate (env_r + r') s r' = Lock.Locked { x := x0, y := x0 } s.data.x = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
r', validate (env_r + r') { data := { x := x, y := y }, locked := locked } r' = Lock.Locked { x := x0, y := x0 } { data := { x := x, y := y }, locked := locked }.data.x = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked } Lock.Locked { x := x0, y := x0 } = Lock.Locked { x := x0, y := x0 } { data := { x := x, y := y }, locked := locked }.data.x = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x, y := y }) { data := { x := x, y := y }, locked := true } True x = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x, y := y }) { data := { x := x, y := y }, locked := true } True x = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 = x

y0_def: x0 = y


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x, y := y }) { data := { x := x, y := y }, locked := true } True x = x0
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 = x

y0_def: x0 = y


cont_valid.mu_valid.f_valid
validate (Lock.Locked { x := x0, y := x0 }) { data := { x := x0, y := x0 }, locked := true }
x0: Nat


cont_valid.mu_valid
valid (atomic_read fun s => s.data.x) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun px r' => r' = Lock.Locked { x := x0, y := x0 } px = x0
x0: Nat


cont_valid.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (u = py) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
x0: Nat

r: spec.Reservation

px: Nat

is_locked_and_valid: r = Lock.Locked { x := x0, y := x0 } px = x0


cont_valid.f_valid
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

px: Nat


cont_valid.f_valid.intro
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

px: Nat


cont_valid.f_valid.intro
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

px: Nat

r_def: r = Lock.Locked { x := x0, y := x0 }

px_def: px = x0


cont_valid.f_valid.intro
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r_def: Lock.Unlocked = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Unlocked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Unlocked (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

a✝: Data

r_def: Lock.Locked a✝ = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked a✝) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r_def: Lock.Invalid = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Invalid
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Invalid (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

px: Nat

r_def: r = Lock.Locked { x := x0, y := x0 }

px_def: px = x0


cont_valid.f_valid.intro
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r_def: Lock.Unlocked = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Unlocked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Unlocked (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

a✝: Data

r_def: Lock.Locked a✝ = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked a✝) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r_def: Lock.Invalid = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Invalid
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Invalid (fun x => true) fun x r => r = IsReservation.empty
x0: Nat

r: spec.Reservation

px: Nat

r_def: r = Lock.Locked { x := x0, y := x0 }

px_def: px = x0


cont_valid.f_valid.intro
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r_def: Lock.Unlocked = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Unlocked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Unlocked (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
x0, px: Nat

px_def: px = x0

data0: Data

r_def: Lock.Locked data0 = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data0) (fun x => true) fun x r => r = IsReservation.empty
x0✝, px: Nat

px_def: px = x0✝

data0: Data

x0, y0: Nat

r_def: Lock.Locked { x := x0, y := y0 } = Lock.Locked { x := x0✝, y := x0✝ }


cont_valid.f_valid.intro.Locked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := y0 }) (fun x => true) fun x r => r = IsReservation.empty
x0✝, px: Nat

px_def: px = x0✝

data0: Data

x0, y0: Nat

r_def: Lock.Locked { x := x0, y := y0 } = Lock.Locked { x := x0✝, y := x0✝ }


cont_valid.f_valid.intro.Locked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := y0 }) (fun x => true) fun x r => r = IsReservation.empty
x0✝, px: Nat

px_def: px = x0✝

x0, y0: Nat

r_def: Lock.Locked { x := x0, y := y0 } = Lock.Locked { x := x0✝, y := x0✝ }


cont_valid.f_valid.intro.Locked
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := y0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl
valid (do let py ← atomic_read fun s => s.data.y atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + Lock.Locked { x := x0, y := x0 }) sr', let t := s.data.y; Spec.validate spec (env_r + r') s r' = Lock.Locked { x := x0, y := x0 } t = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
∀ (env_r : spec.Reservation) (s : spec.State), Truevalidate (env_r + Lock.Locked { x := x0, y := x0 }) sr', validate (env_r + r') s r' = Lock.Locked { x := x0, y := x0 } s.data.y = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
r', validate (env_r + r') { data := { x := x, y := y }, locked := locked } r' = Lock.Locked { x := x0, y := x0 } { data := { x := x, y := y }, locked := locked }.data.y = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked } Lock.Locked { x := x0, y := x0 } = Lock.Locked { x := x0, y := x0 } { data := { x := x, y := y }, locked := locked }.data.y = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
validate (Lock.Locked { x := x, y := y }) { data := { x := x, y := y }, locked := true } True y = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
validate (Lock.Locked { x := x, y := y }) { data := { x := x, y := y }, locked := true } True y = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 = x

y0_def: x0 = y


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
validate (Lock.Locked { x := x, y := y }) { data := { x := x, y := y }, locked := true } True y = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

env_r: spec.Reservation

x, y: Nat

locked: Bool

initial_valid: validate (env_r + Lock.Locked { x := x0, y := x0 }) { data := { x := x, y := y }, locked := locked }

x0_def: x0 = x

y0_def: x0 = y


cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid
validate (Lock.Locked { x := x0, y := x0 }) { data := { x := x0, y := x0 }, locked := true }
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.mu_valid
valid (atomic_read fun s => s.data.y) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun py r' => r' = Lock.Locked { x := x0, y := x0 } py = x0
x0, px: Nat

px_def: px = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } u = x0valid (do atomic_assert fun x => decide (px = u) atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
x0, px: Nat

px_def: px = x0

r: spec.Reservation

py: Nat

is_locked_and_valid: r = Lock.Locked { x := x0, y := x0 } py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r: spec.Reservation

py: Nat


cont_valid.f_valid.intro.Locked.refl.f_valid.intro
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r: spec.Reservation

py: Nat


cont_valid.f_valid.intro.Locked.refl.f_valid.intro
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r: spec.Reservation

py: Nat

r_def: r = Lock.Locked { x := x0, y := x0 }

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r_def: Lock.Unlocked = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Unlocked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Unlocked (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

a✝: Data

r_def: Lock.Locked a✝ = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked a✝) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r_def: Lock.Invalid = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Invalid
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Invalid (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r: spec.Reservation

py: Nat

r_def: r = Lock.Locked { x := x0, y := x0 }

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r_def: Lock.Unlocked = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Unlocked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Unlocked (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

a✝: Data

r_def: Lock.Locked a✝ = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked a✝) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r_def: Lock.Invalid = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Invalid
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Invalid (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

r: spec.Reservation

py: Nat

r_def: r = Lock.Locked { x := x0, y := x0 }

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r_def: Lock.Unlocked = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Unlocked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) Lock.Unlocked (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

data0: Data

r_def: Lock.Locked data0 = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data0) (fun x => true) fun x r => r = IsReservation.empty
x0✝, px: Nat

px_def: px = x0✝

py: Nat

py_def: py = x0✝

data0: Data

x0, y0: Nat

r_def: Lock.Locked { x := x0, y := y0 } = Lock.Locked { x := x0✝, y := x0✝ }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := y0 }) (fun x => true) fun x r => r = IsReservation.empty
x0✝, px: Nat

px_def: px = x0✝

py: Nat

py_def: py = x0✝

data0: Data

x0, y0: Nat

r_def: Lock.Locked { x := x0, y := y0 } = Lock.Locked { x := x0✝, y := x0✝ }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := y0 }) (fun x => true) fun x r => r = IsReservation.empty
x0✝, px: Nat

px_def: px = x0✝

py: Nat

py_def: py = x0✝

x0, y0: Nat

r_def: Lock.Locked { x := x0, y := y0 } = Lock.Locked { x := x0✝, y := x0✝ }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := y0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl
valid (do atomic_assert fun x => decide (px = py) atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
valid (atomic_assert fun x => decide (px = py)) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0, y := x0 }
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0, y := x0 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
valid (atomic_assert fun x => decide (px = py)) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0, y := x0 }
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
valid (atomic_assert fun x => decide (px = py)) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0, y := x0 }
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0, y := x0 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
∀ (env_r : spec.Reservation) (s : spec.State), true = trueSpec.validate spec (env_r + Lock.Locked { x := x0, y := x0 }) sdecide (px = py) = true
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
valid (atomic_assert fun x => decide (px = py)) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0, y := x0 }
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0, y := x0 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

env_r✝: spec.Reservation

s✝: spec.State


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
decide (px = py) = true
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
valid (atomic_assert fun x => decide (px = py)) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0, y := x0 }
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0, y := x0 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

env_r✝: spec.Reservation

s✝: spec.State


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
decide (px = py) = true
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

env_r✝: spec.Reservation

s✝: spec.State


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
decide (x0 = py) = true
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

env_r✝: spec.Reservation

s✝: spec.State


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
decide (px = py) = true
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

env_r✝: spec.Reservation

s✝: spec.State


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
decide (x0 = x0) = true
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

env_r✝: spec.Reservation

s✝: spec.State


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
decide (x0 = x0) = true
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_valid
valid (atomic_assert fun x => decide (px = py)) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r' => r' = Lock.Locked { x := x0, y := x0 }
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
∀ (r' : spec.Reservation), Unitr' = Lock.Locked { x := x0, y := x0 }valid (atomic_read_modify fun s => { data := s.data, locked := false }) r' (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r: spec.Reservation

r_def: r = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r: spec.Reservation

r_def: r = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r: spec.Reservation

r_def: r = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r: spec.Reservation

r_def: r = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0

r: spec.Reservation

r_def: r = Lock.Locked { x := x0, y := x0 }


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid.data_valid
Data.valid { x := x0, y := x0 }
x0, px: Nat

px_def: px = x0

py: Nat

py_def: py = x0


cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid
valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.empty

Goals accomplished! 🐙
end SampleMutex