import Mt.Reservation import Mt.Task import Mt.Thread namespace SampleMutex structureData where x :Data: TypeNat y :Nat: TypeNat defNat: TypeData.valid :Data.valid: Data → PropData ->Data: TypeProp | ⟨Prop: Typex,x: Naty⟩ =>y: Natx =x: Naty abbrevy: NatReservation :=Reservation: ?m.409Mt.LockMt.Lock: Type → TypeData structureData: TypeState where data :State: TypeData locked :Data: TypeBool inductiveBool: Typevalidate :validate: Reservation → State → PropReservation ->Reservation: TypeState ->State: TypeProp where |Prop: Typeunlocked {unlocked: ∀ {data : Data}, Data.valid data → validate Mt.Lock.Unlocked { data := data, locked := false }data :data: DataData} :Data: Typedata.data: Datavalid →valid: Data → Propvalidatevalidate: Reservation → State → PropMt.Lock.Unlocked ⟨Mt.Lock.Unlocked: {T : Type} → Mt.Lock Tdata,data: Datafalse⟩ |false: Boollocked (locked: ∀ (data : Data), validate (Mt.Lock.Locked data) { data := data, locked := true }data :data: DataData) :Data: Typevalidate (validate: Reservation → State → PropMt.Lock.LockedMt.Lock.Locked: {T : Type} → T → Mt.Lock Tdata) ⟨data: Datadata,data: Datatrue⟩ deftrue: Boolspec :spec: Mt.SpecMt.Spec :={Mt.Spec: Type 1StateState: TypeReservationReservation: Typevalidate } open Mt open Mt.TaskM def thread1 :validate: Reservation → State → PropThreadThread: Spec → Type 1spec :=mk_thread do -- lock mutex atomic_blocking_rmr (λ ⟨_,spec: Speclocked⟩ =>locked: Boollocked =locked: Boolfalse) λ (false: Bools :s: StateState) => ⟨State: Type⟨⟩, {⟨⟩: PUnits with locked :=s: Statetrue}⟩ -- two atomic modifications, one after the other atomic_read_modify λtrue: Bools => {s: ?m.982s with data :={s: ?m.982s.data with x :=s: ?m.982s.data.x +s: ?m.9821}} atomic_read_modify λ1: ?m.991s => {s: ?m.1058s with data :={s: ?m.1058s.data with y :=s: ?m.1058s.data.y +s: ?m.10581}} -- release mutex atomic_read_modify λ1: ?m.1067s => {s: ?m.1106s with locked :=s: ?m.1106false} def thread2 :false: BoolThreadThread: Spec → Type 1spec :=mk_thread do -- lock mutex atomic_blocking_rmr (λ ⟨_,spec: Speclocked⟩ =>locked: Boollocked =locked: Boolfalse) λ (false: Bools :s: StateState) => ⟨State: Type⟨⟩, {⟨⟩: PUnits with locked :=s: Statetrue}⟩ -- two atomic reads, one after the other lettrue: Boolpx <- atomic_read λpx: ?m.1637s =>s: ?m.1631s.data.x lets: ?m.1631py <- atomic_read λpy: ?m.1658s =>s: ?m.1652s.data.y atomic_assert λs: ?m.1652_ =>_: ?m.1672px =px: ?m.1637py -- release mutex atomic_read_modify λpy: ?m.1658s => {s: ?m.1704s with locked :=s: ?m.1704false} theoremfalse: Boolvalidate.elim_unlocked {validate.elim_unlocked: ∀ {r : Reservation} {s : State}, validate r s → s.locked = false → r = Lock.Unlocked ∧ Data.valid s.datarr: ?m.1975s} :s: Statevalidatevalidate: Reservation → State → Proprr: ?m.1975s →s: ?m.1978s.locked =s: ?m.1978false →false: Boolr =r: ?m.1975Lock.Unlocked ∧Lock.Unlocked: {T : Type} → Lock Ts.data.s: ?m.1978valid :=valid: Data → Propr = Lock.Unlocked ∧ Data.valid s.data
unlockedLock.Unlocked = Lock.Unlocked ∧ Data.valid { data := data✝, locked := false }.data
lockedLock.Locked data✝ = Lock.Unlocked ∧ Data.valid { data := data✝, locked := true }.data
unlockedLock.Unlocked = Lock.Unlocked ∧ Data.valid { data := data✝, locked := false }.data
lockedLock.Locked data✝ = Lock.Unlocked ∧ Data.valid { data := data✝, locked := true }.data
unlockedLock.Unlocked = Lock.Unlocked ∧ Data.valid { data := data✝, locked := false }.data
lockedLock.Locked data✝ = Lock.Unlocked ∧ Data.valid { data := data✝, locked := true }.dataGoals accomplished! 🐙
unlockedLock.Unlocked = Lock.Unlocked ∧ Data.valid { data := data✝, locked := false }.data
lockedLock.Locked data✝ = Lock.Unlocked ∧ Data.valid { data := data✝, locked := true }.dataGoals accomplished! 🐙
lockedLock.Locked data✝ = Lock.Unlocked ∧ Data.valid { data := data✝, locked := true }.data
lockedLock.Locked data✝ = Lock.Unlocked ∧ Data.valid { data := data✝, locked := true }.datatheoremGoals accomplished! 🐙validate.elim_locked {env_r :env_r: ReservationReservation} {Reservation: Typedd: Datas'} :s': Statevalidate (validate: Reservation → State → Propenv_r +env_r: ReservationLock.LockedLock.Locked: {T : Type} → T → Lock Td)d: ?m.2436s' →s': ?m.2439env_r =env_r: ReservationLock.Unlocked ∧Lock.Unlocked: {T : Type} → Lock Td =d: ?m.2436s'.data ∧s': ?m.2439s'.locked =s': ?m.2439true :=true: Bool
Unlocked
Locked
Invalid
Unlocked
Locked
InvalidGoals accomplished! 🐙Goals accomplished! 🐙theoremGoals accomplished! 🐙valid_bind_mutex_lock {valid_bind_mutex_lock: ∀ {T : Type} {cont : TaskM spec T} {assuming : spec.State → Bool} {motive : T → spec.Reservation → Prop}, (∀ (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 motiveT :T: TypeType} {cont :Type: Type 1TaskMTaskM: Spec → Type → Typespecspec: SpecT} {T: Typeassumingassuming: ?m.3387motive} (motive: T → spec.Reservation → Propcont_valid : ∀cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivex :x: NatNat, cont.valid (Nat: TypeLock.Locked ⟨Lock.Locked: {T : Type} → T → Lock Tx,x: Natx⟩) (λx: Nat_ =>_: ?m.3411true) (true: Boolmotive)) : TaskM.valid (spec :=motive: ?m.3390spec) (T :=spec: SpecT) (do atomic_blocking_rmr (λ ⟨_,T: Typelocked⟩ =>locked: Boollocked =locked: Boolfalse) λ (false: Bools :s: StateState) => ⟨State: Type⟨⟩, {⟨⟩: PUnits with locked :=s: Statetrue}⟩ cont )true: BoolLock.UnlockedLock.Unlocked: {T : Type} → Lock Tassumingassuming: ?m.3387motive :=motive: ?m.3390T: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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)) = true → Spec.validate spec (env_r + Lock.Unlocked) s → ∃ r', 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.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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_validvalidate (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.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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_validvalidate (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.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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_validvalidate (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.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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_validvalidate (Lock.Unlocked + Lock.Locked s.data) { data := s.data, locked := true }T: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
mu_validvalid (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 rT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motive
f_valid∀ (r' : spec.Reservation), PUnit → Lock.is_locked_and_valid Data.valid r' → valid cont r' (fun x => true) motiveGoals accomplished! 🐙T: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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_validT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.UnlockedT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.Lockedvalid cont (Lock.Locked a✝) (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.InvalidT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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_validT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.UnlockedT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.Lockedvalid cont (Lock.Locked a✝) (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.InvalidT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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_validT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.UnlockedGoals accomplished! 🐙T: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.Lockedvalid cont (Lock.Locked data0) (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.Lockedvalid cont (Lock.Locked { x := x0, y := y✝ }) (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.Lockedvalid cont (Lock.Locked { x := x0, y := y✝ }) (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
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.Lockedvalid cont (Lock.Locked { x := x0, y := y✝ }) (fun x => true) motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motiveT: Type
cont: TaskM spec T
assuming: spec.State → Bool
motive: T → spec.Reservation → Prop
cont_valid: ∀ (x : Nat), valid cont (Lock.Locked { x := x, y := x }) (fun x => true) motivevalid (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 motivetheoremGoals accomplished! 🐙valid_mutex_release {assumingvalid_mutex_release: ∀ {assuming : spec.State → Bool} {data : Data}, Data.valid data → valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockeddata} (data: ?m.5451data_valid :data_valid: Data.valid datadata.data: ?m.5451valid) : TaskM.valid (spec :=valid: Data → Propspec) (T :=spec: SpecUnit) (atomic_read_modify λUnit: Types => {s: ?m.5462s with locked :=s: ?m.5462false}) (false: BoolLock.LockedLock.Locked: {T : Type} → T → Lock Tdata)data: ?m.5451assuming (λassuming: ?m.5448__: ?m.5471r =>r: ?m.5474r =r: ?m.5474Lock.Unlocked) :=Lock.Unlocked: {T : Type} → Lock Tvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlocked
f_valid∀ (env_r : spec.Reservation) (s : spec.State), assuming s = true → Spec.validate spec (env_r + Lock.Locked data) s → ∃ r', let s' := { data := s.data, locked := false }; Spec.validate spec (env_r + r') s' ∧ r' = Lock.Unlockedvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockedvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockedassuming: spec.State → Bool
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_validvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockedassuming: spec.State → Bool
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_validvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockedvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockedvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockedassuming: spec.State → Bool
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.aData.valid data'valid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.Unlockedassuming: spec.State → Bool
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.aData.valid data'assuming: spec.State → Bool
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.aData.valid dataassuming: spec.State → Bool
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.aData.valid datavalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked data) assuming fun x r => r = Lock.UnlockedtheoremGoals accomplished! 🐙thread1_valid : thread1.valid :=thread1_valid: Thread.valid thread1
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
cont_validvalid (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
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_validvalid (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 }
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_valid.f_valid∀ (env_r : spec.Reservation) (s : spec.State), true = true → Spec.validate spec (env_r + Lock.Locked { x := x0, y := x0 }) s → ∃ r', 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 }
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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.emptyx0: 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_validvalidate (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 }
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.mu_validvalid (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 }
cont_valid.f_valid∀ (r' : spec.Reservation), Unit → r' = 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.emptyGoals accomplished! 🐙
cont_valid.f_validvalid (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
cont_valid.f_validvalid (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
cont_valid.f_validvalid (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
cont_valid.f_validvalid (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
cont_valid.f_validvalid (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
cont_valid.f_validvalid (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
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_valid.f_valid∀ (env_r : spec.Reservation) (s : spec.State), true = true → Spec.validate spec (env_r + Lock.Locked { x := x0 + 1, y := x0 }) s → ∃ r', 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 }
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_valid.f_valid
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_validx0: 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_validvalidate (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 }
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_valid
cont_valid.f_valid.mu_validvalid (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 }
cont_valid.f_valid.f_validGoals accomplished! 🐙
cont_valid.f_valid.f_validvalid (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
cont_valid.f_valid.f_validvalid (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
cont_valid.f_valid.f_validvalid (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
cont_valid.f_valid.f_validvalid (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
cont_valid.f_valid.f_validvalid (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
cont_valid.f_valid.f_validvalid (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
cont_valid.f_valid.f_valid.data_validData.valid { x := x0 + 1, y := x0 + 1 }
cont_valid.f_valid.f_validvalid (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.emptytheoremGoals accomplished! 🐙thread2_valid : thread2.valid :=thread2_valid: Thread.valid thread2
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
cont_validvalid (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.mu_validvalid (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.mu_valid.f_valid∀ (env_r : spec.Reservation) (s : spec.State), true = true → Spec.validate spec (env_r + Lock.Locked { x := x0, y := x0 }) s → ∃ r', let t := s.data.x; Spec.validate spec (env_r + r') s ∧ r' = Lock.Locked { x := x0, y := x0 } ∧ t = x0
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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.emptyx0: 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_validvalidate (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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.emptyx0: 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_validvalidate (Lock.Locked { x := x0, y := x0 }) { data := { x := x0, y := x0 }, locked := true }
cont_valid.mu_validvalid (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
cont_valid.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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.emptyGoals accomplished! 🐙x0: Nat
r: spec.Reservation
px: Nat
is_locked_and_valid: r = Lock.Locked { x := x0, y := x0 } ∧ px = x0
cont_valid.f_validvalid (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
cont_valid.f_valid.introvalid (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
cont_valid.f_valid.introvalid (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
cont_valid.f_valid.introvalid (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
cont_valid.f_valid.intro.Unlockedvalid (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
cont_valid.f_valid.intro.Lockedvalid (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
cont_valid.f_valid.intro.Invalidvalid (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
cont_valid.f_valid.introvalid (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
cont_valid.f_valid.intro.Unlockedvalid (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
cont_valid.f_valid.intro.Lockedvalid (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
cont_valid.f_valid.intro.Invalidvalid (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
cont_valid.f_valid.introvalid (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
cont_valid.f_valid.intro.Unlockedvalid (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.emptyGoals accomplished! 🐙
cont_valid.f_valid.intro.Lockedvalid (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.emptyx0✝, 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.Lockedvalid (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.emptyx0✝, 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.Lockedvalid (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.emptyx0✝, 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.Lockedvalid (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
cont_valid.f_valid.intro.Locked.reflvalid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.f_valid.intro.Locked.refl.mu_valid.f_valid∀ (env_r : spec.Reservation) (s : spec.State), true = true → Spec.validate spec (env_r + Lock.Locked { x := x0, y := x0 }) s → ∃ r', let t := s.data.y; Spec.validate spec (env_r + r') s ∧ r' = Lock.Locked { x := x0, y := x0 } ∧ t = x0
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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.emptyx0, 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_validvalidate (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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.emptyx0, 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_validvalidate (Lock.Locked { x := x0, y := x0 }) { data := { x := x0, y := x0 }, locked := true }
cont_valid.f_valid.intro.Locked.refl.mu_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation) (u : Nat), r' = Lock.Locked { x := x0, y := x0 } ∧ u = x0 → valid (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.emptyGoals 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_validvalid (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.emptyx0, 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.introvalid (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.emptyx0, 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.Unlockedvalid (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.emptyx0, 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.Lockedvalid (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.emptyx0, 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.Invalidvalid (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.emptyx0, 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.introvalid (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.emptyx0, 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.Unlockedvalid (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.emptyx0, 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.Lockedvalid (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.emptyx0, 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.Invalidvalid (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.emptyx0, 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.introvalid (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.emptyx0, 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.Unlockedvalid (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.emptyGoals 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.Lockedvalid (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.emptyx0✝, 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.Lockedvalid (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.emptyx0✝, 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.Lockedvalid (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.emptyx0✝, 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.Lockedvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.reflvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_validvalid (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 }
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_validvalid (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 }
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_validvalid (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 }
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_validvalid (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 }
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_validvalid (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 }
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation), Unit → r' = 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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.mu_validvalid (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 }
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid∀ (r' : spec.Reservation), Unit → r' = 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.emptyGoals 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_validvalid (atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.emptyx0, 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_validvalid (atomic_read_modify fun s => { data := s.data, locked := false }) r (fun x => true) fun x r => r = IsReservation.emptyx0, 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_validvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.emptyx0, 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_validvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.emptyx0, 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_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_validvalid (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
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_valid.data_validData.valid { x := x0, y := x0 }
cont_valid.f_valid.intro.Locked.refl.f_valid.intro.Locked.refl.f_validvalid (atomic_read_modify fun s => { data := s.data, locked := false }) (Lock.Locked { x := x0, y := x0 }) (fun x => true) fun x r => r = IsReservation.emptyend SampleMutexGoals accomplished! 🐙