import Mt.Reservation import Mt.Task.Impl namespace Mt /-- Monad to describe single threaded algorithms. Tasks can be iterated step by step until they finally complete or panic. `TaskM` is a monad, i.e. you can use the do-notation to write code: ``` import Mt.Task.Basic open Mt abbrev spec : Spec :={ State := Nat, Reservation := UnitReservation, validate :=ฮป _ _ => True } def sample_task : TaskM spec Bool :=do if (<- TaskM.atomic_read ฮป n => n) > 100 then -- reset to 100 TaskM.atomic_read_modify ฮป _ => 100 return false TaskM.atomic_assert ฮป n => n < 500 TaskM.atomic_read_modify ฮป n => n + 7 return true ``` Note: `TaskM` hat an associative bind operator, but it is not a lawful monad: Binding two `pure` cannot be simplified into a single pure, because it requires two iterations to complete. -/ defTaskM (TaskM: Spec โ Type โ Typespec :spec: SpecSpec) (Spec: Type 1T :T: TypeType) :Type: Type 1Type :=Type: Type 1TaskM.impl.TaskMTaskM.impl.TaskM: Spec โ Type โ Typespecspec: SpecT /-- The result of a single iteration of `TaskM`. Independent of the result, the resulting shared state after the iteration can be retrieved using `IterationResult.state` -/ inductiveT: TypeTaskM.IterationResult (TaskM.IterationResult: Spec โ Type โ Typespec :spec: SpecSpec) (Spec: Type 1T :T: TypeType) |Type: Type 1Done :Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Tspec.spec: SpecState ->State: Spec โ TypeT ->T: TypeIterationResultIterationResult: Spec โ Type โ Sort ?u.17specspec: SpecT |T: TypePanic :Panic: {spec : Spec} โ {T : Type} โ spec.State โ String โ IterationResult spec Tspec.spec: SpecState ->State: Spec โ TypeString ->String: TypeIterationResultIterationResult: Spec โ Type โ Sort ?u.17specspec: SpecT |T: TypeRunning :Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Tspec.spec: SpecState -> (State: Spec โ Typespec.spec: SpecState ->State: Spec โ TypeBool) ->Bool: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecT ->T: TypeIterationResultIterationResult: Spec โ Type โ Sort ?u.17specspec: SpecT variable {T: Typespec :spec: SpecSpec} defSpec: Type 1TaskM.IterationResult.state {TaskM.IterationResult.state: {T : Type} โ {spec : Spec} โ IterationResult spec T โ spec.StateTT: Typespec} :spec: SpecIterationResultIterationResult: Spec โ Type โ Typespecspec: ?m.1240T ->T: ?m.1237spec.spec: ?m.1240State |State: Spec โ TypeDoneDone: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Ts _ =>s: spec.States |s: spec.StatePanicPanic: {spec : Spec} โ {T : Type} โ spec.State โ String โ IterationResult spec Ts _ =>s: spec.States |s: spec.StateRunningRunning: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Ts .. =>s: spec.States instance TaskM.instMonad :s: spec.StateMonad (Monad: (Type ?u.1655 โ Type ?u.1654) โ Type (max (?u.1655 + 1) ?u.1654)TaskMTaskM: Spec โ Type โ Typespec) where pure :=spec: Specimpl.TaskM.pure bind :=impl.TaskM.pure: {spec : Spec} โ {T : Type} โ T โ impl.TaskM spec Timpl.TaskM.bind theoremimpl.TaskM.bind: {spec : Spec} โ {U V : Type} โ impl.TaskM spec U โ (U โ impl.TaskM spec V) โ impl.TaskM spec VTaskM.bind_assoc {UU: TypeVV: TypeW :W: TypeType} (Type: Type 1mu :mu: TaskM spec UTaskMTaskM: Spec โ Type โ Typespecspec: SpecU) (U: Typef :f: U โ TaskM spec VU ->U: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecV) (V: Typeg :g: V โ TaskM spec WV ->V: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecW) :W: Typemu >>= (funmu: TaskM spec Uu => (u: ?m.2694ff: U โ TaskM spec Vu) >>=u: ?m.2694g) = (g: V โ TaskM spec Wmu >>=mu: TaskM spec Uf) >>=f: U โ TaskM spec Vg :=g: V โ TaskM spec W(impl.TaskM.bind mu fun u => impl.TaskM.bind (f u) g) = impl.TaskM.bind (impl.TaskM.bind mu f) g/-- Atomic `TaskM` primitive with read/write-access to the shared state. Additional to performing a read-modify operation, it returns a value. Example: Compare Exchange (https://en.wikipedia.org/wiki/Compare-and-swap) -/ defGoals accomplished! ๐TaskM.atomic_read_modify_read {T :T: TypeType} (Type: Type 1f :f: spec.State โ T ร spec.Statespec.spec: SpecState ->State: Spec โ TypeT รT: Typespec.spec: SpecState) :State: Spec โ TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecT :=T: Typeimpl.TaskM.atomic_read_modify_readimpl.TaskM.atomic_read_modify_read: {spec : Spec} โ {T : Type} โ (spec.State โ T ร spec.State) โ impl.TaskM spec Tf /-- Atomic `TaskM` primitive to perform read-modify operations on the shared state. It does not return anything. -/ def TaskM.atomic_read_modify (f: spec.State โ T ร spec.Statef :f: spec.State โ spec.Statespec.spec: SpecState ->State: Spec โ Typespec.spec: SpecState) :State: Spec โ TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecUnit := atomic_read_modify_read ฮปUnit: Types => โจs: ?m.2960โจโฉ,โจโฉ: PUnitff: spec.State โ spec.Statesโฉ /-- Atomic `TaskM` primitive to perform read the shared state. It does not change anything -/ def TaskM.atomic_read {s: ?m.2960T :T: TypeType} (Type: Type 1f :f: spec.State โ Tspec.spec: SpecState ->State: Spec โ TypeT) :T: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecT := atomic_read_modify_read ฮปT: Types => matchs: ?m.3046ff: spec.State โ Ts with |s: ?m.3046t => โจt: ?m.3049t,t: ?m.3049sโฉ /-- Atomic `TaskM` primitive which throws an exception. The current thread panics and will be removed from the system -/ def TaskM.panic {s: ?m.3046T :T: TypeType} (Type: Type 1msg :msg: StringString) :String: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecT :=T: Typeimpl.TaskM.panicimpl.TaskM.panic: {spec : Spec} โ {T : Type} โ String โ impl.TaskM spec Tmsg /-- Atomic `TaskM` primitive to assert a given condition. The condition is checked atomically. If it returns `false`, the current thread panics. -/ def TaskM.atomic_assert (msg: Stringcond :cond: spec.State โ Boolspec.spec: SpecState ->State: Spec โ TypeBool) :Bool: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecUnit :=Unit: Typeimpl.TaskM.atomic_assertimpl.TaskM.atomic_assert: {spec : Spec} โ (spec.State โ Bool) โ impl.TaskM spec Unitcond /-- `TaskM` primitive which blocks the current thread until a given condition holds, and executes a read-modify-read operation afterwards. There are neither spurious wakeups nor race conditions: The system will only perform the read-modify-read operation if the provided condition holds. If it does not, the thread will block. -/ defcond: spec.State โ BoolTaskM.atomic_blocking_rmr (block_until :block_until: spec.State โ Boolspec.spec: SpecState ->State: Spec โ TypeBool) (Bool: Typef :f: spec.State โ T ร spec.Statespec.spec: SpecState ->State: Spec โ TypeT รT: ?m.3233spec.spec: SpecState) :State: Spec โ TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecT :=T: ?m.3233impl.TaskM.atomic_blocking_rmrimpl.TaskM.atomic_blocking_rmr: {spec : Spec} โ {T : Type} โ (spec.State โ Bool) โ (spec.State โ T ร spec.State) โ impl.TaskM spec Tblock_untilblock_until: spec.State โ Boolf /-- Iterate a given thread on a given state and provides an `IterationResult`. The task may complete or panic. If it is does not, it is still running and a continuation will be provided in the result -/ deff: spec.State โ T ร spec.StateTaskM.iterate {TaskM.iterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec TT :T: TypeType} :Type: Type 1TaskMTaskM: Spec โ Type โ Typespecspec: SpecT ->T: Typespec.spec: SpecState ->State: Spec โ TypeIterationResultIterationResult: Spec โ Type โ Typespecspec: SpecT := ฮปT: Typepp: ?m.3329s => matchs: ?m.3332pp: ?m.3329s with |s: ?m.3332impl.IterationResult.Doneimpl.IterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ impl.IterationResult spec Ts's': spec.Statet =>t: TIterationResult.DoneIterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Ts's': spec.Statet |t: Timpl.IterationResult.Panicimpl.IterationResult.Panic: {spec : Spec} โ {T : Type} โ spec.State โ String โ impl.IterationResult spec Ts's': spec.Statemsg =>msg: StringIterationResult.PanicIterationResult.Panic: {spec : Spec} โ {T : Type} โ spec.State โ String โ IterationResult spec Ts's': spec.Statemsg |msg: Stringimpl.IterationResult.Runningimpl.IterationResult.Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ (spec.State โ impl.IterationResult spec T) โ impl.IterationResult spec Ts's': spec.Stateblock_untilblock_until: spec.State โ Boolcont =>cont: spec.State โ impl.IterationResult spec TIterationResult.RunningIterationResult.Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Ts's': spec.Stateblock_untilblock_until: spec.State โ Boolcont /-- Iteration of `pure t` always completes with result `t` -/ theoremcont: spec.State โ impl.IterationResult spec TTaskM.iterate_pure {TaskM.iterate_pure: โ {T : Type} (s : spec.State) (t : T), iterate (pure t) s = IterationResult.Done s tT :T: TypeType} : โ (Type: Type 1s :s: spec.Statespec.spec: SpecState) (State: Spec โ Typet :t: TT),T: Typeiterate (iterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tpurepure: {f : Type ?u.3757 โ Type ?u.3756} โ [self : Pure f] โ {ฮฑ : Type ?u.3757} โ ฮฑ โ f ฮฑt)t: Ts =s: spec.StateIterationResult.DoneIterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Tss: spec.Statet :=t: Tโ (s : spec.State) (t : T), iterate (pure t) s = IterationResult.Done s titerate (pure tโ) sโ = IterationResult.Done sโ tโโ (s : spec.State) (t : T), iterate (pure t) s = IterationResult.Done s titerate (pure tโ) sโ = IterationResult.Done sโ tโโ (s : spec.State) (t : T), iterate (pure t) s = IterationResult.Done s t/-- Iteration of `a >>= f` iterates `a` and returns a continuation. * If the `a` iteration has completed with result `t`, the next iteration will start work on `f t` * If the `a` iteration has not completed yet, the next iteration will continue. * If `a` has panicked, the exception is propagated. -/ theoremGoals accomplished! ๐TaskM.iterate_bind {TaskM.iterate_bind: โ {spec : Spec} {U V : Type} (mu : TaskM spec U) (f : U โ TaskM spec V) (s : spec.State), iterate (mu >>= f) s = let _discr := iterate mu s; match iterate mu s with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (cont >>= f)UU: TypeV :V: TypeType} (Type: Type 1mu :mu: TaskM spec UTaskMTaskM: Spec โ Type โ Typespecspec: SpecU) (U: Typef :f: U โ TaskM spec VU ->U: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecV) : โ (V: Types :s: spec.Statespec.spec: SpecState),State: Spec โ Typeiterate (iterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tmu >>=mu: TaskM spec Uf)f: U โ TaskM spec Vs = matchs: spec.Stateiterateiterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tmumu: TaskM spec Us with |s: spec.StateIterationResult.DoneIterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Ts's': spec.Stateu =>u: UIterationResult.RunningIterationResult.Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Ts' (ฮปs': spec.State_ =>_: ?m.3914true) (true: Boolff: U โ TaskM spec Vu) |u: UIterationResult.PanicIterationResult.Panic: {spec : Spec} โ {T : Type} โ spec.State โ String โ IterationResult spec Ts's': spec.Statemsg =>msg: StringIterationResult.PanicIterationResult.Panic: {spec : Spec} โ {T : Type} โ spec.State โ String โ IterationResult spec Ts's': spec.Statemsg |msg: StringIterationResult.RunningIterationResult.Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Ts's': spec.Stateblock_untilblock_until: spec.State โ Boolcont =>cont: TaskM spec UIterationResult.RunningIterationResult.Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Ts's': spec.Stateblock_until (block_until: spec.State โ Boolcont >>=cont: TaskM spec Uf) :=f: U โ TaskM spec Vโ (s : spec.State), iterate (mu >>= f) s = let _discr := iterate mu s; match iterate mu s with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (cont >>= f)iterate (mu >>= f) s = let _discr := iterate mu s; match iterate mu s with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (cont >>= f)โ (s : spec.State), iterate (mu >>= f) s = let _discr := iterate mu s; match iterate mu s with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (cont >>= f)(match match h : mu s with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match mu s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)โ (s : spec.State), iterate (mu >>= f) s = let _discr := iterate mu s; match iterate mu s with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (cont >>= f)
Done(match match h : impl.IterationResult.Done aโยน aโ with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match impl.IterationResult.Done aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)
Panic(match match h : impl.IterationResult.Panic aโยน aโ with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match impl.IterationResult.Panic aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)spec: Spec
U, V: Type
mu: TaskM spec U
f: U โ TaskM spec V
s, aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec U
Running(match match h : impl.IterationResult.Running aโยฒ aโยน aโ with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match impl.IterationResult.Running aโยฒ aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)(match match h : mu s with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match mu s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)
Done(match match h : impl.IterationResult.Done aโยน aโ with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match impl.IterationResult.Done aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)
Panic(match match h : impl.IterationResult.Panic aโยน aโ with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match impl.IterationResult.Panic aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)spec: Spec
U, V: Type
mu: TaskM spec U
f: U โ TaskM spec V
s, aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec U
Running(match match h : impl.IterationResult.Running aโยฒ aโยน aโ with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match impl.IterationResult.Running aโยฒ aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)(match match h : mu s with | impl.IterationResult.Done s' u => impl.IterationResult.Running s' (fun x => true) (f u) | impl.IterationResult.Panic s' msg => impl.IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => impl.IterationResult.Running s' block_until (impl.TaskM.bind cont f) with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = match match mu s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (f u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (impl.TaskM.bind cont f)/-- Iteration of a read-modify-read-operation will perform the read modify and complete with the computed result. -/ theoremGoals accomplished! ๐TaskM.iterate_rmr {TaskM.iterate_rmr: โ {T : Type} (f : spec.State โ T ร spec.State) (s : spec.State), iterate (atomic_read_modify_read f) s = let _discr := f s; match f s with | (t, s') => IterationResult.Done s' tT :T: TypeType} (Type: Type 1f :f: spec.State โ T ร spec.Statespec.spec: SpecState ->State: Spec โ TypeT รT: Typespec.spec: SpecState) : โState: Spec โ Types,s: ?m.7722iterate (atomic_read_modify_readiterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tf)f: spec.State โ T ร spec.States = matchs: ?m.7722ff: spec.State โ T ร spec.States with | โจs: ?m.7722t,t: Ts'โฉ =>s': spec.StateIterationResult.DoneIterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Ts's': spec.Statet :=t: Tโ (s : spec.State), iterate (atomic_read_modify_read f) s = let _discr := f s; match f s with | (t, s') => IterationResult.Done s' titerate (atomic_read_modify_read f) sโ = let _discr := f sโ; match f sโ with | (t, s') => IterationResult.Done s' tโ (s : spec.State), iterate (atomic_read_modify_read f) s = let _discr := f s; match f s with | (t, s') => IterationResult.Done s' titerate (atomic_read_modify_read f) sโ = let _discr := f sโ; match f sโ with | (t, s') => IterationResult.Done s' tโ (s : spec.State), iterate (atomic_read_modify_read f) s = let _discr := f s; match f s with | (t, s') => IterationResult.Done s' t/-- Iteration of a read-modify operation will perform the read modify operation and complete with `Unit.unit` -/ theoremGoals accomplished! ๐TaskM.iterate_rm (TaskM.iterate_rm: โ (f : spec.State โ spec.State) (s : spec.State), iterate (atomic_read_modify f) s = let s' := f s; IterationResult.Done s' PUnit.unitf :f: spec.State โ spec.Statespec.spec: SpecState ->State: Spec โ Typespec.spec: SpecState) : โState: Spec โ Types,s: ?m.7888iterate (atomic_read_modifyiterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tf)f: spec.State โ spec.States = matchs: ?m.7888ff: spec.State โ spec.States with |s: ?m.7888s' =>s': ?m.7904IterationResult.DoneIterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Ts's': ?m.7904โจโฉ :=โจโฉ: PUnitโ (s : spec.State), iterate (atomic_read_modify f) s = let s' := f s; IterationResult.Done s' PUnit.unit/-- Iteration of a read operation will compute a value based on the current shared state and complete with the result -/ theoremGoals accomplished! ๐TaskM.iterate_read (TaskM.iterate_read: โ {spec : Spec} {T : Type} (f : spec.State โ T ร spec.Reservation) (s : spec.State), iterate (atomic_read f) s = let t := f s; IterationResult.Done s tf :f: spec.State โ T ร spec.Reservationspec.spec: SpecState ->State: Spec โ TypeT รT: ?m.8188spec.spec: SpecReservation) : โReservation: Spec โ Types,s: ?m.8198iterate (atomic_readiterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tf)f: spec.State โ T ร spec.Reservations = matchs: ?m.8198ff: spec.State โ T ร spec.Reservations with |s: ?m.8198t =>t: ?m.8217IterationResult.DoneIterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Tss: ?m.8198t :=t: ?m.8217โ (s : spec.State), iterate (atomic_read f) s = let t := f s; IterationResult.Done s t/-- Iteration of a panic will fail -/ theoremGoals accomplished! ๐TaskM.iterate_panic {T :T: TypeType} (Type: Type 1msg :msg: StringString) : โ (String: Types :s: spec.Statespec.spec: SpecState),State: Spec โ Typeiterate (panic (T :=iterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec TT)T: Typemsg)msg: Strings =s: spec.StateIterationResult.PanicIterationResult.Panic: {spec : Spec} โ {T : Type} โ spec.State โ String โ IterationResult spec Tss: spec.Statemsg :=msg: String/-- Iteration of an assertion will atomically check the condition and succeed or fail depending on the result. -/ theoremGoals accomplished! ๐TaskM.iterate_assert (TaskM.iterate_assert: โ {spec : Spec} (cond : spec.State โ Bool) (s : spec.State), iterate (atomic_assert cond) s = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"cond :cond: spec.State โ Boolspec.spec: SpecState ->State: Spec โ TypeBool) : โBool: Types,s: ?m.8539iterate (atomic_assertiterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tcond)cond: spec.State โ Bools = ifs: ?m.8539condcond: spec.State โ Bools thens: ?m.8539IterationResult.DoneIterationResult.Done: {spec : Spec} โ {T : Type} โ spec.State โ T โ IterationResult spec Tss: ?m.8539โจโฉ elseโจโฉ: PUnitIterationResult.PanicIterationResult.Panic: {spec : Spec} โ {T : Type} โ spec.State โ String โ IterationResult spec Tss: ?m.8539"Assertion failed" :="Assertion failed": Stringโ (s : spec.State), iterate (atomic_assert cond) s = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"iterate (atomic_assert cond) s = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"โ (s : spec.State), iterate (atomic_assert cond) s = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"(match if cond s = true then impl.IterationResult.Done s PUnit.unit else impl.IterationResult.Panic s "Assertion failed" with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"โ (s : spec.State), iterate (atomic_assert cond) s = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"
false(match if false = true then impl.IterationResult.Done s PUnit.unit else impl.IterationResult.Panic s "Assertion failed" with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = if false = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"
true(match if true = true then impl.IterationResult.Done s PUnit.unit else impl.IterationResult.Panic s "Assertion failed" with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = if true = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"(match if cond s = true then impl.IterationResult.Done s PUnit.unit else impl.IterationResult.Panic s "Assertion failed" with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"
false(match if false = true then impl.IterationResult.Done s PUnit.unit else impl.IterationResult.Panic s "Assertion failed" with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = if false = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"
true(match if true = true then impl.IterationResult.Done s PUnit.unit else impl.IterationResult.Panic s "Assertion failed" with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = if true = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"(match if cond s = true then impl.IterationResult.Done s PUnit.unit else impl.IterationResult.Panic s "Assertion failed" with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = if cond s = true then IterationResult.Done s PUnit.unit else IterationResult.Panic s "Assertion failed"/-- Iteration of a `atomic_blocking_rmr` operation will always return a continuation. The `IterationResult` contains the blocking predicate and the desired read-modify-read operation. The caller should ensure that the read-modify-operation is only iterated when the blocking predicate holds. -/ theoremGoals accomplished! ๐TaskM.iterate_blocking_rmr (TaskM.iterate_blocking_rmr: โ {spec : Spec} {T : Type} (block_until : spec.State โ Bool) (f : spec.State โ T ร spec.State) (s : spec.State), iterate (atomic_blocking_rmr block_until f) s = IterationResult.Running s block_until (atomic_read_modify_read f)block_until :block_until: spec.State โ Boolspec.spec: SpecState ->State: Spec โ TypeBool) (Bool: Typef :f: spec.State โ T ร spec.Statespec.spec: SpecState ->State: Spec โ TypeT รT: ?m.9923spec.spec: SpecState) : โState: Spec โ Types,s: ?m.9937iterate (atomic_blocking_rmriterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Tblock_untilblock_until: spec.State โ Boolf)f: spec.State โ T ร spec.States =s: ?m.9937IterationResult.RunningIterationResult.Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Tss: ?m.9937block_until (atomic_read_modify_readblock_until: spec.State โ Boolf) :=f: spec.State โ T ร spec.Stateโ (s : spec.State), iterate (atomic_blocking_rmr block_until f) s = IterationResult.Running s block_until (atomic_read_modify_read f)iterate (atomic_blocking_rmr block_until f) sโ = IterationResult.Running sโ block_until (atomic_read_modify_read f)โ (s : spec.State), iterate (atomic_blocking_rmr block_until f) s = IterationResult.Running s block_until (atomic_read_modify_read f)iterate (atomic_blocking_rmr block_until f) sโ = IterationResult.Running sโ block_until (atomic_read_modify_read f)โ (s : spec.State), iterate (atomic_blocking_rmr block_until f) s = IterationResult.Running s block_until (atomic_read_modify_read f)/-- Well founded relation on `TaskM` fulfilled by continuations with their parents. It can be used to perform well founded recursion `TaskM` without using the implementation details of `TaskM`. Whenever `TaskM.iterate` returns a continuation, the continuation will be *smaller* according to this relation. -/ inductive TaskM.is_direct_cont {Goals accomplished! ๐T :T: TypeType} :Type: Type 1TaskMTaskM: Spec โ Type โ Typespecspec: SpecT ->T: TypeTaskMTaskM: Spec โ Type โ Typespecspec: SpecT ->T: TypeProp |Prop: Typerunning {running: โ {spec : Spec} {T : Type} {p cont : TaskM spec T} {s s' : spec.State} {block_until : spec.State โ Bool}, iterate p s = IterationResult.Running s' block_until cont โ is_direct_cont cont ppp: TaskM spec Tcont :cont: TaskM spec TTaskMTaskM: Spec โ Type โ Typespecspec: SpecT} {T: Typess: ?m.10035s'} {s': ?m.10038block_until :block_until: spec.State โ Boolspec.spec: SpecState ->State: Spec โ TypeBool} (Bool: Typeiteration :iteration: iterate p s = IterationResult.Running s' block_until contp.p: TaskM spec Titerateiterate: {spec : Spec} โ {T : Type} โ TaskM spec T โ spec.State โ IterationResult spec Ts =s: ?m.10035IterationResult.RunningIterationResult.Running: {spec : Spec} โ {T : Type} โ spec.State โ (spec.State โ Bool) โ TaskM spec T โ IterationResult spec Ts's': ?m.10038block_untilblock_until: spec.State โ Boolcont) : is_direct_contcont: TaskM spec Tcontcont: TaskM spec Tp /-- See `TaskM.is_direct_cont` -/ theoremp: TaskM spec TTaskM.is_direct_cont_wf {TaskM.is_direct_cont_wf: โ {spec : Spec} {T : Type}, WellFounded is_direct_contT :T: TypeType} :Type: Type 1WellFounded (@is_direct_contWellFounded: {ฮฑ : Sort ?u.10114} โ (ฮฑ โ ฮฑ โ Prop) โ Propspecspec: SpecT) :=T: TypeWellFounded is_direct_contWellFounded is_direct_contWellFounded is_direct_cont
hAcc is_direct_cont pWellFounded is_direct_cont
h.hwfWellFounded ?m.10203
h.hAcc is_direct_cont xโWellFounded is_direct_cont
h.hwfWellFounded ?m.10203
h.hwfWellFounded ?m.10203
h.hAcc is_direct_cont xโGoals accomplished! ๐WellFounded is_direct_cont
h.hAcc is_direct_cont xโ
h.hAcc is_direct_cont xโ
h.hAcc is_direct_cont xโ
h.hAcc is_direct_cont xโ
h.hAcc is_direct_cont xโ
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
h.hAcc is_direct_cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
h.h.hโ (y : TaskM spec T), is_direct_cont y p โ Acc is_direct_cont y
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
h.h.hโ (y : TaskM spec T), is_direct_cont y p โ Acc is_direct_cont y
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
is_cont: is_direct_cont cont p
h.h.hAcc is_direct_cont cont
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
is_cont: is_direct_cont cont p
h.h.h.aimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
sโ, s'โ: spec.State
block_untilโ: spec.State โ Bool
h.h.h.a.runningimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: iterate p s = IterationResult.Running s' block_until cont
h.h.h.a.runningimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: iterate p s = IterationResult.Running s' block_until cont
h.h.h.a.runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h.h.h.a.runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h.h.h.a.runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h.h.h.a.runningimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยน: spec.State
aโ: T
h: p s = impl.IterationResult.Done aโยน aโ
h.h.h.a.running.Doneimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยน: spec.State
aโ: String
h: p s = impl.IterationResult.Panic aโยน aโ
h.h.h.a.running.Panicimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h.h.h.a.runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยน: spec.State
aโ: T
h: p s = impl.IterationResult.Done aโยน aโ
h.h.h.a.running.Doneimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยน: spec.State
aโ: String
h: p s = impl.IterationResult.Panic aโยน aโ
h.h.h.a.running.Panicimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h.h.h.a.runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
iteration: (match impl.IterationResult.Running aโยฒ aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยน: spec.State
aโ: String
iteration: (match impl.IterationResult.Panic aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h: p s = impl.IterationResult.Panic aโยน aโ
h.h.h.a.running.Panicimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
iteration: (match impl.IterationResult.Running aโยฒ aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยน: spec.State
aโ: String
h: p s = impl.IterationResult.Panic aโยน aโ
h.h.h.a.running.Panicimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยน: spec.State
aโ: String
iteration: (match impl.IterationResult.Panic aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h: p s = impl.IterationResult.Panic aโยน aโ
h.h.h.a.running.Panicimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
iteration: (match p s with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
aโยน: spec.State
aโ: String
h: p s = impl.IterationResult.Panic aโยน aโ
h.h.h.a.running.Panicimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยน: spec.State
aโ: String
iteration: (match impl.IterationResult.Panic aโยน aโ with | impl.IterationResult.Done s' t => IterationResult.Done s' t | impl.IterationResult.Panic s' msg => IterationResult.Panic s' msg | impl.IterationResult.Running s' block_until cont => IterationResult.Running s' block_until cont) = IterationResult.Running s' block_until cont
h: p s = impl.IterationResult.Panic aโยน aโ
h.h.h.a.running.Panicimpl.TaskM.is_direct_cont cont pGoals accomplished! ๐
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
cont'_def: aโ = cont
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
cont'_def: aโ = cont
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน aโ
cont'_def: aโ = cont
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน cont
cont'_def: aโ = cont
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน cont
cont'_def: aโ = cont
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont pspec: Spec
T: Type
p: impl.TaskM spec T
IH: โ (y : impl.TaskM spec T), impl.TaskM.is_direct_cont y p โ Acc is_direct_cont y
cont: TaskM spec T
s, s': spec.State
block_until: spec.State โ Bool
aโยฒ: spec.State
aโยน: spec.State โ Bool
aโ: spec.State โ impl.IterationResult spec T
h: p s = impl.IterationResult.Running aโยฒ aโยน cont
cont'_def: aโ = cont
h.h.h.a.running.Runningimpl.TaskM.is_direct_cont cont p
h.hAcc is_direct_cont xโinstanceGoals accomplished! ๐TaskM.instWf {TaskM.instWf: {spec : Spec} โ {T : Type} โ WellFoundedRelation (TaskM spec T)T :T: TypeType} :Type: Type 1WellFoundedRelation (WellFoundedRelation: Sort ?u.10763 โ Sort (max 1 ?u.10763)TaskMTaskM: Spec โ Type โ Typespecspec: SpecT) where rel :=is_direct_cont wf :=T: Typeis_direct_cont_wf end Mtis_direct_cont_wf: โ {spec : Spec} {T : Type}, WellFounded is_direct_cont