Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+🖱️to focus. On Mac, use Cmdinstead of Ctrl. Style: centered; floating; windowed.
import Mt.Reservation

namespace Mt.TaskM.impl

inductive 
IterationResult: SpecTypeSort ?u.5
IterationResult
(
spec: Spec
spec
:
Spec: Type 1
Spec
) (
T: Type
T
:
Type: Type 1
Type
) |
Done: {spec : Spec} → {T : Type} → spec.StateTIterationResult spec T
Done
:
spec: Spec
spec
.
State: SpecType
State
->
T: Type
T
->
IterationResult: SpecTypeSort ?u.5
IterationResult
spec: Spec
spec
T: Type
T
|
Panic: {spec : Spec} → {T : Type} → spec.StateStringIterationResult spec T
Panic
:
spec: Spec
spec
.
State: SpecType
State
->
String: Type
String
->
IterationResult: SpecTypeSort ?u.5
IterationResult
spec: Spec
spec
T: Type
T
|
Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
Running
:
spec: Spec
spec
.
State: SpecType
State
-> (
spec: Spec
spec
.
State: SpecType
State
->
Bool: Type
Bool
) -> (
spec: Spec
spec
.
State: SpecType
State
->
IterationResult: SpecTypeSort ?u.5
IterationResult
spec: Spec
spec
T: Type
T
) ->
IterationResult: SpecTypeSort ?u.5
IterationResult
spec: Spec
spec
T: Type
T
def
TaskM: (spec : Spec) → (T : Type) → ?m.1237 spec T
TaskM
(
spec: Spec
spec
:
Spec: Type 1
Spec
) (
T: Type
T
:
Type: Type 1
Type
) :=
spec: Spec
spec
.
State: SpecType
State
->
IterationResult: SpecTypeType
IterationResult
spec: Spec
spec
T: Type
T
namespace TaskM variable {
spec: Spec
spec
:
Spec: Type 1
Spec
} def
atomic_read_modify_read: {spec : Spec} → {T : Type} → (spec.StateT × spec.State) → TaskM spec T
atomic_read_modify_read
(
f: spec.StateT × spec.State
f
:
spec: Spec
spec
.
State: SpecType
State
->
T: ?m.1264
T
×
spec: Spec
spec
.
State: SpecType
State
) :
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: ?m.1264
T
|
s: ?m.1282
s
=> match
f: spec.StateT × spec.State
f
s: ?m.1282
s
with | ⟨
t: T
t
,
s': spec.State
s'
⟩ =>
IterationResult.Done: {spec : Spec} → {T : Type} → spec.StateTIterationResult spec T
IterationResult.Done
s': spec.State
s'
t: T
t
def
panic: {T : Type} → StringTaskM spec T
panic
{
T: Type
T
:
Type: Type 1
Type
} (
msg: String
msg
:
String: Type
String
) :
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
|
s: ?m.1496
s
=>
IterationResult.Panic: {spec : Spec} → {T : Type} → spec.StateStringIterationResult spec T
IterationResult.Panic
s: ?m.1496
s
msg: String
msg
def
atomic_assert: (spec.StateBool) → TaskM spec Unit
atomic_assert
(
cond: spec.StateBool
cond
:
spec: Spec
spec
.
State: SpecType
State
->
Bool: Type
Bool
) :
TaskM: SpecTypeType
TaskM
spec: Spec
spec
Unit: Type
Unit
|
s: ?m.1564
s
=> if
cond: spec.StateBool
cond
s: ?m.1564
s
then
IterationResult.Done: {spec : Spec} → {T : Type} → spec.StateTIterationResult spec T
IterationResult.Done
s: ?m.1564
s
⟨⟩: PUnit
⟨⟩
else
IterationResult.Panic: {spec : Spec} → {T : Type} → spec.StateStringIterationResult spec T
IterationResult.Panic
s: ?m.1564
s
"Assertion failed": String
"Assertion failed"
def
atomic_blocking_rmr: {spec : Spec} → {T : Type} → (spec.StateBool) → (spec.StateT × spec.State) → TaskM spec T
atomic_blocking_rmr
(
block_until: spec.StateBool
block_until
:
spec: Spec
spec
.
State: SpecType
State
->
Bool: Type
Bool
) (
f: spec.StateT × spec.State
f
:
spec: Spec
spec
.
State: SpecType
State
->
T: ?m.1745
T
×
spec: Spec
spec
.
State: SpecType
State
) :
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: ?m.1745
T
|
s: ?m.1769
s
=>
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s: ?m.1769
s
block_until: spec.StateBool
block_until
(
atomic_read_modify_read: {spec : Spec} → {T : Type} → (spec.StateT × spec.State) → TaskM spec T
atomic_read_modify_read
f: spec.StateT × spec.State
f
) inductive
is_direct_cont: {T : Type} → TaskM spec TTaskM spec TProp
is_direct_cont
{
T: Type
T
:
Type: Type 1
Type
} :
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
->
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
->
Prop: Type
Prop
|
running: ∀ {spec : Spec} {T : Type} {p cont : TaskM spec T} {s s' : spec.State} {block_until : spec.StateBool}, p s = IterationResult.Running s' block_until contis_direct_cont cont p
running
{
p: TaskM spec T
p
cont: TaskM spec T
cont
:
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
} {
s: ?m.1878
s
s': ?m.1881
s'
} {
block_until: spec.StateBool
block_until
:
spec: Spec
spec
.
State: SpecType
State
->
Bool: Type
Bool
} (
iteration: p s = IterationResult.Running s' block_until cont
iteration
:
p: TaskM spec T
p
s: ?m.1878
s
=
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s': ?m.1881
s'
block_until: spec.StateBool
block_until
cont: TaskM spec T
cont
) :
is_direct_cont: {T : Type} → TaskM spec TTaskM spec TProp
is_direct_cont
cont: TaskM spec T
cont
p: TaskM spec T
p
theorem
is_direct_cont.wf: ∀ {spec : Spec} {T : Type}, WellFounded is_direct_cont
is_direct_cont.wf
{
T: Type
T
:
Type: Type 1
Type
} :
WellFounded: {α : Sort ?u.1952} → (ααProp) → Prop
WellFounded
(@
is_direct_cont: {spec : Spec} → {T : Type} → TaskM spec TTaskM spec TProp
is_direct_cont
spec: Spec
spec
T: Type
T
) :=
spec: Spec

T: Type


WellFounded is_direct_cont
spec: Spec

T: Type


h
∀ (a : TaskM spec T), Acc is_direct_cont a
spec: Spec

T: Type


WellFounded is_direct_cont
spec: Spec

T: Type

p: TaskM spec T


h
Acc is_direct_cont p
spec: Spec

T: Type


WellFounded is_direct_cont
spec: Spec

T: Type

p: TaskM spec T


h.h
∀ (y : TaskM spec T), is_direct_cont y pAcc is_direct_cont y
spec: Spec

T: Type


WellFounded is_direct_cont
spec: Spec

T: Type

p, cont: TaskM spec T

is_cont: is_direct_cont cont p


h.h
Acc is_direct_cont cont
spec: Spec

T: Type


WellFounded is_direct_cont
spec: Spec

T: Type

p, cont: TaskM spec T

s✝, s'✝: spec.State

block_until✝: spec.StateBool


h.h.running
Acc is_direct_cont cont
spec: Spec

T: Type


WellFounded is_direct_cont
spec: Spec

T: Type

p, cont: TaskM spec T

s, s': spec.State

bu: spec.StateBool

iteration: p s = IterationResult.Running s' bu cont


h.h.running
Acc is_direct_cont cont
spec: Spec

T: Type


WellFounded is_direct_cont

Goals accomplished! 🐙
where
helper: ∀ (it : IterationResult spec T) (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, it = IterationResult.Running s block_until pAcc is_direct_cont p
helper
(
it: IterationResult spec T
it
:
IterationResult: SpecTypeType
IterationResult
spec: Spec
spec
T: Type
T
) (
p: TaskM spec T
p
:
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
) {
s: ?m.1965
s
block_until: ?m.1968
block_until
} :
it: IterationResult spec T
it
=
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s: ?m.1965
s
block_until: ?m.1968
block_until
p: TaskM spec T
p
Acc: {α : Sort ?u.1985} → (ααProp) → αProp
Acc
is_direct_cont: {spec : Spec} → {T : Type} → TaskM spec TTaskM spec TProp
is_direct_cont
p: TaskM spec T
p
:=
spec: Spec

T: Type

it: IterationResult spec T

p: TaskM spec T

s: spec.State

block_until: spec.StateBool


it = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

it: IterationResult spec T


∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, it = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

it: IterationResult spec T

p: TaskM spec T

s: spec.State

block_until: spec.StateBool


it = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: T


Done
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

it: IterationResult spec T

p: TaskM spec T

s: spec.State

block_until: spec.StateBool


it = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: T


Done
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: T


Done
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: T

p✝: TaskM spec T

s✝: spec.State

block_until✝: spec.StateBool


Done
Acc is_direct_cont p✝
spec: Spec

T: Type

a✝¹: spec.State

a✝: T


Done
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: T

p✝: TaskM spec T

s✝: spec.State

block_until✝: spec.StateBool


Done
Acc is_direct_cont p✝
spec: Spec

T: Type

a✝¹: spec.State

a✝: T


Done
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Done a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p

Goals accomplished! 🐙
spec: Spec

T: Type

it: IterationResult spec T

p: TaskM spec T

s: spec.State

block_until: spec.StateBool


it = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: String

p✝: TaskM spec T

s✝: spec.State

block_until✝: spec.StateBool


Panic
Acc is_direct_cont p✝
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: String

p✝: TaskM spec T

s✝: spec.State

block_until✝: spec.StateBool


Panic
Acc is_direct_cont p✝
spec: Spec

T: Type

a✝¹: spec.State

a✝: String


Panic
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Panic a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p

Goals accomplished! 🐙
spec: Spec

T: Type

it: IterationResult spec T

p: TaskM spec T

s: spec.State

block_until: spec.StateBool


it = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T

p: TaskM spec T

s: spec.State

bu: spec.StateBool

h: IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s bu p


Running
Acc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p' a = IterationResult.Running s block_until pAcc is_direct_cont p

p: TaskM spec T

s: spec.State

bu: spec.StateBool

h: IterationResult.Running s' bu' p' = IterationResult.Running s bu p


Running
Acc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p' a = IterationResult.Running s block_until pAcc is_direct_cont p

p: TaskM spec T

s: spec.State

bu: spec.StateBool


Running
Acc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p' a = IterationResult.Running s block_until pAcc is_direct_cont p

p: TaskM spec T

s: spec.State

bu: spec.StateBool


Running
Acc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p' a = IterationResult.Running s block_until pAcc is_direct_cont p

p: TaskM spec T

s: spec.State

bu: spec.StateBool

h: p' = p


Running
Acc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p' a = IterationResult.Running s block_until pAcc is_direct_cont p

p: TaskM spec T

s: spec.State

bu: spec.StateBool

h: p' = p


Running
Acc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

IH: ∀ (a : spec.State) (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p' a = IterationResult.Running s block_until pAcc is_direct_cont p

p: TaskM spec T

s: spec.State

bu: spec.StateBool

h: p' = p


Running
Acc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p


Running
Acc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p


Running
Acc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p


Running
Acc is_direct_cont p
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p


Running.h
∀ (y : TaskM spec T), is_direct_cont y pAcc is_direct_cont y
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p

cont: TaskM spec T

is_cont: is_direct_cont cont p


Running.h
Acc is_direct_cont cont
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p

cont: TaskM spec T

is_cont: is_direct_cont cont p


Running.h
Acc is_direct_cont cont
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p

cont: TaskM spec T

s✝, s'✝: spec.State

block_until✝: spec.StateBool


Running.h.running
Acc is_direct_cont cont
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

h: p' = p

cont: TaskM spec T

s✝, s'✝: spec.State

block_until✝: spec.StateBool


Running.h.running
Acc is_direct_cont cont
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p
spec: Spec

T: Type

s': spec.State

bu': spec.StateBool

p': spec.StateIterationResult spec T

p: TaskM spec T

IH: ∀ (a : spec.State) (p_1 : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, p a = IterationResult.Running s block_until p_1Acc is_direct_cont p_1

s: spec.State

bu: spec.StateBool

cont: TaskM spec T

s✝, s'✝: spec.State

block_until✝: spec.StateBool

h: p s✝ = IterationResult.Running s'✝ block_until✝ cont


Running.h.running
Acc is_direct_cont cont
spec: Spec

T: Type

a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult spec T


Running
∀ (p : TaskM spec T) {s : spec.State} {block_until : spec.StateBool}, IterationResult.Running a✝² a✝¹ a✝ = IterationResult.Running s block_until pAcc is_direct_cont p

Goals accomplished! 🐙
instance
instWf: {T : Type} → WellFoundedRelation (TaskM spec T)
instWf
{
T: Type
T
:
Type: Type 1
Type
} :
WellFoundedRelation: Sort ?u.2740Sort (max 1 ?u.2740)
WellFoundedRelation
(
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
) where rel :=
is_direct_cont: {spec : Spec} → {T : Type} → TaskM spec TTaskM spec TProp
is_direct_cont
wf :=
is_direct_cont.wf: ∀ {spec : Spec} {T : Type}, WellFounded is_direct_cont
is_direct_cont.wf
def
pure: {spec : Spec} → {T : Type} → TTaskM spec T
pure
{
T: Type
T
:
Type: Type 1
Type
} (
t: T
t
:
T: Type
T
) :
TaskM: SpecTypeType
TaskM
spec: Spec
spec
T: Type
T
:= λ
s: ?m.2825
s
=>
IterationResult.Done: {spec : Spec} → {T : Type} → spec.StateTIterationResult spec T
IterationResult.Done
s: ?m.2825
s
t: T
t
def
bind: {spec : Spec} → {U V : Type} → (_ : TaskM spec U) ×' (_ : UTaskM spec V) ×' spec.StateIterationResult spec V
bind
{
U: Type
U
V: Type
V
:
Type: Type 1
Type
} (
mu: TaskM spec U
mu
:
TaskM: SpecTypeType
TaskM
spec: Spec
spec
U: Type
U
) (
f: UTaskM spec V
f
:
U: Type
U
->
TaskM: SpecTypeType
TaskM
spec: Spec
spec
V: Type
V
) :
TaskM: SpecTypeType
TaskM
spec: Spec
spec
V: Type
V
:= λ
s: ?m.2891
s
=> match
h: mu s = IterationResult.Done s' u
h
:
mu: TaskM spec U
mu
s: ?m.2891
s
with |
IterationResult.Done: {spec : Spec} → {T : Type} → spec.StateTIterationResult spec T
IterationResult.Done
s': spec.State
s'
u: U
u
=>
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s': spec.State
s'
_: ?m.2922
_
=>
true: Bool
true
) (
f: UTaskM spec V
f
u: U
u
) |
IterationResult.Panic: {spec : Spec} → {T : Type} → spec.StateStringIterationResult spec T
IterationResult.Panic
s': spec.State
s'
msg: String
msg
=>
IterationResult.Panic: {spec : Spec} → {T : Type} → spec.StateStringIterationResult spec T
IterationResult.Panic
s': spec.State
s'
msg: String
msg
|
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s': spec.State
s'
block_until: spec.StateBool
block_until
cont: spec.StateIterationResult spec U
cont
=> have :
is_direct_cont: {spec : Spec} → {T : Type} → TaskM spec TTaskM spec TProp
is_direct_cont
cont: spec.StateIterationResult spec U
cont
mu: TaskM spec U
mu
:=⟨
h: mu s = IterationResult.Running s' block_until cont
h
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s': spec.State
s'
block_until: spec.StateBool
block_until
(
bind: {U V : Type} → TaskM spec U(UTaskM spec V) → TaskM spec V
bind
cont: spec.StateIterationResult spec U
cont
f: UTaskM spec V
f
) termination_by bind =>
mu: TaskM spec U
mu
theorem
bind_def: ∀ {U V : Type} {spec : Spec} {mu : TaskM spec U} {f : UTaskM 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)
bind_def
{
U: ?m.4332
U
V: Type
V
spec: ?m.4338
spec
} {
mu: TaskM spec U
mu
:
TaskM: SpecTypeType
TaskM
spec: ?m.4338
spec
U: ?m.4332
U
} {
f: UTaskM spec V
f
:
U: ?m.4332
U
->
TaskM: SpecTypeType
TaskM
spec: ?m.4338
spec
V: ?m.4335
V
} {
s: spec.State
s
} : (
bind: {spec : Spec} → {U V : Type} → TaskM spec U(UTaskM spec V) → TaskM spec V
bind
mu: TaskM spec U
mu
f: UTaskM spec V
f
)
s: ?m.4348
s
= match
mu: TaskM spec U
mu
s: ?m.4348
s
with |
IterationResult.Done: {spec : Spec} → {T : Type} → spec.StateTIterationResult spec T
IterationResult.Done
s': spec.State
s'
u: U
u
=>
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s': spec.State
s'
_: ?m.4400
_
=>
true: Bool
true
) (
f: UTaskM spec V
f
u: U
u
) |
IterationResult.Panic: {spec : Spec} → {T : Type} → spec.StateStringIterationResult spec T
IterationResult.Panic
s': spec.State
s'
msg: String
msg
=>
IterationResult.Panic: {spec : Spec} → {T : Type} → spec.StateStringIterationResult spec T
IterationResult.Panic
s': spec.State
s'
msg: String
msg
|
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s': spec.State
s'
block_until: spec.StateBool
block_until
cont: spec.StateIterationResult spec U
cont
=>
IterationResult.Running: {spec : Spec} → {T : Type} → spec.State(spec.StateBool) → (spec.StateIterationResult spec T) → IterationResult spec T
IterationResult.Running
s': spec.State
s'
block_until: spec.StateBool
block_until
(
bind: {spec : Spec} → {U V : Type} → TaskM spec U(UTaskM spec V) → TaskM spec V
bind
cont: spec.StateIterationResult spec U
cont
f: UTaskM spec V
f
) :=
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM 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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM spec V

s: spec.State


(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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM 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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM spec V

s, a✝¹: spec.State

a✝: U


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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM spec V

s, a✝¹: spec.State

a✝: String


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: UTaskM spec V

s, a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult 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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM spec V

s: spec.State


(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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM spec V

s, a✝¹: spec.State

a✝: U


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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM spec V

s, a✝¹: spec.State

a✝: String


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: UTaskM spec V

s, a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult 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)
spec✝: Spec

U, V: Type

spec: Spec

mu: TaskM spec U

f: UTaskM spec V

s: spec.State


(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)

Goals accomplished! 🐙
theorem
bind_assoc: ∀ {spec : Spec} {U V W : Type} (mu : TaskM spec U) (f : UTaskM spec V) (g : VTaskM spec W), (bind mu fun u => bind (f u) g) = bind (bind mu f) g
bind_assoc
{
U: Type
U
V: Type
V
W: Type
W
:
Type: Type 1
Type
} (
mu: TaskM spec U
mu
:
TaskM: SpecTypeType
TaskM
spec: Spec
spec
U: Type
U
) (
f: UTaskM spec V
f
:
U: Type
U
->
TaskM: SpecTypeType
TaskM
spec: Spec
spec
V: Type
V
) (
g: VTaskM spec W
g
:
V: Type
V
->
TaskM: SpecTypeType
TaskM
spec: Spec
spec
W: Type
W
) :
mu: TaskM spec U
mu
.
bind: {spec : Spec} → {U V : Type} → TaskM spec U(UTaskM spec V) → TaskM spec V
bind
(fun
u: ?m.6763
u
=> (
f: UTaskM spec V
f
u: ?m.6763
u
).
bind: {spec : Spec} → {U V : Type} → TaskM spec U(UTaskM spec V) → TaskM spec V
bind
g: VTaskM spec W
g
) = (
mu: TaskM spec U
mu
.
bind: {spec : Spec} → {U V : Type} → TaskM spec U(UTaskM spec V) → TaskM spec V
bind
f: UTaskM spec V
f
).
bind: {spec : Spec} → {U V : Type} → TaskM spec U(UTaskM spec V) → TaskM spec V
bind
g: VTaskM spec W
g
:=
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


h
∀ (x : spec.State), bind mu (fun u => bind (f u) g) x = bind (bind mu f) g x
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


h
∀ (x : spec.State), bind mu (fun u => bind (f u) g) x = bind (bind mu f) g x
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0: spec.State


h
bind mu (fun u => bind (f u) g) s0 = bind (bind mu f) g s0
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0: spec.State


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: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM 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: UTaskM spec V

g: VTaskM 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: UTaskM spec V

g: VTaskM spec W

s0, a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult 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)
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0: spec.State


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: UTaskM spec V

g: VTaskM 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: UTaskM spec V

g: VTaskM 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: UTaskM spec V

g: VTaskM spec W

s0, a✝²: spec.State

a✝¹: spec.StateBool

a✝: spec.StateIterationResult 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)
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0: spec.State


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: UTaskM spec V

g: VTaskM 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: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0, s': spec.State

block_until: spec.StateBool

cont: spec.StateIterationResult 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: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0, s': spec.State

block_until: spec.StateBool

cont: spec.StateIterationResult 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
IterationResult.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: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0, s': spec.State

block_until: spec.StateBool

cont: spec.StateIterationResult 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.Running
IterationResult.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: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0, s': spec.State

block_until: spec.StateBool

cont: spec.StateIterationResult 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.Running
(bind cont fun u => bind (f u) g) = bind (bind cont f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0, s': spec.State

block_until: spec.StateBool

cont: spec.StateIterationResult 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.Running.h
∀ (x : spec.State), bind cont (fun u => bind (f u) g) x = bind (bind cont f) g x
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0, s': spec.State

block_until: spec.StateBool

cont: spec.StateIterationResult 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.Running.h
∀ (x : spec.State), bind cont (fun u => bind (f u) g) x = bind (bind cont f) g x
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W

s0, s': spec.State

block_until: spec.StateBool

cont: spec.StateIterationResult 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

s: spec.State


h.Running.h
bind cont (fun u => bind (f u) g) s = bind (bind cont f) g s
spec: Spec

U, V, W: Type

mu: TaskM spec U

f: UTaskM spec V

g: VTaskM spec W


(bind mu fun u => bind (f u) g) = bind (bind mu f) g

Goals accomplished! 🐙
end TaskM end Mt.TaskM.impl