summaryrefslogtreecommitdiff
path: root/source/Checking/Kernel/Derivation.hs
diff options
context:
space:
mode:
Diffstat (limited to 'source/Checking/Kernel/Derivation.hs')
-rw-r--r--source/Checking/Kernel/Derivation.hs1264
1 files changed, 0 insertions, 1264 deletions
diff --git a/source/Checking/Kernel/Derivation.hs b/source/Checking/Kernel/Derivation.hs
deleted file mode 100644
index 65bcc25..0000000
--- a/source/Checking/Kernel/Derivation.hs
+++ /dev/null
@@ -1,1264 +0,0 @@
-{-# LANGUAGE DerivingStrategies #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
--- | Private in-memory proof trees and independent kernel replay.
-module Checking.Kernel.Derivation
- ( ImportIx
- , importIx
- , importIxValue
- , HypothesisIx
- , hypothesisIx
- , DerivationImportJudgment
- , derivationImportJudgment
- , derivationImportStatement
- , KernelDerivation
- , mapKernelDerivationGlobals
- , importedFactDerivation
- , localHypothesisDerivation
- , foundationFactDerivation
- , implicationEliminationDerivation
- , forallEliminationDerivation
- , falsumEliminationDerivation
- , implicationIntroductionDerivation
- , forallIntroductionDerivation
- , ConversionPlan
- , conversionPlan
- , conversionPlanBudget
- , ConversionPlanError(..)
- , convertJudgmentDerivation
- , equalityReflexivityDerivation
- , scopedEqualityReflexivityDerivation
- , equalityCongruenceApplicationDerivation
- , equalityCongruenceLambdaDerivation
- , equalityModusPonensDerivation
- , setLfpBoundDerivation
- , setLfpLeastDerivation
- , setLfpFixedDerivation
- , setLfpInductDerivation
- , weakenDerivationHypotheses
- , KernelReplayLimits
- , kernelReplayLimits
- , defaultKernelReplayLimits
- , KernelReplayLimitError(..)
- , ReplayedKernelDerivation
- , replayKernelDerivation
- , replayedKernelTarget
- , replayedKernelImportUses
- , replayedKernelFoundationUses
- , replayedKernelRuleUses
- , replayedKernelNodeCount
- , replayedKernelMaximumDepth
- , DerivationImportError(..)
- , KernelReplayError(..)
- ) where
-
-import Base
-import Checking.Core
-import Checking.Foundation
-import Checking.Kernel.Semantics qualified as Semantics
-import Checking.Kernel.SetLfp qualified as SetLfp
-
-import Control.Monad (unless)
-import Data.Bifunctor (first)
-import Data.Set qualified as Set
-import Data.Vector (Vector)
-import Data.Vector qualified as Vector
-import Numeric.Natural (Natural)
-
-
-newtype ImportIx = ImportIx Natural
- deriving stock (Show, Eq, Ord)
-
-importIx :: Natural -> ImportIx
-importIx = ImportIx
-
-importIxValue :: ImportIx -> Natural
-importIxValue (ImportIx index) =
- index
-
-newtype HypothesisIx = HypothesisIx Natural
- deriving stock (Show, Eq, Ord)
-
-hypothesisIx :: Natural -> HypothesisIx
-hypothesisIx = HypothesisIx
-
-newtype DerivationImportJudgment global =
- DerivationImportJudgment
- (FrozenCheckedCore global)
- deriving stock (Eq)
-
-data DerivationImportError =
- DerivationImportIsNotProposition !CoreType
- deriving stock (Show, Eq)
-
-derivationImportJudgment
- :: FrozenCheckedCore global
- -> Either
- DerivationImportError
- (DerivationImportJudgment global)
-derivationImportJudgment statement
- | frozenCoreType statement == TyProp =
- Right (DerivationImportJudgment statement)
- | otherwise =
- Left
- (DerivationImportIsNotProposition
- (frozenCoreType statement))
-
-derivationImportStatement
- :: DerivationImportJudgment global
- -> FrozenCheckedCore global
-derivationImportStatement
- (DerivationImportJudgment statement) =
- statement
-
-data KernelDerivation global
- = UseImportedFact !ImportIx
- | UseLocalHypothesis !HypothesisIx
- | UseFoundationFact !FoundationAxiomTag
- | ImplicationElimination
- !(KernelDerivation global)
- !(KernelDerivation global)
- | ForallElimination
- !(KernelDerivation global)
- !(ScopedCheckedCore global)
- | FalsumElimination
- !(KernelDerivation global)
- !(ScopedCheckedCore global)
- | ImplicationIntroduction
- !(ScopedCheckedCore global)
- !(KernelDerivation global)
- | ForallIntroduction
- !CoreType
- !(KernelDerivation global)
- | ConvertJudgment
- !(KernelDerivation global)
- !(ScopedCheckedCore global)
- !ConversionPlan
- | EqualityReflexivity
- !(ScopedCheckedCore global)
- | EqualityCongruenceApplication
- !(KernelDerivation global)
- !(KernelDerivation global)
- | EqualityCongruenceLambda
- !CoreType
- !(KernelDerivation global)
- | EqualityModusPonens
- !(KernelDerivation global)
- !(KernelDerivation global)
- | ApplySetLfpBound
- !(ScopedCheckedCore global)
- !(ScopedCheckedCore global)
- | ApplySetLfpLeast
- !(ScopedCheckedCore global)
- !(ScopedCheckedCore global)
- !(ScopedCheckedCore global)
- !(KernelDerivation global)
- !(KernelDerivation global)
- | ApplySetLfpFixed
- !(ScopedCheckedCore global)
- !(ScopedCheckedCore global)
- !(KernelDerivation global)
- | ApplySetLfpInduct
- !(ScopedCheckedCore global)
- !(ScopedCheckedCore global)
- !(ScopedCheckedCore global)
- !(ScopedCheckedCore global)
- !(KernelDerivation global)
- !(KernelDerivation global)
- !(KernelDerivation global)
- deriving stock (Eq)
-
-mapKernelDerivationGlobals
- :: (left -> right)
- -> KernelDerivation left
- -> KernelDerivation right
-mapKernelDerivationGlobals transform = go
- where
- scoped = mapScopedGlobals transform
- go = \case
- UseImportedFact index ->
- UseImportedFact index
- UseLocalHypothesis index ->
- UseLocalHypothesis index
- UseFoundationFact tag ->
- UseFoundationFact tag
- ImplicationElimination premise implication ->
- ImplicationElimination (go premise) (go implication)
- ForallElimination proof argument ->
- ForallElimination (go proof) (scoped argument)
- FalsumElimination proof target ->
- FalsumElimination (go proof) (scoped target)
- ImplicationIntroduction premise proof ->
- ImplicationIntroduction (scoped premise) (go proof)
- ForallIntroduction binderType proof ->
- ForallIntroduction binderType (go proof)
- ConvertJudgment proof target plan ->
- ConvertJudgment (go proof) (scoped target) plan
- EqualityReflexivity term ->
- EqualityReflexivity (scoped term)
- EqualityCongruenceApplication function argument ->
- EqualityCongruenceApplication (go function) (go argument)
- EqualityCongruenceLambda binderType proof ->
- EqualityCongruenceLambda binderType (go proof)
- EqualityModusPonens equality proof ->
- EqualityModusPonens (go equality) (go proof)
- ApplySetLfpBound domain operator ->
- ApplySetLfpBound (scoped domain) (scoped operator)
- ApplySetLfpLeast domain operator candidate bounded closed ->
- ApplySetLfpLeast
- (scoped domain)
- (scoped operator)
- (scoped candidate)
- (go bounded)
- (go closed)
- ApplySetLfpFixed domain operator monotone ->
- ApplySetLfpFixed
- (scoped domain)
- (scoped operator)
- (go monotone)
- ApplySetLfpInduct domain operator predicate element
- monotone member closed ->
- ApplySetLfpInduct
- (scoped domain)
- (scoped operator)
- (scoped predicate)
- (scoped element)
- (go monotone)
- (go member)
- (go closed)
-
-importedFactDerivation
- :: ImportIx
- -> KernelDerivation global
-importedFactDerivation =
- UseImportedFact
-
-localHypothesisDerivation
- :: HypothesisIx
- -> KernelDerivation global
-localHypothesisDerivation =
- UseLocalHypothesis
-
-foundationFactDerivation
- :: FoundationAxiomTag
- -> KernelDerivation global
-foundationFactDerivation =
- UseFoundationFact
-
-implicationEliminationDerivation
- :: KernelDerivation global
- -> KernelDerivation global
- -> KernelDerivation global
-implicationEliminationDerivation =
- ImplicationElimination
-
-forallEliminationDerivation
- :: KernelDerivation global
- -> ScopedCheckedCore global
- -> KernelDerivation global
-forallEliminationDerivation =
- ForallElimination
-
-falsumEliminationDerivation
- :: KernelDerivation global
- -> ScopedCheckedCore global
- -> KernelDerivation global
-falsumEliminationDerivation =
- FalsumElimination
-
-implicationIntroductionDerivation
- :: ScopedCheckedCore global
- -> KernelDerivation global
- -> KernelDerivation global
-implicationIntroductionDerivation =
- ImplicationIntroduction
-
-forallIntroductionDerivation
- :: CoreType
- -> KernelDerivation global
- -> KernelDerivation global
-forallIntroductionDerivation =
- ForallIntroduction
-
-newtype ConversionPlan = ConversionPlan Natural
- deriving stock (Show, Eq, Ord)
-
-data ConversionPlanError =
- ConversionPlanExceedsLimit !Natural
- deriving stock (Show, Eq)
-
-conversionPlanLimit :: Natural
-conversionPlanLimit =
- 100000
-
-conversionPlan
- :: Natural
- -> Either ConversionPlanError ConversionPlan
-conversionPlan budget
- | budget <= conversionPlanLimit =
- Right (ConversionPlan budget)
- | otherwise =
- Left (ConversionPlanExceedsLimit budget)
-
-conversionPlanBudget :: ConversionPlan -> Natural
-conversionPlanBudget (ConversionPlan budget) =
- budget
-
-convertJudgmentDerivation
- :: KernelDerivation global
- -> ScopedCheckedCore global
- -> ConversionPlan
- -> KernelDerivation global
-convertJudgmentDerivation =
- ConvertJudgment
-
-equalityReflexivityDerivation
- :: FrozenCheckedCore global
- -> KernelDerivation global
-equalityReflexivityDerivation =
- EqualityReflexivity . embedClosedCore []
-
-scopedEqualityReflexivityDerivation
- :: ScopedCheckedCore global
- -> KernelDerivation global
-scopedEqualityReflexivityDerivation =
- EqualityReflexivity
-
-equalityCongruenceApplicationDerivation
- :: KernelDerivation global
- -> KernelDerivation global
- -> KernelDerivation global
-equalityCongruenceApplicationDerivation =
- EqualityCongruenceApplication
-
-equalityCongruenceLambdaDerivation
- :: CoreType
- -> KernelDerivation global
- -> KernelDerivation global
-equalityCongruenceLambdaDerivation =
- EqualityCongruenceLambda
-
-equalityModusPonensDerivation
- :: KernelDerivation global
- -> KernelDerivation global
- -> KernelDerivation global
-equalityModusPonensDerivation =
- EqualityModusPonens
-
-setLfpBoundDerivation
- :: ScopedCheckedCore global
- -> ScopedCheckedCore global
- -> KernelDerivation global
-setLfpBoundDerivation =
- ApplySetLfpBound
-
-setLfpLeastDerivation
- :: ScopedCheckedCore global
- -> ScopedCheckedCore global
- -> ScopedCheckedCore global
- -> KernelDerivation global
- -> KernelDerivation global
- -> KernelDerivation global
-setLfpLeastDerivation =
- ApplySetLfpLeast
-
-setLfpFixedDerivation
- :: ScopedCheckedCore global
- -> ScopedCheckedCore global
- -> KernelDerivation global
- -> KernelDerivation global
-setLfpFixedDerivation =
- ApplySetLfpFixed
-
-setLfpInductDerivation
- :: ScopedCheckedCore global
- -> ScopedCheckedCore global
- -> ScopedCheckedCore global
- -> ScopedCheckedCore global
- -> KernelDerivation global
- -> KernelDerivation global
- -> KernelDerivation global
- -> KernelDerivation global
-setLfpInductDerivation =
- ApplySetLfpInduct
-
--- | Add hypotheses outside a derivation while preserving hypotheses introduced
--- by implication nodes inside it.
-weakenDerivationHypotheses
- :: Natural
- -> KernelDerivation global
- -> KernelDerivation global
-weakenDerivationHypotheses amount =
- shift 0
- where
- shift cutoff = \case
- UseImportedFact index ->
- UseImportedFact index
- UseLocalHypothesis (HypothesisIx index) ->
- UseLocalHypothesis
- (HypothesisIx
- (if index >= cutoff
- then index + amount
- else index))
- UseFoundationFact tag ->
- UseFoundationFact tag
- ImplicationElimination implication premise ->
- ImplicationElimination
- (shift cutoff implication)
- (shift cutoff premise)
- ForallElimination quantified argument ->
- ForallElimination
- (shift cutoff quantified)
- argument
- FalsumElimination falsum target ->
- FalsumElimination
- (shift cutoff falsum)
- target
- ImplicationIntroduction premise body ->
- ImplicationIntroduction
- premise
- (shift (cutoff + 1) body)
- ForallIntroduction binderType body ->
- ForallIntroduction
- binderType
- (shift cutoff body)
- ConvertJudgment source target plan ->
- ConvertJudgment
- (shift cutoff source)
- target
- plan
- EqualityReflexivity operand ->
- EqualityReflexivity operand
- EqualityCongruenceApplication function argument ->
- EqualityCongruenceApplication
- (shift cutoff function)
- (shift cutoff argument)
- EqualityCongruenceLambda binderType body ->
- EqualityCongruenceLambda
- binderType
- (shift cutoff body)
- EqualityModusPonens equality premise ->
- EqualityModusPonens
- (shift cutoff equality)
- (shift cutoff premise)
- ApplySetLfpBound domain operator ->
- ApplySetLfpBound domain operator
- ApplySetLfpLeast
- domain operator candidate
- closed bounded ->
- ApplySetLfpLeast
- domain
- operator
- candidate
- (shift cutoff closed)
- (shift cutoff bounded)
- ApplySetLfpFixed domain operator monotone ->
- ApplySetLfpFixed
- domain
- operator
- (shift cutoff monotone)
- ApplySetLfpInduct
- domain operator predicate element
- monotone member closure ->
- ApplySetLfpInduct
- domain
- operator
- predicate
- element
- (shift cutoff monotone)
- (shift cutoff member)
- (shift cutoff closure)
-
-data KernelReplayLimits = KernelReplayLimits
- !Natural
- !Natural
- deriving stock (Show, Eq)
-
-data KernelReplayLimitError
- = KernelReplayNodeLimitIsZero
- | KernelReplayNodeLimitTooLarge !Natural
- | KernelReplayDepthLimitTooLarge !Natural
- deriving stock (Show, Eq)
-
-maximumKernelReplayNodes :: Natural
-maximumKernelReplayNodes =
- 1000000
-
-maximumKernelReplayDepth :: Natural
-maximumKernelReplayDepth =
- 4096
-
-kernelReplayLimits
- :: Natural
- -> Natural
- -> Either KernelReplayLimitError KernelReplayLimits
-kernelReplayLimits nodeLimit depthLimit
- | nodeLimit == 0 =
- Left KernelReplayNodeLimitIsZero
- | nodeLimit > maximumKernelReplayNodes =
- Left (KernelReplayNodeLimitTooLarge nodeLimit)
- | depthLimit > maximumKernelReplayDepth =
- Left (KernelReplayDepthLimitTooLarge depthLimit)
- | otherwise =
- Right
- (KernelReplayLimits
- nodeLimit
- depthLimit)
-
-defaultKernelReplayLimits :: KernelReplayLimits
-defaultKernelReplayLimits =
- KernelReplayLimits
- 200000
- 2048
-
-data ReplayedKernelDerivation global =
- ReplayedKernelDerivation
- !(FrozenCheckedCore global)
- !(Set ImportIx)
- !(Set FoundationAxiomTag)
- !(Set KernelRuleTag)
- !Natural
- !Natural
- deriving stock (Eq)
-
-replayedKernelTarget
- :: ReplayedKernelDerivation global
- -> FrozenCheckedCore global
-replayedKernelTarget
- (ReplayedKernelDerivation
- target
- _importUses
- _foundationUses
- _ruleUses
- _nodeCount
- _maximumDepth) =
- target
-
-replayedKernelImportUses
- :: ReplayedKernelDerivation global
- -> Set ImportIx
-replayedKernelImportUses
- (ReplayedKernelDerivation
- _target
- importUses
- _foundationUses
- _ruleUses
- _nodeCount
- _maximumDepth) =
- importUses
-
-replayedKernelFoundationUses
- :: ReplayedKernelDerivation global
- -> Set FoundationAxiomTag
-replayedKernelFoundationUses
- (ReplayedKernelDerivation
- _target
- _importUses
- foundationUses
- _ruleUses
- _nodeCount
- _maximumDepth) =
- foundationUses
-
-replayedKernelRuleUses
- :: ReplayedKernelDerivation global
- -> Set KernelRuleTag
-replayedKernelRuleUses
- (ReplayedKernelDerivation
- _target
- _importUses
- _foundationUses
- ruleUses
- _nodeCount
- _maximumDepth) =
- ruleUses
-
-replayedKernelNodeCount
- :: ReplayedKernelDerivation global
- -> Natural
-replayedKernelNodeCount
- (ReplayedKernelDerivation
- _target
- _importUses
- _foundationUses
- _ruleUses
- nodeCount
- _maximumDepth) =
- nodeCount
-
-replayedKernelMaximumDepth
- :: ReplayedKernelDerivation global
- -> Natural
-replayedKernelMaximumDepth
- (ReplayedKernelDerivation
- _target
- _importUses
- _foundationUses
- _ruleUses
- _nodeCount
- maximumDepth) =
- maximumDepth
-
-data ReplayStep global = ReplayStep
- !(ScopedCheckedCore global)
- !(Set ImportIx)
- !(Set FoundationAxiomTag)
- !(Set KernelRuleTag)
- !Natural
- !Natural
-
-data KernelReplayError
- = KernelReplaySemanticsError
- !Semantics.KernelSemanticsError
- | KernelReplaySetLfpRuleError
- !SetLfp.SetLfpRuleError
- | KernelReplayImportOutOfBounds !ImportIx
- | KernelReplayHypothesisOutOfBounds !HypothesisIx
- | KernelReplayStoredContextMismatch
- ![CoreType]
- ![CoreType]
- | KernelReplayStoredTermIllTyped !CoreCheckError
- | KernelReplayStoredTypeMismatch
- !CoreType
- !CoreType
- | KernelReplayWeakeningError !CoreCheckError
- | KernelReplayNodeLimitExceeded !Natural
- | KernelReplayDepthLimitExceeded !Natural
- | KernelReplayRootRemainedOpen
- | KernelReplayTargetMismatch
- deriving stock (Show, Eq)
-
-replayKernelDerivation
- :: Eq global
- => CheckedFoundation
- -> KernelReplayLimits
- -> (global -> Maybe CoreType)
- -> Vector (DerivationImportJudgment global)
- -> FrozenCheckedCore global
- -> KernelDerivation global
- -> Either
- KernelReplayError
- (ReplayedKernelDerivation global)
-replayKernelDerivation
- checkedFoundationValue
- limits
- globalType
- imports
- expectedTarget
- derivation =
- checkedFoundationValue `seq` do
- expectedTarget' <-
- recheckClosed expectedTarget
- ReplayStep
- synthesized
- importUses
- foundationUses
- ruleUses
- nodeCount
- maximumDepth <-
- replay [] [] 0 derivation
- closed <-
- maybe
- (Left KernelReplayRootRemainedOpen)
- Right
- (closeScopedCore synthesized)
- unless
- (closed == expectedTarget')
- (Left KernelReplayTargetMismatch)
- pure
- (ReplayedKernelDerivation
- closed
- importUses
- foundationUses
- ruleUses
- nodeCount
- maximumDepth)
- where
- replay context hypotheses depth derivationNode
- | depth > replayDepthLimit =
- Left
- (KernelReplayDepthLimitExceeded
- replayDepthLimit)
- | otherwise = do
- step <-
- replayWithin
- context
- hypotheses
- depth
- derivationNode
- if stepNodeCount step > replayNodeLimit
- then
- Left
- (KernelReplayNodeLimitExceeded
- replayNodeLimit)
- else
- Right step
-
- replayWithin context hypotheses depth = \case
- UseImportedFact index -> do
- judgment <-
- lookupImport index
- statement <-
- recheckStored
- context
- (embedClosedCore context
- (derivationImportStatement
- judgment))
- pure
- (leaf
- depth
- statement
- (Set.singleton index)
- mempty)
- UseLocalHypothesis index -> do
- hypothesis <-
- lookupHypothesis index hypotheses
- checkedHypothesis <-
- recheckStored context hypothesis
- pure
- (leaf
- depth
- checkedHypothesis
- mempty
- mempty)
- UseFoundationFact tag -> do
- statement <-
- recheckStored
- context
- (embedClosedCore context
- (mapFrozenGlobals
- absurd
- (foundationAxiomFrozen
- checkedFoundationValue
- tag)))
- pure
- (leaf
- depth
- statement
- mempty
- (Set.singleton tag))
- ImplicationElimination implication premise -> do
- implicationStep <-
- replay context hypotheses (depth + 1) implication
- premiseStep <-
- replay context hypotheses (depth + 1) premise
- combine2 depth
- (Semantics.implicationElimination
- globalType
- (stepValue implicationStep)
- (stepValue premiseStep))
- implicationStep
- premiseStep
- ForallElimination quantified argument -> do
- argument' <-
- recheckStored context argument
- quantifiedStep <-
- replay context hypotheses (depth + 1) quantified
- combine1 depth
- (Semantics.forallElimination
- globalType
- (stepValue quantifiedStep)
- argument')
- quantifiedStep
- FalsumElimination falsum target -> do
- target' <-
- recheckStored context target
- falsumStep <-
- replay context hypotheses (depth + 1) falsum
- combine1 depth
- (Semantics.falsumElimination
- globalType
- (stepValue falsumStep)
- target')
- falsumStep
- ImplicationIntroduction premise body -> do
- premise' <-
- recheckStored context premise
- bodyStep <-
- replay
- context
- (premise' : hypotheses)
- (depth + 1)
- body
- combine1 depth
- (Semantics.implicationIntroduction
- globalType
- premise'
- (stepValue bodyStep))
- bodyStep
- ForallIntroduction binderType body -> do
- weakenedHypotheses <-
- traverse
- (first KernelReplayWeakeningError
- . weakenScopedCore
- globalType
- binderType)
- hypotheses
- bodyStep <-
- replay
- (binderType : context)
- weakenedHypotheses
- (depth + 1)
- body
- combine1 depth
- (Semantics.forallIntroduction
- globalType
- binderType
- (stepValue bodyStep))
- bodyStep
- ConvertJudgment source target plan -> do
- target' <-
- recheckStored context target
- sourceStep <-
- replay
- context
- hypotheses
- (depth + 1)
- source
- combine1 depth
- (Semantics.convertJudgment
- globalType
- (conversionPlanBudget plan)
- (stepValue sourceStep)
- target')
- sourceStep
- EqualityReflexivity operand -> do
- operand' <-
- recheckStored context operand
- value <-
- first KernelReplaySemanticsError
- (Semantics.equalityReflexivity
- globalType
- operand')
- pure (leaf depth value mempty mempty)
- EqualityCongruenceApplication
- functionEquality
- argumentEquality -> do
- functionStep <-
- replay
- context
- hypotheses
- (depth + 1)
- functionEquality
- argumentStep <-
- replay
- context
- hypotheses
- (depth + 1)
- argumentEquality
- combine2 depth
- (Semantics.equalityCongruenceApplication
- globalType
- (stepValue functionStep)
- (stepValue argumentStep))
- functionStep
- argumentStep
- EqualityCongruenceLambda binderType bodyEquality -> do
- weakenedHypotheses <-
- traverse
- (first KernelReplayWeakeningError
- . weakenScopedCore
- globalType
- binderType)
- hypotheses
- bodyStep <-
- replay
- (binderType : context)
- weakenedHypotheses
- (depth + 1)
- bodyEquality
- combine1 depth
- (Semantics.equalityCongruenceLambda
- globalType
- binderType
- (stepValue bodyStep))
- bodyStep
- EqualityModusPonens equality premise -> do
- equalityStep <-
- replay context hypotheses (depth + 1) equality
- premiseStep <-
- replay context hypotheses (depth + 1) premise
- combine2 depth
- (Semantics.equalityModusPonens
- globalType
- (stepValue equalityStep)
- (stepValue premiseStep))
- equalityStep
- premiseStep
- ApplySetLfpBound domain operator -> do
- domain' <-
- recheckStored context domain
- operator' <-
- recheckStored context operator
- value <-
- first KernelReplaySetLfpRuleError
- (SetLfp.setLfpBound
- checkedFoundationValue
- globalType
- domain'
- operator')
- pure
- (ruleLeaf
- depth
- SetLfpBound
- value)
- ApplySetLfpLeast
- domain
- operator
- candidate
- closedPremise
- boundedPremise -> do
- domain' <-
- recheckStored context domain
- operator' <-
- recheckStored context operator
- candidate' <-
- recheckStored context candidate
- closedStep <-
- replay
- context
- hypotheses
- (depth + 1)
- closedPremise
- boundedStep <-
- replay
- context
- hypotheses
- (depth + 1)
- boundedPremise
- combineRule depth SetLfpLeast
- (SetLfp.setLfpLeast
- checkedFoundationValue
- globalType
- domain'
- operator'
- candidate'
- (stepValue closedStep)
- (stepValue boundedStep))
- [closedStep, boundedStep]
- ApplySetLfpFixed domain operator monotonePremise -> do
- domain' <-
- recheckStored context domain
- operator' <-
- recheckStored context operator
- monotoneStep <-
- replay
- context
- hypotheses
- (depth + 1)
- monotonePremise
- combineRule depth SetLfpFixed
- (SetLfp.setLfpFixed
- checkedFoundationValue
- globalType
- domain'
- operator'
- (stepValue monotoneStep))
- [monotoneStep]
- ApplySetLfpInduct
- domain
- operator
- predicate
- element
- monotonePremise
- memberPremise
- closurePremise -> do
- domain' <-
- recheckStored context domain
- operator' <-
- recheckStored context operator
- predicate' <-
- recheckStored context predicate
- element' <-
- recheckStored context element
- monotoneStep <-
- replay
- context
- hypotheses
- (depth + 1)
- monotonePremise
- memberStep <-
- replay
- context
- hypotheses
- (depth + 1)
- memberPremise
- closureStep <-
- replay
- context
- hypotheses
- (depth + 1)
- closurePremise
- combineRule depth SetLfpInduct
- (SetLfp.setLfpInduct
- checkedFoundationValue
- globalType
- domain'
- operator'
- predicate'
- element'
- (stepValue monotoneStep)
- (stepValue memberStep)
- (stepValue closureStep))
- [ monotoneStep
- , memberStep
- , closureStep
- ]
-
- lookupImport index@(ImportIx naturalIndex)
- | naturalIndex
- > fromIntegral (maxBound :: Int) =
- Left
- (KernelReplayImportOutOfBounds
- index)
- | otherwise =
- maybe
- (Left
- (KernelReplayImportOutOfBounds
- index))
- Right
- (imports
- Vector.!?
- (fromIntegral naturalIndex))
-
- lookupHypothesis
- index@(HypothesisIx naturalIndex)
- hypotheses =
- maybe
- (Left
- (KernelReplayHypothesisOutOfBounds
- index))
- Right
- (atNatural naturalIndex hypotheses)
-
- requireContext expected value
- | scopedCoreContext value == expected =
- Right ()
- | otherwise =
- Left
- (KernelReplayStoredContextMismatch
- expected
- (scopedCoreContext value))
-
- recheckStored expectedContext stored = do
- requireContext expectedContext stored
- checked <-
- first KernelReplayStoredTermIllTyped
- (checkScopedCanonicalCore
- globalType
- expectedContext
- (scopedCoreTerm stored))
- unless
- (scopedCoreType checked
- == scopedCoreType stored)
- (Left
- (KernelReplayStoredTypeMismatch
- (scopedCoreType stored)
- (scopedCoreType checked)))
- pure checked
-
- recheckClosed stored = do
- checked <-
- first KernelReplayStoredTermIllTyped
- (checkCanonicalCore
- globalType
- (frozenCoreTerm stored))
- unless
- (frozenCoreType checked
- == frozenCoreType stored)
- (Left
- (KernelReplayStoredTypeMismatch
- (frozenCoreType stored)
- (frozenCoreType checked)))
- pure checked
-
- replayNodeLimit =
- case limits of
- KernelReplayLimits nodeLimit _depthLimit ->
- nodeLimit
-
- replayDepthLimit =
- case limits of
- KernelReplayLimits _nodeLimit depthLimit ->
- depthLimit
-
-leaf
- :: Natural
- -> ScopedCheckedCore global
- -> Set ImportIx
- -> Set FoundationAxiomTag
- -> ReplayStep global
-leaf depth value importUses foundationUses =
- ReplayStep
- value
- importUses
- foundationUses
- mempty
- 1
- depth
-
-ruleLeaf
- :: Natural
- -> KernelRuleTag
- -> ScopedCheckedCore global
- -> ReplayStep global
-ruleLeaf depth tag value =
- ReplayStep
- value
- mempty
- mempty
- (Set.singleton tag)
- 1
- depth
-
-stepValue :: ReplayStep global -> ScopedCheckedCore global
-stepValue
- (ReplayStep
- value
- _importUses
- _foundationUses
- _ruleUses
- _nodeCount
- _maximumDepth) =
- value
-
-combine1
- :: Natural
- -> Either
- Semantics.KernelSemanticsError
- (ScopedCheckedCore global)
- -> ReplayStep global
- -> Either KernelReplayError (ReplayStep global)
-combine1 depth synthesized child = do
- value <-
- first KernelReplaySemanticsError synthesized
- pure
- (ReplayStep
- value
- (stepImportUses child)
- (stepFoundationUses child)
- (stepRuleUses child)
- (1 + stepNodeCount child)
- (max depth
- (stepMaximumDepth child)))
-
-combine2
- :: Natural
- -> Either
- Semantics.KernelSemanticsError
- (ScopedCheckedCore global)
- -> ReplayStep global
- -> ReplayStep global
- -> Either KernelReplayError (ReplayStep global)
-combine2 depth synthesized left right = do
- value <-
- first KernelReplaySemanticsError synthesized
- pure
- (ReplayStep
- value
- (stepImportUses left
- <> stepImportUses right)
- (stepFoundationUses left
- <> stepFoundationUses right)
- (stepRuleUses left
- <> stepRuleUses right)
- (1
- + stepNodeCount left
- + stepNodeCount right)
- (maximum
- [ depth
- , stepMaximumDepth left
- , stepMaximumDepth right
- ]))
-
-combineRule
- :: Natural
- -> KernelRuleTag
- -> Either
- SetLfp.SetLfpRuleError
- (ScopedCheckedCore global)
- -> [ReplayStep global]
- -> Either KernelReplayError (ReplayStep global)
-combineRule depth tag synthesized children = do
- value <-
- first KernelReplaySetLfpRuleError synthesized
- pure
- (ReplayStep
- value
- (foldMap stepImportUses children)
- (foldMap stepFoundationUses children)
- (Set.insert tag
- (foldMap stepRuleUses children))
- (1 + sum (stepNodeCount <$> children))
- (maximum
- (depth
- : (stepMaximumDepth <$> children))))
-
-stepImportUses
- :: ReplayStep global
- -> Set ImportIx
-stepImportUses
- (ReplayStep
- _value
- importUses
- _foundationUses
- _ruleUses
- _nodeCount
- _maximumDepth) =
- importUses
-
-stepFoundationUses
- :: ReplayStep global
- -> Set FoundationAxiomTag
-stepFoundationUses
- (ReplayStep
- _value
- _importUses
- foundationUses
- _ruleUses
- _nodeCount
- _maximumDepth) =
- foundationUses
-
-stepRuleUses
- :: ReplayStep global
- -> Set KernelRuleTag
-stepRuleUses
- (ReplayStep
- _value
- _importUses
- _foundationUses
- ruleUses
- _nodeCount
- _maximumDepth) =
- ruleUses
-
-stepNodeCount :: ReplayStep global -> Natural
-stepNodeCount
- (ReplayStep
- _value
- _importUses
- _foundationUses
- _ruleUses
- nodeCount
- _maximumDepth) =
- nodeCount
-
-stepMaximumDepth :: ReplayStep global -> Natural
-stepMaximumDepth
- (ReplayStep
- _value
- _importUses
- _foundationUses
- _ruleUses
- _nodeCount
- maximumDepth) =
- maximumDepth
-
-atNatural :: Natural -> [a] -> Maybe a
-atNatural _index [] =
- Nothing
-atNatural 0 (value : _rest) =
- Just value
-atNatural index (_value : rest) =
- atNatural (index - 1) rest