import Mt.Reservation namespace Mt.TaskM.impl inductiveIterationResult (IterationResult: Spec → Type → Sort ?u.5spec :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.5specspec: 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.5specspec: SpecT |T: TypeRunning :Running: {spec : Spec} → {T : Type} → spec.State → (spec.State → Bool) → (spec.State → IterationResult spec T) → IterationResult spec Tspec.spec: SpecState -> (State: Spec → Typespec.spec: SpecState ->State: Spec → TypeBool) -> (Bool: Typespec.spec: SpecState ->State: Spec → TypeIterationResultIterationResult: Spec → Type → Sort ?u.5specspec: SpecT) ->T: TypeIterationResultIterationResult: Spec → Type → Sort ?u.5specspec: SpecT defT: TypeTaskM (TaskM: (spec : Spec) → (T : Type) → ?m.1237 spec Tspec :spec: SpecSpec) (Spec: Type 1T :T: TypeType) :=Type: Type 1spec.spec: SpecState ->State: Spec → TypeIterationResultIterationResult: Spec → Type → Typespecspec: SpecT namespace TaskM variable {T: Typespec :spec: SpecSpec} def atomic_read_modify_read (Spec: Type 1f :f: spec.State → T × spec.Statespec.spec: SpecState ->State: Spec → TypeT ×T: ?m.1264spec.spec: SpecState) :State: Spec → TypeTaskMTaskM: Spec → Type → Typespecspec: SpecT |T: ?m.1264s => matchs: ?m.1282ff: spec.State → T × spec.States with | ⟨s: ?m.1282t,t: Ts'⟩ =>s': spec.StateIterationResult.DoneIterationResult.Done: {spec : Spec} → {T : Type} → spec.State → T → IterationResult spec Ts's': spec.Statet def panic {t: TT :T: TypeType} (Type: Type 1msg :msg: StringString) :String: TypeTaskMTaskM: Spec → Type → Typespecspec: SpecT |T: Types =>s: ?m.1496IterationResult.PanicIterationResult.Panic: {spec : Spec} → {T : Type} → spec.State → String → IterationResult spec Tss: ?m.1496msg def atomic_assert (msg: Stringcond :cond: spec.State → Boolspec.spec: SpecState ->State: Spec → TypeBool) :Bool: TypeTaskMTaskM: Spec → Type → Typespecspec: SpecUnit |Unit: Types => ifs: ?m.1564condcond: spec.State → Bools thens: ?m.1564IterationResult.DoneIterationResult.Done: {spec : Spec} → {T : Type} → spec.State → T → IterationResult spec Tss: ?m.1564⟨⟩ else⟨⟩: PUnitIterationResult.PanicIterationResult.Panic: {spec : Spec} → {T : Type} → spec.State → String → IterationResult spec Tss: ?m.1564"Assertion failed" def"Assertion failed": Stringatomic_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.1745spec.spec: SpecState) :State: Spec → TypeTaskMTaskM: Spec → Type → Typespecspec: SpecT |T: ?m.1745s =>s: ?m.1769IterationResult.RunningIterationResult.Running: {spec : Spec} → {T : Type} → spec.State → (spec.State → Bool) → (spec.State → IterationResult spec T) → IterationResult spec Tss: ?m.1769block_until (atomic_read_modify_readblock_until: spec.State → Boolf) inductive is_direct_cont {f: spec.State → T × spec.StateT :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}, 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.1878s'} {s': ?m.1881block_until :block_until: spec.State → Boolspec.spec: SpecState ->State: Spec → TypeBool} (Bool: Typeiteration :iteration: p s = IterationResult.Running s' block_until contpp: TaskM spec Ts =s: ?m.1878IterationResult.RunningIterationResult.Running: {spec : Spec} → {T : Type} → spec.State → (spec.State → Bool) → (spec.State → IterationResult spec T) → IterationResult spec Ts's': ?m.1881block_untilblock_until: spec.State → Boolcont) : is_direct_contcont: TaskM spec Tcontcont: TaskM spec Tp theoremp: TaskM spec Tis_direct_cont.wf {is_direct_cont.wf: ∀ {spec : Spec} {T : Type}, WellFounded is_direct_contT :T: TypeType} :Type: Type 1WellFounded (@is_direct_contWellFounded: {α : Sort ?u.1952} → (α → α → Prop) → Propspecspec: SpecT) :=T: TypeWellFounded is_direct_contWellFounded is_direct_contWellFounded is_direct_cont
h.h∀ (y : TaskM spec T), is_direct_cont y p → Acc is_direct_cont yWellFounded is_direct_cont
h.hAcc is_direct_cont contWellFounded is_direct_contWellFounded is_direct_contWellFounded is_direct_contwhereGoals accomplished! 🐙helper (helper: ∀ (it : IterationResult spec T) (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, it = IterationResult.Running s block_until p → Acc is_direct_cont pit :it: IterationResult spec TIterationResultIterationResult: Spec → Type → Typespecspec: SpecT) (T: Typep :p: TaskM spec TTaskMTaskM: Spec → Type → Typespecspec: SpecT) {T: Typess: ?m.1965block_until} :block_until: ?m.1968it =it: IterationResult spec TIterationResult.RunningIterationResult.Running: {spec : Spec} → {T : Type} → spec.State → (spec.State → Bool) → (spec.State → IterationResult spec T) → IterationResult spec Tss: ?m.1965block_untilblock_until: ?m.1968p →p: TaskM spec TAcc is_direct_contAcc: {α : Sort ?u.1985} → (α → α → Prop) → α → Propp :=p: TaskM spec Tspec: Spec
T: Type
it: IterationResult spec T
p: TaskM spec T
s: spec.State
block_until: spec.State → Boolit = IterationResult.Running s block_until p → Acc is_direct_cont p∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, it = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
it: IterationResult spec T
p: TaskM spec T
s: spec.State
block_until: spec.State → Boolit = IterationResult.Running s block_until p → Acc is_direct_cont p
Done∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
it: IterationResult spec T
p: TaskM spec T
s: spec.State
block_until: spec.State → Boolit = IterationResult.Running s block_until p → Acc is_direct_cont p
Done∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Done∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Done∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Done∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pGoals accomplished! 🐙spec: Spec
T: Type
it: IterationResult spec T
p: TaskM spec T
s: spec.State
block_until: spec.State → Boolit = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Panic∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pGoals accomplished! 🐙spec: Spec
T: Type
it: IterationResult spec T
p: TaskM spec T
s: spec.State
block_until: spec.State → Boolit = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
a✝²: spec.State
a✝¹: spec.State → Bool
a✝: spec.State → IterationResult spec T
p: TaskM spec T
s: spec.State
bu: spec.State → Bool
h: IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s bu p
RunningAcc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p' a = IterationResult.Running s block_until p → Acc is_direct_cont p
p: TaskM spec T
s: spec.State
bu: spec.State → Bool
h: IterationResult.Running s' bu' p' = IterationResult.Running s bu p
RunningAcc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p' a = IterationResult.Running s block_until p → Acc is_direct_cont p
p: TaskM spec T
s: spec.State
bu: spec.State → Bool
RunningAcc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p' a = IterationResult.Running s block_until p → Acc is_direct_cont p
p: TaskM spec T
s: spec.State
bu: spec.State → Bool
RunningAcc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p' a = IterationResult.Running s block_until p → Acc is_direct_cont p
p: TaskM spec T
s: spec.State
bu: spec.State → Bool
h: p' = p
RunningAcc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p' a = IterationResult.Running s block_until p → Acc is_direct_cont p
p: TaskM spec T
s: spec.State
bu: spec.State → Bool
h: p' = p
RunningAcc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p' a = IterationResult.Running s block_until p → Acc is_direct_cont p
p: TaskM spec T
s: spec.State
bu: spec.State → Bool
h: p' = p
RunningAcc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
RunningAcc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
RunningAcc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
RunningAcc is_direct_cont p
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
Running.h∀ (y : TaskM spec T), is_direct_cont y p → Acc is_direct_cont y
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
cont: TaskM spec T
is_cont: is_direct_cont cont p
Running.hAcc is_direct_cont cont
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
cont: TaskM spec T
is_cont: is_direct_cont cont p
Running.hAcc is_direct_cont cont
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
cont: TaskM spec T
s✝, s'✝: spec.State
block_until✝: spec.State → Bool
Running.h.runningAcc is_direct_cont cont
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
h: p' = p
cont: TaskM spec T
s✝, s'✝: spec.State
block_until✝: spec.State → Bool
Running.h.runningAcc is_direct_cont cont
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pspec: Spec
T: Type
s': spec.State
bu': spec.State → Bool
p': spec.State → IterationResult spec T
p: TaskM spec T
IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, p a = IterationResult.Running s block_until p_1 → Acc is_direct_cont p_1
s: spec.State
bu: spec.State → Bool
cont: TaskM spec T
s✝, s'✝: spec.State
block_until✝: spec.State → Bool
h: p s✝ = IterationResult.Running s'✝ block_until✝ cont
Running.h.runningAcc is_direct_cont cont
Running∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.State → Bool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until p → Acc is_direct_cont pinstanceGoals accomplished! 🐙instWf {instWf: {T : Type} → WellFoundedRelation (TaskM spec T)T :T: TypeType} :Type: Type 1WellFoundedRelation (WellFoundedRelation: Sort ?u.2740 → Sort (max 1 ?u.2740)TaskMTaskM: Spec → Type → Typespecspec: SpecT) where rel :=is_direct_cont wf :=T: Typeis_direct_cont.wf def pure {is_direct_cont.wf: ∀ {spec : Spec} {T : Type}, WellFounded is_direct_contT :T: TypeType} (Type: Type 1t :t: TT) :T: TypeTaskMTaskM: Spec → Type → Typespecspec: SpecT := λT: Types =>s: ?m.2825IterationResult.DoneIterationResult.Done: {spec : Spec} → {T : Type} → spec.State → T → IterationResult spec Tss: ?m.2825t deft: Tbind {bind: {spec : Spec} → {U V : Type} → (_ : TaskM spec U) ×' (_ : U → TaskM spec V) ×' spec.State → IterationResult spec VUU: 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: TypeTaskMTaskM: Spec → Type → Typespecspec: SpecV := λV: Types => matchs: ?m.2891h :h: mu s = IterationResult.Done s' umumu: TaskM spec Us with |s: ?m.2891IterationResult.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) → (spec.State → IterationResult spec T) → IterationResult spec Ts' (λs': spec.State_ =>_: ?m.2922true) (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) → (spec.State → IterationResult spec T) → IterationResult spec Ts's': spec.Stateblock_untilblock_until: spec.State → Boolcont => have : is_direct_contcont: spec.State → IterationResult spec Ucontcont: spec.State → IterationResult spec Umu :=⟨mu: TaskM spec Uh⟩h: mu s = IterationResult.Running s' block_until contIterationResult.RunningIterationResult.Running: {spec : Spec} → {T : Type} → spec.State → (spec.State → Bool) → (spec.State → IterationResult spec T) → IterationResult spec Ts's': spec.Stateblock_until (bindblock_until: spec.State → Boolcontcont: spec.State → IterationResult spec Uf) termination_by bind =>f: U → TaskM spec Vmu theoremmu: TaskM spec Ubind_def {bind_def: ∀ {U V : Type} {spec : Spec} {mu : TaskM spec U} {f : U → TaskM spec V} {s : spec.State}, bind mu f s = let _discr := mu s; match 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 (bind cont f)UU: ?m.4332VV: Typespec} {spec: ?m.4338mu :mu: TaskM spec UTaskMTaskM: Spec → Type → Typespecspec: ?m.4338U} {U: ?m.4332f :f: U → TaskM spec VU ->U: ?m.4332TaskMTaskM: Spec → Type → Typespecspec: ?m.4338V} {V: ?m.4335s} : (binds: spec.Statemumu: TaskM spec Uf)f: U → TaskM spec Vs = matchs: ?m.4348mumu: TaskM spec Us with |s: ?m.4348IterationResult.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) → (spec.State → IterationResult spec T) → IterationResult spec Ts' (λs': spec.State_ =>_: ?m.4400true) (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) → (spec.State → IterationResult spec T) → IterationResult spec Ts's': spec.Stateblock_untilblock_until: spec.State → Boolcont =>cont: spec.State → IterationResult spec UIterationResult.RunningIterationResult.Running: {spec : Spec} → {T : Type} → spec.State → (spec.State → Bool) → (spec.State → IterationResult spec T) → IterationResult spec Ts's': spec.Stateblock_until (bindblock_until: spec.State → Boolcontcont: spec.State → IterationResult spec Uf) :=f: U → TaskM spec Vbind mu f s = let _discr := mu s; match 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 (bind cont f)(match h : 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 (bind cont f)) = match 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 (bind cont f)bind mu f s = let _discr := mu s; match 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 (bind cont f)
Done(match h : IterationResult.Done a✝¹ a✝ 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 (bind cont f)) = match IterationResult.Done a✝¹ a✝ 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 (bind cont f)
Panic(match h : IterationResult.Panic a✝¹ a✝ 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 (bind cont f)) = match IterationResult.Panic a✝¹ a✝ 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 (bind cont f)spec✝: Spec
U, V: Type
spec: Spec
mu: TaskM spec U
f: U → TaskM spec V
s, a✝²: spec.State
a✝¹: spec.State → Bool
a✝: spec.State → IterationResult spec U
Running(match h : IterationResult.Running a✝² a✝¹ a✝ 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 (bind cont f)) = match IterationResult.Running a✝² a✝¹ a✝ 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 (bind cont f)(match h : 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 (bind cont f)) = match 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 (bind cont f)
Done(match h : IterationResult.Done a✝¹ a✝ 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 (bind cont f)) = match IterationResult.Done a✝¹ a✝ 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 (bind cont f)
Panic(match h : IterationResult.Panic a✝¹ a✝ 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 (bind cont f)) = match IterationResult.Panic a✝¹ a✝ 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 (bind cont f)spec✝: Spec
U, V: Type
spec: Spec
mu: TaskM spec U
f: U → TaskM spec V
s, a✝²: spec.State
a✝¹: spec.State → Bool
a✝: spec.State → IterationResult spec U
Running(match h : IterationResult.Running a✝² a✝¹ a✝ 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 (bind cont f)) = match IterationResult.Running a✝² a✝¹ a✝ 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 (bind cont f)(match h : 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 (bind cont f)) = match 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 (bind cont f)theoremGoals accomplished! 🐙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.bind (funmu: TaskM spec Uu => (u: ?m.6763ff: U → TaskM spec Vu).bindu: ?m.6763g) = (g: V → TaskM spec Wmu.bindmu: TaskM spec Uf).bindf: U → TaskM spec Vg :=g: V → TaskM spec W
h(match mu s0 with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match mu s0 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, a✝¹: spec.State
a✝: U
h.Done(match IterationResult.Done a✝¹ a✝ with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match IterationResult.Done a✝¹ a✝ 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, a✝¹: spec.State
a✝: String
h.Panic(match IterationResult.Panic a✝¹ a✝ with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match IterationResult.Panic a✝¹ a✝ 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, a✝²: spec.State
a✝¹: spec.State → Bool
a✝: spec.State → IterationResult spec U
h.Running(match IterationResult.Running a✝² a✝¹ a✝ with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match IterationResult.Running a✝² a✝¹ a✝ 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)
h(match mu s0 with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match mu s0 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, a✝¹: spec.State
a✝: U
h.Done(match IterationResult.Done a✝¹ a✝ with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match IterationResult.Done a✝¹ a✝ 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, a✝¹: spec.State
a✝: String
h.Panic(match IterationResult.Panic a✝¹ a✝ with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match IterationResult.Panic a✝¹ a✝ 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, a✝²: spec.State
a✝¹: spec.State → Bool
a✝: spec.State → IterationResult spec U
h.Running(match IterationResult.Running a✝² a✝¹ a✝ with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match IterationResult.Running a✝² a✝¹ a✝ 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)
h(match mu s0 with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match mu s0 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, a✝¹: spec.State
a✝: U
h.Done(match IterationResult.Done a✝¹ a✝ with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match IterationResult.Done a✝¹ a✝ 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)Goals accomplished! 🐙spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, s': spec.State
block_until: spec.State → Bool
cont: spec.State → IterationResult spec U
IH: ∀ (a : spec.State), (match cont a with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match cont a 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)
h.Running(match IterationResult.Running s' block_until cont with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, s': spec.State
block_until: spec.State → Bool
cont: spec.State → IterationResult spec U
IH: ∀ (a : spec.State), (match cont a with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (bind (f u) g) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont fun u => bind (f u) g)) = match match cont a 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 (bind cont f) with | IterationResult.Done s' u => IterationResult.Running s' (fun x => true) (g u) | IterationResult.Panic s' msg => IterationResult.Panic s' msg | IterationResult.Running s' block_until cont => IterationResult.Running s' block_until (bind cont g)
h.RunningIterationResult.Running s' block_until (bind cont fun u => bind (f u) g) = IterationResult.Running s' block_until (bind (bind cont f) g)spec: Spec
U, V, W: Type
mu: TaskM spec U
f: U → TaskM spec V
g: V → TaskM spec W
s0, s': spec.State
block_until: spec.State → Bool
cont: spec.State → IterationResult spec U
IH: ∀ (a : spec.State), bind cont (fun u => bind (f u) g) a = bind (bind cont fun u => f u) (fun u => g u) a
h.RunningIterationResult.Running s' block_until (bind cont fun u => bind (f u) g) = IterationResult.Running s' block_until (bind (bind cont f) g)end TaskM end Mt.TaskM.implGoals accomplished! 🐙