Cortex.Wire.AdmissionArtifact.Primitive
On this page
Imports
Overview
Primitive graph-step rows for decoded Wire admission artifacts.
The declarations here mirror the Haskell primitive admission trace: empty, node, binding-reference, overlay, and connect rows plus their local validator obligations and row-level projection lemmas.
namespace Cortex.Wirenamespace AdmissionArtifactopen Cortex.Wire.ElaborationIRPrimitive Graph Steps
Primitive graph-admission step recorded by Haskell lowering.
inductive PrimitiveGraphStep where
| empty
| node
(node : NodeId)
(entries exits : List AdmissionBoundaryPort)
| bindingRef (binding : BindingName)
| overlay
(leftNodes rightNodes : List NodeId)
(leftBindings rightBindings : List BindingName)
| connect
(leftExits rightEntries : List AdmissionBoundaryPort)
(matchedPairs : List AdmissionConnection)
(unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort)
deriving Reprnamespace PrimitiveGraphStepPrimitive node boundary rows are owned by the node row that serializes them.
def NodeFrontiersOwned
(node : NodeId)
(entries exits : List AdmissionBoundaryPort) :
Prop :=
(∀ entry, entry ∈ entries → entry.node = node) ∧
(∀ exit, exit ∈ exits → exit.node = node)Primitive node frontier rows do not duplicate boundary identities.
def NodeFrontiersLinear
(entries exits : List AdmissionBoundaryPort) :
Prop :=
(entries.map AdmissionBoundaryPort.key).Nodup ∧
(exits.map AdmissionBoundaryPort.key).NodupPrimitive overlay side ledgers are duplicate-free before they are merged.
def OverlayLedgersUnique
(leftNodes rightNodes : List NodeId)
(leftBindings rightBindings : List BindingName) :
Prop :=
leftNodes.Nodup ∧ rightNodes.Nodup ∧ leftBindings.Nodup ∧ rightBindings.NodupPrimitive overlay rows must keep left/right node and binding ledgers disjoint.
def OverlayLedgersDisjoint
(leftNodes rightNodes : List NodeId)
(leftBindings rightBindings : List BindingName) :
Prop :=
(∀ node, node ∈ leftNodes → node ∈ rightNodes → False) ∧
(∀ binding, binding ∈ leftBindings → binding ∈ rightBindings → False)Matched primitive connect rows cannot reuse an output endpoint or input endpoint.
def ConnectPairsLinear (matchedPairs : List AdmissionConnection) : Prop :=
(matchedPairs.map AdmissionConnection.fromKey).Nodup ∧
(matchedPairs.map AdmissionConnection.toKey).NodupSerialized primitive connect frontiers do not contain duplicate endpoint keys.
def ConnectFrontiersLinear
(leftExits rightEntries : List AdmissionBoundaryPort) :
Prop :=
(leftExits.map AdmissionBoundaryPort.key).Nodup ∧
(rightEntries.map AdmissionBoundaryPort.key).NodupMatched and unmatched primitive connect rows partition the serialized frontiers exactly.
def ConnectFrontierPartition
(leftExits rightEntries : List AdmissionBoundaryPort)
(matchedPairs : List AdmissionConnection)
(unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort) :
Prop :=
((matchedPairs.map AdmissionConnection.fromKey) ++
(unmatchedLeftExits.map AdmissionBoundaryPort.key)).Perm
(leftExits.map AdmissionBoundaryPort.key) ∧
((matchedPairs.map AdmissionConnection.toKey) ++
(unmatchedRightEntries.map AdmissionBoundaryPort.key)).Perm
(rightEntries.map AdmissionBoundaryPort.key)Every compatible left/right frontier pair is present in the matched-pair ledger.
def ConnectMatchesAllCompatible
(leftExits rightEntries : List AdmissionBoundaryPort)
(matchedPairs : List AdmissionConnection) :
Prop :=
∀ leftExit, leftExit ∈ leftExits →
∀ rightEntry, rightEntry ∈ rightEntries →
leftExit.CompatibleWith rightEntry →
∃ pair, pair ∈ matchedPairs ∧
pair.fromPort = leftExit ∧ pair.toPort = rightEntryPrimitive connect rows carry structurally valid frontiers and contraction rows.
def ConnectRowsValid
(leftExits rightEntries : List AdmissionBoundaryPort)
(matchedPairs : List AdmissionConnection)
(unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort) :
Prop :=
BoundaryPortsValid leftExits ∧
BoundaryPortsValid rightEntries ∧
ConnectionsValid matchedPairs ∧
BoundaryPortsValid unmatchedLeftExits ∧
BoundaryPortsValid unmatchedRightEntriesTop-level raw connections projected from this primitive trace row.
def rawConnections : PrimitiveGraphStep → List AdmissionRawConnection
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node _node _entries _exits => []
| PrimitiveGraphStep.bindingRef _binding => []
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries matchedPairs
_unmatchedLeftExits _unmatchedRightEntries =>
matchedPairs.map AdmissionRawConnection.ofAdmissionConnectionBoundary contractions serialized by this primitive trace row.
def matchedConnections : PrimitiveGraphStep → List AdmissionConnection
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node _node _entries _exits => []
| PrimitiveGraphStep.bindingRef _binding => []
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries matchedPairs
_unmatchedLeftExits _unmatchedRightEntries =>
matchedPairsTop-level node summary rows projected from this primitive trace row.
def nodeRows : PrimitiveGraphStep → List NodeId
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node nodeId _entries _exits => [nodeId]
| PrimitiveGraphStep.bindingRef _binding => []
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries _matchedPairs
_unmatchedLeftExits _unmatchedRightEntries => []Top-level binding-ref summary rows projected from this primitive trace row.
def bindingRows : PrimitiveGraphStep → List BindingName
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node _node _entries _exits => []
| PrimitiveGraphStep.bindingRef binding => [binding]
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries _matchedPairs
_unmatchedLeftExits _unmatchedRightEntries => []Primitive node entry boundary keys projected from this trace row.
def nodeEntryKeys : PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node _node entries _exits =>
entries.map AdmissionBoundaryPort.key
| PrimitiveGraphStep.bindingRef _binding => []
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries _matchedPairs
_unmatchedLeftExits _unmatchedRightEntries => []Primitive node exit boundary keys projected from this trace row.
def nodeExitKeys : PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node _node _entries exits =>
exits.map AdmissionBoundaryPort.key
| PrimitiveGraphStep.bindingRef _binding => []
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries _matchedPairs
_unmatchedLeftExits _unmatchedRightEntries => []Input boundary keys consumed by primitive connect rows.
def consumedEntryKeys : PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node _node _entries _exits => []
| PrimitiveGraphStep.bindingRef _binding => []
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries matchedPairs
_unmatchedLeftExits _unmatchedRightEntries =>
matchedPairs.map AdmissionConnection.toKeyOutput boundary keys consumed by primitive connect rows.
def consumedExitKeys : PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| PrimitiveGraphStep.empty => []
| PrimitiveGraphStep.node _node _entries _exits => []
| PrimitiveGraphStep.bindingRef _binding => []
| PrimitiveGraphStep.overlay _leftNodes _rightNodes _leftBindings _rightBindings => []
| PrimitiveGraphStep.connect _leftExits _rightEntries matchedPairs
_unmatchedLeftExits _unmatchedRightEntries =>
matchedPairs.map AdmissionConnection.fromKeyTop-level raw connections projected from a list of primitive trace rows.
def rawConnectionsList : List PrimitiveGraphStep → List AdmissionRawConnection
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.rawConnections ++ rawConnectionsList primitiveStepsBoundary contractions projected from a list of primitive trace rows.
def matchedConnectionsList : List PrimitiveGraphStep → List AdmissionConnection
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.matchedConnections ++ matchedConnectionsList primitiveStepsPrimitive raw connections are exactly the raw projection of matched contractions.
theorem rawConnectionsList_eq_map_matchedConnectionsList
(primitiveSteps : List PrimitiveGraphStep) :
rawConnectionsList primitiveSteps =
(matchedConnectionsList primitiveSteps).map
AdmissionRawConnection.ofAdmissionConnection := primitiveSteps:List PrimitiveGraphStep⊢ rawConnectionsList primitiveSteps =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList primitiveSteps)
induction primitiveSteps with
⊢ rawConnectionsList [] = List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList [])
All goals completed! 🐙
primitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:rawConnectionsList primitiveSteps =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList primitiveSteps)⊢ rawConnectionsList (primitiveStep :: primitiveSteps) =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList (primitiveStep :: primitiveSteps))
cases primitiveStep with
primitiveSteps:List PrimitiveGraphStepih:rawConnectionsList primitiveSteps =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList primitiveSteps)⊢ rawConnectionsList (empty :: primitiveSteps) =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList (empty :: primitiveSteps))
All goals completed! 🐙
primitiveSteps:List PrimitiveGraphStepih:rawConnectionsList primitiveSteps =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList primitiveSteps)node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPort⊢ rawConnectionsList (PrimitiveGraphStep.node node entries exits :: primitiveSteps) =
List.map AdmissionRawConnection.ofAdmissionConnection
(matchedConnectionsList (PrimitiveGraphStep.node node entries exits :: primitiveSteps))
All goals completed! 🐙
primitiveSteps:List PrimitiveGraphStepih:rawConnectionsList primitiveSteps =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList primitiveSteps)binding:BindingName⊢ rawConnectionsList (bindingRef binding :: primitiveSteps) =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList (bindingRef binding :: primitiveSteps))
All goals completed! 🐙
primitiveSteps:List PrimitiveGraphStepih:rawConnectionsList primitiveSteps =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList primitiveSteps)leftNodes:List NodeIdrightNodes:List NodeIdleftBindings:List BindingNamerightBindings:List BindingName⊢ rawConnectionsList (overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps) =
List.map AdmissionRawConnection.ofAdmissionConnection
(matchedConnectionsList (overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps))
All goals completed! 🐙
primitiveSteps:List PrimitiveGraphStepih:rawConnectionsList primitiveSteps =
List.map AdmissionRawConnection.ofAdmissionConnection (matchedConnectionsList primitiveSteps)leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPort⊢ rawConnectionsList
(connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :: primitiveSteps) =
List.map AdmissionRawConnection.ofAdmissionConnection
(matchedConnectionsList
(connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :: primitiveSteps))
All goals completed! 🐙Top-level node summary rows projected from a list of primitive trace rows.
def nodeRowsList : List PrimitiveGraphStep → List NodeId
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.nodeRows ++ nodeRowsList primitiveStepsTop-level binding-ref summary rows projected from a list of primitive trace rows.
def bindingRowsList : List PrimitiveGraphStep → List BindingName
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.bindingRows ++ bindingRowsList primitiveStepsPrimitive node rows contribute their node identity to the primitive node-row ledger.
theorem nodeRowsList_mem_of_node_mem
{primitiveSteps : List PrimitiveGraphStep}
{node : NodeId}
{entries exits : List AdmissionBoundaryPort}
(hStep : PrimitiveGraphStep.node node entries exits ∈ primitiveSteps) :
node ∈ nodeRowsList primitiveSteps := primitiveSteps:List PrimitiveGraphStepnode:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPorthStep:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps⊢ node ∈ nodeRowsList primitiveSteps
induction primitiveSteps with
node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPorthStep:PrimitiveGraphStep.node node entries exits ∈ []⊢ node ∈ nodeRowsList []
All goals completed! 🐙
node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps → node ∈ nodeRowsList primitiveStepshStep:PrimitiveGraphStep.node node entries exits ∈ primitiveStep :: primitiveSteps⊢ node ∈ nodeRowsList (primitiveStep :: primitiveSteps)
node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps → node ∈ nodeRowsList primitiveStepshStep:PrimitiveGraphStep.node node entries exits = primitiveStep ∨ PrimitiveGraphStep.node node entries exits ∈ primitiveSteps⊢ node ∈ primitiveStep.nodeRows ∨ node ∈ nodeRowsList primitiveSteps
cases hStep with
node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps → node ∈ nodeRowsList primitiveStepshHead:PrimitiveGraphStep.node node entries exits = primitiveStep⊢ node ∈ primitiveStep.nodeRows ∨ node ∈ nodeRowsList primitiveSteps
node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps → node ∈ nodeRowsList primitiveSteps⊢ node ∈ (PrimitiveGraphStep.node node entries exits).nodeRows ∨ node ∈ nodeRowsList primitiveSteps
exact Or.inl (node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps → node ∈ nodeRowsList primitiveSteps⊢ node ∈ (PrimitiveGraphStep.node node entries exits).nodeRows All goals completed! 🐙)
node:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps → node ∈ nodeRowsList primitiveStepshTail:PrimitiveGraphStep.node node entries exits ∈ primitiveSteps⊢ node ∈ primitiveStep.nodeRows ∨ node ∈ nodeRowsList primitiveSteps
All goals completed! 🐙Duplicate-free primitive node ledgers make node frontier rows unique.
theorem node_frontiers_eq_of_nodeRowsList_nodup
{primitiveSteps : List PrimitiveGraphStep}
(hUnique : (nodeRowsList primitiveSteps).Nodup)
{node : NodeId}
{entries₁ exits₁ entries₂ exits₂ : List AdmissionBoundaryPort}
(hLeft : PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps)
(hRight : PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps) :
entries₁ = entries₂ ∧ exits₁ = exits₂ := primitiveSteps:List PrimitiveGraphStephUnique:(nodeRowsList primitiveSteps).Nodupnode:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPorthLeft:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRight:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
induction primitiveSteps with
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPorthUnique:(nodeRowsList []).NoduphLeft:PrimitiveGraphStep.node node entries₁ exits₁ ∈ []hRight:PrimitiveGraphStep.node node entries₂ exits₂ ∈ []⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (primitiveStep :: primitiveSteps)).NoduphLeft:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStep :: primitiveStepshRight:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStep :: primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (primitiveStep :: primitiveSteps)).NoduphLeft:PrimitiveGraphStep.node node entries₁ exits₁ = primitiveStep ∨
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRight:PrimitiveGraphStep.node node entries₂ exits₂ = primitiveStep ∨
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
cases hLeft with
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (primitiveStep :: primitiveSteps)).NoduphRight:PrimitiveGraphStep.node node entries₂ exits₂ = primitiveStep ∨
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshLeftHead:PrimitiveGraphStep.node node entries₁ exits₁ = primitiveStep⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).NoduphRight:PrimitiveGraphStep.node node entries₂ exits₂ = PrimitiveGraphStep.node node entries₁ exits₁ ∨
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
cases hRight with
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).NoduphRightHead:PrimitiveGraphStep.node node entries₂ exits₂ = PrimitiveGraphStep.node node entries₁ exits₁⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStephUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).Nodupih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps → entries₁ = entries₁ ∧ exits₁ = exits₁⊢ entries₁ = entries₁ ∧ exits₁ = exits₁
All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).NoduphRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).NoduphRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshRightNode:node ∈ nodeRowsList primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
have hNoTail : node ∉ nodeRowsList primitiveSteps := primitiveSteps:List PrimitiveGraphStephUnique:(nodeRowsList primitiveSteps).Nodupnode:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPorthLeft:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRight:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).NoduphRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshRightNode:node ∈ nodeRowsList primitiveStepshUniqueHead:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).Nodup⊢ node ∉ nodeRowsList primitiveSteps
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₁ exits₁ :: primitiveSteps)).NoduphRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshRightNode:node ∈ nodeRowsList primitiveStepshUniqueHead:node ∉ nodeRowsList primitiveSteps ∧ (nodeRowsList primitiveSteps).Nodup⊢ node ∉ nodeRowsList primitiveSteps
All goals completed! 🐙
All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (primitiveStep :: primitiveSteps)).NoduphRight:PrimitiveGraphStep.node node entries₂ exits₂ = primitiveStep ∨
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
cases hRight with
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (primitiveStep :: primitiveSteps)).NoduphLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightHead:PrimitiveGraphStep.node node entries₂ exits₂ = primitiveStep⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₂ exits₂ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₂ exits₂ :: primitiveSteps)).NoduphLeftNode:node ∈ nodeRowsList primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
have hNoTail : node ∉ nodeRowsList primitiveSteps := primitiveSteps:List PrimitiveGraphStephUnique:(nodeRowsList primitiveSteps).Nodupnode:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPorthLeft:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRight:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₂ exits₂ :: primitiveSteps)).NoduphLeftNode:node ∈ nodeRowsList primitiveStepshUniqueHead:(nodeRowsList (PrimitiveGraphStep.node node entries₂ exits₂ :: primitiveSteps)).Nodup⊢ node ∉ nodeRowsList primitiveSteps
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshUnique:(nodeRowsList (PrimitiveGraphStep.node node entries₂ exits₂ :: primitiveSteps)).NoduphLeftNode:node ∈ nodeRowsList primitiveStepshUniqueHead:node ∉ nodeRowsList primitiveSteps ∧ (nodeRowsList primitiveSteps).Nodup⊢ node ∉ nodeRowsList primitiveSteps
All goals completed! 🐙
All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hUnique:(nodeRowsList (primitiveStep :: primitiveSteps)).NoduphLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshUnique:(nodeRowsList (empty :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsnode✝:NodeIdentries✝:List AdmissionBoundaryPortexits✝:List AdmissionBoundaryPorthUnique:(nodeRowsList (PrimitiveGraphStep.node node✝ entries✝ exits✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsbinding✝:BindingNamehUnique:(nodeRowsList (bindingRef binding✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsleftNodes✝:List NodeIdrightNodes✝:List NodeIdleftBindings✝:List BindingNamerightBindings✝:List BindingNamehUnique:(nodeRowsList (overlay leftNodes✝ rightNodes✝ leftBindings✝ rightBindings✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsleftExits✝:List AdmissionBoundaryPortrightEntries✝:List AdmissionBoundaryPortmatchedPairs✝:List AdmissionConnectionunmatchedLeftExits✝:List AdmissionBoundaryPortunmatchedRightEntries✝:List AdmissionBoundaryPorthUnique:(nodeRowsList
(connect leftExits✝ rightEntries✝ matchedPairs✝ unmatchedLeftExits✝ unmatchedRightEntries✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂ node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshUnique:(nodeRowsList (empty :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsnode✝:NodeIdentries✝:List AdmissionBoundaryPortexits✝:List AdmissionBoundaryPorthUnique:(nodeRowsList (PrimitiveGraphStep.node node✝ entries✝ exits✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsbinding✝:BindingNamehUnique:(nodeRowsList (bindingRef binding✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsleftNodes✝:List NodeIdrightNodes✝:List NodeIdleftBindings✝:List BindingNamerightBindings✝:List BindingNamehUnique:(nodeRowsList (overlay leftNodes✝ rightNodes✝ leftBindings✝ rightBindings✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsleftExits✝:List AdmissionBoundaryPortrightEntries✝:List AdmissionBoundaryPortmatchedPairs✝:List AdmissionConnectionunmatchedLeftExits✝:List AdmissionBoundaryPortunmatchedRightEntries✝:List AdmissionBoundaryPorthUnique:(nodeRowsList
(connect leftExits✝ rightEntries✝ matchedPairs✝ unmatchedLeftExits✝ unmatchedRightEntries✝ :: primitiveSteps)).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂ node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsleftExits✝:List AdmissionBoundaryPortrightEntries✝:List AdmissionBoundaryPortmatchedPairs✝:List AdmissionConnectionunmatchedLeftExits✝:List AdmissionBoundaryPortunmatchedRightEntries✝:List AdmissionBoundaryPorthUnique:(nodeRowsList primitiveSteps).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepshUnique:(nodeRowsList primitiveSteps).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂ All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsnode✝:NodeIdentries✝:List AdmissionBoundaryPortexits✝:List AdmissionBoundaryPorthUnique:node✝ ∉ nodeRowsList primitiveSteps ∧ (nodeRowsList primitiveSteps).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂ All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsbinding✝:BindingNamehUnique:(nodeRowsList primitiveSteps).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂ All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsleftNodes✝:List NodeIdrightNodes✝:List NodeIdleftBindings✝:List BindingNamerightBindings✝:List BindingNamehUnique:(nodeRowsList primitiveSteps).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂ All goals completed! 🐙
node:NodeIdentries₁:List AdmissionBoundaryPortexits₁:List AdmissionBoundaryPortentries₂:List AdmissionBoundaryPortexits₂:List AdmissionBoundaryPortprimitiveSteps:List PrimitiveGraphStepih:(nodeRowsList primitiveSteps).Nodup →
PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveSteps →
PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveSteps → entries₁ = entries₂ ∧ exits₁ = exits₂hLeftTail:PrimitiveGraphStep.node node entries₁ exits₁ ∈ primitiveStepshRightTail:PrimitiveGraphStep.node node entries₂ exits₂ ∈ primitiveStepsleftExits✝:List AdmissionBoundaryPortrightEntries✝:List AdmissionBoundaryPortmatchedPairs✝:List AdmissionConnectionunmatchedLeftExits✝:List AdmissionBoundaryPortunmatchedRightEntries✝:List AdmissionBoundaryPorthUnique:(nodeRowsList primitiveSteps).Nodup⊢ entries₁ = entries₂ ∧ exits₁ = exits₂ All goals completed! 🐙Primitive node entry boundary keys projected from a list of trace rows.
def nodeEntryKeysList :
List PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.nodeEntryKeys ++ nodeEntryKeysList primitiveStepsPrimitive node exit boundary keys projected from a list of trace rows.
def nodeExitKeysList :
List PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.nodeExitKeys ++ nodeExitKeysList primitiveStepsInput boundary keys consumed by a list of primitive connect rows.
def consumedEntryKeysList :
List PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.consumedEntryKeys ++ consumedEntryKeysList primitiveStepsOutput boundary keys consumed by a list of primitive connect rows.
def consumedExitKeysList :
List PrimitiveGraphStep → List (NodeId × FieldLabel × ContractId)
| [] => []
| primitiveStep :: primitiveSteps =>
primitiveStep.consumedExitKeys ++ consumedExitKeysList primitiveStepsMatched connection rows contribute their target keys to consumed entry keys.
theorem matchedConnectionsList_toKey_mem_consumedEntryKeysList
{connection : AdmissionConnection}
{primitiveSteps : List PrimitiveGraphStep}
(hConnection :
connection ∈ matchedConnectionsList primitiveSteps) :
connection.toKey ∈ consumedEntryKeysList primitiveSteps := connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStephConnection:connection ∈ matchedConnectionsList primitiveSteps⊢ connection.toKey ∈ consumedEntryKeysList primitiveSteps
induction primitiveSteps with
connection:AdmissionConnectionhConnection:connection ∈ matchedConnectionsList []⊢ connection.toKey ∈ consumedEntryKeysList []
All goals completed! 🐙
connection:AdmissionConnectionprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepshConnection:connection ∈ matchedConnectionsList (primitiveStep :: primitiveSteps)⊢ connection.toKey ∈ consumedEntryKeysList (primitiveStep :: primitiveSteps)
cases primitiveStep with
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepshConnection:connection ∈ matchedConnectionsList (empty :: primitiveSteps)⊢ connection.toKey ∈ consumedEntryKeysList (empty :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepsnode:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPorthConnection:connection ∈ matchedConnectionsList (PrimitiveGraphStep.node node entries exits :: primitiveSteps)⊢ connection.toKey ∈ consumedEntryKeysList (PrimitiveGraphStep.node node entries exits :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepsbinding:BindingNamehConnection:connection ∈ matchedConnectionsList (bindingRef binding :: primitiveSteps)⊢ connection.toKey ∈ consumedEntryKeysList (bindingRef binding :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepsleftNodes:List NodeIdrightNodes:List NodeIdleftBindings:List BindingNamerightBindings:List BindingNamehConnection:connection ∈ matchedConnectionsList (overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps)⊢ connection.toKey ∈ consumedEntryKeysList (overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthConnection:connection ∈
matchedConnectionsList
(connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :: primitiveSteps)⊢ connection.toKey ∈
consumedEntryKeysList
(connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :: primitiveSteps)
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthConnection:connection ∈ matchedPairs ∨ connection ∈ matchedConnectionsList primitiveSteps⊢ (∃ a ∈ matchedPairs, a.toKey = connection.toKey) ∨ connection.toKey ∈ consumedEntryKeysList primitiveSteps
cases hConnection with
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthPair:connection ∈ matchedPairs⊢ (∃ a ∈ matchedPairs, a.toKey = connection.toKey) ∨ connection.toKey ∈ consumedEntryKeysList primitiveSteps
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.toKey ∈ consumedEntryKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthRest:connection ∈ matchedConnectionsList primitiveSteps⊢ (∃ a ∈ matchedPairs, a.toKey = connection.toKey) ∨ connection.toKey ∈ consumedEntryKeysList primitiveSteps
All goals completed! 🐙Matched connection rows contribute their source keys to consumed exit keys.
theorem matchedConnectionsList_fromKey_mem_consumedExitKeysList
{connection : AdmissionConnection}
{primitiveSteps : List PrimitiveGraphStep}
(hConnection :
connection ∈ matchedConnectionsList primitiveSteps) :
connection.fromKey ∈ consumedExitKeysList primitiveSteps := connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStephConnection:connection ∈ matchedConnectionsList primitiveSteps⊢ connection.fromKey ∈ consumedExitKeysList primitiveSteps
induction primitiveSteps with
connection:AdmissionConnectionhConnection:connection ∈ matchedConnectionsList []⊢ connection.fromKey ∈ consumedExitKeysList []
All goals completed! 🐙
connection:AdmissionConnectionprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepshConnection:connection ∈ matchedConnectionsList (primitiveStep :: primitiveSteps)⊢ connection.fromKey ∈ consumedExitKeysList (primitiveStep :: primitiveSteps)
cases primitiveStep with
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepshConnection:connection ∈ matchedConnectionsList (empty :: primitiveSteps)⊢ connection.fromKey ∈ consumedExitKeysList (empty :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepsnode:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPorthConnection:connection ∈ matchedConnectionsList (PrimitiveGraphStep.node node entries exits :: primitiveSteps)⊢ connection.fromKey ∈ consumedExitKeysList (PrimitiveGraphStep.node node entries exits :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepsbinding:BindingNamehConnection:connection ∈ matchedConnectionsList (bindingRef binding :: primitiveSteps)⊢ connection.fromKey ∈ consumedExitKeysList (bindingRef binding :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepsleftNodes:List NodeIdrightNodes:List NodeIdleftBindings:List BindingNamerightBindings:List BindingNamehConnection:connection ∈ matchedConnectionsList (overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps)⊢ connection.fromKey ∈ consumedExitKeysList (overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps)
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthConnection:connection ∈
matchedConnectionsList
(connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :: primitiveSteps)⊢ connection.fromKey ∈
consumedExitKeysList
(connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :: primitiveSteps)
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthConnection:connection ∈ matchedPairs ∨ connection ∈ matchedConnectionsList primitiveSteps⊢ (∃ a ∈ matchedPairs, a.fromKey = connection.fromKey) ∨ connection.fromKey ∈ consumedExitKeysList primitiveSteps
cases hConnection with
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthPair:connection ∈ matchedPairs⊢ (∃ a ∈ matchedPairs, a.fromKey = connection.fromKey) ∨ connection.fromKey ∈ consumedExitKeysList primitiveSteps
All goals completed! 🐙
connection:AdmissionConnectionprimitiveSteps:List PrimitiveGraphStepih:connection ∈ matchedConnectionsList primitiveSteps → connection.fromKey ∈ consumedExitKeysList primitiveStepsleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPorthRest:connection ∈ matchedConnectionsList primitiveSteps⊢ (∃ a ∈ matchedPairs, a.fromKey = connection.fromKey) ∨ connection.fromKey ∈ consumedExitKeysList primitiveSteps
All goals completed! 🐙Matched pairs from a primitive connect row appear in the global matched-pair ledger.
theorem matchedConnectionsList_mem_of_connect_mem
{primitiveSteps : List PrimitiveGraphStep}
{leftExits rightEntries : List AdmissionBoundaryPort}
{matchedPairs : List AdmissionConnection}
{unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort}
{pair : AdmissionConnection}
(hStep :
PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈
primitiveSteps)
(hPair : pair ∈ matchedPairs) :
pair ∈ matchedConnectionsList primitiveSteps := primitiveSteps:List PrimitiveGraphStepleftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveStepshPair:pair ∈ matchedPairs⊢ pair ∈ matchedConnectionsList primitiveSteps
induction primitiveSteps with
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairshStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ []⊢ pair ∈ matchedConnectionsList []
All goals completed! 🐙
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveStep:PrimitiveGraphStepprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepshStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveStep :: primitiveSteps⊢ pair ∈ matchedConnectionsList (primitiveStep :: primitiveSteps)
cases primitiveStep with
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepshStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ empty :: primitiveSteps⊢ pair ∈ matchedConnectionsList (empty :: primitiveSteps)
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepshStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps⊢ pair ∈ matchedConnectionsList primitiveSteps
All goals completed! 🐙
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsnode:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPorthStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈
PrimitiveGraphStep.node node entries exits :: primitiveSteps⊢ pair ∈ matchedConnectionsList (PrimitiveGraphStep.node node entries exits :: primitiveSteps)
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsnode:NodeIdentries:List AdmissionBoundaryPortexits:List AdmissionBoundaryPorthStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps⊢ pair ∈ matchedConnectionsList primitiveSteps
All goals completed! 🐙
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsbinding:BindingNamehStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈
bindingRef binding :: primitiveSteps⊢ pair ∈ matchedConnectionsList (bindingRef binding :: primitiveSteps)
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsbinding:BindingNamehStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps⊢ pair ∈ matchedConnectionsList primitiveSteps
All goals completed! 🐙
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsleftNodes:List NodeIdrightNodes:List NodeIdleftBindings:List BindingNamerightBindings:List BindingNamehStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈
overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps⊢ pair ∈ matchedConnectionsList (overlay leftNodes rightNodes leftBindings rightBindings :: primitiveSteps)
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsleftNodes:List NodeIdrightNodes:List NodeIdleftBindings:List BindingNamerightBindings:List BindingNamehStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps⊢ pair ∈ matchedConnectionsList primitiveSteps
All goals completed! 🐙
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsleftExits':List AdmissionBoundaryPortrightEntries':List AdmissionBoundaryPortmatchedPairs':List AdmissionConnectionunmatchedLeftExits':List AdmissionBoundaryPortunmatchedRightEntries':List AdmissionBoundaryPorthStep:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈
connect leftExits' rightEntries' matchedPairs' unmatchedLeftExits' unmatchedRightEntries' :: primitiveSteps⊢ pair ∈
matchedConnectionsList
(connect leftExits' rightEntries' matchedPairs' unmatchedLeftExits' unmatchedRightEntries' :: primitiveSteps)
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsleftExits':List AdmissionBoundaryPortrightEntries':List AdmissionBoundaryPortmatchedPairs':List AdmissionConnectionunmatchedLeftExits':List AdmissionBoundaryPortunmatchedRightEntries':List AdmissionBoundaryPorthStep:leftExits = leftExits' ∧
rightEntries = rightEntries' ∧
matchedPairs = matchedPairs' ∧
unmatchedLeftExits = unmatchedLeftExits' ∧ unmatchedRightEntries = unmatchedRightEntries' ∨
connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps⊢ pair ∈ matchedPairs' ∨ pair ∈ matchedConnectionsList primitiveSteps
cases hStep with
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsleftExits':List AdmissionBoundaryPortrightEntries':List AdmissionBoundaryPortmatchedPairs':List AdmissionConnectionunmatchedLeftExits':List AdmissionBoundaryPortunmatchedRightEntries':List AdmissionBoundaryPorthHead:leftExits = leftExits' ∧
rightEntries = rightEntries' ∧
matchedPairs = matchedPairs' ∧
unmatchedLeftExits = unmatchedLeftExits' ∧ unmatchedRightEntries = unmatchedRightEntries'⊢ pair ∈ matchedPairs' ∨ pair ∈ matchedConnectionsList primitiveSteps
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveSteps⊢ pair ∈ matchedPairs ∨ pair ∈ matchedConnectionsList primitiveSteps
All goals completed! 🐙
leftExits:List AdmissionBoundaryPortrightEntries:List AdmissionBoundaryPortmatchedPairs:List AdmissionConnectionunmatchedLeftExits:List AdmissionBoundaryPortunmatchedRightEntries:List AdmissionBoundaryPortpair:AdmissionConnectionhPair:pair ∈ matchedPairsprimitiveSteps:List PrimitiveGraphStepih:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps →
pair ∈ matchedConnectionsList primitiveStepsleftExits':List AdmissionBoundaryPortrightEntries':List AdmissionBoundaryPortmatchedPairs':List AdmissionConnectionunmatchedLeftExits':List AdmissionBoundaryPortunmatchedRightEntries':List AdmissionBoundaryPorthTail:connect leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries ∈ primitiveSteps⊢ pair ∈ matchedPairs' ∨ pair ∈ matchedConnectionsList primitiveSteps
All goals completed! 🐙Validator obligations for a serialized primitive node row.
structure NodeValid
(nodeId : NodeId)
(entries exits : List AdmissionBoundaryPort) : Prop where
nodeValid : nodeId.Valid
entriesValid : BoundaryPortsValid entries
exitsValid : BoundaryPortsValid exits
frontiersOwned : NodeFrontiersOwned nodeId entries exits
frontiersLinear : NodeFrontiersLinear entries exitsValidator obligations for a serialized primitive overlay row.
structure OverlayValid
(leftNodeIds rightNodeIds : List NodeId)
(leftBindings rightBindings : List BindingName) : Prop where
leftNodesValid : ∀ node, node ∈ leftNodeIds → node.Valid
rightNodesValid : ∀ node, node ∈ rightNodeIds → node.Valid
leftBindingsValid : ∀ binding, binding ∈ leftBindings → binding.Valid
rightBindingsValid : ∀ binding, binding ∈ rightBindings → binding.Valid
ledgersUnique : OverlayLedgersUnique leftNodeIds rightNodeIds leftBindings rightBindings
ledgersDisjoint : OverlayLedgersDisjoint leftNodeIds rightNodeIds leftBindings rightBindingsValidator obligations for a serialized primitive connect row.
structure ConnectValid
(leftExits rightEntries : List AdmissionBoundaryPort)
(matchedPairs : List AdmissionConnection)
(unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort) : Prop where
pairsDrawnFromFrontiers :
∀ pair, pair ∈ matchedPairs → pair.fromPort ∈ leftExits ∧ pair.toPort ∈ rightEntries
unmatchedLeftDrawnFromFrontier :
∀ boundary, boundary ∈ unmatchedLeftExits → boundary ∈ leftExits
unmatchedRightDrawnFromFrontier :
∀ boundary, boundary ∈ unmatchedRightEntries → boundary ∈ rightEntries
pairsLinear : ConnectPairsLinear matchedPairs
frontiersLinear : ConnectFrontiersLinear leftExits rightEntries
matchesAllCompatible : ConnectMatchesAllCompatible leftExits rightEntries matchedPairs
frontierPartition :
ConnectFrontierPartition
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries
rowsValid :
ConnectRowsValid
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntriesRow-level validator obligation for primitive graph steps.
The primitive artifact is still a trace row, not a CertifiedGraph. For
connect, the local check is that every matched pair and every unmatched
endpoint is drawn from the frontiers serialized in the same row, and that the
matched/unmatched rows partition each frontier exactly.
def Valid : PrimitiveGraphStep → Prop
| .empty => True
| .node nodeId entries exits =>
NodeValid nodeId entries exits
| PrimitiveGraphStep.bindingRef binding => binding.Valid
| PrimitiveGraphStep.overlay leftNodeIds rightNodeIds leftBindings rightBindings =>
OverlayValid leftNodeIds rightNodeIds leftBindings rightBindings
| PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries =>
ConnectValid leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntriesPrimitive graph-step rows mention only nodes and binding references in the top-level summary.
def DomainClosed
(nodes : List NodeId)
(bindingRefs : List BindingName) :
PrimitiveGraphStep → Prop
| .empty => True
| .node nodeId entries exits =>
nodeId ∈ nodes ∧
BoundaryPortsClosed nodes entries ∧
BoundaryPortsClosed nodes exits
| PrimitiveGraphStep.bindingRef binding => binding ∈ bindingRefs
| PrimitiveGraphStep.overlay leftNodeIds rightNodeIds leftBindings rightBindings =>
(∀ node, node ∈ leftNodeIds → node ∈ nodes) ∧
(∀ node, node ∈ rightNodeIds → node ∈ nodes) ∧
(∀ binding, binding ∈ leftBindings → binding ∈ bindingRefs) ∧
(∀ binding, binding ∈ rightBindings → binding ∈ bindingRefs)
| PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries =>
BoundaryPortsClosed nodes leftExits ∧
BoundaryPortsClosed nodes rightEntries ∧
ConnectionsClosed nodes matchedPairs ∧
BoundaryPortsClosed nodes unmatchedLeftExits ∧
BoundaryPortsClosed nodes unmatchedRightEntriesValid primitive overlay rows expose left/right ledger disjointness.
theorem valid_overlay_ledgersDisjoint
{leftNodes rightNodes : List NodeId}
{leftBindings rightBindings : List BindingName}
(hValid :
(PrimitiveGraphStep.overlay
leftNodes rightNodes leftBindings rightBindings).Valid) :
OverlayLedgersDisjoint leftNodes rightNodes leftBindings rightBindings :=
hValid.ledgersDisjointValid primitive overlay rows expose duplicate-free side ledgers.
theorem valid_overlay_ledgersUnique
{leftNodes rightNodes : List NodeId}
{leftBindings rightBindings : List BindingName}
(hValid :
(PrimitiveGraphStep.overlay
leftNodes rightNodes leftBindings rightBindings).Valid) :
OverlayLedgersUnique leftNodes rightNodes leftBindings rightBindings :=
hValid.ledgersUniqueValid primitive connect rows expose left/right frontier membership for each match.
theorem valid_connect_pair_mem
{leftExits rightEntries : List AdmissionBoundaryPort}
{matchedPairs : List AdmissionConnection}
{unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort}
(hValid :
(PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries).Valid)
{pair : AdmissionConnection}
(hPair : pair ∈ matchedPairs) :
pair.fromPort ∈ leftExits ∧ pair.toPort ∈ rightEntries :=
hValid.pairsDrawnFromFrontiers pair hPairValid primitive connect rows do not reuse matched output or input endpoints.
theorem valid_connect_pairsLinear
{leftExits rightEntries : List AdmissionBoundaryPort}
{matchedPairs : List AdmissionConnection}
{unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort}
(hValid :
(PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries).Valid) :
ConnectPairsLinear matchedPairs :=
hValid.pairsLinearValid primitive connect rows expose duplicate-free serialized frontiers.
theorem valid_connect_frontiersLinear
{leftExits rightEntries : List AdmissionBoundaryPort}
{matchedPairs : List AdmissionConnection}
{unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort}
(hValid :
(PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries).Valid) :
ConnectFrontiersLinear leftExits rightEntries :=
hValid.frontiersLinearValid primitive connect rows expose exact matched/unmatched frontier partitioning.
theorem valid_connect_frontierPartition
{leftExits rightEntries : List AdmissionBoundaryPort}
{matchedPairs : List AdmissionConnection}
{unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort}
(hValid :
(PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries).Valid) :
ConnectFrontierPartition
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :=
hValid.frontierPartitionValid primitive connect rows match every compatible left/right frontier pair.
theorem valid_connect_matchesAllCompatible
{leftExits rightEntries : List AdmissionBoundaryPort}
{matchedPairs : List AdmissionConnection}
{unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort}
(hValid :
(PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries).Valid) :
ConnectMatchesAllCompatible leftExits rightEntries matchedPairs :=
hValid.matchesAllCompatibleValid primitive connect rows expose structural validity of serialized row endpoints.
theorem valid_connect_rowsValid
{leftExits rightEntries : List AdmissionBoundaryPort}
{matchedPairs : List AdmissionConnection}
{unmatchedLeftExits unmatchedRightEntries : List AdmissionBoundaryPort}
(hValid :
(PrimitiveGraphStep.connect
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries).Valid) :
ConnectRowsValid
leftExits rightEntries matchedPairs unmatchedLeftExits unmatchedRightEntries :=
hValid.rowsValidend PrimitiveGraphStepend AdmissionArtifactend Cortex.Wire