Cortex.Wire.Planner
On this page
Imports
import Cortex.Wire.Admission
import Mathlib.Data.Finset.CardOverview
Executable-planner correspondence support for Wire rewrites.
Context
Cortex.Wire.Admission states the runtime planning contract once a
rewrite's inserted subgraph already lives in the final node namespace. The
Haskell runtime obtains that shape by applying namespaceSubgraph before it
constructs the final topology. This module names that proof-side boundary:
subgraph namespacing, the namespace-discipline obligation, relation-level
correspondence for the AST mapping, and the theorem that turns proof-shaped
executable planner equations into PlanGraphRewriteChecks.
Theorem Split
The page defines graph/subgraph/rewrite namespacing, proves the denotation
of namespaced graph expressions, and then packages runtime construction
equations into the admission contract used by
planGraphRewriteChecks_admissible.
namespace Cortex.Wireopen Cortex.GraphNamespaced Rewrite Inputs
section Namespacingvariable {node : Type}variable [DecidableEq node]
RuntimeNamespacePolicy is the proof-side model of executable namespace syntax.
For the Haskell NodeId planner, namespaceNode anchor local is
namespaceNodeId anchor local, while localAllowed local records the
reserved-delimiter check performed before namespacing. The policy carries
syntax-level facts that are independent of the current topology; freshness
against a particular graph remains a NamespaceDiscipline obligation.
structure RuntimeNamespacePolicy (node : Type) whereNamespace a local inserted node under the rewrite anchor.
namespaceNode : node β node β nodeThe runtime syntax predicate accepted for local inserted node ids.
localAllowed : node β PropFor a fixed anchor, namespacing does not collapse distinct local node ids.
namespaceNode_injective : β anchor, Function.Injective (namespaceNode anchor)
mapGraph f g maps a graph expression over its vertex labels.
def mapGraph (f : node β node) : Graph node β Graph node
| Graph.empty => Graph.empty
| Graph.vertex vertex => Graph.vertex (f vertex)
| Graph.overlay left right => Graph.overlay (mapGraph f left) (mapGraph f right)
| Graph.connect left right => Graph.connect (mapGraph f left) (mapGraph f right)
mapRelation f relation is the relation-level counterpart of mapGraph f.
def mapRelation (f : node β node) (relation : Relation node) : Relation node :=
{ vertices := relation.vertices.image f
edges := relation.edges.image (fun edge => (f edge.1, f edge.2)) }Relation mapping distributes over relation overlay.
theorem mapRelation_overlay
(f : node β node)
(left right : Relation node) :
mapRelation f (Relation.overlay left right) =
Relation.overlay (mapRelation f left) (mapRelation f right) := node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ mapRelation f (left.overlay right) = (mapRelation f left).overlay (mapRelation f right)
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.overlay right)).vertices = ((mapRelation f left).overlay (mapRelation f right)).verticesnode:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.overlay right)).edges = ((mapRelation f left).overlay (mapRelation f right)).edges
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.overlay right)).vertices = ((mapRelation f left).overlay (mapRelation f right)).vertices All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.overlay right)).edges = ((mapRelation f left).overlay (mapRelation f right)).edges All goals completed! πRelation mapping distributes over relation connect.
theorem mapRelation_connect
(f : node β node)
(left right : Relation node) :
mapRelation f (Relation.connect left right) =
Relation.connect (mapRelation f left) (mapRelation f right) := node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ mapRelation f (left.connect right) = (mapRelation f left).connect (mapRelation f right)
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.connect right)).vertices = ((mapRelation f left).connect (mapRelation f right)).verticesnode:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.connect right)).edges = ((mapRelation f left).connect (mapRelation f right)).edges
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.connect right)).vertices = ((mapRelation f left).connect (mapRelation f right)).vertices All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ (mapRelation f (left.connect right)).edges = ((mapRelation f left).connect (mapRelation f right)).edges node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ Finset.image (fun edge => (f edge.1, f edge.2)) (left.edges βͺ right.edges βͺ left.vertices ΓΛ’ right.vertices) =
Finset.image (fun edge => (f edge.1, f edge.2)) left.edges βͺ
Finset.image (fun edge => (f edge.1, f edge.2)) right.edges βͺ
Finset.image f left.vertices ΓΛ’ Finset.image f right.vertices
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ Finset.image (fun edge => (f edge.1, f edge.2)) left.edges βͺ
Finset.image (fun edge => (f edge.1, f edge.2)) right.edges βͺ
Finset.image (fun edge => (f edge.1, f edge.2)) (left.vertices ΓΛ’ right.vertices) =
Finset.image (fun edge => (f edge.1, f edge.2)) left.edges βͺ
Finset.image (fun edge => (f edge.1, f edge.2)) right.edges βͺ
Finset.image f left.vertices ΓΛ’ Finset.image f right.vertices
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Relation noderight:Relation nodeβ’ Finset.image (Prod.map f f) left.edges βͺ Finset.image (Prod.map f f) right.edges βͺ
Finset.image (Prod.map f f) (left.vertices ΓΛ’ right.vertices) =
Finset.image (Prod.map f f) left.edges βͺ Finset.image (Prod.map f f) right.edges βͺ
Finset.image f left.vertices ΓΛ’ Finset.image f right.vertices
All goals completed! πMapping a graph expression and then denoting it equals mapping its denotation.
theorem denote_mapGraph (f : node β node) (g : Graph node) :
denote (mapGraph f g) = mapRelation f (denote g) := node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodeβ’ denote (mapGraph f g) = mapRelation f (denote g)
induction g with
node:Typeinstβ:DecidableEq nodef:node β nodeβ’ denote (mapGraph f Graph.empty) = mapRelation f (denote Graph.empty)
node:Typeinstβ:DecidableEq nodef:node β nodex:nodeβ’ x β (denote (mapGraph f Graph.empty)).vertices β x β (mapRelation f (denote Graph.empty)).verticesnode:Typeinstβ:DecidableEq nodef:node β nodex:node Γ nodeβ’ x β (denote (mapGraph f Graph.empty)).edges β x β (mapRelation f (denote Graph.empty)).edges
node:Typeinstβ:DecidableEq nodef:node β nodex:nodeβ’ x β (denote (mapGraph f Graph.empty)).vertices β x β (mapRelation f (denote Graph.empty)).vertices All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodex:node Γ nodeβ’ x β (denote (mapGraph f Graph.empty)).edges β x β (mapRelation f (denote Graph.empty)).edges All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodeβ’ denote (mapGraph f (Graph.vertex vertex)) = mapRelation f (denote (Graph.vertex vertex))
node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodeβ’ x β (denote (mapGraph f (Graph.vertex vertex))).vertices β x β (mapRelation f (denote (Graph.vertex vertex))).verticesnode:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:node Γ nodeβ’ x β (denote (mapGraph f (Graph.vertex vertex))).edges β x β (mapRelation f (denote (Graph.vertex vertex))).edges
node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodeβ’ x β (denote (mapGraph f (Graph.vertex vertex))).vertices β x β (mapRelation f (denote (Graph.vertex vertex))).vertices node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodeβ’ x = f vertex β β a, a = vertex β§ f a = x
node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodeβ’ x = f vertex β β a, a = vertex β§ f a = xnode:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodeβ’ (β a, a = vertex β§ f a = x) β x = f vertex
node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodeβ’ x = f vertex β β a, a = vertex β§ f a = x node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodehMapped:x = f vertexβ’ β a, a = vertex β§ f a = x
All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:nodeβ’ (β a, a = vertex β§ f a = x) β x = f vertex node:Typeinstβ:DecidableEq nodef:node β nodex:node_local:nodehMapped:f _local = xβ’ x = f _local
All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodevertex:nodex:node Γ nodeβ’ x β (denote (mapGraph f (Graph.vertex vertex))).edges β x β (mapRelation f (denote (Graph.vertex vertex))).edges All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Graph noderight:Graph nodeleft_ih:denote (mapGraph f left) = mapRelation f (denote left)right_ih:denote (mapGraph f right) = mapRelation f (denote right)β’ denote (mapGraph f (left.overlay right)) = mapRelation f (denote (left.overlay right))
calc
denote (mapGraph f (Graph.overlay left right)) =
Relation.overlay (denote (mapGraph f left)) (denote (mapGraph f right)) := rfl
_ =
Relation.overlay (mapRelation f (denote left)) (mapRelation f (denote right)) := node:Typeinstβ:DecidableEq nodef:node β nodeleft:Graph noderight:Graph nodeleft_ih:denote (mapGraph f left) = mapRelation f (denote left)right_ih:denote (mapGraph f right) = mapRelation f (denote right)β’ (denote (mapGraph f left)).overlay (denote (mapGraph f right)) =
(mapRelation f (denote left)).overlay (mapRelation f (denote right))
All goals completed! π
_ = mapRelation f (denote (Graph.overlay left right)) := node:Typeinstβ:DecidableEq nodef:node β nodeleft:Graph noderight:Graph nodeleft_ih:denote (mapGraph f left) = mapRelation f (denote left)right_ih:denote (mapGraph f right) = mapRelation f (denote right)β’ (mapRelation f (denote left)).overlay (mapRelation f (denote right)) = mapRelation f (denote (left.overlay right))
All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeleft:Graph noderight:Graph nodeleft_ih:denote (mapGraph f left) = mapRelation f (denote left)right_ih:denote (mapGraph f right) = mapRelation f (denote right)β’ denote (mapGraph f (left.connect right)) = mapRelation f (denote (left.connect right))
calc
denote (mapGraph f (Graph.connect left right)) =
Relation.connect (denote (mapGraph f left)) (denote (mapGraph f right)) := rfl
_ =
Relation.connect (mapRelation f (denote left)) (mapRelation f (denote right)) := node:Typeinstβ:DecidableEq nodef:node β nodeleft:Graph noderight:Graph nodeleft_ih:denote (mapGraph f left) = mapRelation f (denote left)right_ih:denote (mapGraph f right) = mapRelation f (denote right)β’ (denote (mapGraph f left)).connect (denote (mapGraph f right)) =
(mapRelation f (denote left)).connect (mapRelation f (denote right))
All goals completed! π
_ = mapRelation f (denote (Graph.connect left right)) := node:Typeinstβ:DecidableEq nodef:node β nodeleft:Graph noderight:Graph nodeleft_ih:denote (mapGraph f left) = mapRelation f (denote left)right_ih:denote (mapGraph f right) = mapRelation f (denote right)β’ (mapRelation f (denote left)).connect (mapRelation f (denote right)) = mapRelation f (denote (left.connect right))
All goals completed! π
NamespaceDiscipline records the proof-side safety of runtime node namespacing.
The localAllowed predicate is the generic Lean hook for executable syntax
rules such as the Haskell NodeId restriction that local inserted ids must not
contain the reserved namespace delimiter. Injectivity comes from the
RuntimeNamespacePolicy; this discipline records the topology-specific checks.
structure NamespaceDiscipline
(isLocalAllowed : node β Prop)
(ns : node β node)
(context : PlanningContext node)
(spec : SubgraphSpec node) :
Prop whereLocal inserted node ids are accepted by the runtime namespace syntax.
localAllowed :
β localNode,
localNode β (denote spec.topology).vertices β
isLocalAllowed localNodeNamespaced inserted nodes are fresh against the current topology.
fresh :
β localNode,
localNode β (denote spec.topology).vertices β
ns localNode β (denote context.topology).vertices
namespaceSubgraphSpec ns spec maps an inserted subgraph into final node IDs.
def namespaceSubgraphSpec
(ns : node β node)
(spec : SubgraphSpec node) :
SubgraphSpec node :=
{ topology := mapGraph ns spec.topology
definitions := spec.definitions.image ns
entryNodes := spec.entryNodes.image ns
exitNodes := spec.exitNodes.image ns }Namespaced inserted topology vertices remain fresh against the context topology.
theorem namespaceSubgraphSpec_fresh_against_context
{isLocalAllowed : node β Prop}
{ns : node β node}
{context : PlanningContext node}
{spec : SubgraphSpec node}
(hDiscipline : NamespaceDiscipline isLocalAllowed ns context spec) :
β mappedNode,
mappedNode β (denote (namespaceSubgraphSpec ns spec).topology).vertices β
mappedNode β (denote context.topology).vertices := node:Typeinstβ:DecidableEq nodeisLocalAllowed:node β Propns:node β nodecontext:PlanningContext nodespec:SubgraphSpec nodehDiscipline:NamespaceDiscipline isLocalAllowed ns context specβ’ β mappedNode β (denote (namespaceSubgraphSpec ns spec).topology).vertices,
mappedNode β (denote context.topology).vertices
intro mappedNode node:Typeinstβ:DecidableEq nodeisLocalAllowed:node β Propns:node β nodecontext:PlanningContext nodespec:SubgraphSpec nodehDiscipline:NamespaceDiscipline isLocalAllowed ns context specmappedNode:nodehNode:mappedNode β (denote (namespaceSubgraphSpec ns spec).topology).verticesβ’ mappedNode β (denote context.topology).vertices
node:Typeinstβ:DecidableEq nodeisLocalAllowed:node β Propns:node β nodecontext:PlanningContext nodespec:SubgraphSpec nodehDiscipline:NamespaceDiscipline isLocalAllowed ns context specmappedNode:nodehNode:β a β (denote spec.topology).vertices, ns a = mappedNodeβ’ mappedNode β (denote context.topology).vertices
node:Typeinstβ:DecidableEq nodeisLocalAllowed:node β Propns:node β nodecontext:PlanningContext nodespec:SubgraphSpec nodehDiscipline:NamespaceDiscipline isLocalAllowed ns context speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesβ’ ns localNode β (denote context.topology).vertices
All goals completed! πNamespace discipline exposes the executable local-node syntax predicate.
theorem namespaceSubgraphSpec_local_allowed
{isLocalAllowed : node β Prop}
{ns : node β node}
{context : PlanningContext node}
{spec : SubgraphSpec node}
(hDiscipline : NamespaceDiscipline isLocalAllowed ns context spec) :
β localNode,
localNode β (denote spec.topology).vertices β
isLocalAllowed localNode :=
hDiscipline.localAllowedNamespaced graph paths are images of source graph paths.
theorem graphPath_mapGraph_of_graphPath
(f : node β node)
{g : Graph node}
{source target : node}
(hPath : GraphPath g source target) :
GraphPath (mapGraph f g) (f source) (f target) := node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehPath:GraphPath g source targetβ’ GraphPath (mapGraph f g) (f source) (f target)
induction hPath with
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodeaβ:nodebβ:nodehEdge:(aβ, bβ) β (denote g).edgesβ’ GraphPath (mapGraph f g) (f aβ) (f bβ)
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodeaβ:nodebβ:nodehEdge:(aβ, bβ) β (denote g).edgesβ’ (f aβ, f bβ) β (denote (mapGraph f g)).edges
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodeaβ:nodebβ:nodehEdge:(aβ, bβ) β (denote g).edgesβ’ β a β (denote g).edges, (f a.1, f a.2) = (f aβ, f bβ)
All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodeaβ:nodebβ:nodecβ:nodeleftPath:GraphPath g aβ bβrightPath:GraphPath g bβ cβleft_ih:GraphPath (mapGraph f g) (f aβ) (f bβ)right_ih:GraphPath (mapGraph f g) (f bβ) (f cβ)β’ GraphPath (mapGraph f g) (f aβ) (f cβ)
All goals completed! πEvery mapped graph path has a source-level preimage when the mapping is injective.
theorem graphPath_mapGraph_preimage
{f : node β node}
{g : Graph node}
(hInjective : Function.Injective f)
{mappedSource mappedTarget : node}
(hPath : GraphPath (mapGraph f g) mappedSource mappedTarget) :
β source target,
mappedSource = f source β§
mappedTarget = f target β§
GraphPath g source target := node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodehPath:GraphPath (mapGraph f g) mappedSource mappedTargetβ’ β source target, mappedSource = f source β§ mappedTarget = f target β§ GraphPath g source target
induction hPath with
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodehEdge:(aβ, bβ) β (denote (mapGraph f g)).edgesβ’ β source target, aβ = f source β§ bβ = f target β§ GraphPath g source target
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodehEdge:β a β (denote g).edges, (f a.1, f a.2) = (aβ, bβ)β’ β source target, aβ = f source β§ bβ = f target β§ GraphPath g source target
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodeedge:node Γ nodehEdge:edge β (denote g).edgeshMapped:(f edge.1, f edge.2) = (aβ, bβ)β’ β source target, aβ = f source β§ bβ = f target β§ GraphPath g source target
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodesource:nodetarget:nodehEdge:(source, target) β (denote g).edgeshMapped:(f (source, target).1, f (source, target).2) = (aβ, bβ)β’ β source target, aβ = f source β§ bβ = f target β§ GraphPath g source target
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodesource:nodetarget:nodehEdge:(source, target) β (denote g).edgesβ’ β source_1 target_1,
f (source, target).1 = f source_1 β§ f (source, target).2 = f target_1 β§ GraphPath g source_1 target_1
All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodecβ:nodeleftPath:GraphPath (mapGraph f g) aβ bβrightPath:GraphPath (mapGraph f g) bβ cβleft_ih:β source target, aβ = f source β§ bβ = f target β§ GraphPath g source targetright_ih:β source target, bβ = f source β§ cβ = f target β§ GraphPath g source targetβ’ β source target, aβ = f source β§ cβ = f target β§ GraphPath g source target
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodecβ:nodeleftPath:GraphPath (mapGraph f g) aβ bβrightPath:GraphPath (mapGraph f g) bβ cβright_ih:β source target, bβ = f source β§ cβ = f target β§ GraphPath g source targetsource:nodemiddleLeft:nodehSource:aβ = f sourcehMiddleLeft:bβ = f middleLefthLeftPath:GraphPath g source middleLeftβ’ β source target, aβ = f source β§ cβ = f target β§ GraphPath g source target
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodecβ:nodeleftPath:GraphPath (mapGraph f g) aβ bβrightPath:GraphPath (mapGraph f g) bβ cβsource:nodemiddleLeft:nodehSource:aβ = f sourcehMiddleLeft:bβ = f middleLefthLeftPath:GraphPath g source middleLeftmiddleRight:nodetarget:nodehMiddleRight:bβ = f middleRighthTarget:cβ = f targethRightPath:GraphPath g middleRight targetβ’ β source target, aβ = f source β§ cβ = f target β§ GraphPath g source target
have hMiddle : middleLeft = middleRight := node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodehPath:GraphPath (mapGraph f g) mappedSource mappedTargetβ’ β source target, mappedSource = f source β§ mappedTarget = f target β§ GraphPath g source target
All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodecβ:nodeleftPath:GraphPath (mapGraph f g) aβ bβrightPath:GraphPath (mapGraph f g) bβ cβsource:nodemiddleLeft:nodehSource:aβ = f sourcehMiddleLeft:bβ = f middleLefthLeftPath:GraphPath g source middleLeftmiddleRight:nodetarget:nodehMiddleRight:bβ = f middleRighthTarget:cβ = f targethRightPath:GraphPath g middleRight targethMiddle:middleLeft = middleRightβ’ GraphPath g source target
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fmappedSource:nodemappedTarget:nodeaβ:nodebβ:nodecβ:nodeleftPath:GraphPath (mapGraph f g) aβ bβrightPath:GraphPath (mapGraph f g) bβ cβsource:nodemiddleLeft:nodehSource:aβ = f sourcehMiddleLeft:bβ = f middleLefthLeftPath:GraphPath g source middleLeftmiddleRight:nodetarget:nodehMiddleRight:bβ = f middleRighthTarget:cβ = f targethRightPath:GraphPath g middleLeft targethMiddle:middleLeft = middleRightβ’ GraphPath g source target
All goals completed! πInjective graph mapping preserves acyclicity.
theorem mapGraph_preserves_acyclic
{f : node β node}
{g : Graph node}
(hInjective : Function.Injective f)
(hAcyclic : Acyclic g) :
Acyclic (mapGraph f g) := node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fhAcyclic:Acyclic gβ’ Acyclic (mapGraph f g)
intro mappedNode node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fhAcyclic:Acyclic gmappedNode:nodehCycle:GraphPath (mapGraph f g) mappedNode mappedNodeβ’ False
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fhAcyclic:Acyclic gmappedNode:nodehCycle:GraphPath (mapGraph f g) mappedNode mappedNodesource:nodetarget:nodehSource:mappedNode = f sourcehTarget:mappedNode = f targethPath:GraphPath g source targetβ’ False
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fhAcyclic:Acyclic gmappedNode:nodehCycle:GraphPath (mapGraph f g) mappedNode mappedNodesource:nodetarget:nodehSource:mappedNode = f sourcehTarget:mappedNode = f targethPath:GraphPath g source targethSame:source = targetβ’ False
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodehInjective:Function.Injective fhAcyclic:Acyclic gmappedNode:nodehCycle:GraphPath (mapGraph f g) mappedNode mappedNodesource:nodetarget:nodehSource:mappedNode = f sourcehTarget:mappedNode = f targethPath:GraphPath g target targethSame:source = targetβ’ False
All goals completed! πReachability is preserved by graph mapping.
theorem reachableOrSame_mapGraph_of_reachableOrSame
(f : node β node)
{g : Graph node}
{source target : node}
(hReachable : ReachableOrSame g source target) :
ReachableOrSame (mapGraph f g) (f source) (f target) := node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehReachable:ReachableOrSame g source targetβ’ ReachableOrSame (mapGraph f g) (f source) (f target)
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehSame:source = targetβ’ ReachableOrSame (mapGraph f g) (f source) (f target)node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehPath:GraphPath g source targetβ’ ReachableOrSame (mapGraph f g) (f source) (f target)
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehSame:source = targetβ’ ReachableOrSame (mapGraph f g) (f source) (f target) node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehSame:source = targetβ’ f source = f target
All goals completed! π
node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehPath:GraphPath g source targetβ’ ReachableOrSame (mapGraph f g) (f source) (f target) node:Typeinstβ:DecidableEq nodef:node β nodeg:Graph nodesource:nodetarget:nodehPath:GraphPath g source targetβ’ GraphPath (mapGraph f g) (f source) (f target)
All goals completed! πNamespacing preserves definition-domain coverage for inserted subgraphs.
theorem namespaceSubgraphSpec_preserves_definitionCoverage
(ns : node β node)
{spec : SubgraphSpec node}
(hCoverage : DefinitionCoverage spec.topology spec.definitions) :
DefinitionCoverage
(namespaceSubgraphSpec ns spec).topology
(namespaceSubgraphSpec ns spec).definitions := node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehCoverage:DefinitionCoverage spec.topology spec.definitionsβ’ DefinitionCoverage (namespaceSubgraphSpec ns spec).topology (namespaceSubgraphSpec ns spec).definitions
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehCoverage:spec.definitions = (denote spec.topology).verticesβ’ (namespaceSubgraphSpec ns spec).definitions = (denote (namespaceSubgraphSpec ns spec).topology).vertices
All goals completed! πNamespacing preserves node-inside-topology facts for inserted node sets.
theorem namespaceSubgraphSpec_preserves_nodesInside
(ns : node β node)
{spec : SubgraphSpec node}
{nodes : Finset node}
(hInside : NodesInside nodes spec.topology) :
NodesInside (nodes.image ns) (namespaceSubgraphSpec ns spec).topology := node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodenodes:Finset nodehInside:NodesInside nodes spec.topologyβ’ NodesInside (Finset.image ns nodes) (namespaceSubgraphSpec ns spec).topology
intro mappedNode node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodenodes:Finset nodehInside:NodesInside nodes spec.topologymappedNode:nodehMappedNode:mappedNode β Finset.image ns nodesβ’ mappedNode β (denote (namespaceSubgraphSpec ns spec).topology).vertices
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodenodes:Finset nodehInside:NodesInside nodes spec.topologymappedNode:nodehMappedNode:β a β nodes, ns a = mappedNodeβ’ β a β (denote spec.topology).vertices, ns a = mappedNode
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodenodes:Finset nodehInside:NodesInside nodes spec.topologylocalNode:nodehLocalNode:localNode β nodesβ’ β a β (denote spec.topology).vertices, ns a = ns localNode
All goals completed! πNamespacing preserves orphan-freedom for inserted subgraphs.
theorem namespaceSubgraphSpec_preserves_orphanFree
(ns : node β node)
{spec : SubgraphSpec node}
(hOrphanFree : OrphanFree spec) :
OrphanFree (namespaceSubgraphSpec ns spec) := node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree specβ’ OrphanFree (namespaceSubgraphSpec ns spec)
intro mappedNode node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree specmappedNode:nodehMappedNode:mappedNode β (denote (namespaceSubgraphSpec ns spec).topology).verticesβ’ (β entry β (namespaceSubgraphSpec ns spec).entryNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology entry mappedNode) β§
β exit β (namespaceSubgraphSpec ns spec).exitNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology mappedNode exit
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree specmappedNode:nodehMappedNode:β a β (denote spec.topology).vertices, ns a = mappedNodeβ’ (β entry β (namespaceSubgraphSpec ns spec).entryNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology entry mappedNode) β§
β exit β (namespaceSubgraphSpec ns spec).exitNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology mappedNode exit
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesβ’ (β entry β (namespaceSubgraphSpec ns spec).entryNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology entry (ns localNode)) β§
β exit β (namespaceSubgraphSpec ns spec).exitNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns localNode) exit
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ (β entry β (namespaceSubgraphSpec ns spec).entryNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology entry (ns localNode)) β§
β exit β (namespaceSubgraphSpec ns spec).exitNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns localNode) exit
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ β entry β (namespaceSubgraphSpec ns spec).entryNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology entry (ns localNode)node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ β exit β (namespaceSubgraphSpec ns spec).exitNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns localNode) exit
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ β entry β (namespaceSubgraphSpec ns spec).entryNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology entry (ns localNode) node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ns entry β (namespaceSubgraphSpec ns spec).entryNodesnode:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns entry) (ns localNode)
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ns entry β (namespaceSubgraphSpec ns spec).entryNodes All goals completed! π
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns entry) (ns localNode) All goals completed! π
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ β exit β (namespaceSubgraphSpec ns spec).exitNodes,
ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns localNode) exit node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ns exit β (namespaceSubgraphSpec ns spec).exitNodesnode:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns localNode) (ns exit)
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ns exit β (namespaceSubgraphSpec ns spec).exitNodes All goals completed! π
node:Typeinstβ:DecidableEq nodens:node β nodespec:SubgraphSpec nodehOrphanFree:OrphanFree speclocalNode:nodehLocalNode:localNode β (denote spec.topology).verticesentry:nodehEntry:entry β spec.entryNodeshEntryReachable:ReachableOrSame spec.topology entry localNodeexit:nodehExit:exit β spec.exitNodeshExitReachable:ReachableOrSame spec.topology localNode exitβ’ ReachableOrSame (namespaceSubgraphSpec ns spec).topology (ns localNode) (ns exit) All goals completed! πNamespacing preserves the runtime inserted-subgraph validity bundle.
theorem namespaceSubgraphSpec_preserves_valid
{ns : node β node}
{spec : SubgraphSpec node}
(hInjective : Function.Injective ns)
(hValid : spec.Valid) :
(namespaceSubgraphSpec ns spec).Valid :=
{ acyclic := mapGraph_preserves_acyclic hInjective hValid.acyclic
definitionsCover :=
namespaceSubgraphSpec_preserves_definitionCoverage ns hValid.definitionsCover
entryNodesNonempty := Finset.Nonempty.image hValid.entryNodesNonempty ns
exitNodesNonempty := Finset.Nonempty.image hValid.exitNodesNonempty ns
entryNodesInside :=
namespaceSubgraphSpec_preserves_nodesInside ns hValid.entryNodesInside
exitNodesInside :=
namespaceSubgraphSpec_preserves_nodesInside ns hValid.exitNodesInside
orphanFree := namespaceSubgraphSpec_preserves_orphanFree ns hValid.orphanFree }
namespaceGraphRewrite ns rewrite maps only the inserted subgraph.
The rewrite anchor already lives in the current topology namespace, matching the executable Haskell planner.
def namespaceGraphRewrite
(ns : node β node)
(rewrite : GraphRewrite node) :
GraphRewrite node :=
match rewrite with
| GraphRewrite.expandNode anchor mode spec =>
GraphRewrite.expandNode anchor mode (namespaceSubgraphSpec ns spec)
| GraphRewrite.appendAfter anchor spec =>
GraphRewrite.appendAfter anchor (namespaceSubgraphSpec ns spec)Namespacing does not change the rewrite anchor.
theorem namespaceGraphRewrite_anchor
(ns : node β node)
(rewrite : GraphRewrite node) :
(namespaceGraphRewrite ns rewrite).anchor = rewrite.anchor := node:Typeinstβ:DecidableEq nodens:node β noderewrite:GraphRewrite nodeβ’ (namespaceGraphRewrite ns rewrite).anchor = rewrite.anchor
node:Typeinstβ:DecidableEq nodens:node β nodeaβΒ²:nodeaβΒΉ:ExpansionModeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒ² aβΒΉ aβ)).anchor = (GraphRewrite.expandNode aβΒ² aβΒΉ aβ).anchornode:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.appendAfter aβΒΉ aβ)).anchor = (GraphRewrite.appendAfter aβΒΉ aβ).anchor node:Typeinstβ:DecidableEq nodens:node β nodeaβΒ²:nodeaβΒΉ:ExpansionModeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒ² aβΒΉ aβ)).anchor = (GraphRewrite.expandNode aβΒ² aβΒΉ aβ).anchornode:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.appendAfter aβΒΉ aβ)).anchor = (GraphRewrite.appendAfter aβΒΉ aβ).anchor All goals completed! πNamespacing does not change whether the anchor is removed or retained.
theorem namespaceGraphRewrite_anchorDisposition
(ns : node β node)
(rewrite : GraphRewrite node) :
(namespaceGraphRewrite ns rewrite).anchorDisposition = rewrite.anchorDisposition := node:Typeinstβ:DecidableEq nodens:node β noderewrite:GraphRewrite nodeβ’ (namespaceGraphRewrite ns rewrite).anchorDisposition = rewrite.anchorDisposition
cases rewrite with
node:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodemode:ExpansionModeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒΉ mode aβ)).anchorDisposition =
(GraphRewrite.expandNode aβΒΉ mode aβ).anchorDisposition
node:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒΉ ExpansionMode.replaceNode aβ)).anchorDisposition =
(GraphRewrite.expandNode aβΒΉ ExpansionMode.replaceNode aβ).anchorDispositionnode:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒΉ ExpansionMode.retainNodeAsEnvelope aβ)).anchorDisposition =
(GraphRewrite.expandNode aβΒΉ ExpansionMode.retainNodeAsEnvelope aβ).anchorDisposition node:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒΉ ExpansionMode.replaceNode aβ)).anchorDisposition =
(GraphRewrite.expandNode aβΒΉ ExpansionMode.replaceNode aβ).anchorDispositionnode:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒΉ ExpansionMode.retainNodeAsEnvelope aβ)).anchorDisposition =
(GraphRewrite.expandNode aβΒΉ ExpansionMode.retainNodeAsEnvelope aβ).anchorDisposition All goals completed! π
node:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.appendAfter aβΒΉ aβ)).anchorDisposition =
(GraphRewrite.appendAfter aβΒΉ aβ).anchorDisposition
All goals completed! πNamespacing maps the inserted rewrite spec and leaves the rewrite form unchanged.
theorem namespaceGraphRewrite_spec
(ns : node β node)
(rewrite : GraphRewrite node) :
(namespaceGraphRewrite ns rewrite).spec =
namespaceSubgraphSpec ns rewrite.spec := node:Typeinstβ:DecidableEq nodens:node β noderewrite:GraphRewrite nodeβ’ (namespaceGraphRewrite ns rewrite).spec = namespaceSubgraphSpec ns rewrite.spec
node:Typeinstβ:DecidableEq nodens:node β nodeaβΒ²:nodeaβΒΉ:ExpansionModeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒ² aβΒΉ aβ)).spec =
namespaceSubgraphSpec ns (GraphRewrite.expandNode aβΒ² aβΒΉ aβ).specnode:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.appendAfter aβΒΉ aβ)).spec =
namespaceSubgraphSpec ns (GraphRewrite.appendAfter aβΒΉ aβ).spec node:Typeinstβ:DecidableEq nodens:node β nodeaβΒ²:nodeaβΒΉ:ExpansionModeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.expandNode aβΒ² aβΒΉ aβ)).spec =
namespaceSubgraphSpec ns (GraphRewrite.expandNode aβΒ² aβΒΉ aβ).specnode:Typeinstβ:DecidableEq nodens:node β nodeaβΒΉ:nodeaβ:SubgraphSpec nodeβ’ (namespaceGraphRewrite ns (GraphRewrite.appendAfter aβΒΉ aβ)).spec =
namespaceSubgraphSpec ns (GraphRewrite.appendAfter aβΒΉ aβ).spec All goals completed! π
runtimePlannerRewrite policy rewrite is the rewrite after runtime namespacing.
def runtimePlannerRewrite
(policy : RuntimeNamespacePolicy node)
(rewrite : GraphRewrite node) :
GraphRewrite node :=
namespaceGraphRewrite (policy.namespaceNode rewrite.anchor) rewriteend NamespacingRuntime List Boundaries
section RuntimeListsvariable {node : Type}variable [DecidableEq node]
A runtime list and proof-side Finset describe the same node boundary.
The Haskell planner computes frontier-delta cost from duplicate-free entry
lists. Lean uses Finset boundaries, so this predicate records the
duplicate-free list bridge explicitly.
def RuntimeNodeListMatches (values : List node) (nodes : Finset node) : Prop :=
values.Nodup β§ values.toFinset = nodesDuplicate-free runtime lists have the same length as their proof-side node set cardinality.
theorem RuntimeNodeListMatches.card_eq_length
{values : List node}
{nodes : Finset node}
(hMatches : RuntimeNodeListMatches values nodes) :
nodes.card = values.length := node:Typeinstβ:DecidableEq nodevalues:List nodenodes:Finset nodehMatches:RuntimeNodeListMatches values nodesβ’ nodes.card = values.length
node:Typeinstβ:DecidableEq nodevalues:List nodenodes:Finset nodehNodup:values.NoduphToFinset:values.toFinset = nodesβ’ nodes.card = values.length
node:Typeinstβ:DecidableEq nodevalues:List nodenodes:Finset nodehNodup:values.NoduphToFinset:values.toFinset = nodesβ’ values.toFinset.card = values.length
All goals completed! πend RuntimeListsPlanner Construction Bridge
section PlannerBridgevariable {node : Type}variable [DecidableEq node]Runtime anchor fields agree with the namespaced rewrite and final topology.
The absence/presence fields are explicit construction obligations: this module does not derive them from the topology equation. The executable planner is responsible for producing a final topology whose anchor membership agrees with the rewrite disposition.
structure RuntimeAnchorMatches
(policy : RuntimeNamespacePolicy node)
(rawRewrite : GraphRewrite node)
(delta : PlannedRewriteDelta node) :
Prop whereThe delta records the raw rewrite anchor.
anchorNode_eq : delta.anchorNode = rawRewrite.anchorThe delta records the rewrite-form anchor disposition.
anchorDisposition_eq :
delta.anchorDisposition = (runtimePlannerRewrite policy rawRewrite).anchorDispositionRuntime construction obligation: removed anchors are absent from the final topology.
removed_absent :
delta.anchorDisposition = RewriteAnchorDisposition.removed β
(runtimePlannerRewrite policy rawRewrite).anchor β (denote delta.topology).verticesRuntime construction obligation: retained anchors remain in the final topology.
retained_present :
delta.anchorDisposition = RewriteAnchorDisposition.retained β
(runtimePlannerRewrite policy rawRewrite).anchor β (denote delta.topology).verticesRuntime topology and definition fields agree with the relation-level planner model.
structure RuntimeDeltaMatches
(policy : RuntimeNamespacePolicy node)
(context : PlanningContext node)
(rawRewrite : GraphRewrite node)
(delta : PlannedRewriteDelta node) :
Prop whereThe planned final topology follows the relation-level planner construction.
topology_eq :
denote delta.topology =
plannedFinalRelation context.topology (runtimePlannerRewrite policy rawRewrite)Delta entry nodes are the namespaced inserted entry nodes.
entryNodes_eq : delta.entryNodes = (runtimePlannerRewrite policy rawRewrite).spec.entryNodesDelta exit nodes are the namespaced inserted exit nodes.
exitNodes_eq : delta.exitNodes = (runtimePlannerRewrite policy rawRewrite).spec.exitNodesDelta new nodes are computed from the relation diff.
newNodes_eq :
delta.newNodes =
relationAddedNodes (denote context.topology) (denote delta.topology)Delta removed nodes are computed from the relation diff.
removedNodes_eq :
delta.removedNodes =
relationRemovedNodes (denote context.topology) (denote delta.topology)Delta added edges are computed from the relation diff.
addedEdges_eq :
delta.addedEdges =
relationAddedEdges (denote context.topology) (denote delta.topology)Final definitions follow the runtime delete-or-retain formula.
definitions_eq :
delta.definitions = plannedFinalDefinitions context (runtimePlannerRewrite policy rawRewrite)Runtime structural cost fields agree with computed rewrite-delta data.
structure RuntimeCostMatches
(policy : RuntimeNamespacePolicy node)
(rawRewrite : GraphRewrite node)
(delta : PlannedRewriteDelta node) :
Prop whereAdded-node cost equals the computed new-node count.
addedNodes_eq : delta.cost.addedNodes = delta.newNodes.cardAdded-edge cost equals the computed added-edge count.
addedEdges_eq : delta.cost.addedEdges = delta.addedEdges.cardAdded-depth cost follows the inserted longest-path computation.
addedDepth_eq :
β insertedDepth,
LongestInsertedPathNodeCount (runtimePlannerRewrite policy rawRewrite).spec insertedDepth β§
delta.cost.addedDepth =
match delta.anchorDisposition with
| RewriteAnchorDisposition.removed => insertedDepth - 1
| RewriteAnchorDisposition.retained => insertedDepthEntry nodes match the duplicate-free runtime list used for frontier-delta cost.
entryNodes_runtimeList :
β entryList,
RuntimeNodeListMatches entryList delta.entryNodes β§
delta.cost.frontierDelta = entryList.length - 1Each accepted graph rewrite consumes one rewrite-operation unit.
rewriteOps_eq : delta.cost.rewriteOps = 1
RuntimePlannerConstruction is the proof-shaped output of executable planning.
It starts from the raw rewrite accepted by the runtime, records the
namespacing discipline that turns the raw inserted subgraph into the final
node namespace, and carries constructor equations for the planned delta. The
bridge below derives PlanGraphRewriteChecks; those checks are not restated
as fields here.
structure RuntimePlannerConstruction
(policy : RuntimeNamespacePolicy node)
(context : PlanningContext node)
(rawRewrite : GraphRewrite node)
(delta : PlannedRewriteDelta node) :
Prop whereThe runtime namespace validator accepted the raw inserted subgraph.
namespaceDiscipline :
NamespaceDiscipline
policy.localAllowed
(policy.namespaceNode rawRewrite.anchor)
context
rawRewrite.specThe raw anchor exists in the current topology.
anchorInTopology : rawRewrite.anchor β (denote context.topology).verticesThe raw anchor has a current stage definition.
anchorHasDefinition : rawRewrite.anchor β context.definitionsThe raw inserted subgraph passed runtime subgraph validation.
rawSubgraphValid : rawRewrite.spec.ValidAnchor identity and disposition agree with the namespaced rewrite.
anchorMatches : RuntimeAnchorMatches policy rawRewrite deltaDelta topology and definitions agree with the relation-level planner model.
deltaMatches : RuntimeDeltaMatches policy context rawRewrite deltaStructural cost agrees with computed delta data and runtime boundary lists.
costMatches : RuntimeCostMatches policy rawRewrite deltaFinal definitions exactly cover final topology vertices.
finalDefinitionsCover : DefinitionCoverage delta.topology delta.definitionsFinal topology passed runtime DAG validation.
finalAcyclic : Acyclic delta.topologyExisting vertices remain after adding edges to a relation.
theorem relationVertices_subset_addEdgesToRelation
(relation : Relation node)
(edges : Finset (node Γ node)) :
relation.vertices β (addEdgesToRelation relation edges).vertices := node:Typeinstβ:DecidableEq noderelation:Relation nodeedges:Finset (node Γ node)β’ relation.vertices β (addEdgesToRelation relation edges).vertices
intro vertex node:Typeinstβ:DecidableEq noderelation:Relation nodeedges:Finset (node Γ node)vertex:nodehVertex:vertex β relation.verticesβ’ vertex β (addEdgesToRelation relation edges).vertices
node:Typeinstβ:DecidableEq noderelation:Relation nodeedges:Finset (node Γ node)vertex:nodehVertex:vertex β relation.verticesβ’ (vertex β relation.vertices β¨ vertex β Finset.image Prod.fst edges) β¨ vertex β Finset.image Prod.snd edges
All goals completed! πExisting edges remain after adding edges to a relation.
theorem relationEdges_subset_addEdgesToRelation
(relation : Relation node)
(edges : Finset (node Γ node)) :
relation.edges β (addEdgesToRelation relation edges).edges := node:Typeinstβ:DecidableEq noderelation:Relation nodeedges:Finset (node Γ node)β’ relation.edges β (addEdgesToRelation relation edges).edges
intro edge node:Typeinstβ:DecidableEq noderelation:Relation nodeedges:Finset (node Γ node)edge:node Γ nodehEdge:edge β relation.edgesβ’ edge β (addEdgesToRelation relation edges).edges
node:Typeinstβ:DecidableEq noderelation:Relation nodeedges:Finset (node Γ node)edge:node Γ nodehEdge:edge β relation.edgesβ’ edge β relation.edges β¨ edge β edges
All goals completed! πRight-overlay vertices are present in the overlay.
theorem relationVertices_right_subset_overlay
(left right : Relation node) :
right.vertices β (Relation.overlay left right).vertices := node:Typeinstβ:DecidableEq nodeleft:Relation noderight:Relation nodeβ’ right.vertices β (left.overlay right).vertices
intro vertex node:Typeinstβ:DecidableEq nodeleft:Relation noderight:Relation nodevertex:nodehVertex:vertex β right.verticesβ’ vertex β (left.overlay right).vertices
node:Typeinstβ:DecidableEq nodeleft:Relation noderight:Relation nodevertex:nodehVertex:vertex β right.verticesβ’ vertex β left.vertices β¨ vertex β right.vertices
All goals completed! πRight-overlay edges are present in the overlay.
theorem relationEdges_right_subset_overlay
(left right : Relation node) :
right.edges β (Relation.overlay left right).edges := node:Typeinstβ:DecidableEq nodeleft:Relation noderight:Relation nodeβ’ right.edges β (left.overlay right).edges
intro edge node:Typeinstβ:DecidableEq nodeleft:Relation noderight:Relation nodeedge:node Γ nodehEdge:edge β right.edgesβ’ edge β (left.overlay right).edges
node:Typeinstβ:DecidableEq nodeleft:Relation noderight:Relation nodeedge:node Γ nodehEdge:edge β right.edgesβ’ edge β left.edges β¨ edge β right.edges
All goals completed! πInserted-subgraph vertices are present in the relation-level planned final topology.
theorem insertedVertices_subset_plannedFinalRelation
(context : Graph node)
(rewrite : GraphRewrite node) :
(denote rewrite.spec.topology).vertices β
(plannedFinalRelation context rewrite).vertices := node:Typeinstβ:DecidableEq nodecontext:Graph noderewrite:GraphRewrite nodeβ’ (denote rewrite.spec.topology).vertices β (plannedFinalRelation context rewrite).vertices
intro vertex node:Typeinstβ:DecidableEq nodecontext:Graph noderewrite:GraphRewrite nodevertex:nodehVertex:vertex β (denote rewrite.spec.topology).verticesβ’ vertex β (plannedFinalRelation context rewrite).vertices
node:Typeinstβ:DecidableEq nodecontext:Graph noderewrite:GraphRewrite nodevertex:nodehVertex:vertex β (denote rewrite.spec.topology).verticesβ’ vertex β
(addEdgesToRelation
(addEdgesToRelation
((match rewrite with
| GraphRewrite.expandNode _anchor ExpansionMode.replaceNode _spec =>
removeVertexFromRelation (denote context) rewrite.anchor
| GraphRewrite.expandNode _anchor ExpansionMode.retainNodeAsEnvelope _spec =>
removeOutgoingFromRelation (denote context) rewrite.anchor
| GraphRewrite.appendAfter _anchor _spec =>
removeOutgoingFromRelation (denote context) rewrite.anchor).overlay
(denote rewrite.spec.topology))
((match rewrite.anchorDisposition with
| RewriteAnchorDisposition.removed => predecessorsOf (denote context) rewrite.anchor
| RewriteAnchorDisposition.retained => {rewrite.anchor}) ΓΛ’
rewrite.spec.entryNodes))
(rewrite.spec.exitNodes ΓΛ’ successorsOf (denote context) rewrite.anchor)).vertices
All goals completed! πInserted-subgraph edges are present in the relation-level planned final topology.
theorem insertedEdges_subset_plannedFinalRelation
(context : Graph node)
(rewrite : GraphRewrite node) :
(denote rewrite.spec.topology).edges β
(plannedFinalRelation context rewrite).edges := node:Typeinstβ:DecidableEq nodecontext:Graph noderewrite:GraphRewrite nodeβ’ (denote rewrite.spec.topology).edges β (plannedFinalRelation context rewrite).edges
intro edge node:Typeinstβ:DecidableEq nodecontext:Graph noderewrite:GraphRewrite nodeedge:node Γ nodehEdge:edge β (denote rewrite.spec.topology).edgesβ’ edge β (plannedFinalRelation context rewrite).edges
node:Typeinstβ:DecidableEq nodecontext:Graph noderewrite:GraphRewrite nodeedge:node Γ nodehEdge:edge β (denote rewrite.spec.topology).edgesβ’ edge β
(addEdgesToRelation
(addEdgesToRelation
((match rewrite with
| GraphRewrite.expandNode _anchor ExpansionMode.replaceNode _spec =>
removeVertexFromRelation (denote context) rewrite.anchor
| GraphRewrite.expandNode _anchor ExpansionMode.retainNodeAsEnvelope _spec =>
removeOutgoingFromRelation (denote context) rewrite.anchor
| GraphRewrite.appendAfter _anchor _spec =>
removeOutgoingFromRelation (denote context) rewrite.anchor).overlay
(denote rewrite.spec.topology))
((match rewrite.anchorDisposition with
| RewriteAnchorDisposition.removed => predecessorsOf (denote context) rewrite.anchor
| RewriteAnchorDisposition.retained => {rewrite.anchor}) ΓΛ’
rewrite.spec.entryNodes))
(rewrite.spec.exitNodes ΓΛ’ successorsOf (denote context) rewrite.anchor)).edges
All goals completed! πA topology construction equation proves the inserted subgraph is present in the final graph.
theorem subgraphContainedInFinal_of_topology_eq
{context : PlanningContext node}
{rewrite : GraphRewrite node}
{delta : PlannedRewriteDelta node}
(hTopology : denote delta.topology = plannedFinalRelation context.topology rewrite) :
SubgraphContainedInFinal rewrite delta := node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewriteβ’ SubgraphContainedInFinal rewrite delta
node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewriteβ’ β node_1 β (denote rewrite.spec.topology).vertices, node_1 β (denote delta.topology).verticesnode:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewriteβ’ β edge β (denote rewrite.spec.topology).edges, edge β (denote delta.topology).edges
node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewriteβ’ β node_1 β (denote rewrite.spec.topology).vertices, node_1 β (denote delta.topology).vertices intro vertex node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewritevertex:nodehVertex:vertex β (denote rewrite.spec.topology).verticesβ’ vertex β (denote delta.topology).vertices
node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewritevertex:nodehVertex:vertex β (denote rewrite.spec.topology).verticesβ’ vertex β (plannedFinalRelation context.topology rewrite).vertices
All goals completed! π
node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewriteβ’ β edge β (denote rewrite.spec.topology).edges, edge β (denote delta.topology).edges intro edge node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewriteedge:node Γ nodehEdge:edge β (denote rewrite.spec.topology).edgesβ’ edge β (denote delta.topology).edges
node:Typeinstβ:DecidableEq nodecontext:PlanningContext noderewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehTopology:denote delta.topology = plannedFinalRelation context.topology rewriteedge:node Γ nodehEdge:edge β (denote rewrite.spec.topology).edgesβ’ edge β (plannedFinalRelation context.topology rewrite).edges
All goals completed! πRuntime construction exposes the local-node syntax acceptance checked before namespacing.
theorem runtimePlannerConstruction_local_allowed
{policy : RuntimeNamespacePolicy node}
{context : PlanningContext node}
{rawRewrite : GraphRewrite node}
{delta : PlannedRewriteDelta node}
(hConstruction : RuntimePlannerConstruction policy context rawRewrite delta) :
β localNode,
localNode β (denote rawRewrite.spec.topology).vertices β
policy.localAllowed localNode :=
namespaceSubgraphSpec_local_allowed hConstruction.namespaceDisciplineRuntime construction exposes freshness of namespaced inserted nodes.
theorem runtimePlannerConstruction_namespaced_fresh
{policy : RuntimeNamespacePolicy node}
{context : PlanningContext node}
{rawRewrite : GraphRewrite node}
{delta : PlannedRewriteDelta node}
(hConstruction : RuntimePlannerConstruction policy context rawRewrite delta) :
β mappedNode,
mappedNode β
(denote (runtimePlannerRewrite policy rawRewrite).spec.topology).vertices β
mappedNode β (denote context.topology).vertices := node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltaβ’ β mappedNode β (denote (runtimePlannerRewrite policy rawRewrite).spec.topology).vertices,
mappedNode β (denote context.topology).vertices
node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltaβ’ β
mappedNode β
(denote (namespaceSubgraphSpec (policy.namespaceNode rawRewrite.anchor) rawRewrite.spec).topology).vertices,
mappedNode β (denote context.topology).vertices
All goals completed! πExecutable planner construction fields establish the admission planning contract.
theorem runtimePlannerConstruction_planGraphRewriteChecks
{policy : RuntimeNamespacePolicy node}
{context : PlanningContext node}
{rawRewrite : GraphRewrite node}
{delta : PlannedRewriteDelta node}
(hConstruction :
RuntimePlannerConstruction policy context rawRewrite delta) :
PlanGraphRewriteChecks context (runtimePlannerRewrite policy rawRewrite) delta := node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltaβ’ PlanGraphRewriteChecks context (runtimePlannerRewrite policy rawRewrite) delta
have hAnchor :
rawRewrite.anchor = (runtimePlannerRewrite policy rawRewrite).anchor := node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltaβ’ PlanGraphRewriteChecks context (runtimePlannerRewrite policy rawRewrite) delta
All goals completed! π
have hSubgraphValid : (runtimePlannerRewrite policy rawRewrite).spec.Valid := node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltaβ’ PlanGraphRewriteChecks context (runtimePlannerRewrite policy rawRewrite) delta
node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltahAnchor:rawRewrite.anchor = (runtimePlannerRewrite policy rawRewrite).anchorβ’ (namespaceSubgraphSpec (policy.namespaceNode rawRewrite.anchor) rawRewrite.spec).Valid
All goals completed! π
node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltahAnchor:rawRewrite.anchor = (runtimePlannerRewrite policy rawRewrite).anchorhSubgraphValid:(runtimePlannerRewrite policy rawRewrite).spec.ValidentryList:List nodehEntryMatches:RuntimeNodeListMatches entryList delta.entryNodeshFrontierDelta:delta.cost.frontierDelta = entryList.length - 1β’ PlanGraphRewriteChecks context (runtimePlannerRewrite policy rawRewrite) delta
node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltahAnchor:rawRewrite.anchor = (runtimePlannerRewrite policy rawRewrite).anchorhSubgraphValid:(runtimePlannerRewrite policy rawRewrite).spec.ValidentryList:List nodehEntryMatches:RuntimeNodeListMatches entryList delta.entryNodeshFrontierDelta:delta.cost.frontierDelta = entryList.length - 1hEntryCard:delta.entryNodes.card = entryList.lengthβ’ PlanGraphRewriteChecks context (runtimePlannerRewrite policy rawRewrite) delta
refine
{ anchorMatches := hConstruction.anchorMatches.anchorNode_eq.trans hAnchor
anchorInTopology := ?_
anchorHasDefinition := ?_
subgraphValid := hSubgraphValid
topologyMatches := hConstruction.deltaMatches.topology_eq
subgraphContained :=
subgraphContainedInFinal_of_topology_eq hConstruction.deltaMatches.topology_eq
entryExitMatches :=
{ entryNodes_eq := hConstruction.deltaMatches.entryNodes_eq
exitNodes_eq := hConstruction.deltaMatches.exitNodes_eq }
anchorDispositionMatches :=
{ disposition_eq := hConstruction.anchorMatches.anchorDisposition_eq
removed_absent := hConstruction.anchorMatches.removed_absent
retained_present := hConstruction.anchorMatches.retained_present }
topologyDiffMatches :=
{ newNodes_eq := hConstruction.deltaMatches.newNodes_eq
removedNodes_eq := hConstruction.deltaMatches.removedNodes_eq
addedEdges_eq := hConstruction.deltaMatches.addedEdges_eq }
costMatches :=
{ addedNodes_eq := hConstruction.costMatches.addedNodes_eq
addedEdges_eq := hConstruction.costMatches.addedEdges_eq
addedDepth_eq := hConstruction.costMatches.addedDepth_eq
frontierDelta_eq := node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltahAnchor:rawRewrite.anchor = (runtimePlannerRewrite policy rawRewrite).anchorhSubgraphValid:(runtimePlannerRewrite policy rawRewrite).spec.ValidentryList:List nodehEntryMatches:RuntimeNodeListMatches entryList delta.entryNodeshFrontierDelta:delta.cost.frontierDelta = entryList.length - 1hEntryCard:delta.entryNodes.card = entryList.lengthβ’ delta.cost.frontierDelta = delta.entryNodes.card - 1
All goals completed! π
rewriteOps_eq := hConstruction.costMatches.rewriteOps_eq }
definitionUpdateMatches :=
{ definitions_eq := hConstruction.deltaMatches.definitions_eq }
finalDefinitionsCover := hConstruction.finalDefinitionsCover
finalAcyclic := hConstruction.finalAcyclic }
node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltahAnchor:rawRewrite.anchor = (runtimePlannerRewrite policy rawRewrite).anchorhSubgraphValid:(runtimePlannerRewrite policy rawRewrite).spec.ValidentryList:List nodehEntryMatches:RuntimeNodeListMatches entryList delta.entryNodeshFrontierDelta:delta.cost.frontierDelta = entryList.length - 1hEntryCard:delta.entryNodes.card = entryList.lengthβ’ (runtimePlannerRewrite policy rawRewrite).anchor β (denote context.topology).vertices All goals completed! π
node:Typeinstβ:DecidableEq nodepolicy:RuntimeNamespacePolicy nodecontext:PlanningContext noderawRewrite:GraphRewrite nodedelta:PlannedRewriteDelta nodehConstruction:RuntimePlannerConstruction policy context rawRewrite deltahAnchor:rawRewrite.anchor = (runtimePlannerRewrite policy rawRewrite).anchorhSubgraphValid:(runtimePlannerRewrite policy rawRewrite).spec.ValidentryList:List nodehEntryMatches:RuntimeNodeListMatches entryList delta.entryNodeshFrontierDelta:delta.cost.frontierDelta = entryList.length - 1hEntryCard:delta.entryNodes.card = entryList.lengthβ’ (runtimePlannerRewrite policy rawRewrite).anchor β context.definitions All goals completed! πExecutable planner construction plus budget admission gives an abstract admissible rewrite.
theorem runtimePlannerConstruction_admissible
{policy : RuntimeNamespacePolicy node}
{context : PlanningContext node}
{rawRewrite : GraphRewrite node}
{budget remaining : RewriteBudget}
{delta : PlannedRewriteDelta node}
{contractOk : Graph node β Prop}
(hConstruction : RuntimePlannerConstruction policy context rawRewrite delta)
(hAdmitted : AdmittedRewriteDelta budget delta remaining)
(hContracts :
β g, denote g = denote context.topology β contractOk g β contractOk delta.topology) :
admissible
(delta.toRewrite
context.topology
(plannedRewriteSafety_of_checks
(runtimePlannerConstruction_planGraphRewriteChecks hConstruction)
hContracts))
context.topology
budget :=
planGraphRewriteChecks_admissible
(runtimePlannerConstruction_planGraphRewriteChecks hConstruction)
hAdmitted
hContractsend PlannerBridgeend Cortex.Wire