Cortex.Pulse.State
On this page
Imports
import Cortex.Pulse.DAGOverview
This module defines the extensional state used by the fixed-topology Pulse kernel. Runtime payloads, failure details, and signal contents stay abstract; the proofs only inspect lifecycle status and whether a node has an output.
Context
The Haskell runtime stores maps keyed by durable node identifiers. The Lean model uses total functions over the finite topology instead, so the proofs can focus on lifecycle invariants rather than map bookkeeping.
Theorem Split
The page introduces the status lattice, the extensional graph state, the
topology-domain invariant, and the recovery normalization lemma that
removes volatile running marks.
namespace Cortex.PulseNode Status Lattice
NodeStatus is the lifecycle status for a node in the fixed-topology kernel.
The constructors mirror the runtime states in Cortex.Pulse.GraphRuntime
while erasing payload details that are irrelevant to structural safety.
inductive NodeStatus : Type where
| pending : NodeStatus
| running : NodeStatus
| completed : NodeStatus
| failed : NodeStatus
| skipped : NodeStatus
| interrupted : NodeStatus
| waiting : NodeStatus
| rewritten : NodeStatus
deriving Repr, DecidableEqnamespace NodeStatus
NodeStatus.terminal status means the status cannot make another local transition.
def terminal : NodeStatus → Prop
| completed => True
| failed => True
| skipped => True
| rewritten => True
| pending => False
| running => False
| interrupted => False
| waiting => False
NodeStatus.propagatable status means failure closure may overwrite it with failed.
def propagatable : NodeStatus → Prop
| pending => True
| waiting => True
| completed => False
| failed => False
| skipped => False
| running => False
| interrupted => False
| rewritten => False
NodeStatus.mayHaveOutput status means the status owns a durable payload.
def mayHaveOutput : NodeStatus → Prop
| completed => True
| failed => False
| skipped => False
| rewritten => True
| pending => False
| running => False
| interrupted => False
| waiting => False
NodeStatus.requiresOutput status means the status must carry a durable payload.
def requiresOutput : NodeStatus → Prop
| completed => True
| rewritten => True
| failed => False
| skipped => False
| pending => False
| running => False
| interrupted => False
| waiting => False
NodeStatus.unblocksSuccessors status means direct successors may run past it.
def unblocksSuccessors : NodeStatus → Prop
| completed => True
| skipped => True
| rewritten => True
| failed => False
| pending => False
| running => False
| interrupted => False
| waiting => False
failureLe before after orders states by failure-propagation growth.
A status can stay unchanged, or a still-propagatable status can become
failed. This is the order used for monotonicity of failure closure.
def failureLe : NodeStatus → NodeStatus → Prop
| before, after => before = after ∨ (propagatable before ∧ after = failed)
unblocks_terminal says successor-unblocking statuses are terminal.
theorem unblocks_terminal {status : NodeStatus}
(hUnblocks : unblocksSuccessors status) :
terminal status := status:NodeStatushUnblocks:status.unblocksSuccessors⊢ status.terminal
hUnblocks:pending.unblocksSuccessors⊢ pending.terminalhUnblocks:running.unblocksSuccessors⊢ running.terminalhUnblocks:completed.unblocksSuccessors⊢ completed.terminalhUnblocks:failed.unblocksSuccessors⊢ failed.terminalhUnblocks:skipped.unblocksSuccessors⊢ skipped.terminalhUnblocks:interrupted.unblocksSuccessors⊢ interrupted.terminalhUnblocks:waiting.unblocksSuccessors⊢ waiting.terminalhUnblocks:rewritten.unblocksSuccessors⊢ rewritten.terminal hUnblocks:pending.unblocksSuccessors⊢ pending.terminalhUnblocks:running.unblocksSuccessors⊢ running.terminalhUnblocks:completed.unblocksSuccessors⊢ completed.terminalhUnblocks:failed.unblocksSuccessors⊢ failed.terminalhUnblocks:skipped.unblocksSuccessors⊢ skipped.terminalhUnblocks:interrupted.unblocksSuccessors⊢ interrupted.terminalhUnblocks:waiting.unblocksSuccessors⊢ waiting.terminalhUnblocks:rewritten.unblocksSuccessors⊢ rewritten.terminal All goals completed! 🐙
terminal_unblocks_of_not_failed recovers runtime-unblocking terminal statuses.
theorem terminal_unblocks_of_not_failed {status : NodeStatus}
(hTerminal : terminal status)
(hNotFailed : status ≠ failed) :
unblocksSuccessors status := status:NodeStatushTerminal:status.terminalhNotFailed:status ≠ failed⊢ status.unblocksSuccessors
hTerminal:pending.terminalhNotFailed:pending ≠ failed⊢ pending.unblocksSuccessorshTerminal:running.terminalhNotFailed:running ≠ failed⊢ running.unblocksSuccessorshTerminal:completed.terminalhNotFailed:completed ≠ failed⊢ completed.unblocksSuccessorshTerminal:failed.terminalhNotFailed:failed ≠ failed⊢ failed.unblocksSuccessorshTerminal:skipped.terminalhNotFailed:skipped ≠ failed⊢ skipped.unblocksSuccessorshTerminal:interrupted.terminalhNotFailed:interrupted ≠ failed⊢ interrupted.unblocksSuccessorshTerminal:waiting.terminalhNotFailed:waiting ≠ failed⊢ waiting.unblocksSuccessorshTerminal:rewritten.terminalhNotFailed:rewritten ≠ failed⊢ rewritten.unblocksSuccessors hTerminal:pending.terminalhNotFailed:pending ≠ failed⊢ pending.unblocksSuccessorshTerminal:running.terminalhNotFailed:running ≠ failed⊢ running.unblocksSuccessorshTerminal:completed.terminalhNotFailed:completed ≠ failed⊢ completed.unblocksSuccessorshTerminal:failed.terminalhNotFailed:failed ≠ failed⊢ failed.unblocksSuccessorshTerminal:skipped.terminalhNotFailed:skipped ≠ failed⊢ skipped.unblocksSuccessorshTerminal:interrupted.terminalhNotFailed:interrupted ≠ failed⊢ interrupted.unblocksSuccessorshTerminal:waiting.terminalhNotFailed:waiting ≠ failed⊢ waiting.unblocksSuccessorshTerminal:rewritten.terminalhNotFailed:rewritten ≠ failed⊢ rewritten.unblocksSuccessors All goals completed! 🐙
pending_not_terminal states that a pending node is not terminal.
theorem pending_not_terminal :
¬ terminal pending := ⊢ ¬pending.terminal
hTerminal:pending.terminal⊢ False
All goals completed! 🐙
failed_not_propagatable states that a failed node is not propagatable.
theorem failed_not_propagatable :
¬ propagatable failed := ⊢ ¬failed.propagatable
hPropagatable:failed.propagatable⊢ False
All goals completed! 🐙
failureLe_refl says status failure-growth is reflexive.
theorem failureLe_refl (status : NodeStatus) :
failureLe status status :=
Or.inl rfl
failureLe_to_failed turns a propagatable status into a failure-growth step.
theorem failureLe_to_failed {status : NodeStatus}
(hPropagatable : propagatable status) :
failureLe status failed :=
Or.inr ⟨hPropagatable, rfl⟩
failed_of_failureLe_failed says failed statuses cannot grow to another status.
theorem failed_of_failureLe_failed {after : NodeStatus}
(hLe : failureLe failed after) :
after = failed := after:NodeStatushLe:failed.failureLe after⊢ after = failed
after:NodeStatushSame:failed = after⊢ after = failedafter:NodeStatushFailure:failed.propagatable ∧ after = failed⊢ after = failed
after:NodeStatushSame:failed = after⊢ after = failed All goals completed! 🐙
after:NodeStatushFailure:failed.propagatable ∧ after = failed⊢ after = failed All goals completed! 🐙
failureLe_preserves_failed says failure-growth preserves existing failures.
theorem failureLe_preserves_failed {before after : NodeStatus}
(hLe : failureLe before after)
(hFailed : before = failed) :
after = failed := before:NodeStatusafter:NodeStatushLe:before.failureLe afterhFailed:before = failed⊢ after = failed
after:NodeStatushLe:failed.failureLe after⊢ after = failed
All goals completed! 🐙
failureLe_reflects_propagatable pulls propagatability back through failure-growth.
theorem failureLe_reflects_propagatable {before after : NodeStatus}
(hLe : failureLe before after)
(hPropagatable : propagatable after) :
propagatable before := before:NodeStatusafter:NodeStatushLe:before.failureLe afterhPropagatable:after.propagatable⊢ before.propagatable
before:NodeStatusafter:NodeStatushPropagatable:after.propagatablehSame:before = after⊢ before.propagatablebefore:NodeStatusafter:NodeStatushPropagatable:after.propagatablehFailure:before.propagatable ∧ after = failed⊢ before.propagatable
before:NodeStatusafter:NodeStatushPropagatable:after.propagatablehSame:before = after⊢ before.propagatable before:NodeStatushPropagatable:before.propagatable⊢ before.propagatable
All goals completed! 🐙
before:NodeStatusafter:NodeStatushPropagatable:after.propagatablehFailure:before.propagatable ∧ after = failed⊢ before.propagatable All goals completed! 🐙
failureLe_trans says status failure-growth is transitive.
theorem failureLe_trans {left middle right : NodeStatus}
(hLeft : failureLe left middle)
(hRight : failureLe middle right) :
failureLe left right := left:NodeStatusmiddle:NodeStatusright:NodeStatushLeft:left.failureLe middlehRight:middle.failureLe right⊢ left.failureLe right
left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthSame:left = middle⊢ left.failureLe rightleft:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthFailure:left.propagatable ∧ middle = failed⊢ left.failureLe right
left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthSame:left = middle⊢ left.failureLe right left:NodeStatusright:NodeStatushRight:left.failureLe right⊢ left.failureLe right
All goals completed! 🐙
left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthFailure:left.propagatable ∧ middle = failed⊢ left.failureLe right left:NodeStatusmiddle:NodeStatusright:NodeStatushRight:middle.failureLe righthPropagatable:left.propagatablehMiddleFailed:middle = failed⊢ left.failureLe right
left:NodeStatusright:NodeStatushPropagatable:left.propagatablehRight:failed.failureLe right⊢ left.failureLe right
left:NodeStatusright:NodeStatushPropagatable:left.propagatablehRight:failed.failureLe righthRightFailed:right = failed⊢ left.failureLe right
left:NodeStatushPropagatable:left.propagatablehRight:failed.failureLe failed⊢ left.failureLe failed
All goals completed! 🐙end NodeStatusExtensional Graph State
GraphState ν payload is node statuses plus optional node outputs.
structure GraphState (ν : Type u) (payload : Type v) where
status node is the current lifecycle status for a node.
status : ν → NodeStatus
output node is the optional node output. Payload contents remain abstract.
output : ν → Option payloadnamespace GraphStatevariable {ν : Type u} {payload : Type v}@[ext]
theorem ext {s t : GraphState ν payload}
(hStatus : ∀ n : ν, s.status n = t.status n)
(hOutput : ∀ n : ν, s.output n = t.output n) :
s = t := ν:Type upayload:Type vs:GraphState ν payloadt:GraphState ν payloadhStatus:∀ (n : ν), s.status n = t.status nhOutput:∀ (n : ν), s.output n = t.output n⊢ s = t
cases s with
ν:Type upayload:Type vt:GraphState ν payloadsStatus:ν → NodeStatussOutput:ν → Option payloadhStatus:∀ (n : ν), { status := sStatus, output := sOutput }.status n = t.status nhOutput:∀ (n : ν), { status := sStatus, output := sOutput }.output n = t.output n⊢ { status := sStatus, output := sOutput } = t
cases t with
ν:Type upayload:Type vsStatus:ν → NodeStatussOutput:ν → Option payloadtStatus:ν → NodeStatustOutput:ν → Option payloadhStatus:∀ (n : ν), { status := sStatus, output := sOutput }.status n = { status := tStatus, output := tOutput }.status nhOutput:∀ (n : ν), { status := sStatus, output := sOutput }.output n = { status := tStatus, output := tOutput }.output n⊢ { status := sStatus, output := sOutput } = { status := tStatus, output := tOutput }
ν:Type upayload:Type vsStatus:ν → NodeStatussOutput:ν → Option payloadtStatus:ν → NodeStatustOutput:ν → Option payloadhStatus:∀ (n : ν), sStatus n = tStatus nhOutput:∀ (n : ν), sOutput n = tOutput n⊢ { status := sStatus, output := sOutput } = { status := tStatus, output := tOutput }
ν:Type upayload:Type vsStatus:ν → NodeStatussOutput:ν → Option payloadtOutput:ν → Option payloadhOutput:∀ (n : ν), sOutput n = tOutput nhStatus:∀ (n : ν), sStatus n = sStatus n⊢ { status := sStatus, output := sOutput } = { status := sStatus, output := tOutput }
ν:Type upayload:Type vsStatus:ν → NodeStatussOutput:ν → Option payloadhStatus:∀ (n : ν), sStatus n = sStatus nhOutput:∀ (n : ν), sOutput n = sOutput n⊢ { status := sStatus, output := sOutput } = { status := sStatus, output := sOutput }
All goals completed! 🐙
GraphState.initial sets every node to pending with no output.
def initial : GraphState ν payload where
status := fun _ => NodeStatus.pending
output := fun _ => noneFailure-Growth Order
GraphState.failureLe left right lifts status failure-growth pointwise.
Outputs are intentionally outside this order because failure propagation does not inspect them; output ownership and preservation are separate invariants.
def failureLe (left right : GraphState ν payload) : Prop :=
∀ node : ν, NodeStatus.failureLe (left.status node) (right.status node)
failureLe_refl says graph-state failure-growth is reflexive.
theorem failureLe_refl (state : GraphState ν payload) :
failureLe state state := ν:Type upayload:Type vstate:GraphState ν payload⊢ state.failureLe state
ν:Type upayload:Type vstate:GraphState ν payloadnode:ν⊢ (state.status node).failureLe (state.status node)
All goals completed! 🐙
failureLe_trans says graph-state failure-growth is transitive.
theorem failureLe_trans {left middle right : GraphState ν payload}
(hLeft : failureLe left middle)
(hRight : failureLe middle right) :
failureLe left right := ν:Type upayload:Type vleft:GraphState ν payloadmiddle:GraphState ν payloadright:GraphState ν payloadhLeft:left.failureLe middlehRight:middle.failureLe right⊢ left.failureLe right
ν:Type upayload:Type vleft:GraphState ν payloadmiddle:GraphState ν payloadright:GraphState ν payloadhLeft:left.failureLe middlehRight:middle.failureLe rightnode:ν⊢ (left.status node).failureLe (right.status node)
All goals completed! 🐙
failureLe_preserves_failed lifts failed-status preservation to graph states.
theorem failureLe_preserves_failed {left right : GraphState ν payload}
(hLe : failureLe left right)
{node : ν}
(hFailed : left.status node = NodeStatus.failed) :
right.status node = NodeStatus.failed :=
NodeStatus.failureLe_preserves_failed (hLe node) hFailedRecovery Normalization
resetStatus status resets only volatile execution statuses before resumption.
def resetStatus : NodeStatus → NodeStatus
| NodeStatus.running => NodeStatus.pending
| NodeStatus.interrupted => NodeStatus.pending
| NodeStatus.pending => NodeStatus.pending
| NodeStatus.completed => NodeStatus.completed
| NodeStatus.failed => NodeStatus.failed
| NodeStatus.skipped => NodeStatus.skipped
| NodeStatus.waiting => NodeStatus.waiting
| NodeStatus.rewritten => NodeStatus.rewritten
resetStatus_preserves_terminal preserves terminal status through recovery reset.
theorem resetStatus_preserves_terminal {status : NodeStatus}
(hTerminal : NodeStatus.terminal status) :
NodeStatus.terminal (resetStatus status) := status:NodeStatushTerminal:status.terminal⊢ (resetStatus status).terminal
hTerminal:NodeStatus.pending.terminal⊢ (resetStatus NodeStatus.pending).terminalhTerminal:NodeStatus.running.terminal⊢ (resetStatus NodeStatus.running).terminalhTerminal:NodeStatus.completed.terminal⊢ (resetStatus NodeStatus.completed).terminalhTerminal:NodeStatus.failed.terminal⊢ (resetStatus NodeStatus.failed).terminalhTerminal:NodeStatus.skipped.terminal⊢ (resetStatus NodeStatus.skipped).terminalhTerminal:NodeStatus.interrupted.terminal⊢ (resetStatus NodeStatus.interrupted).terminalhTerminal:NodeStatus.waiting.terminal⊢ (resetStatus NodeStatus.waiting).terminalhTerminal:NodeStatus.rewritten.terminal⊢ (resetStatus NodeStatus.rewritten).terminal hTerminal:NodeStatus.pending.terminal⊢ (resetStatus NodeStatus.pending).terminalhTerminal:NodeStatus.running.terminal⊢ (resetStatus NodeStatus.running).terminalhTerminal:NodeStatus.completed.terminal⊢ (resetStatus NodeStatus.completed).terminalhTerminal:NodeStatus.failed.terminal⊢ (resetStatus NodeStatus.failed).terminalhTerminal:NodeStatus.skipped.terminal⊢ (resetStatus NodeStatus.skipped).terminalhTerminal:NodeStatus.interrupted.terminal⊢ (resetStatus NodeStatus.interrupted).terminalhTerminal:NodeStatus.waiting.terminal⊢ (resetStatus NodeStatus.waiting).terminalhTerminal:NodeStatus.rewritten.terminal⊢ (resetStatus NodeStatus.rewritten).terminal All goals completed! 🐙
resetStatus_reflects_unblocks recovers original unblocking from reset unblocking.
theorem resetStatus_reflects_unblocks {status : NodeStatus}
(hUnblocks : NodeStatus.unblocksSuccessors (resetStatus status)) :
NodeStatus.unblocksSuccessors status := status:NodeStatushUnblocks:(resetStatus status).unblocksSuccessors⊢ status.unblocksSuccessors
hUnblocks:(resetStatus NodeStatus.pending).unblocksSuccessors⊢ NodeStatus.pending.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.running).unblocksSuccessors⊢ NodeStatus.running.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.completed).unblocksSuccessors⊢ NodeStatus.completed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.failed).unblocksSuccessors⊢ NodeStatus.failed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.skipped).unblocksSuccessors⊢ NodeStatus.skipped.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.interrupted).unblocksSuccessors⊢ NodeStatus.interrupted.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.waiting).unblocksSuccessors⊢ NodeStatus.waiting.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.rewritten).unblocksSuccessors⊢ NodeStatus.rewritten.unblocksSuccessors hUnblocks:(resetStatus NodeStatus.pending).unblocksSuccessors⊢ NodeStatus.pending.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.running).unblocksSuccessors⊢ NodeStatus.running.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.completed).unblocksSuccessors⊢ NodeStatus.completed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.failed).unblocksSuccessors⊢ NodeStatus.failed.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.skipped).unblocksSuccessors⊢ NodeStatus.skipped.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.interrupted).unblocksSuccessors⊢ NodeStatus.interrupted.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.waiting).unblocksSuccessors⊢ NodeStatus.waiting.unblocksSuccessorshUnblocks:(resetStatus NodeStatus.rewritten).unblocksSuccessors⊢ NodeStatus.rewritten.unblocksSuccessors All goals completed! 🐙
resetStatus_reflects_requiresOutput recovers original output requirements.
theorem resetStatus_reflects_requiresOutput {status : NodeStatus}
(hRequiresOutput : NodeStatus.requiresOutput (resetStatus status)) :
NodeStatus.requiresOutput status := status:NodeStatushRequiresOutput:(resetStatus status).requiresOutput⊢ status.requiresOutput
hRequiresOutput:(resetStatus NodeStatus.pending).requiresOutput⊢ NodeStatus.pending.requiresOutputhRequiresOutput:(resetStatus NodeStatus.running).requiresOutput⊢ NodeStatus.running.requiresOutputhRequiresOutput:(resetStatus NodeStatus.completed).requiresOutput⊢ NodeStatus.completed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.failed).requiresOutput⊢ NodeStatus.failed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.skipped).requiresOutput⊢ NodeStatus.skipped.requiresOutputhRequiresOutput:(resetStatus NodeStatus.interrupted).requiresOutput⊢ NodeStatus.interrupted.requiresOutputhRequiresOutput:(resetStatus NodeStatus.waiting).requiresOutput⊢ NodeStatus.waiting.requiresOutputhRequiresOutput:(resetStatus NodeStatus.rewritten).requiresOutput⊢ NodeStatus.rewritten.requiresOutput hRequiresOutput:(resetStatus NodeStatus.pending).requiresOutput⊢ NodeStatus.pending.requiresOutputhRequiresOutput:(resetStatus NodeStatus.running).requiresOutput⊢ NodeStatus.running.requiresOutputhRequiresOutput:(resetStatus NodeStatus.completed).requiresOutput⊢ NodeStatus.completed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.failed).requiresOutput⊢ NodeStatus.failed.requiresOutputhRequiresOutput:(resetStatus NodeStatus.skipped).requiresOutput⊢ NodeStatus.skipped.requiresOutputhRequiresOutput:(resetStatus NodeStatus.interrupted).requiresOutput⊢ NodeStatus.interrupted.requiresOutputhRequiresOutput:(resetStatus NodeStatus.waiting).requiresOutput⊢ NodeStatus.waiting.requiresOutputhRequiresOutput:(resetStatus NodeStatus.rewritten).requiresOutput⊢ NodeStatus.rewritten.requiresOutput All goals completed! 🐙
resetRunningToPending state makes in-flight nodes pending again after a crash.
def resetRunningToPending (s : GraphState ν payload) : GraphState ν payload where
status := fun n => resetStatus (s.status n)
output := s.output
noRunningNodes state means no node is still marked as running.
def noRunningNodes (s : GraphState ν payload) : Prop :=
∀ n : ν, s.status n ≠ NodeStatus.running
noInterruptedNodes state means recovery has removed interrupted markers.
def noInterruptedNodes (s : GraphState ν payload) : Prop :=
∀ n : ν, s.status n ≠ NodeStatus.interrupted
outputsRespectStatuses state constrains outputs to statuses that may retain them.
def outputsRespectStatuses (s : GraphState ν payload) : Prop :=
∀ (n : ν) (value : payload),
s.output n = some value → NodeStatus.mayHaveOutput (s.status n)
outputsCompleteForStatuses state requires payload-owning statuses to have outputs.
def outputsCompleteForStatuses (s : GraphState ν payload) : Prop :=
∀ n : ν, NodeStatus.requiresOutput (s.status n) → ∃ value : payload, s.output n = some value
topologyDomain G state says off-topology nodes are absent from durable state.
def topologyDomain (G : DAG ν) (s : GraphState ν payload) : Prop :=
∀ n : ν, n ∉ G.nodes → s.status n = NodeStatus.pending ∧ s.output n = noneNormalization Theorem
resetRunning_no_running proves status reset removes every running marker.
theorem resetRunning_no_running (s : GraphState ν payload) :
noRunningNodes (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payload⊢ s.resetRunningToPending.noRunningNodes
ν:Type upayload:Type vs:GraphState ν payloadn:ν⊢ s.resetRunningToPending.status n ≠ NodeStatus.running
ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pending⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.running⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completed⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.failed⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skipped⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupted⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waiting⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewritten⊢ s.resetRunningToPending.status n ≠ NodeStatus.running ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pending⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.running⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completed⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.failed⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skipped⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupted⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waiting⊢ s.resetRunningToPending.status n ≠ NodeStatus.runningν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewritten⊢ s.resetRunningToPending.status n ≠ NodeStatus.running
All goals completed! 🐙
resetRunning_no_interrupted proves status reset removes every interrupted marker.
theorem resetRunning_no_interrupted (s : GraphState ν payload) :
noInterruptedNodes (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payload⊢ s.resetRunningToPending.noInterruptedNodes
ν:Type upayload:Type vs:GraphState ν payloadn:ν⊢ s.resetRunningToPending.status n ≠ NodeStatus.interrupted
ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pending⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.running⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completed⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.failed⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skipped⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupted⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waiting⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewritten⊢ s.resetRunningToPending.status n ≠ NodeStatus.interrupted ν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.pending⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.running⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.completed⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.failed⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.skipped⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.interrupted⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.waiting⊢ s.resetRunningToPending.status n ≠ NodeStatus.interruptedν:Type upayload:Type vs:GraphState ν payloadn:νhStatus:s.status n = NodeStatus.rewritten⊢ s.resetRunningToPending.status n ≠ NodeStatus.interrupted
All goals completed! 🐙
resetRunning_preserves_topologyDomain preserves the off-topology invariant.
theorem resetRunning_preserves_topologyDomain
(G : DAG ν)
(s : GraphState ν payload)
(hDomain : topologyDomain G s) :
topologyDomain G (resetRunningToPending s) := ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G s⊢ topologyDomain G s.resetRunningToPending
intro node ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node ∉ G.nodes⊢ s.resetRunningToPending.status node = NodeStatus.pending ∧ s.resetRunningToPending.output node = none
ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node ∉ G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = none⊢ s.resetRunningToPending.status node = NodeStatus.pending ∧ s.resetRunningToPending.output node = none
ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node ∉ G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = none⊢ s.resetRunningToPending.status node = NodeStatus.pendingν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node ∉ G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = none⊢ s.resetRunningToPending.output node = none
ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node ∉ G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = none⊢ s.resetRunningToPending.status node = NodeStatus.pending All goals completed! 🐙
ν:Type upayload:Type vG:DAG νs:GraphState ν payloadhDomain:topologyDomain G snode:νhNotMem:node ∉ G.nodeshStatus:s.status node = NodeStatus.pendinghOutput:s.output node = none⊢ s.resetRunningToPending.output node = none All goals completed! 🐙
resetRunning_preserves_outputsRespectStatuses preserves output ownership.
theorem resetRunning_preserves_outputsRespectStatuses
(s : GraphState ν payload)
(hOutputs : outputsRespectStatuses s) :
outputsRespectStatuses (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatuses⊢ s.resetRunningToPending.outputsRespectStatuses
intro node ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payload⊢ s.resetRunningToPending.output node = some value → (s.resetRunningToPending.status node).mayHaveOutput ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some value⊢ (s.resetRunningToPending.status node).mayHaveOutput
ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutput⊢ (s.resetRunningToPending.status node).mayHaveOutput
ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.pending⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.running⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.completed⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.failed⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.skipped⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.interrupted⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.waiting⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.rewritten⊢ (s.resetRunningToPending.status node).mayHaveOutput ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.pending⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.running⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.completed⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.failed⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.skipped⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.interrupted⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.waiting⊢ (s.resetRunningToPending.status node).mayHaveOutputν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsRespectStatusesnode:νvalue:payloadhOutput:s.resetRunningToPending.output node = some valuehMayHaveOutput:(s.status node).mayHaveOutputhStatus:s.status node = NodeStatus.rewritten⊢ (s.resetRunningToPending.status node).mayHaveOutput
All goals completed! 🐙
resetRunning_preserves_outputsCompleteForStatuses preserves required outputs.
theorem resetRunning_preserves_outputsCompleteForStatuses
(s : GraphState ν payload)
(hOutputs : outputsCompleteForStatuses s) :
outputsCompleteForStatuses (resetRunningToPending s) := ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsCompleteForStatuses⊢ s.resetRunningToPending.outputsCompleteForStatuses
intro node ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsCompleteForStatusesnode:νhRequiresOutput:(s.resetRunningToPending.status node).requiresOutput⊢ ∃ value, s.resetRunningToPending.output node = some value
have hResetRequires :
NodeStatus.requiresOutput (resetStatus (s.status node)) := ν:Type upayload:Type vs:GraphState ν payloadhOutputs:s.outputsCompleteForStatuses⊢ s.resetRunningToPending.outputsCompleteForStatuses
All goals completed! 🐙
All goals completed! 🐙end GraphStateend Cortex.Pulse