diff options
Diffstat (limited to 'source/Checking/Declaration.hs')
| -rw-r--r-- | source/Checking/Declaration.hs | 6543 |
1 files changed, 0 insertions, 6543 deletions
diff --git a/source/Checking/Declaration.hs b/source/Checking/Declaration.hs deleted file mode 100644 index 65b7675..0000000 --- a/source/Checking/Declaration.hs +++ /dev/null @@ -1,6543 +0,0 @@ -{-# LANGUAGE DeriveAnyClass #-} -{-# LANGUAGE DerivingStrategies #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE RankNTypes #-} - --- | Builder-confined authorization and atomic typed declaration append. -module Checking.Declaration - ( ModuleDriver - , DriverFailure(..) - , DriverResult(..) - , ImportedModuleEvidence - , ImportedAliasOrigin(..) - , freshImportedModuleEvidence - , validateImportedModuleEvidence - , importSealedModule - , importSealedModuleDriver - , nextDeclarationSlotDriver - , currentTheoryDriver - , currentFoundationAxiomDriver - , resolveVisibleFactAliasDriver - , resolveVisibleFactTargetsDriver - , resolveVisibleGlobalDriver - , resolveVisibleGlobalContentDriver - , ResolvedStructure - , resolvedStructureDescriptor - , resolvedStructurePredicate - , resolvedStructureOperation - , resolvedStructureOperations - , resolveVisibleStructureDriver - , resolveVisibleStructureOperationObjectsDriver - , objectAvailableDriver - , objectTypeDriver - , LoweringDriver - , runProspectiveLoweringDriver - , nextDeclarationSlotLowering - , currentTheoryLowering - , currentFoundationAxiomLowering - , resolveVisibleFactAliasLowering - , resolveVisibleFactTargetsLowering - , resolveVisibleGlobalLowering - , resolveVisibleGlobalContentLowering - , resolveVisibleStructureLowering - , resolveVisibleStructureOperationObjectsLowering - , objectAvailableLowering - , objectTypeLowering - , runModuleDriver - , ValidationLookup - , validationLookup - , ValidationRun(..) - , failModuleDriver - , failDeclarationDriver - , VampireResolver - , vampireBatchResolver - , vampireBatchResolverWithPreparationObserver - , vampireResolver - , vampireSubmissionResolver - , Declaration - , failDeclaration - , addDeclarationObject - , addDeclarationProposition - , resolveVisibleGlobal - , stageSemanticGlobalBinding - , stageSemanticStructureDescriptor - , CandidateSpec - , candidateSpec - , CandidatePlanningSpec - , CheckedCandidate - , checkedCandidate - , checkedDefinitionEquationPlanning - , checkedSourceAxiomPlanning - , checkedDatatypePlanning - , checkedKernelPlanning - , checkedSourceProofPlanning - , checkedOmittedPlanning - , CheckedPlannedVampireRequest - , checkedPlannedVampireRequest - , plannedEarlierCandidate - , CheckedDeclaration - , checkedProofDeclaration - , checkedCompiledDeclaration - , admitCheckedDeclaration - , PlannedDeclaration - , planCheckedDeclaration - , admitPlannedCheckedDeclaration - , plannedDeclarationPreviousPrefix - , plannedDeclarationNextPrefix - , plannedDeclarationDelta - , PlanningIntegrityError(..) - , prepareCandidateSpecDriver - , prepareFrozenCandidateSpecDriver - , prepareDefinitionEquationSpecDriver - , preparePointwiseDefinitionEquationSpecDriver - , prepareStagedCandidateVampireDriver - , prepareCandidateSpecLowering - , prepareFrozenCandidateSpecLowering - , prepareDefinitionEquationSpecLowering - , preparePointwiseDefinitionEquationSpecLowering - , prepareStagedCandidateVampireLowering - , ReservedCandidate - , reserveCandidate - , reserveCandidateBatch - , reservePropositionCandidate - , reserveFrozenPropositionCandidateBatch - , reserveDefinitionEquationCandidate - , reservePointwiseDefinitionEquationCandidate - , reserveDefinitionEquationCandidateBatch - , reservedCandidateSlot - , reservedCandidateStage - , CandidateProof - , locateProofObligation - , recordOmittedUse - , VampirePremiseSelection(..) - , VampireObligationPreparationError(..) - , ScopedVampirePremise - , scopedVampirePremise - , PreparedVampireObligation - , prepareScopedVampireObligationDriver - , prepareScopedContradictionObligationDriver - , prepareScopedVampireObligationLowering - , prepareScopedContradictionObligationLowering - , useAuthorizedFact - , useStagedCandidate - , LocalClaim - , proveLocalKernelClaim - , useLocalClaim - , authorizeKernelProofCandidate - , authorizeKernelConstructionCandidate - , authorizeDefinitionEquationCandidate - , acceptVampireObligation - , acceptPreparedVampireObligation - , acceptCurrentCandidateVampire - , prepareCurrentCandidateVampire - , authorizeVampireCandidate - , authorizeVampireCandidateBatch - , authorizeSourceAxiomCandidate - , authorizeOmittedCandidate - , authorizeDatatypeCompilationCandidates - , authorizeCompiledDeclaration - , commitProofDeclaration - , commitCompiledDeclaration - , CommittedDeclarationBatch - , committedBatchOwner - , committedBatchSlot - , committedBatchPreviousPrefix - , committedBatchNextPrefix - , committedBatchDelta - , committedBatchObjects - , committedBatchPropositions - , committedBatchProofValidations - , committedBatchDeclarationValidation - , PendingModulePrefix - , emptyPendingModulePrefix - , pendingModulePrefixBatches - , pendingModulePrefixCurrent - , ValidationIntegrityError(..) - , renderValidationIntegrityError - , DeclarationError(..) - , declarationErrorLocation - , renderDeclarationError - , DriverOpenError(..) - , renderDriverOpenError - ) where - -import Base -import Checking.Authority -import Checking.Backend.Problem qualified as Backend -import Checking.Backend.Tptp qualified as Tptp -import Checking.Core -import Checking.Foundation -import Checking.Identity -import Checking.Kernel.Derivation -import Checking.Semantic -import Checking.Materialization qualified as Materialization -import Felix.Cache.Codec (encodeCache) -import Felix.Module -import Provers qualified -import Report.Location -import Syntax.Abstract (StructSymbol) - -import Control.Exception qualified as Exception -import Control.DeepSeq (deepseq) -import Control.Monad.Except (ExceptT) -import Control.Monad.Except qualified as Except -import Control.Monad (foldM, unless, when) -import Control.Monad.State.Strict (StateT) -import Control.Monad.State.Strict qualified as State -import Data.Bifunctor (first) -import Data.ByteString qualified as ByteString -import Data.List qualified as List -import Data.List.NonEmpty qualified as NonEmpty -import Data.Map.Strict qualified as Map -import Data.Maybe (catMaybes, mapMaybe) -import Data.Set qualified as Set -import Data.Text qualified as Text -import Data.Unique (Unique, newUnique) -import Data.IORef (IORef, atomicModifyIORef', newIORef, readIORef) -import Data.Vector (Vector) -import Data.Vector qualified as Vector -import Numeric.Natural (Natural) - - -newtype BuilderIdentity = BuilderIdentity Unique - deriving stock (Eq) - -newtype DeclarationInvocation = DeclarationInvocation Natural - deriving stock (Eq) - -newtype CandidateStage = CandidateStage Natural - deriving stock (Show, Eq, Ord) - -data ValidationLookup = ValidationLookup - !(ProofValidationKey -> IO (Maybe ProofValidationRecord)) - !(DeclarationValidationKey - -> IO (Maybe DeclarationValidationRecord)) - -validationLookup - :: (ProofValidationKey -> IO (Maybe ProofValidationRecord)) - -> (DeclarationValidationKey - -> IO (Maybe DeclarationValidationRecord)) - -> ValidationLookup -validationLookup = - ValidationLookup - -data ValidationRun - = FreshValidation - | WarmValidation !ValidationLookup - -data ValidationIntegrityError - = CachedValidationIntegrityError - !Materialization.MaterializationError - deriving stock (Show, Eq) - -instance Exception.Exception ValidationIntegrityError - -renderValidationIntegrityError :: ValidationIntegrityError -> Text -renderValidationIntegrityError = \case - CachedValidationIntegrityError failure -> - "cached validation does not match its exact contextual input: " - <> Text.pack (show failure) - - -data BuilderFactAuthorization = BuilderFactAuthorization - !BuilderIdentity - !FactSlot - !FactAuthority - -data PendingFactAuthorization = PendingFactAuthorization - !BuilderIdentity - !PrefixContextId - !DeclarationInvocation - !FactSlot - !FactAuthority - !CandidateStage - --- | Checked fact semantics paired with caller-selected evidence. Semantic --- lookup and request preparation deliberately ignore the evidence parameter; --- only the admitted builder instantiation may consume capabilities. -data FactEntry evidence = FactEntry - !CheckedPropositionContent - !SemanticFactOccurrence - !evidence - --- | The shared checked semantic state. The evidence parameter makes the --- distinction between admitted authority and future inert planning data --- visible without duplicating lookup, collision, closure, or delta logic. -data BuilderState evidence = BuilderState - { logicalBuilderIdentity :: !BuilderIdentity - , logicalBuilderFoundation :: !CheckedFoundation - , logicalBuilderTheory :: !TheoryId - , logicalBuilderOwner :: !ModuleName - , logicalBuilderDirectSemanticInputs :: ![SemanticInterfaceId] - , logicalBuilderPrefix :: !PrefixContextId - , logicalBuilderObjectClosure :: !CheckedObjectClosure - , logicalBuilderFacts - :: !(Map - SemanticFactOccurrenceFingerprint - (FactEntry evidence)) - , logicalBuilderAliases - :: !(Map SemanticName ImportedAliasBinding) - , logicalBuilderGlobals - :: !(Map SemanticGlobalKey SemanticGlobalTarget) - , logicalBuilderStructures - :: !(Map SemanticStructurePhrase ResolvedStructure) - , logicalBuilderImportedInterfaces :: !(Set SemanticInterfaceId) - , logicalBuilderDeltas :: ![DeclarationInterfaceDelta] - , logicalBuilderNextDeclaration :: !Natural - , logicalBuilderNextFact :: !Natural - , logicalBuilderNextInvocation :: !Natural - } - --- | The only production builder in this milestone. Capability-consuming --- operations below accept this admitted instantiation, never a polymorphic --- 'BuilderState'. -type LogicalBuilder = BuilderState BuilderFactAuthorization - --- | Public semantic contract and strict declaration-stage provenance for a --- prospective fact. It deliberately contains no builder identity, prefix, --- declaration invocation, pending authorization, or minting capability. -data PlanningProvenance = PlanningProvenance - !DeclarationSlot - !CandidateStage - !FactSlot - deriving stock (Eq) - -data PlanningEvidence = PlanningEvidence - !FactAuthority - !(Maybe PlanningProvenance) - -data ResolvedStructureOperation = ResolvedStructureOperation - !ObjectId - !SemanticStructurePhrase - deriving stock (Show, Eq) - -data ResolvedStructure = ResolvedStructure - !SemanticStructureDescriptor - !(Set SemanticStructurePhrase) - !(Map StructSymbol ResolvedStructureOperation) - deriving stock (Show, Eq) - -resolvedStructureDescriptor - :: ResolvedStructure - -> SemanticStructureDescriptor -resolvedStructureDescriptor (ResolvedStructure descriptor _ _) = - descriptor - -resolvedStructurePredicate :: ResolvedStructure -> Maybe ObjectId -resolvedStructurePredicate = - semanticStructureDescriptorPredicate . resolvedStructureDescriptor - -resolvedStructureOperation - :: StructSymbol - -> ResolvedStructure - -> Maybe ObjectId -resolvedStructureOperation symbol (ResolvedStructure _ _ operations) = - operationObject <$> Map.lookup symbol operations - where - operationObject (ResolvedStructureOperation object _origin) = object - -resolvedStructureOperations - :: ResolvedStructure - -> Map StructSymbol ObjectId -resolvedStructureOperations (ResolvedStructure _ _ operations) = - operationObject <$> operations - where - operationObject (ResolvedStructureOperation object _origin) = object - -structureOperationBindings - :: Map SemanticStructurePhrase ResolvedStructure - -> Set (StructSymbol, ObjectId) -structureOperationBindings structures = - Set.fromList - [ (symbol, object) - | structure <- Map.elems structures - , (symbol, object) <- - Map.toAscList (resolvedStructureOperations structure) - ] - - -data CommittedDeclarationBatch = CommittedDeclarationBatch - !ModuleName - !DeclarationSlot - !PrefixContextId - !PrefixContextId - !DeclarationInterfaceDelta - ![AssertedObject] - ![CheckedPropositionContent] - ![ProofValidationRecord] - !(Maybe DeclarationValidationRecord) - -committedBatchOwner :: CommittedDeclarationBatch -> ModuleName -committedBatchOwner - (CommittedDeclarationBatch owner _ _ _ _ _ _ _ _) = - owner - -committedBatchSlot - :: CommittedDeclarationBatch - -> DeclarationSlot -committedBatchSlot - (CommittedDeclarationBatch _ slot _ _ _ _ _ _ _) = - slot - -committedBatchPreviousPrefix - :: CommittedDeclarationBatch - -> PrefixContextId -committedBatchPreviousPrefix - (CommittedDeclarationBatch _ _ previous _ _ _ _ _ _) = - previous - -committedBatchNextPrefix - :: CommittedDeclarationBatch - -> PrefixContextId -committedBatchNextPrefix - (CommittedDeclarationBatch _ _ _ next _ _ _ _ _) = - next - -committedBatchDelta - :: CommittedDeclarationBatch - -> DeclarationInterfaceDelta -committedBatchDelta - (CommittedDeclarationBatch _ _ _ _ delta _ _ _ _) = - delta - -committedBatchObjects - :: CommittedDeclarationBatch - -> [AssertedObject] -committedBatchObjects - (CommittedDeclarationBatch _ _ _ _ _ objects _ _ _) = - objects - -committedBatchPropositions - :: CommittedDeclarationBatch - -> [CheckedPropositionContent] -committedBatchPropositions - (CommittedDeclarationBatch _ _ _ _ _ _ propositions _ _) = - propositions - -committedBatchProofValidations - :: CommittedDeclarationBatch - -> [ProofValidationRecord] -committedBatchProofValidations - (CommittedDeclarationBatch _ _ _ _ _ _ _ validations _) = - validations - -committedBatchDeclarationValidation - :: CommittedDeclarationBatch - -> Maybe DeclarationValidationRecord -committedBatchDeclarationValidation - (CommittedDeclarationBatch _ _ _ _ _ _ _ _ validation) = - validation - - -data PendingModulePrefix = PendingModulePrefix - !PrefixContextId - ![CommittedDeclarationBatch] - -emptyPendingModulePrefix - :: PrefixContextId - -> PendingModulePrefix -emptyPendingModulePrefix prefix = - PendingModulePrefix prefix [] - -instance Show PendingModulePrefix where - show prefix = - "PendingModulePrefix {pendingModulePrefixCurrent = " - <> show (pendingModulePrefixCurrent prefix) - <> ", pendingModulePrefixBatchCount = " - <> show (length (pendingModulePrefixBatches prefix)) - <> "}" - -pendingModulePrefixBatches - :: PendingModulePrefix - -> [CommittedDeclarationBatch] -pendingModulePrefixBatches - (PendingModulePrefix _ batchesReversed) = - reverse batchesReversed - -pendingModulePrefixCurrent - :: PendingModulePrefix - -> PrefixContextId -pendingModulePrefixCurrent - (PendingModulePrefix prefix _batches) = - prefix - -appendPendingBatch - :: CommittedDeclarationBatch - -> PendingModulePrefix - -> PendingModulePrefix -appendPendingBatch batch (PendingModulePrefix _ batches) = - forceCommittedBatch batch `seq` - PendingModulePrefix - (committedBatchNextPrefix batch) - (batch : batches) - -forceCommittedBatch :: CommittedDeclarationBatch -> () -forceCommittedBatch - (CommittedDeclarationBatch - owner slot previous next delta objects propositions - proofValidations declarationValidation) = - owner `seq` - slot `seq` - previous `seq` - next `seq` - ByteString.length - (encodeCache (putDeclarationInterfaceDeltaCache delta)) `seq` - objects `deepseq` - propositions `deepseq` - forceProofValidations proofValidations `seq` - forceDeclarationValidation declarationValidation - where - forceProofValidations = - foldl' - (\() record -> - proofValidationRecordKey record `seq` - ByteString.length - (encodeCache - (putValidationCertificateCache - (proofValidationRecordCertificate - record))) `seq` ()) - () - - forceDeclarationValidation = \case - Nothing -> () - Just record -> - declarationValidationRecordKey record `seq` - foldl' - (\() certificate -> - ByteString.length - (encodeCache - (putValidationCertificateCache - certificate)) `seq` ()) - () - (declarationValidationRecordCertificates record) - - -data VampireResolverMode - = SynchronousVampireResolution - (forall local origin. - NonEmpty - (Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId) - -> IO - (NonEmpty - (Either - Provers.ProverProcessError - Provers.ProverAnswer))) - | AsynchronousVampireSubmission - (NonEmpty Provers.PreparedVerificationRequest - -> IO (NonEmpty Provers.VampireHandle)) - -data VampireResolver = VampireResolver - !VampireResolverMode - !(Word64 -> IO ()) - -vampireBatchResolver - :: (forall local origin. - NonEmpty - (Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId) - -> IO - (NonEmpty - (Either - Provers.ProverProcessError - Provers.ProverAnswer))) - -> VampireResolver -vampireBatchResolver resolve = - vampireBatchResolverWithPreparationObserver resolve (const (pure ())) - -vampireBatchResolverWithPreparationObserver - :: (forall local origin. - NonEmpty - (Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId) - -> IO - (NonEmpty - (Either - Provers.ProverProcessError - Provers.ProverAnswer))) - -> (Word64 -> IO ()) - -> VampireResolver -vampireBatchResolverWithPreparationObserver resolve observe = - VampireResolver (SynchronousVampireResolution resolve) observe - --- | Production submission-only resolver. Retained-plan admission consumes --- the submitted handles through its private synchronous replay resolver. -vampireSubmissionResolver - :: (NonEmpty Provers.PreparedVerificationRequest - -> IO (NonEmpty Provers.VampireHandle)) - -> (Word64 -> IO ()) - -> VampireResolver -vampireSubmissionResolver submit observe = - VampireResolver (AsynchronousVampireSubmission submit) observe - -vampireResolver - :: (forall local origin. - Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> IO - (Either - Provers.ProverProcessError - Provers.ProverAnswer)) - -> VampireResolver -vampireResolver resolve = - vampireBatchResolver (traverse resolve) - -resolveOneVampire - :: VampireResolver - -> Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> ExceptT DeclarationError IO - (Either - Provers.ProverProcessError - Provers.ProverAnswer) -resolveOneVampire resolver prepared = do - results@(result :| _) <- - liftIO (resolveSynchronousVampireBatch resolver (prepared :| [])) - void - (Except.liftEither - (validateVampireResolverResultCount 1 results)) - pure result - -resolveSynchronousVampireBatch - :: VampireResolver - -> NonEmpty - (Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId) - -> IO - (NonEmpty - (Either - Provers.ProverProcessError - Provers.ProverAnswer)) -resolveSynchronousVampireBatch - (VampireResolver mode _observe) tasks = - case mode of - SynchronousVampireResolution resolve -> resolve tasks - AsynchronousVampireSubmission{} -> - throwIO - (PlanningIntegrityError - "asynchronous Vampire resolver reached synchronous admission") - -observeVampirePreparation - :: VampireResolver - -> Word64 - -> IO () -observeVampirePreparation (VampireResolver _mode observe) = observe - -validateVampireResolverResultCount - :: Int - -> NonEmpty value - -> Either DeclarationError [value] -validateVampireResolverResultCount expected results - | expected == actual = - Right (NonEmpty.toList results) - | otherwise = - Left (VampireResolverBatchSizeMismatch expected actual) - where - actual = NonEmpty.length results - -data DriverState = DriverState - !VampireResolver - !LogicalBuilder - !PendingModulePrefix - !ValidationRun - --- | Authority-free semantic state used while lowering checked declarations. --- Existing admitted facts are projected to their public contracts; no --- builder-local authorization capability crosses this boundary. -newtype ProspectiveBuilder = ProspectiveBuilder - (BuilderState PlanningEvidence) - -data LoweringState = LoweringState - !VampireResolver - !ProspectiveBuilder - !ValidationRun - -newtype LoweringDriver value = LoweringDriver - { runLoweringStep :: StateT LoweringState IO value - } - deriving newtype (Functor, Applicative, Monad) - -newtype ModuleDriver failure value = ModuleDriver - { runDriverStep - :: ExceptT - (DriverFailure failure) - (StateT DriverState IO) - value - } - deriving newtype (Functor, Applicative, Monad) - --- | Run one complete authority-free planning action from the current admitted --- input projection. The prospective state advances throughout the action but --- never mutates the authoritative module builder. -runProspectiveLoweringDriver - :: LoweringDriver value - -> ModuleDriver failure value -runProspectiveLoweringDriver action = ModuleDriver do - DriverState resolver builder _prefix validation <- State.get - State.lift - (liftIO - (State.evalStateT - (runLoweringStep action) - (LoweringState resolver - (projectLogicalBuilder builder) - validation))) - -projectLogicalBuilder :: LogicalBuilder -> ProspectiveBuilder -projectLogicalBuilder builder = - ProspectiveBuilder - builder - { logicalBuilderFacts = - fmap projectFact (logicalBuilderFacts builder) - } - where - projectFact (FactEntry proposition occurrence _authorization) = - FactEntry proposition occurrence - (PlanningEvidence - (semanticFactAuthority occurrence) - Nothing) - -data DriverFailure failure - = DriverDeclarationFailed !DeclarationError - | DriverActionFailed !failure - deriving stock (Show, Eq) - -data DriverResult failure value - = DriverSucceeded - !value - !SemanticInterface - !PendingModulePrefix - !CheckedObjectClosure - | DriverFailed - !(DriverFailure failure) - !PendingModulePrefix - | DriverSealFailed - !SemanticInterfaceError - !PendingModulePrefix - -data ImportedAliasOrigin = ImportedAliasOrigin - !DeclarationSlot - !SemanticFactOccurrenceFingerprint - deriving stock (Show, Eq) - -data ImportedAliasBinding = ImportedAliasBinding - !SemanticFactOccurrenceFingerprint - !ImportedAliasOrigin - --- | Opaque evidence produced from a successfully sealed producer. Direct --- parents retain the semantic DAG; importing folds it deterministically and --- mints fresh authority for the consuming builder. -data ImportedModuleEvidence = ImportedModuleEvidence - !SemanticInterface - ![ImportedModuleEvidence] - !(Map - SemanticFactOccurrenceFingerprint - (SemanticFactOccurrence, CheckedPropositionContent)) - ![AssertedObject] - -freshImportedModuleEvidence - :: [ImportedModuleEvidence] - -> SemanticInterface - -> PendingModulePrefix - -> ImportedModuleEvidence -freshImportedModuleEvidence parents interface prefix = - ImportedModuleEvidence - interface - parents - (Map.fromList - [ ( semanticFactFingerprint occurrence - , (occurrence, requireProposition occurrence) - ) - | occurrence <- occurrences - ]) - objects - where - batches = pendingModulePrefixBatches prefix - objects = concatMap committedBatchObjects batches - propositions = concatMap committedBatchPropositions batches - propositionMap = - Map.fromList - [ (checkedPropositionId proposition, proposition) - | proposition <- propositions - ] - occurrences = - concatMap - declarationDeltaFacts - (semanticInterfaceDeclarations interface) - - requireProposition occurrence = - case Map.lookup - (semanticFactProposition occurrence) - propositionMap of - Just proposition -> - proposition - Nothing -> - impossible - ("sealed fact occurrence references absent proposition " - <> show (semanticFactProposition occurrence)) - --- | Construct import evidence after a trusted producer or validated store --- installation has supplied the complete canonical proposition payloads. -validateImportedModuleEvidence - :: TheoryId - -> [ImportedModuleEvidence] - -> SemanticInterface - -> [AssertedObject] - -> [CheckedPropositionContent] - -> Either DeclarationError ImportedModuleEvidence -validateImportedModuleEvidence - theory parents interface objects propositions = do - _ <- first ImportedEvidenceInterfaceFailed - (validateSemanticInterface - (semanticInterfaceOwner interface) - (semanticInterfaceDirectInputs interface) - (semanticInterfaceDeclarations interface) - (semanticInterfaceAssertedId interface)) - unless - (semanticInterfaceDirectInputs interface == parentIds) - (Left - (ImportedEvidenceDirectMismatch - (semanticInterfaceDirectInputs interface) - parentIds)) - let propositionMap = - Map.fromList - [ (checkedPropositionId proposition, proposition) - | proposition <- propositions - ] - objectMap = - Map.fromList - [ (assertedObjectId object, object) - | object <- objects - ] - localObjectIds = - concatMap - declarationDeltaObjects - (semanticInterfaceDeclarations interface) - parentObjectMap = - foldl' - (Map.unionWith const) - Map.empty - (evidenceObjectMap <$> parents) - localObjects <- traverse - (\identity -> - maybe - (Left (ImportedEvidenceObjectMissing identity)) - Right - (Map.lookup identity objectMap)) - localObjectIds - closure <- first DeclarationObjectValidationFailed - (validateObjectClosure - theory - (Map.elems parentObjectMap <> localObjects)) - let occurrences = - concatMap - declarationDeltaFacts - (semanticInterfaceDeclarations interface) - pairs <- traverse - (\occurrence -> do - proposition <- maybe - (Left - (ImportedEvidencePropositionMissing - (semanticFactProposition occurrence))) - Right - (Map.lookup - (semanticFactProposition occurrence) - propositionMap) - _ <- first DeclarationPropositionValidationFailed - (validateAssertedPropositionContent - closure - (checkedPropositionId proposition) - (frozenCoreTerm - (checkedPropositionTerm proposition))) - _ <- first ImportedFactMaterializationFailed - (Materialization.checkImportedOccurrence - theory - (semanticFactFingerprint occurrence) - occurrence - proposition - (semanticFactAuthority occurrence)) - pure - ( semanticFactFingerprint occurrence - , (occurrence, proposition) - )) - occurrences - let evidence = - ImportedModuleEvidence - interface - parents - (Map.fromList pairs) - localObjects - _ <- validateEvidenceInventory theory closure evidence - pure evidence - where - parentIds = - semanticInterfaceAssertedId . evidenceInterface <$> parents - -validateEvidenceInventory - :: TheoryId - -> CheckedObjectClosure - -> ImportedModuleEvidence - -> Either DeclarationError () -validateEvidenceInventory theory closure evidence = - do - void (foldEvidence Set.empty Map.empty Map.empty evidence) - (_seen, structures) <- - foldStructures Set.empty Map.empty evidence - void (foldGlobals structures Set.empty Map.empty evidence) - where - foldEvidence seen facts aliases current - | identity `Set.member` seen = - Right (seen, facts, aliases) - | otherwise = do - unless - (semanticInterfaceDirectInputs interface == parentIds) - (Left - (ImportedEvidenceDirectMismatch - (semanticInterfaceDirectInputs interface) - parentIds)) - (parentsSeen, parentFacts, parentAliases) <- - foldM - (\(seen', facts', aliases') parent -> - foldEvidence seen' facts' aliases' parent) - (seen, facts, aliases) - parents - localFacts <- foldM insertFact parentFacts (Map.elems entries) - localAliases <- foldM - (insertAlias localFacts) - parentAliases - [ ( alias - , ImportedAliasOrigin - (declarationDeltaSlot delta) - (semanticAliasTarget alias) - ) - | delta <- semanticInterfaceDeclarations interface - , alias <- declarationDeltaAliases delta - ] - pure - ( Set.insert identity parentsSeen - , localFacts - , localAliases - ) - where - ImportedModuleEvidence interface parents entries _objects = current - identity = semanticInterfaceAssertedId interface - parentIds = - semanticInterfaceAssertedId . evidenceInterface <$> parents - - insertFact facts pair@(occurrence, proposition) = do - let fingerprint = semanticFactFingerprint occurrence - _ <- first ImportedFactMaterializationFailed - (Materialization.checkImportedOccurrence - theory - fingerprint - occurrence - proposition - (semanticFactAuthority occurrence)) - case Map.lookup fingerprint facts of - Nothing -> - Right (Map.insert fingerprint pair facts) - Just (existingOccurrence, existingProposition) - | existingOccurrence == occurrence - && checkedPropositionId existingProposition - == checkedPropositionId proposition -> - Right facts - | otherwise -> - Left (ImportedFactCollision fingerprint) - - insertAlias facts aliases (alias, origin) = do - let name = semanticAliasName alias - target = semanticAliasTarget alias - unless - (Map.member target facts) - (Left (ImportedAliasTargetMissing target)) - case Map.lookup name aliases of - Nothing -> - Right - (Map.insert - name - (ImportedAliasBinding target origin) - aliases) - Just (ImportedAliasBinding existingTarget existingOrigin) - | existingTarget == target -> - Right aliases - | otherwise -> - Left - (ImportedAliasCollision - name existingOrigin origin) - - foldGlobals structures seen globals current - | identity `Set.member` seen = - Right (seen, globals) - | otherwise = do - (parentsSeen, parentGlobals) <- - foldM - (\(seen', globals') parent -> - foldGlobals structures seen' globals' parent) - (seen, globals) - parents - globals' <- - foldM - (insertGlobal - (structureOperationBindings structures)) - parentGlobals - [ binding - | delta <- semanticInterfaceDeclarations interface - , binding <- semanticEnvironmentBindings - (declarationDeltaEnvironment delta) - ] - pure (Set.insert identity parentsSeen, globals') - where - ImportedModuleEvidence interface parents _entries _objects = current - identity = semanticInterfaceAssertedId interface - - insertGlobal operationBindings globals binding = do - let key = semanticGlobalBindingKey binding - target = semanticGlobalBindingTarget binding - _ <- - first - (ImportedGlobalTargetInvalid key target) - (validateSemanticGlobalBindingTarget - operationBindings - closure binding) - case Map.lookup key globals of - Nothing -> Right (Map.insert key target globals) - Just existing - | existing == target -> Right globals - | otherwise -> - Left (ImportedGlobalCollision key existing target) - - foldStructures seen structures current - | identity `Set.member` seen = - Right (seen, structures) - | otherwise = do - (parentsSeen, parentStructures) <- - foldM - (\(seen', structures') parent -> - foldStructures seen' structures' parent) - (seen, structures) - parents - structures' <- - foldM - (insertSemanticStructure closure) - parentStructures - [ descriptor - | delta <- semanticInterfaceDeclarations interface - , descriptor <- semanticEnvironmentStructures - (declarationDeltaEnvironment delta) - ] - pure (Set.insert identity parentsSeen, structures') - where - ImportedModuleEvidence interface parents _entries _objects = current - identity = semanticInterfaceAssertedId interface - -evidenceInterface :: ImportedModuleEvidence -> SemanticInterface -evidenceInterface - (ImportedModuleEvidence interface _parents _entries _objects) = - interface - -evidenceObjectMap - :: ImportedModuleEvidence - -> Map ObjectId AssertedObject -evidenceObjectMap - (ImportedModuleEvidence _interface parents _entries objects) = - foldl' - (Map.unionWith const) - (Map.fromList - [ (assertedObjectId object, object) - | object <- objects - ]) - (evidenceObjectMap <$> parents) - -data DriverOpenError - = DriverInitialPrefixError !PrefixContextError - | DriverInitialObjectError !ObjectValidationError - deriving stock (Show, Eq) - -renderDriverOpenError :: DriverOpenError -> Text -renderDriverOpenError = \case - DriverInitialPrefixError{} -> - "the initial semantic prefix is inconsistent" - DriverInitialObjectError{} -> - "the initial object closure is inconsistent" - -runModuleDriver - :: CheckedFoundation - -> ModuleName - -> [SemanticInterfaceId] - -> VampireResolver - -> ValidationRun - -> ModuleDriver failure value - -> IO - (Either - DriverOpenError - (DriverResult failure value)) -runModuleDriver - foundation owner direct resolver validationRun action = do - unique <- BuilderIdentity <$> newUnique - let theory = theoryId foundation - case (,) <$> - first DriverInitialPrefixError - (initialPrefixContextId theory owner direct) - <*> - first DriverInitialObjectError - (validateObjectClosure theory []) of - Left err -> - pure (Left err) - Right (prefix, closure) -> do - let builder = - BuilderState - { logicalBuilderIdentity = unique - , logicalBuilderFoundation = foundation - , logicalBuilderTheory = theory - , logicalBuilderOwner = owner - , logicalBuilderDirectSemanticInputs = direct - , logicalBuilderPrefix = prefix - , logicalBuilderObjectClosure = closure - , logicalBuilderFacts = Map.empty - , logicalBuilderAliases = Map.empty - , logicalBuilderGlobals = Map.empty - , logicalBuilderStructures = Map.empty - , logicalBuilderImportedInterfaces = Set.empty - , logicalBuilderDeltas = [] - , logicalBuilderNextDeclaration = 0 - , logicalBuilderNextFact = 0 - , logicalBuilderNextInvocation = 0 - } - initialState = - DriverState - resolver - builder - (PendingModulePrefix prefix []) - validationRun - (result, DriverState _ finalBuilder finalPrefix _) <- - State.runStateT - (Except.runExceptT - (runDriverStep action)) - initialState - case result of - Left err -> - pure (Right (DriverFailed err finalPrefix)) - Right value -> do - case semanticInterface - owner - direct - (reverse - (logicalBuilderDeltas - finalBuilder)) of - Left err -> - pure - (Right - (DriverSealFailed - err - finalPrefix)) - Right interface -> - pure - (Right - (DriverSucceeded - value - interface - finalPrefix - (logicalBuilderObjectClosure - finalBuilder))) - -failModuleDriver :: failure -> ModuleDriver failure value -failModuleDriver err = - ModuleDriver - (Except.throwError - (DriverActionFailed err)) - -failDeclarationDriver :: DeclarationError -> ModuleDriver failure value -failDeclarationDriver err = - ModuleDriver (Except.throwError (DriverDeclarationFailed err)) - -nextDeclarationSlotDriver - :: ModuleDriver failure DeclarationSlot -nextDeclarationSlotDriver = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure - (declarationSlot - (logicalBuilderOwner builder) - (localDeclarationOrdinal - (logicalBuilderNextDeclaration builder))) - -currentTheoryDriver :: ModuleDriver failure TheoryId -currentTheoryDriver = - ModuleDriver - (State.gets - (\(DriverState _resolver builder _prefix _validation) -> - logicalBuilderTheory builder)) - -currentFoundationAxiomDriver - :: FoundationAxiomTag - -> ModuleDriver failure (FrozenCheckedCore Void) -currentFoundationAxiomDriver tag = - ModuleDriver - (State.gets - (\(DriverState _resolver builder _prefix _validation) -> - foundationAxiomFrozen - (logicalBuilderFoundation builder) - tag)) - -resolveVisibleFactAliasDriver - :: SemanticName - -> ModuleDriver failure - (Maybe SemanticFactOccurrenceFingerprint) -resolveVisibleFactAliasDriver alias = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure do - ImportedAliasBinding fingerprint _origin <- - Map.lookup alias (logicalBuilderAliases builder) - pure fingerprint - -resolveVisibleFactTargetsDriver - :: FrozenCheckedCore ObjectId - -> ModuleDriver failure - [SemanticFactOccurrenceFingerprint] -resolveVisibleFactTargetsDriver target = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure - [ fingerprint - | (fingerprint, FactEntry proposition _occurrence _authorization) <- - Map.toAscList (logicalBuilderFacts builder) - , checkedPropositionTerm proposition == target - ] - -resolveVisibleGlobalDriver - :: SemanticGlobalKey - -> ModuleDriver failure (Maybe (SemanticGlobalTarget, CoreType)) -resolveVisibleGlobalDriver key = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure - ( (\(target, _content, _dependencies) -> - ( target - , fromMaybe - (impossible "visible semantic key has no source type") - (semanticGlobalKeyType key) - )) - <$> resolveVisibleGlobalContent builder key - ) - -resolveVisibleGlobalContentDriver - :: SemanticGlobalKey - -> ModuleDriver failure - (Maybe - ( SemanticGlobalTarget - , ObjectContent - , Map ObjectId CoreType - )) -resolveVisibleGlobalContentDriver key = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure (resolveVisibleGlobalContent builder key) - -resolveVisibleStructureDriver - :: SemanticStructurePhrase - -> ModuleDriver failure (Maybe ResolvedStructure) -resolveVisibleStructureDriver structurePhrase = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure (Map.lookup structurePhrase (logicalBuilderStructures builder)) - -resolveVisibleStructureOperationObjectsDriver - :: StructSymbol - -> ModuleDriver failure [ObjectId] -resolveVisibleStructureOperationObjectsDriver symbol = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure - ( Set.toAscList - (Set.fromList - (mapMaybe - (resolvedStructureOperation symbol) - (Map.elems (logicalBuilderStructures builder)))) - ) - -resolveVisibleGlobalContent - :: BuilderState evidence - -> SemanticGlobalKey - -> Maybe - ( SemanticGlobalTarget - , ObjectContent - , Map ObjectId CoreType - ) -resolveVisibleGlobalContent builder key = do - target <- Map.lookup key (logicalBuilderGlobals builder) - content <- - lookupCheckedObjectContent - (semanticGlobalTargetObject target) - closure - let dependencies = - Map.fromList - [ (identity, requireDependency identity) - | identity <- case content of - TransparentObjectContent _theory _coreType body -> - Set.toAscList (canonicalTermGlobals body) - _ -> [] - ] - pure - ( target - , content - , dependencies - ) - where - closure = logicalBuilderObjectClosure builder - - requireDependency identity = - case lookupCheckedObjectType identity closure of - Just coreType -> coreType - Nothing -> - impossible "checked object dependency is absent" - -objectAvailableDriver - :: ObjectId - -> ModuleDriver failure Bool -objectAvailableDriver identity = - ModuleDriver - (State.gets - (\(DriverState _resolver builder _prefix _validation) -> - isJust - (lookupCheckedObjectType - identity - (logicalBuilderObjectClosure builder)))) - -objectTypeDriver - :: ObjectId - -> ModuleDriver failure (Maybe CoreType) -objectTypeDriver identity = - ModuleDriver - (State.gets - (\(DriverState _resolver builder _prefix _validation) -> - lookupCheckedObjectType - identity - (logicalBuilderObjectClosure builder))) - -nextDeclarationSlotLowering :: LoweringDriver DeclarationSlot -nextDeclarationSlotLowering = - withLoweringBuilder \builder -> - declarationSlot - (logicalBuilderOwner builder) - (localDeclarationOrdinal - (logicalBuilderNextDeclaration builder)) - -currentTheoryLowering :: LoweringDriver TheoryId -currentTheoryLowering = - withLoweringBuilder logicalBuilderTheory - -currentFoundationAxiomLowering - :: FoundationAxiomTag - -> LoweringDriver (FrozenCheckedCore Void) -currentFoundationAxiomLowering tag = - withLoweringBuilder - (\builder -> - foundationAxiomFrozen - (logicalBuilderFoundation builder) - tag) - -resolveVisibleFactAliasLowering - :: SemanticName - -> LoweringDriver (Maybe SemanticFactOccurrenceFingerprint) -resolveVisibleFactAliasLowering alias = - withLoweringBuilder \builder -> do - ImportedAliasBinding fingerprint _origin <- - Map.lookup alias (logicalBuilderAliases builder) - pure fingerprint - -resolveVisibleFactTargetsLowering - :: FrozenCheckedCore ObjectId - -> LoweringDriver [SemanticFactOccurrenceFingerprint] -resolveVisibleFactTargetsLowering target = - withLoweringBuilder \builder -> - [ fingerprint - | (fingerprint, FactEntry proposition _occurrence _evidence) <- - Map.toAscList (logicalBuilderFacts builder) - , checkedPropositionTerm proposition == target - ] - -resolveVisibleGlobalLowering - :: SemanticGlobalKey - -> LoweringDriver (Maybe (SemanticGlobalTarget, CoreType)) -resolveVisibleGlobalLowering key = - withLoweringBuilder \builder -> - ( (\(target, _content, _dependencies) -> - ( target - , fromMaybe - (impossible "visible semantic key has no source type") - (semanticGlobalKeyType key) - )) - <$> resolveVisibleGlobalContent builder key - ) - -resolveVisibleGlobalContentLowering - :: SemanticGlobalKey - -> LoweringDriver - (Maybe - ( SemanticGlobalTarget - , ObjectContent - , Map ObjectId CoreType - )) -resolveVisibleGlobalContentLowering key = - withLoweringBuilder (\builder -> resolveVisibleGlobalContent builder key) - -resolveVisibleStructureLowering - :: SemanticStructurePhrase - -> LoweringDriver (Maybe ResolvedStructure) -resolveVisibleStructureLowering phrase = - withLoweringBuilder (Map.lookup phrase . logicalBuilderStructures) - -resolveVisibleStructureOperationObjectsLowering - :: StructSymbol - -> LoweringDriver [ObjectId] -resolveVisibleStructureOperationObjectsLowering symbol = - withLoweringBuilder \builder -> - Set.toAscList - (Set.fromList - (mapMaybe - (resolvedStructureOperation symbol) - (Map.elems (logicalBuilderStructures builder)))) - -objectAvailableLowering :: ObjectId -> LoweringDriver Bool -objectAvailableLowering identity = - withLoweringBuilder - (isJust - . lookupCheckedObjectType identity - . logicalBuilderObjectClosure) - -objectTypeLowering :: ObjectId -> LoweringDriver (Maybe CoreType) -objectTypeLowering identity = - withLoweringBuilder - (lookupCheckedObjectType identity - . logicalBuilderObjectClosure) - -withLoweringBuilder - :: (BuilderState PlanningEvidence -> value) - -> LoweringDriver value -withLoweringBuilder action = LoweringDriver do - LoweringState _resolver (ProspectiveBuilder builder) _validation <- State.get - pure (action builder) - - -data CandidateSpec = CandidateSpec - !CheckedPropositionContent - !FactSearchEligibility - ![SemanticName] - -candidateSpec - :: CheckedPropositionContent - -> FactSearchEligibility - -> [SemanticName] - -> CandidateSpec -candidateSpec = - CandidateSpec - --- | One strictly earlier candidate in the same checked declaration. The --- position is structural and becomes a concrete fact slot only while the --- declaration is planned. -data PlannedCandidatePosition = PlannedCandidatePosition - !Natural - !Natural - deriving stock (Show, Eq, Ord) - -data CandidatePlanningDirect - = PlanningDefinitionEquation !ObjectId - | PlanningSourceAxiom - | PlanningTrustedDatatype !DatatypeCompilationDescriptor - | PlanningKernelConstruction !KernelConstructionDescriptor - | PlanningCheckedSourceProof - | PlanningOmitted - deriving stock (Show, Eq) - --- | Erased exact request data needed by scheduling and public-contract --- planning. The family body retains the typed obligation used by admission; --- this projection carries only its one canonical request and exact global --- premise fingerprints. -data CheckedPlannedVampireRequest = CheckedPlannedVampireRequest - !Location - !Provers.PreparedVerificationRequest - ![SemanticFactOccurrenceFingerprint] - -data CandidatePlanningSpec = CandidatePlanningSpec - !CandidatePlanningDirect - ![SemanticFactOccurrenceFingerprint] - ![PlannedCandidatePosition] - ![CheckedPlannedVampireRequest] - --- | One authority-free checked candidate and its exact planning contract. --- The two parts are constructed together by the declaration-family lowerer --- and retain no builder capability or publication path. -data CheckedCandidate = CheckedCandidate - !CandidateSpec - !CandidatePlanningSpec - -checkedCandidate - :: CandidateSpec - -> CandidatePlanningSpec - -> CheckedCandidate -checkedCandidate = CheckedCandidate - -checkedDefinitionEquationPlanning :: ObjectId -> CandidatePlanningSpec -checkedDefinitionEquationPlanning identity = - CandidatePlanningSpec - (PlanningDefinitionEquation identity) [] [] [] - -checkedSourceAxiomPlanning :: CandidatePlanningSpec -checkedSourceAxiomPlanning = - CandidatePlanningSpec PlanningSourceAxiom [] [] [] - -checkedDatatypePlanning - :: DatatypeCompilationDescriptor - -> CandidatePlanningSpec -checkedDatatypePlanning descriptor = - CandidatePlanningSpec (PlanningTrustedDatatype descriptor) [] [] [] - -checkedKernelPlanning - :: KernelConstructionDescriptor - -> [SemanticFactOccurrenceFingerprint] - -> CandidatePlanningSpec -checkedKernelPlanning descriptor facts = - CandidatePlanningSpec - (PlanningKernelConstruction descriptor) - facts - [] - [] - -checkedSourceProofPlanning - :: [CheckedPlannedVampireRequest] - -> [PlannedCandidatePosition] - -> CandidatePlanningSpec -checkedSourceProofPlanning requests staged = - CandidatePlanningSpec - PlanningCheckedSourceProof [] staged requests - -checkedOmittedPlanning - :: [CheckedPlannedVampireRequest] - -> [PlannedCandidatePosition] - -> CandidatePlanningSpec -checkedOmittedPlanning requests staged = - CandidatePlanningSpec PlanningOmitted [] staged requests - -checkedPlannedVampireRequest - :: Location - -> PreparedVampireObligation local origin - -> CheckedPlannedVampireRequest -checkedPlannedVampireRequest location - (PreparedVampireObligation expected task) = - CheckedPlannedVampireRequest - location - (Provers.preparedTypedProverRequest task) - ( Backend.typedBackendFactReference - <$> Vector.toList - (Backend.typedProblemGlobalPremises expected) - ) - -plannedEarlierCandidate - :: Natural - -> Natural - -> PlannedCandidatePosition -plannedEarlierCandidate = - PlannedCandidatePosition - -data CheckedDeclarationMode - = CheckedProofMode !ProofSyntaxId - | CheckedCompiledMode !DeclarationSyntaxId - --- | One completely lowered, authority-free declaration transaction. The --- family body is a closed checked authorization recipe owned by its exact --- lowerer; structural effects and stable source-ordered candidate stages are --- common. This value is invocation-local and never serialized. -data CheckedDeclaration body = CheckedDeclaration - !CheckedDeclarationMode - ![AssertedObject] - ![CheckedPropositionContent] - ![SemanticGlobalBinding] - ![SemanticStructureDescriptor] - ![NonEmpty CheckedCandidate] - !body - -checkedProofDeclaration - :: ProofSyntaxId - -> [AssertedObject] - -> [CheckedPropositionContent] - -> [SemanticGlobalBinding] - -> [SemanticStructureDescriptor] - -> [NonEmpty CheckedCandidate] - -> body - -> CheckedDeclaration body -checkedProofDeclaration - syntax objects propositions globals structures stages = - CheckedDeclaration - (CheckedProofMode syntax) objects propositions globals structures - stages - -checkedCompiledDeclaration - :: DeclarationSyntaxId - -> [AssertedObject] - -> [CheckedPropositionContent] - -> [SemanticGlobalBinding] - -> [SemanticStructureDescriptor] - -> [NonEmpty CheckedCandidate] - -> body - -> CheckedDeclaration body -checkedCompiledDeclaration - syntax objects propositions globals structures stages = - CheckedDeclaration - (CheckedCompiledMode syntax) objects propositions globals structures - stages - -prepareCandidateSpecDriver - :: [AssertedObject] - -> ScopedCheckedCore ObjectId - -> FactSearchEligibility - -> [SemanticName] - -> ModuleDriver failure (Either DeclarationError CandidateSpec) -prepareCandidateSpecDriver objects scoped eligibility aliases = - prepareCandidateSpecWithDriverClosure objects - (\closure -> - prepareScopedCandidateSpec - closure scoped eligibility aliases) - -prepareFrozenCandidateSpecDriver - :: [AssertedObject] - -> FrozenCheckedCore ObjectId - -> FactSearchEligibility - -> [SemanticName] - -> ModuleDriver failure (Either DeclarationError CandidateSpec) -prepareFrozenCandidateSpecDriver objects frozen eligibility aliases = - prepareCandidateSpecWithDriverClosure objects - (\closure -> - prepareFrozenCandidateSpec - closure frozen eligibility aliases) - -prepareDefinitionEquationSpecDriver - :: [AssertedObject] - -> ObjectId - -> SemanticName - -> ModuleDriver failure (Either DeclarationError CandidateSpec) -prepareDefinitionEquationSpecDriver objects identity alias = - prepareCandidateSpecWithDriverClosure objects - (\closure -> - prepareDefinitionEquationSpec closure identity alias) - -preparePointwiseDefinitionEquationSpecDriver - :: [AssertedObject] - -> ObjectId - -> SemanticName - -> ModuleDriver failure (Either DeclarationError CandidateSpec) -preparePointwiseDefinitionEquationSpecDriver objects identity alias = - prepareCandidateSpecWithDriverClosure objects - (\closure -> - preparePointwiseDefinitionEquationSpec closure identity alias) - -prepareCandidateSpecLowering - :: [AssertedObject] - -> ScopedCheckedCore ObjectId - -> FactSearchEligibility - -> [SemanticName] - -> LoweringDriver (Either DeclarationError CandidateSpec) -prepareCandidateSpecLowering objects scoped eligibility aliases = - prepareCandidateSpecWithLoweringClosure objects - (\closure -> - prepareScopedCandidateSpec - closure scoped eligibility aliases) - -prepareFrozenCandidateSpecLowering - :: [AssertedObject] - -> FrozenCheckedCore ObjectId - -> FactSearchEligibility - -> [SemanticName] - -> LoweringDriver (Either DeclarationError CandidateSpec) -prepareFrozenCandidateSpecLowering objects frozen eligibility aliases = - prepareCandidateSpecWithLoweringClosure objects - (\closure -> - prepareFrozenCandidateSpec - closure frozen eligibility aliases) - -prepareDefinitionEquationSpecLowering - :: [AssertedObject] - -> ObjectId - -> SemanticName - -> LoweringDriver (Either DeclarationError CandidateSpec) -prepareDefinitionEquationSpecLowering objects identity alias = - prepareCandidateSpecWithLoweringClosure objects - (\closure -> - prepareDefinitionEquationSpec closure identity alias) - -preparePointwiseDefinitionEquationSpecLowering - :: [AssertedObject] - -> ObjectId - -> SemanticName - -> LoweringDriver (Either DeclarationError CandidateSpec) -preparePointwiseDefinitionEquationSpecLowering objects identity alias = - prepareCandidateSpecWithLoweringClosure objects - (\closure -> - preparePointwiseDefinitionEquationSpec closure identity alias) - --- | Prepare one closed Vampire obligation whose only premise is a --- conditionally available fact from a strictly earlier candidate stage of --- the same declaration. The temporary checked stage contains public fact --- semantics and structural provenance only; admission must still consume the --- corresponding real reserved candidate before accepting this request. -prepareStagedCandidateVampireDriver - :: Location - -> [AssertedObject] - -> CandidateSpec - -> CandidateSpec - -> ModuleDriver failure - (Either - DeclarationError - (PreparedVampireObligation Void ())) -prepareStagedCandidateVampireDriver - location objects premiseSpec targetSpec = - ModuleDriver do - DriverState resolver builder _prefix _validation <- State.get - State.lift - (liftIO - (prepareStagedCandidateVampireWith - resolver builder location objects premiseSpec targetSpec)) - -prepareStagedCandidateVampireLowering - :: Location - -> [AssertedObject] - -> CandidateSpec - -> CandidateSpec - -> LoweringDriver - (Either - DeclarationError - (PreparedVampireObligation Void ())) -prepareStagedCandidateVampireLowering - location objects premiseSpec targetSpec = - LoweringDriver do - LoweringState resolver (ProspectiveBuilder builder) _validation <- - State.get - liftIO - (prepareStagedCandidateVampireWith - resolver builder location objects premiseSpec targetSpec) - -prepareStagedCandidateVampireWith - :: VampireResolver - -> BuilderState evidence - -> Location - -> [AssertedObject] - -> CandidateSpec - -> CandidateSpec - -> IO - (Either - DeclarationError - (PreparedVampireObligation Void ())) -prepareStagedCandidateVampireWith - resolver builder location objects premiseSpec targetSpec = do - let staged = do - closure <- - first DeclarationObjectValidationFailed - (extendObjectClosure - (logicalBuilderObjectClosure builder) - objects) - premise <- - prospectiveStagePremise - builder closure premiseSpec targetSpec - pure (closure, premise) - case staged of - Left failure -> pure (Left failure) - Right (closure, premise) -> do - prepared <- - measureVampirePreparation resolver - (prepareClosedCandidateVampire - builder closure - (candidateSpecProposition targetSpec) - [premise]) - pure - (first - (ProofObligationFailedAt location - . CurrentCandidateVampirePreparationFailed) - prepared) - -candidateSpecProposition :: CandidateSpec -> CheckedPropositionContent -candidateSpecProposition (CandidateSpec proposition _eligibility _aliases) = - proposition - -prospectiveStagePremise - :: BuilderState evidence - -> CheckedObjectClosure - -> CandidateSpec - -> CandidateSpec - -> Either DeclarationError CheckedPropositionContent -prospectiveStagePremise builder closure premiseSpec targetSpec = do - let owner = logicalBuilderOwner builder - declaration = - declarationSlot owner - (localDeclarationOrdinal - (logicalBuilderNextDeclaration builder)) - premiseSlot = - factSlot owner - (localFactOrdinal (logicalBuilderNextFact builder)) - targetSlot = - factSlot owner - (localFactOrdinal (logicalBuilderNextFact builder + 1)) - premiseStage = CandidateStage 0 - targetStage = CandidateStage 1 - proposition = candidateSpecProposition premiseSpec - authority = - factAuthority - (theoremRef - (logicalBuilderTheory builder) - (checkedPropositionId proposition)) - cleanAuthoritySafety - CandidateSpec _ eligibility _aliases = premiseSpec - occurrence = - semanticFactOccurrence premiseSlot authority eligibility - stage = - CheckedDeclarationStage declaration closure - (Map.singleton premiseSlot - (FactEntry proposition occurrence - (PlanningEvidence - authority - (Just - (PlanningProvenance - declaration premiseStage premiseSlot))))) - unless - (propositionMatchesClosure closure - (candidateSpecProposition targetSpec)) - (Left (PlanningFactContractMismatch targetSlot)) - useProspectiveStageFact - stage targetStage targetSlot premiseStage premiseSlot - -useProspectiveStageFact - :: CheckedDeclarationStage - -> CandidateStage - -> FactSlot - -> CandidateStage - -> FactSlot - -> Either DeclarationError CheckedPropositionContent -useProspectiveStageFact - (CheckedDeclarationStage ownSlot closure entries) - currentStage currentSlot expectedStage premiseSlot = do - FactEntry proposition occurrence - (PlanningEvidence authority provenance) <- - maybe - (Left (PlanningFactContractMismatch premiseSlot)) - Right - (Map.lookup premiseSlot entries) - unless - ( provenance - == Just - (PlanningProvenance - ownSlot expectedStage premiseSlot) - && expectedStage < currentStage - && semanticFactSlot occurrence == premiseSlot - && semanticFactAuthority occurrence == authority - && propositionMatchesClosure closure proposition - ) - (Left (PlanningFactContractMismatch currentSlot)) - pure proposition - -prepareCandidateSpecWithDriverClosure - :: [AssertedObject] - -> (CheckedObjectClosure -> Either DeclarationError CandidateSpec) - -> ModuleDriver failure (Either DeclarationError CandidateSpec) -prepareCandidateSpecWithDriverClosure objects prepare = ModuleDriver do - DriverState _resolver builder _prefix _validation <- State.get - pure do - closure <- - first DeclarationObjectValidationFailed - (extendObjectClosure - (logicalBuilderObjectClosure builder) - objects) - prepare closure - -prepareCandidateSpecWithLoweringClosure - :: [AssertedObject] - -> (CheckedObjectClosure -> Either DeclarationError CandidateSpec) - -> LoweringDriver (Either DeclarationError CandidateSpec) -prepareCandidateSpecWithLoweringClosure objects prepare = - withLoweringBuilder \builder -> do - closure <- - first DeclarationObjectValidationFailed - (extendObjectClosure - (logicalBuilderObjectClosure builder) - objects) - prepare closure - -data ReservedCandidate = ReservedCandidate - !BuilderIdentity - !PrefixContextId - !DeclarationInvocation - !CandidateStage - !FactSlot - !CandidateSpec - -reservedCandidateSlot :: ReservedCandidate -> FactSlot -reservedCandidateSlot - (ReservedCandidate _ _ _ _ slot _) = - slot - -reservedCandidateStage :: ReservedCandidate -> Natural -reservedCandidateStage - (ReservedCandidate _ _ _ (CandidateStage stage) _ _) = - stage - -candidateCheckedProposition - :: ReservedCandidate - -> CheckedPropositionContent -candidateCheckedProposition - (ReservedCandidate _ _ _ _ _ (CandidateSpec proposition _ _)) = - proposition - -candidateTheoremReference - :: BuilderState evidence - -> ReservedCandidate - -> TheoremRef -candidateTheoremReference builder candidate = - theoremRef - (logicalBuilderTheory builder) - (checkedPropositionId - (candidateCheckedProposition candidate)) - - -data PendingCandidate = PendingCandidate - !ReservedCandidate - !ValidationCertificate - !PendingFactAuthorization - -data DeclarationValidationSelection - = DeclarationValidationUnselected - | FreshDeclarationValidation - | CachedDeclarationValidation - !DeclarationSyntaxId - ![ObjectId] - ![TheoremId] - !DeclarationValidationRecord - !(Map FactSlot Natural) - -data DeclarationState = DeclarationState - { declarationVampireResolver :: !VampireResolver - , declarationValidationRun :: !ValidationRun - , declarationValidationMode :: !ValidationMode - , declarationValidationSelection - :: !DeclarationValidationSelection - , declarationBuilder :: !LogicalBuilder - , declarationOwnSlot :: !DeclarationSlot - , declarationInvocation :: !DeclarationInvocation - , declarationObjectsReversed :: ![AssertedObject] - , declarationObjectClosure :: !(Maybe CheckedObjectClosure) - , declarationPropositionsReversed - :: ![CheckedPropositionContent] - , declarationGlobalBindingsReversed - :: ![SemanticGlobalBinding] - , declarationStructureDescriptorsReversed - :: ![SemanticStructureDescriptor] - , declarationReservations - :: !(Map FactSlot ReservedCandidate) - , declarationPending :: !(Map FactSlot PendingCandidate) - , declarationNextFact :: !Natural - , declarationNextStage :: !Natural - , declarationAuthorizationFrontier :: !Natural - } - --- | Authority-free view of checked declaration-local semantics. This is the --- narrow staging substrate for later lowerers: it carries the exact object --- closure and conditional public fact contracts, but no builder identity, --- prefix, invocation, pending authorization, admitted alias, or published --- occurrence. -data CheckedDeclarationStage = CheckedDeclarationStage - !DeclarationSlot - !CheckedObjectClosure - !(Map FactSlot (FactEntry PlanningEvidence)) - -newtype Declaration value = Declaration - { runDeclaration - :: StateT - DeclarationState - (ExceptT DeclarationError IO) - value - } - deriving newtype (Functor, Applicative, Monad) - -failDeclaration :: DeclarationError -> Declaration value -failDeclaration = - Declaration . State.lift . Except.throwError - -addDeclarationObject :: AssertedObject -> Declaration () -addDeclarationObject asserted = Declaration do - state <- State.get - case declarationValidationSelection state of - DeclarationValidationUnselected -> pure () - _ -> - State.lift - (Except.throwError - DeclarationShapeChangedAfterValidationLookup) - when - (isJust (declarationObjectClosure state)) - (State.lift - (Except.throwError - DeclarationObjectAddedAfterAuthorization)) - State.put - state - { declarationObjectsReversed = - asserted : declarationObjectsReversed state - } - -addDeclarationProposition - :: CheckedPropositionContent - -> Declaration () -addDeclarationProposition proposition = - Declaration - (State.modify' \state -> - state - { declarationPropositionsReversed = - proposition - : declarationPropositionsReversed state - }) - -resolveVisibleGlobal - :: SemanticGlobalKey - -> Declaration (Maybe (SemanticGlobalTarget, CoreType)) -resolveVisibleGlobal key = Declaration do - state <- State.get - let builder = declarationBuilder state - pure do - target <- Map.lookup key (logicalBuilderGlobals builder) - coreType <- semanticGlobalKeyType key - pure (target, coreType) - -stageSemanticGlobalBinding - :: SemanticGlobalKey - -> SemanticGlobalTarget - -> Declaration () -stageSemanticGlobalBinding key target = Declaration do - state <- State.get - case declarationValidationSelection state of - DeclarationValidationUnselected -> pure () - _ -> - State.lift - (Except.throwError - DeclarationShapeChangedAfterValidationLookup) - when - (any - ((== key) . semanticGlobalBindingKey) - (declarationGlobalBindingsReversed state)) - (State.lift - (Except.throwError - (DeclarationGlobalAlreadyStaged key))) - State.put - state - { declarationGlobalBindingsReversed = - semanticGlobalBinding key target - : declarationGlobalBindingsReversed state - } - -stageSemanticStructureDescriptor - :: SemanticStructureDescriptor - -> Declaration () -stageSemanticStructureDescriptor descriptor = Declaration do - state <- State.get - case declarationValidationSelection state of - DeclarationValidationUnselected -> pure () - _ -> - State.lift - (Except.throwError - DeclarationShapeChangedAfterValidationLookup) - let structurePhrase = semanticStructureDescriptorPhrase descriptor - when - (any - ((== structurePhrase) . semanticStructureDescriptorPhrase) - (declarationStructureDescriptorsReversed state)) - (State.lift - (Except.throwError - (DeclarationStructureAlreadyStaged structurePhrase))) - State.put - state - { declarationStructureDescriptorsReversed = - descriptor - : declarationStructureDescriptorsReversed state - } - -prepareScopedCandidateSpec - :: CheckedObjectClosure - -> ScopedCheckedCore ObjectId - -> FactSearchEligibility - -> [SemanticName] - -> Either DeclarationError CandidateSpec -prepareScopedCandidateSpec closure scoped eligibility aliases = do - frozen <- - maybe (Left CandidatePropositionNotClosed) Right - (closeScopedCore scoped) - prepareFrozenCandidateSpec closure frozen eligibility aliases - -prepareFrozenCandidateSpec - :: CheckedObjectClosure - -> FrozenCheckedCore ObjectId - -> FactSearchEligibility - -> [SemanticName] - -> Either DeclarationError CandidateSpec -prepareFrozenCandidateSpec closure frozen eligibility aliases = do - unless - (frozenCoreType frozen == TyProp) - (Left - (CandidatePropositionNotProposition - (frozenCoreType frozen))) - proposition <- - first DeclarationPropositionValidationFailed - (validatePropositionContent closure (frozenCoreTerm frozen)) - pure (candidateSpec proposition eligibility aliases) - -prepareDefinitionEquationSpec - :: CheckedObjectClosure - -> ObjectId - -> SemanticName - -> Either DeclarationError CandidateSpec -prepareDefinitionEquationSpec closure identity alias = do - content <- - maybe - (Left (DefinitionEquationObjectMissing identity)) - Right - (lookupCheckedObjectContent identity closure) - (coreType, body) <- - case content of - TransparentObjectContent _theory objectType objectBody -> - Right (objectType, objectBody) - _ -> - Left (DefinitionEquationObjectNotTransparent identity) - proposition <- - first DeclarationPropositionValidationFailed - (validatePropositionContent - closure - (CEq coreType (CGlobal identity) body)) - pure (candidateSpec proposition SearchEligible [alias]) - -preparePointwiseDefinitionEquationSpec - :: CheckedObjectClosure - -> ObjectId - -> SemanticName - -> Either DeclarationError CandidateSpec -preparePointwiseDefinitionEquationSpec closure identity alias = do - content <- - maybe - (Left (DefinitionEquationObjectMissing identity)) - Right - (lookupCheckedObjectContent identity closure) - body <- - case content of - TransparentObjectContent _theory - (TyArrow TySet TyProp) (CLam TySet predicate) -> - Right predicate - _ -> - Left - (DefinitionEquationObjectNotPointwisePredicate identity) - proposition <- - first DeclarationPropositionValidationFailed - (validatePropositionContent - closure - (CForall TySet - (CEq TyProp - (CApp (CGlobal identity) (CBound 0)) - body))) - pure (candidateSpec proposition SearchEligible [alias]) - -reserveCandidate - :: CandidateSpec - -> Declaration ReservedCandidate -reserveCandidate spec = - NonEmpty.head <$> reserveCandidateBatch (spec :| []) - --- | Validate and reserve one closed checked proposition in the current --- declaration closure. -reservePropositionCandidate - :: ScopedCheckedCore ObjectId - -> FactSearchEligibility - -> [SemanticName] - -> Declaration ReservedCandidate -reservePropositionCandidate scoped eligibility aliases = Declaration do - unprepared <- State.get - prepared <- - State.lift - (Except.liftEither - (prepareDeclarationClosure unprepared)) - spec <- - State.lift - (Except.liftEither - (prepareScopedCandidateSpec - (fromMaybe - (impossible - "prepared proposition closure is absent") - (declarationObjectClosure prepared)) - scoped eligibility aliases)) - State.put prepared - runDeclaration (reserveCandidate spec) - --- | Validate and reserve one stage of already closed checked propositions in --- the current declaration closure. -reserveFrozenPropositionCandidateBatch - :: NonEmpty - ( FrozenCheckedCore ObjectId - , FactSearchEligibility - , [SemanticName] - ) - -> Declaration (NonEmpty ReservedCandidate) -reserveFrozenPropositionCandidateBatch inputs = Declaration do - unprepared <- State.get - prepared <- - State.lift - (Except.liftEither - (prepareDeclarationClosure unprepared)) - let closure = - maybe - (impossible "prepared proposition closure is absent") - id - (declarationObjectClosure prepared) - specs <- traverse (prepareInput closure) inputs - State.put prepared - runDeclaration (reserveCandidateBatch specs) - where - prepareInput closure (frozen, eligibility, aliases) = - State.lift - (Except.liftEither - (prepareFrozenCandidateSpec - closure frozen eligibility aliases)) - -reserveCandidateBatch - :: NonEmpty CandidateSpec - -> Declaration (NonEmpty ReservedCandidate) -reserveCandidateBatch specs = Declaration do - state <- State.get - case declarationValidationSelection state of - DeclarationValidationUnselected -> pure () - _ -> - State.lift - (Except.throwError - DeclarationShapeChangedAfterValidationLookup) - let builder = declarationBuilder state - stage = CandidateStage (declarationNextStage state) - firstFact = declarationNextFact state - candidates = - NonEmpty.zipWith - (makeReserved builder state stage) - (0 :| [1 ..]) - specs - reservations' = - foldl' - (\reservations candidate -> - Map.insert - (reservedCandidateSlot candidate) - candidate - reservations) - (declarationReservations state) - candidates - candidateCount = fromIntegral (NonEmpty.length specs) - State.put - state - { declarationReservations = reservations' - , declarationNextFact = firstFact + candidateCount - , declarationNextStage = - declarationNextStage state + 1 - } - pure candidates - where - makeReserved builder state stage offset spec = - ReservedCandidate - (logicalBuilderIdentity builder) - (logicalBuilderPrefix builder) - (declarationInvocation state) - stage - (factSlot - (logicalBuilderOwner builder) - (localFactOrdinal - (declarationNextFact state + offset))) - spec - --- | Construct the one defining equation owned by a checked transparent --- object. The equation is derived from authoritative object content, not from --- a caller-supplied proposition. -reserveDefinitionEquationCandidate - :: ObjectId - -> SemanticName - -> Declaration ReservedCandidate -reserveDefinitionEquationCandidate identity alias = Declaration do - unprepared <- State.get - prepared <- - State.lift - (Except.liftEither - (prepareDeclarationClosure unprepared)) - spec <- - State.lift - (Except.liftEither - (prepareDefinitionEquationSpec - (fromMaybe - (impossible - "prepared definition closure is absent") - (declarationObjectClosure prepared)) - identity alias)) - State.put prepared - runDeclaration (reserveCandidate spec) - --- | Construct the pointwise presentation of one unary transparent predicate --- definition. The candidate remains tied to the object's checked content. -reservePointwiseDefinitionEquationCandidate - :: ObjectId - -> SemanticName - -> Declaration ReservedCandidate -reservePointwiseDefinitionEquationCandidate identity alias = Declaration do - unprepared <- State.get - prepared <- - State.lift - (Except.liftEither - (prepareDeclarationClosure unprepared)) - spec <- - State.lift - (Except.liftEither - (preparePointwiseDefinitionEquationSpec - (fromMaybe - (impossible "prepared predicate closure is absent") - (declarationObjectClosure prepared)) - identity alias)) - State.put prepared - runDeclaration (reserveCandidate spec) - --- | Reserve one defining equation and a nonempty generated-fact batch at the --- same declaration stage. No candidate in the batch can cite a sibling. -reserveDefinitionEquationCandidateBatch - :: ObjectId - -> SemanticName - -> NonEmpty - ( ScopedCheckedCore ObjectId - , FactSearchEligibility - , [SemanticName] - ) - -> Declaration - ( ReservedCandidate - , NonEmpty ReservedCandidate - ) -reserveDefinitionEquationCandidateBatch identity alias generated = - Declaration do - unprepared <- State.get - prepared <- - State.lift - (Except.liftEither - (prepareDeclarationClosure unprepared)) - let closure = - maybe - (impossible - "prepared declaration closure is absent") - id - (declarationObjectClosure prepared) - definition <- - State.lift - (Except.liftEither - (prepareDefinitionEquationSpec closure identity alias)) - generatedSpecs <- - traverse - (prepareGeneratedSpec closure) - generated - State.put prepared - candidates <- - runDeclaration - (reserveCandidateBatch - (definition :| toList generatedSpecs)) - case candidates of - definitionCandidate :| firstGenerated : remainingGenerated -> - pure - ( definitionCandidate - , firstGenerated :| remainingGenerated - ) - _ -> - impossible - "a nonempty generated batch produced no candidate" - where - prepareGeneratedSpec closure (scoped, eligibility, aliases) = - State.lift - (Except.liftEither - (prepareScopedCandidateSpec - closure scoped eligibility aliases)) - --- | Resolve one complete compiled declaration against its exact validation --- key, then run the source-level authorization action under that selection. --- Objects and candidates must already be prepared so the lookup key cannot --- change after a hit or miss is chosen. -authorizeCompiledDeclaration - :: Declaration value - -> Declaration value -authorizeCompiledDeclaration action = Declaration do - unprepared <- State.get - (syntax, objects, theorems, ordinals, prepared) <- - State.lift - (Except.liftEither - (prepareCompiledValidation unprepared)) - let key = - declarationValidationKey - syntax - (logicalBuilderPrefix - (declarationBuilder prepared)) - objects - theorems - cached <- - case declarationValidationRun prepared of - FreshValidation -> - pure Nothing - WarmValidation - (ValidationLookup _lookupProof lookupDeclaration) -> - liftIO (lookupDeclaration key) - traverse_ - (\record -> - case Materialization.checkDeclarationValidationRecord - (logicalBuilderPrefix - (declarationBuilder prepared)) - syntax - objects - theorems - record of - Left failure -> - liftIO - (throwIO - (CachedValidationIntegrityError failure)) - Right () -> - pure ()) - cached - let selection = - case cached of - Nothing -> - FreshDeclarationValidation - Just record -> - CachedDeclarationValidation - syntax objects theorems record ordinals - State.put - prepared - { declarationValidationSelection = selection - } - runDeclaration action - -prepareCompiledValidation - :: DeclarationState - -> Either - DeclarationError - ( DeclarationSyntaxId - , [ObjectId] - , [TheoremId] - , Map FactSlot Natural - , DeclarationState - ) -prepareCompiledValidation declaration = do - syntax <- - case declarationValidationMode declaration of - DeclarationValidationMode value -> - Right value - _ -> - Left DeclarationValidationOutsideCompiledDeclaration - case declarationValidationSelection declaration of - DeclarationValidationUnselected -> pure () - _ -> Left DeclarationValidationAlreadySelected - closure <- declarationClosure declaration - let builder = declarationBuilder declaration - candidates = Map.elems (declarationReservations declaration) - objects = - assertedObjectId - <$> reverse - (declarationObjectsReversed declaration) - theorems = - theoremId . candidateTheoremReference builder - <$> candidates - ordinals = - Map.fromList - (zip - (reservedCandidateSlot <$> candidates) - [0 ..]) - pure - ( syntax - , objects - , theorems - , ordinals - , declaration - { declarationObjectClosure = Just closure - } - ) - -lookupProofValidation - :: ReservedCandidate - -> Declaration (ProofSyntaxId, Maybe ProofValidationRecord) -lookupProofValidation candidate = Declaration do - state <- State.get - syntax <- - case declarationValidationMode state of - EnvironmentImportMode -> - State.lift - (Except.throwError - ProofValidationOutsideProofDeclaration) - ProofValidationMode proofSyntax -> - pure proofSyntax - DeclarationValidationMode{} -> - State.lift - (Except.throwError - ProofValidationOutsideProofDeclaration) - let builder = declarationBuilder state - reference = candidateTheoremReference builder candidate - key = - proofValidationKey - (theoremId - (factAuthorityTheorem - (factAuthority - reference - cleanAuthoritySafety))) - syntax - (logicalBuilderPrefix builder) - record <- - case declarationValidationRun state of - FreshValidation -> - pure Nothing - WarmValidation (ValidationLookup lookupProof _lookupDeclaration) -> - State.lift - (liftIO - (lookupProof key)) - pure (syntax, record) -data CandidatePremise = CandidatePremise - !CheckedPropositionContent - -data CandidateProofState = CandidateProofState - { candidateProofDeclaration :: !DeclarationState - , candidateProofObjectClosure :: !CheckedObjectClosure - , candidateProofCandidate :: !ReservedCandidate - , candidateProofCachedValidation - :: !(Maybe Materialization.CandidateValidation) - , candidateProofPremisesReversed :: ![CandidatePremise] - , candidateProofPremiseCount :: !Natural - , candidateProofSafety :: !CandidateSafety - , candidateProofAcceptedRequestsReversed - :: ![PreparedRequestId] - } - -candidateProofBuilder :: CandidateProofState -> LogicalBuilder -candidateProofBuilder = - declarationBuilder . candidateProofDeclaration - -newtype CandidateProof value = CandidateProof - { runCandidateProof - :: StateT - CandidateProofState - (ExceptT DeclarationError IO) - value - } - deriving newtype (Functor, Applicative, Monad) - --- | Attach source trivia to a proof-obligation failure. The location does --- not participate in validation or request identity. -locateProofObligation - :: Location - -> CandidateProof value - -> CandidateProof value -locateProofObligation location (CandidateProof action) = - CandidateProof - (State.mapStateT - (Except.withExceptT - (ProofObligationFailedAt location)) - action) - --- | Record that the current exact proof discharged one goal with @Omitted@. -recordOmittedUse :: CandidateProof () -recordOmittedUse = CandidateProof do - state <- State.get - State.put - state - { candidateProofSafety = - addCandidateEscape - Omitted - (candidateProofSafety state) - } - -data VampirePremiseSelection - = VampireImplicitPremises - | VampireExplicitPremises - !(NonEmpty SemanticFactOccurrenceFingerprint) - | VampireLocalPremises - deriving stock (Show, Eq) - -data VampireObligationPreparationError local - = VampireObligationIndirectTargetNotFalsum - | VampireObligationClaimProjectionFailed - !(Backend.SupportedPropositionProjectionError local) - | VampireObligationLocalProjectionFailed - !Backend.LocalPremiseOrdinal - !(Backend.SupportedPropositionProjectionError local) - | VampireObligationLocalClassificationFailed - !Backend.LocalPremiseOrdinal - !(Backend.BackendClassificationError ObjectId) - | VampireObligationFactNotVisible - !SemanticFactOccurrenceFingerprint - | VampireObligationFactInvalid - !SemanticFactOccurrenceFingerprint - | VampireObligationPlanningFailed - !(Backend.TypedProblemError local ObjectId) - | VampireObligationEncodingFailed - !(Tptp.TypedTptpPreparationError local ObjectId) - deriving stock (Show, Eq) - -data ScopedVampirePremise local origin = ScopedVampirePremise - !Backend.LocalPremiseOrdinal - !origin - !(Vector (local, CoreType)) - !(ScopedCheckedCore ObjectId) - -scopedVampirePremise - :: Backend.LocalPremiseOrdinal - -> origin - -> Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> ScopedVampirePremise local origin -scopedVampirePremise = - ScopedVampirePremise - -data PreparedVampireObligation local origin = - PreparedVampireObligation - !(Backend.TypedProblem - SemanticFactOccurrenceFingerprint - local - origin - ObjectId) - !(Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId) - --- | Prepare a scoped task for a trusted structural proof checker. This --- validates the typed problem but does not establish how its local judgments --- derive from the enclosing theorem. 'Checking.Exact.Proof' owns that --- composition on the production path. -prepareScopedVampireObligationDriver - :: Ord local - => Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> [ScopedVampirePremise local origin] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> ModuleDriver failure - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -prepareScopedVampireObligationDriver - claimSupport claim scopedLocals auxiliaryTags selection = - prepareScopedVampireObligationForMode - Provers.DirectTask - claimSupport - claim - scopedLocals - auxiliaryTags - selection - --- | Prepare the one indirect task admitted by the exact proof compiler. --- The target check keeps contradictory input from authorizing another goal. -prepareScopedContradictionObligationDriver - :: Ord local - => Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> [ScopedVampirePremise local origin] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> ModuleDriver failure - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -prepareScopedContradictionObligationDriver - claimSupport claim scopedLocals auxiliaryTags selection - | scopedCoreType claim /= TyProp || scopedCoreTerm claim /= CFalsum = - pure (Left VampireObligationIndirectTargetNotFalsum) - | otherwise = - prepareScopedVampireObligationForMode - Provers.IndirectTask - claimSupport - claim - scopedLocals - auxiliaryTags - selection - -prepareScopedVampireObligationLowering - :: Ord local - => Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> [ScopedVampirePremise local origin] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> LoweringDriver - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -prepareScopedVampireObligationLowering - claimSupport claim scopedLocals auxiliaryTags selection = - prepareScopedVampireObligationForModeLowering - Provers.DirectTask - claimSupport claim scopedLocals auxiliaryTags selection - -prepareScopedContradictionObligationLowering - :: Ord local - => Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> [ScopedVampirePremise local origin] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> LoweringDriver - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -prepareScopedContradictionObligationLowering - claimSupport claim scopedLocals auxiliaryTags selection - | scopedCoreType claim /= TyProp || scopedCoreTerm claim /= CFalsum = - pure (Left VampireObligationIndirectTargetNotFalsum) - | otherwise = - prepareScopedVampireObligationForModeLowering - Provers.IndirectTask - claimSupport claim scopedLocals auxiliaryTags selection - -prepareScopedVampireObligationForModeLowering - :: Ord local - => Provers.VampireTaskMode - -> Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> [ScopedVampirePremise local origin] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> LoweringDriver - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -prepareScopedVampireObligationForModeLowering - taskMode claimSupport claim scopedLocals auxiliaryTags selection = - LoweringDriver do - LoweringState resolver (ProspectiveBuilder builder) _validation <- - State.get - liftIO - (prepareScopedVampireObligationWith - resolver builder taskMode claimSupport claim scopedLocals - auxiliaryTags selection) - -prepareScopedVampireObligationForMode - :: Ord local - => Provers.VampireTaskMode - -> Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> [ScopedVampirePremise local origin] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> ModuleDriver failure - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -prepareScopedVampireObligationForMode - taskMode claimSupport claim scopedLocals auxiliaryTags selection = - ModuleDriver do - DriverState resolver builder _prefix _validation <- State.get - State.lift - (Except.liftIO - (prepareScopedVampireObligationWith - resolver builder taskMode claimSupport claim scopedLocals - auxiliaryTags selection)) - -prepareScopedVampireObligationWith - :: (Ord local) - => VampireResolver - -> BuilderState evidence - -> Provers.VampireTaskMode - -> Vector (local, CoreType) - -> ScopedCheckedCore ObjectId - -> [ScopedVampirePremise local origin] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> IO - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -prepareScopedVampireObligationWith - resolver builder taskMode claimSupport claim scopedLocals - auxiliaryTags selection = - measureVampirePreparation resolver preparation - where - closure = logicalBuilderObjectClosure builder - globalType = (`lookupCheckedObjectType` closure) - preparation = do - supportedClaim <- - first VampireObligationClaimProjectionFailed - (Backend.projectSupportedProposition - globalType - claimSupport - claim) - locals <- traverse prepareLocal scopedLocals - prepareVampireObligationWith - taskMode - builder - closure - supportedClaim - locals - auxiliaryTags - selection - - prepareLocal - (ScopedVampirePremise - ordinal origin support proposition) = do - supported <- - first - (VampireObligationLocalProjectionFailed ordinal) - (Backend.projectSupportedProposition - globalType - support - proposition) - first - (VampireObligationLocalClassificationFailed ordinal) - (Backend.typedLocalPremise - globalType - ordinal - origin - supported) - -prepareVampireObligationWith - :: Ord local - => Provers.VampireTaskMode - -> BuilderState evidence - -> CheckedObjectClosure - -> Backend.SupportedProposition local ObjectId - -> [Backend.TypedLocalPremise local origin ObjectId] - -> [FoundationAxiomTag] - -> VampirePremiseSelection - -> Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin) -prepareVampireObligationWith - taskMode builder closure claim locals auxiliaryTags selection = do - let globalType = (`lookupCheckedObjectType` closure) - selected <- - selectVampireFacts - globalType - builder - selection - let (globalMode, localPolicy) = - case selection of - VampireImplicitPremises -> - ( Backend.ImplicitFofPremises - , Backend.FirstOrderLocals - ) - VampireExplicitPremises{} -> - ( Backend.ExplicitGlobalPremises - , Backend.FirstOrderLocals - ) - VampireLocalPremises -> - ( Backend.NoGlobalPremises - , Backend.AllLocals - ) - propositionDependencies = - foundationAxiomDependencies - . Backend.supportedPropositionTerm - requiredAuxiliaryTags = - Set.toAscList - ( Set.fromList auxiliaryTags - <> propositionDependencies claim - <> foldMap - (propositionDependencies - . Backend.typedBackendFactProposition) - selected - <> foldMap - (propositionDependencies - . Backend.typedLocalPremiseProposition) - (Backend.selectTypedLocalPremises - localPolicy - locals) - ) - auxiliaries = - Backend.typedFoundationAuxiliaryInput - (logicalBuilderFoundation builder) - <$> requiredAuxiliaryTags - problem <- - first VampireObligationPlanningFailed - (Backend.planTypedProblem - globalType - selected - claim - locals - auxiliaries - globalMode - localPolicy) - task <- - first VampireObligationEncodingFailed - (Provers.prepareTypedProverTask - taskMode - problem) - pure (PreparedVampireObligation problem task) - -measureVampirePreparation - :: VampireResolver - -> Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin) - -> IO - (Either - (VampireObligationPreparationError local) - (PreparedVampireObligation local origin)) -measureVampirePreparation resolver preparation = do - started <- getMonotonicTimeNSec - prepared <- Exception.evaluate (forcePrepared preparation) - finished <- getMonotonicTimeNSec - observeVampirePreparation resolver (finished - started) - pure prepared - where - forcePrepared result = - case result of - Left err -> err `seq` result - Right prepared@(PreparedVampireObligation _ task) -> - let request = Provers.preparedTypedProverRequest task - in Provers.preparedVerificationByteCount request `seq` - Provers.preparedVerificationRequestId request `seq` - prepared `seq` - result - -selectVampireFacts - :: (ObjectId -> Maybe CoreType) - -> BuilderState evidence - -> VampirePremiseSelection - -> Either - (VampireObligationPreparationError local) - (Vector - (Backend.TypedBackendFact - SemanticFactOccurrenceFingerprint - ObjectId)) -selectVampireFacts globalType builder selection = - Vector.fromList <$> case selection of - VampireImplicitPremises -> - mapMaybeM prepareImplicit - (Map.toAscList (logicalBuilderFacts builder)) - VampireExplicitPremises fingerprints -> - traverse prepareExplicit - (stableUniqueBy id (toList fingerprints)) - VampireLocalPremises -> - Right [] - where - prepareImplicit (fingerprint, authorized@(FactEntry - _proposition occurrence _authorization)) - | semanticFactSearchEligibility occurrence - /= SearchEligible = - Right Nothing - | otherwise = do - fact <- prepareFact fingerprint authorized - pure case Backend.typedBackendFactCapability fact of - Backend.FofProjectable{} -> Just fact - Backend.RequiresTh0{} -> Nothing - - prepareExplicit fingerprint = - case Map.lookup fingerprint (logicalBuilderFacts builder) of - Nothing -> - Left (VampireObligationFactNotVisible fingerprint) - Just authorized -> - prepareFact fingerprint authorized - - prepareFact fingerprint - (FactEntry proposition occurrence _authorization) - | semanticFactFingerprint occurrence /= fingerprint = - Left (VampireObligationFactInvalid fingerprint) - | otherwise = do - supported <- - first - (const - (VampireObligationFactInvalid fingerprint)) - (Backend.supportedProposition - Vector.empty - (embedClosedCore - [] - (checkedPropositionTerm proposition))) - capability <- - first - (const - (VampireObligationFactInvalid fingerprint)) - (Backend.classifySupportedProposition - globalType - supported) - pure - (Backend.typedBackendFact - fingerprint - supported - capability) - - mapMaybeM action = - fmap catMaybes . traverse action - -data LocalClaim = LocalClaim - !BuilderIdentity - !DeclarationInvocation - !FactSlot - !CheckedPropositionContent - -useAuthorizedFact - :: SemanticFactOccurrenceFingerprint - -> CandidateProof ImportIx -useAuthorizedFact fingerprint = do - proposition <- consumeAuthorizedFact fingerprint - registerKernelImport proposition - --- | Validate one fact capability and accumulate only its safety effect. --- Backend use does not register a kernel import. -consumeAuthorizedFact - :: SemanticFactOccurrenceFingerprint - -> CandidateProof CheckedPropositionContent -consumeAuthorizedFact fingerprint = CandidateProof do - state <- State.get - let builder = candidateProofBuilder state - declaration = candidateProofDeclaration state - staged = - findPendingByFingerprint - fingerprint - (declarationPending declaration) - case staged of - Just pending -> - consumePendingFact pending state - Nothing -> - case Map.lookup - fingerprint - (logicalBuilderFacts builder) of - Nothing -> - State.lift - (Except.throwError - (AuthorizedFactNotVisible fingerprint)) - Just authorized -> - consumeBuilderAuthorizedFact authorized state - --- | Materialize one sealed direct import and its transitive parents. The --- interface DAG is folded imported-before-importer and each producer --- occurrence receives a fresh capability for this consuming builder. -importSealedModule - :: ImportedModuleEvidence - -> Declaration () -importSealedModule evidence = Declaration do - state <- State.get - when - (isJust (declarationObjectClosure state)) - (State.lift - (Except.throwError ImportedModuleAfterAuthorization)) - let builder = declarationBuilder state - interfaceId = - semanticInterfaceAssertedId - (evidenceInterface evidence) - unless - (interfaceId `elem` - logicalBuilderDirectSemanticInputs builder) - (State.lift - (Except.throwError - (ImportedModuleNotDirect interfaceId))) - imported <- - State.lift - (Except.liftEither - (foldImportedEvidence evidence builder)) - State.put - state - { declarationBuilder = imported - , declarationObjectClosure = Nothing - } - --- The walking path keeps complete aggregate maps. Measure long chains before --- replacing this representation. -foldImportedEvidence - :: ImportedModuleEvidence - -> LogicalBuilder - -> Either DeclarationError LogicalBuilder -foldImportedEvidence evidence builder - | interfaceId - `Set.member` logicalBuilderImportedInterfaces builder = - Right builder - | otherwise = do - unless - (semanticInterfaceDirectInputs interface - == (semanticInterfaceAssertedId . evidenceInterface - <$> parents)) - (Left - (ImportedEvidenceDirectMismatch - (semanticInterfaceDirectInputs interface) - (semanticInterfaceAssertedId . evidenceInterface - <$> parents))) - withParents <- foldM - (flip foldImportedEvidence) - builder - parents - objectClosure <- - first - DeclarationObjectValidationFailed - (extendImportedObjectClosure - (logicalBuilderObjectClosure withParents) - objects) - importedFacts <- foldM - (insertImportedFact withParents) - (logicalBuilderFacts withParents) - (Map.elems entries) - importedAliases <- foldM - (insertImportedAlias importedFacts) - (logicalBuilderAliases withParents) - [ ( alias - , ImportedAliasOrigin - (declarationDeltaSlot delta) - (semanticAliasTarget alias) - ) - | delta <- semanticInterfaceDeclarations interface - , alias <- declarationDeltaAliases delta - ] - importedStructures <- foldM - (insertSemanticStructure objectClosure) - (logicalBuilderStructures withParents) - [ descriptor - | delta <- semanticInterfaceDeclarations interface - , descriptor <- semanticEnvironmentStructures - (declarationDeltaEnvironment delta) - ] - importedGlobals <- foldM - (insertImportedGlobal objectClosure importedStructures) - (logicalBuilderGlobals withParents) - [ binding - | delta <- semanticInterfaceDeclarations interface - , binding <- semanticEnvironmentBindings - (declarationDeltaEnvironment delta) - ] - pure - withParents - { logicalBuilderFacts = importedFacts - , logicalBuilderAliases = importedAliases - , logicalBuilderGlobals = importedGlobals - , logicalBuilderStructures = importedStructures - , logicalBuilderObjectClosure = objectClosure - , logicalBuilderImportedInterfaces = - Set.insert - interfaceId - (logicalBuilderImportedInterfaces withParents) - } - where - ImportedModuleEvidence interface parents entries objects = evidence - interfaceId = semanticInterfaceAssertedId interface - - extendImportedObjectClosure closure asserted = - extendObjectClosure - closure - [ object - | object <- asserted - , assertedObjectId object - `Set.notMember` checkedObjectIds closure - ] - - insertImportedFact - current facts pair = do - let (occurrence, proposition) = pair - fingerprint = semanticFactFingerprint occurrence - authority = semanticFactAuthority occurrence - _ <- - first ImportedFactMaterializationFailed - (Materialization.checkImportedOccurrence - (logicalBuilderTheory current) - fingerprint - occurrence - proposition - authority) - let authorization = - BuilderFactAuthorization - (logicalBuilderIdentity current) - (semanticFactSlot occurrence) - authority - authorized = - FactEntry proposition occurrence authorization - case Map.lookup fingerprint facts of - Nothing -> - pure (Map.insert fingerprint authorized facts) - Just existing - | equivalentAuthorizedFact existing authorized -> - pure facts - | otherwise -> - Left (ImportedFactCollision fingerprint) - - insertImportedAlias facts aliases (alias, origin) = do - let name = semanticAliasName alias - target = semanticAliasTarget alias - unless - (Map.member target facts) - (Left (ImportedAliasTargetMissing target)) - case Map.lookup name aliases of - Nothing -> - pure - (Map.insert - name - (ImportedAliasBinding target origin) - aliases) - Just (ImportedAliasBinding existingTarget existingOrigin) - | existingTarget == target -> - pure aliases - | otherwise -> - Left - (ImportedAliasCollision - name existingOrigin origin) - - insertImportedGlobal closure structures globals binding = do - let key = semanticGlobalBindingKey binding - target = semanticGlobalBindingTarget binding - _ <- - first - (ImportedGlobalTargetInvalid key target) - (validateSemanticGlobalBindingTarget - (structureOperationBindings structures) - closure binding) - case Map.lookup key globals of - Nothing -> pure (Map.insert key target globals) - Just existing - | existing == target -> pure globals - | otherwise -> - Left (ImportedGlobalCollision key existing target) - -insertSemanticStructure - :: CheckedObjectClosure - -> Map SemanticStructurePhrase ResolvedStructure - -> SemanticStructureDescriptor - -> Either - DeclarationError - (Map SemanticStructurePhrase ResolvedStructure) -insertSemanticStructure closure structures descriptor = do - validateSemanticStructureTargets closure descriptor - let structurePhrase = semanticStructureDescriptorPhrase descriptor - case Map.lookup structurePhrase structures of - Just (ResolvedStructure existing _ _) - | existing == descriptor -> Right structures - | otherwise -> - Left - (ImportedStructureCollision - structurePhrase existing descriptor) - Nothing -> do - parents <- traverse resolveParent - (semanticStructureDescriptorParents descriptor) - inherited <- foldM mergeParentOperations Map.empty parents - complete <- foldM insertOwnOperation inherited - (semanticStructureDescriptorOperations descriptor) - let ancestors = - Set.unions - [ Set.insert - (semanticStructureDescriptorPhrase - (resolvedStructureDescriptor parent)) - parentAncestors - | parent@(ResolvedStructure _ parentAncestors _) <- parents - ] - resolved = ResolvedStructure descriptor ancestors complete - Right (Map.insert structurePhrase resolved structures) - where - resolveParent parentPhrase = - maybe - (Left - (SemanticStructureParentMissing - (semanticStructureDescriptorPhrase descriptor) - parentPhrase)) - Right - (Map.lookup parentPhrase structures) - - mergeParentOperations operations - (ResolvedStructure _descriptor _ancestors parentOperations) = - foldM insertInheritedOperation operations - (Map.toAscList parentOperations) - - insertInheritedOperation operations (symbol, operation) = - insertResolvedOperation symbol operation operations - - insertOwnOperation operations operation = - insertResolvedOperation - (semanticStructureOperationSymbol operation) - (ResolvedStructureOperation - (semanticStructureOperationObject operation) - (semanticStructureDescriptorPhrase descriptor)) - operations - - insertResolvedOperation symbol incoming operations = - case Map.lookup symbol operations of - Nothing -> Right (Map.insert symbol incoming operations) - Just (ResolvedStructureOperation existingObject existingOrigin) -> - case incoming of - ResolvedStructureOperation incomingObject incomingOrigin - | existingObject == incomingObject -> Right operations - | otherwise -> - Left - (SemanticStructureOperationConflict - symbol existingOrigin incomingOrigin) - -validateSemanticStructureTargets - :: CheckedObjectClosure - -> SemanticStructureDescriptor - -> Either DeclarationError () -validateSemanticStructureTargets closure descriptor = do - traverse_ validatePredicate - (semanticStructureDescriptorPredicate descriptor) - traverse_ validateOperation - (semanticStructureDescriptorOperations descriptor) - where - validatePredicate object = - validateObjectType - (SemanticStructurePredicateTargetInvalid - (semanticStructureDescriptorPhrase descriptor)) - object - (TyArrow TySet TyProp) - - validateOperation operation = - validateObjectType - (SemanticStructureOperationTargetInvalid - (semanticStructureDescriptorPhrase descriptor) - (semanticStructureOperationSymbol operation)) - (semanticStructureOperationObject operation) - (TyArrow TySet TySet) - - validateObjectType failure object expected = - case lookupCheckedObjectType object closure of - Nothing -> Left (failure object Nothing expected) - Just actual - | actual == expected -> Right () - | otherwise -> Left (failure object (Just actual) expected) - -equivalentAuthorizedFact - :: FactEntry BuilderFactAuthorization - -> FactEntry BuilderFactAuthorization - -> Bool -equivalentAuthorizedFact - (FactEntry leftProposition leftOccurrence - (BuilderFactAuthorization leftIdentity leftSlot leftAuthority)) - (FactEntry rightProposition rightOccurrence - (BuilderFactAuthorization rightIdentity rightSlot rightAuthority)) = - checkedPropositionId leftProposition - == checkedPropositionId rightProposition - && leftOccurrence == rightOccurrence - && leftIdentity == rightIdentity - && leftSlot == rightSlot - && leftAuthority == rightAuthority - --- | Driver-level form used before the first declaration of a consuming --- module. It changes only the private builder's imported fact environment; --- no declaration prefix or durable envelope is emitted. -importSealedModuleDriver - :: ImportedModuleEvidence - -> ModuleDriver failure () -importSealedModuleDriver evidence = ModuleDriver do - DriverState resolver builder prefix validationRun <- - State.get - let declaration = - initialDeclarationState - resolver - validationRun - EnvironmentImportMode - builder - result <- - liftIO - (Except.runExceptT - (State.runStateT - (runDeclaration - (importSealedModule evidence)) - declaration)) - case result of - Left failure -> - Except.throwError (DriverDeclarationFailed failure) - Right (_value, importedState) -> - State.put - (DriverState - resolver - (declarationBuilder importedState) - prefix - validationRun) - -useStagedCandidate - :: ReservedCandidate - -> CandidateProof ImportIx -useStagedCandidate premise = CandidateProof do - state <- State.get - let current = candidateProofCandidate state - declaration = candidateProofDeclaration state - State.lift - (Except.liftEither - (validateReservedCandidate - declaration - premise)) - State.lift - (Except.liftEither - (validateStrictCandidateStage premise current)) - pending <- - maybe - (State.lift - (Except.throwError - (StagedPremiseNotAuthorized - (reservedCandidateSlot premise)))) - pure - (Map.lookup - (reservedCandidateSlot premise) - (declarationPending declaration)) - let proposedAuthority = - validationTarget (pendingCandidateCertificate pending) - checkedStage <- - State.lift - (Except.liftEither - (prepareCheckedDeclarationStage - declaration - (candidateProofObjectClosure state) - [(premise, proposedAuthority)])) - stagedProposition <- - State.lift - (Except.liftEither - (useCheckedStageFact checkedStage current premise)) - proposition <- consumePendingFact pending state - unless - (checkedPropositionId stagedProposition - == checkedPropositionId proposition) - (State.lift - (Except.throwError - (PlanningFactContractMismatch - (reservedCandidateSlot premise)))) - updated <- State.get - appendCandidatePremise proposition updated - -validateStrictCandidateStage - :: ReservedCandidate - -> ReservedCandidate - -> Either DeclarationError () -validateStrictCandidateStage premise current = - unless - (reservedStage premise < reservedStage current) - (Left - (StagedPremiseNotEarlier - (reservedCandidateSlot premise) - (reservedCandidateStage premise) - (reservedCandidateSlot current) - (reservedCandidateStage current))) - -prepareCheckedDeclarationStage - :: DeclarationState - -> CheckedObjectClosure - -> [(ReservedCandidate, FactAuthority)] - -> Either DeclarationError CheckedDeclarationStage -prepareCheckedDeclarationStage declaration closure candidates = do - entries <- foldM insertCandidate Map.empty candidates - pure (CheckedDeclarationStage ownSlot closure entries) - where - builder = declarationBuilder declaration - ownSlot = declarationOwnSlot declaration - - insertCandidate entries (candidate, authority) = do - validateReservedCandidate declaration candidate - let slot = reservedCandidateSlot candidate - unless - (factAuthorityTheorem authority - == candidateTheoremReference builder candidate) - (Left (PlanningFactContractMismatch slot)) - when - (Map.member slot entries) - (Left (PlanningFactContractMismatch slot)) - let occurrence = candidateOccurrence candidate authority - evidence = PlanningEvidence - authority - (Just - (PlanningProvenance - ownSlot - (reservedStage candidate) - slot)) - pure - (Map.insert - slot - (FactEntry - (candidateCheckedProposition candidate) - occurrence - evidence) - entries) - -useCheckedStageFact - :: CheckedDeclarationStage - -> ReservedCandidate - -> ReservedCandidate - -> Either DeclarationError CheckedPropositionContent -useCheckedStageFact - (CheckedDeclarationStage ownSlot closure entries) - current - premise = do - validateStrictCandidateStage premise current - let slot = reservedCandidateSlot premise - FactEntry proposition occurrence - (PlanningEvidence authority provenance) <- - maybe - (Left (PlanningFactContractMismatch slot)) - Right - (Map.lookup slot entries) - unless - ( provenance - == Just - (PlanningProvenance - ownSlot - (reservedStage premise) - slot) - && semanticFactSlot occurrence == slot - && semanticFactAuthority occurrence == authority - && checkedPropositionId proposition - == checkedPropositionId - (candidateCheckedProposition premise) - && propositionMatchesClosure closure proposition - ) - (Left (PlanningFactContractMismatch slot)) - pure proposition - -propositionMatchesClosure - :: CheckedObjectClosure - -> CheckedPropositionContent - -> Bool -propositionMatchesClosure closure proposition = - case validateAssertedPropositionContent - closure - (checkedPropositionId proposition) - (frozenCoreTerm (checkedPropositionTerm proposition)) of - Right _ -> True - Left _ -> False - -candidateOccurrence - :: ReservedCandidate - -> FactAuthority - -> SemanticFactOccurrence -candidateOccurrence - (ReservedCandidate _ _ _ _ slot - (CandidateSpec _ eligibility _aliases)) - authority = - semanticFactOccurrence slot authority eligibility - -candidateAliases :: ReservedCandidate -> [SemanticName] -candidateAliases - (ReservedCandidate _ _ _ _ _ - (CandidateSpec _ _ aliases)) = - aliases - -proveLocalKernelClaim - :: CheckedPropositionContent - -> KernelDerivation ObjectId - -> CandidateProof LocalClaim -proveLocalKernelClaim proposition derivation = CandidateProof do - state <- State.get - void - (State.lift - (Except.liftEither - (replayCandidateKernel proposition derivation state))) - let candidate = candidateProofCandidate state - declaration = candidateProofDeclaration state - pure - (LocalClaim - (logicalBuilderIdentity - (candidateProofBuilder state)) - (declarationInvocation declaration) - (reservedCandidateSlot candidate) - proposition) - -useLocalClaim :: LocalClaim -> CandidateProof ImportIx -useLocalClaim - (LocalClaim identity invocation slot proposition) = - CandidateProof do - state <- State.get - let builder = candidateProofBuilder state - declaration = candidateProofDeclaration state - candidate = candidateProofCandidate state - unless - ( identity == logicalBuilderIdentity builder - && invocation == declarationInvocation declaration - && slot == reservedCandidateSlot candidate - ) - (State.lift - (Except.throwError LocalClaimOutsideCandidate)) - appendCandidatePremise proposition state - - -authorizeKernelProofCandidate - :: ReservedCandidate - -> CandidateProof (KernelDerivation ObjectId) - -> Declaration () -authorizeKernelProofCandidate candidate proof = - authorizeOneCandidate candidate \initial -> do - (derivation, final) <- - State.runStateT (runCandidateProof proof) initial - when - (isNothing (candidateProofCachedValidation final)) - (void - (Except.liftEither - (replayCandidateKernel - (candidateCheckedProposition candidate) - derivation - final))) - completeCandidateWithValidation - candidate - (CheckedSourceProof - (acceptedRequestIds final)) - (candidateProofSafety final) - final - -authorizeKernelConstructionCandidate - :: KernelConstructionDescriptor - -> ReservedCandidate - -> CandidateProof (KernelDerivation ObjectId) - -> Declaration () -authorizeKernelConstructionCandidate descriptor candidate proof = - authorizeOneCandidate candidate \initial -> do - (derivation, final) <- - State.runStateT (runCandidateProof proof) initial - when - (isNothing (candidateProofCachedValidation final)) do - replayed <- - Except.liftEither - (replayCandidateKernel - (candidateCheckedProposition candidate) - derivation - final) - Except.liftEither - (validateKernelConstruction - descriptor - (candidateCheckedProposition candidate) - replayed - final) - completeCandidateWithValidation - candidate - (CheckedKernelConstruction descriptor) - (candidateProofSafety final) - final - -authorizeDefinitionEquationCandidate - :: ObjectId - -> ReservedCandidate - -> Declaration () -authorizeDefinitionEquationCandidate identity candidate = - authorizeOneCandidate candidate \initial -> do - when - (isNothing (candidateProofCachedValidation initial)) - (unless - (matchesDefinitionEquation - identity - (candidateCheckedProposition candidate) - initial) - (Except.throwError - DefinitionEquationCandidateMismatch)) - completeCandidateWithValidation - candidate - (CheckedKernelConstruction - (CheckedDefinitionEquation identity)) - (candidateProofSafety initial) - initial - -authorizeSourceAxiomCandidate - :: ReservedCandidate - -> Declaration () -authorizeSourceAxiomCandidate candidate = - authorizeOneCandidate candidate \initial -> - let safety = - addCandidateEscape - SourceAxiom - initialCandidateSafety - in completeCandidateWithValidation - candidate - SourceAxiomAuthorization - safety - initial - --- | Complete one exact deterministic datatype as a single trusted family. --- The descriptor, objects, and complete candidate batch must agree exactly. --- Law semantics are trusted to the sole production compiler in --- "Checking.Exact.Datatype"; this boundary validates its complete inventory, --- not the meaning of each generated proposition. -authorizeDatatypeCompilationCandidates - :: DatatypeCompilationDescriptor - -> ObjectId - -> NonEmpty ObjectId - -> NonEmpty ReservedCandidate - -> Declaration () -authorizeDatatypeCompilationCandidates - suppliedDescriptor carrier constructors candidates = - Declaration do - state <- State.get - let builder = declarationBuilder state - objectInventory = carrier : NonEmpty.toList constructors - declaredObjects = - assertedObjectId - <$> reverse (declarationObjectsReversed state) - reservedCandidates = - Map.elems (declarationReservations state) - theoremInventory = - candidateTheoremReference builder - <$> NonEmpty.toList candidates - expectedDescriptor = - datatypeCompilationDescriptor - carrier - constructors - theoremInventory - stages = - nubOrd - (reservedCandidateStage - <$> NonEmpty.toList candidates) - unless - ( suppliedDescriptor == expectedDescriptor - && declaredObjects == objectInventory - && reservedCandidates == NonEmpty.toList candidates - && length stages == 1 - ) - (State.lift - (Except.throwError - DatatypeCompilationDescriptorMismatch)) - runDeclaration - (traverse_ - (authorizeDatatypeCandidate suppliedDescriptor) - candidates) - -authorizeDatatypeCandidate - :: DatatypeCompilationDescriptor - -> ReservedCandidate - -> Declaration () -authorizeDatatypeCandidate descriptor candidate = - authorizeOneCandidate candidate \initial -> - completeCandidateWithValidation - candidate - (TrustedCompilation - (DatatypeCompilation descriptor)) - initialCandidateSafety - initial - -authorizeOmittedCandidate - :: ReservedCandidate - -> CandidateProof () - -> Declaration () -authorizeOmittedCandidate candidate proof = - authorizeOneCandidate candidate \initial -> do - cached <- - selectProofCandidateValidation candidate initial - let preparedInitial = - initial - { candidateProofCachedValidation = cached - } - ((), final) <- - State.runStateT (runCandidateProof proof) preparedInitial - let safety = candidateProofSafety final - unless - (Omitted - `elem` escapeKindsToList - (authoritySafetyEscapeKinds - (candidateSafetyAuthority safety))) - (Except.throwError OmittedProofDidNotRecordUse) - completeCandidateWithValidation - candidate - OmittedAuthorization - safety - final - --- | Retain the closed candidate-target path while scoped proof composition is --- introduced. It uses the same environment validation as local obligations. -acceptVampireObligation - :: Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - Void - origin - ObjectId - -> CandidateProof () -acceptVampireObligation prepared = - acceptValidatedVampireTask - (validateCandidateVampireProblem prepared) - prepared - --- | Validate one internally prepared scoped obligation, then retain its exact --- accepted request. The trusted caller remains responsible for structural --- local-proof composition. -acceptPreparedVampireObligation - :: (Eq local, Eq origin) - => PreparedVampireObligation local origin - -> CandidateProof () -acceptPreparedVampireObligation - (PreparedVampireObligation expected prepared) = - acceptValidatedVampireTask - (validatePreparedVampireProblem expected prepared) - prepared - --- | Prepare and execute the current closed candidate using exactly the --- staged premises already consumed by its trusted declaration compiler. -acceptCurrentCandidateVampire :: CandidateProof () -acceptCurrentCandidateVampire = - prepareCurrentCandidateVampire - >>= acceptPreparedVampireObligation - --- | Prepare the current closed candidate without executing its request. The --- declaration-owned batch authorizer uses this seam only after all strictly --- earlier staged premises have been consumed. -prepareCurrentCandidateVampire - :: CandidateProof (PreparedVampireObligation Void ()) -prepareCurrentCandidateVampire = CandidateProof do - initial <- State.get - let builder = candidateProofBuilder initial - closure = candidateProofObjectClosure initial - target = candidateCheckedProposition - (candidateProofCandidate initial) - premises = - [ proposition - | CandidatePremise proposition <- - reverse (candidateProofPremisesReversed initial) - ] - resolver = - declarationVampireResolver - (candidateProofDeclaration initial) - preparation = - prepareClosedCandidateVampire - builder closure target premises - preparedResult <- - State.lift - (liftIO - (measureVampirePreparation resolver preparation)) - prepared <- - State.lift - (Except.liftEither - (first - CurrentCandidateVampirePreparationFailed - preparedResult)) - pure prepared - -prepareClosedCandidateVampire - :: BuilderState evidence - -> CheckedObjectClosure - -> CheckedPropositionContent - -> [CheckedPropositionContent] - -> Either - (VampireObligationPreparationError Void) - (PreparedVampireObligation Void ()) -prepareClosedCandidateVampire builder closure target premises = do - supportedTarget <- - first - VampireObligationClaimProjectionFailed - (Backend.projectSupportedProposition - globalType - (Vector.empty :: Vector (Void, CoreType)) - (closed target)) - locals <- - traverse - prepareLocal - (zip [0 :: Natural ..] premises) - prepareVampireObligationWith - Provers.DirectTask - builder - closure - supportedTarget - locals - [] - VampireLocalPremises - where - globalType = (`lookupCheckedObjectType` closure) - closed proposition = - embedClosedCore [] - (checkedPropositionTerm proposition) - - prepareLocal (index, proposition) = do - let ordinal = Backend.localPremiseOrdinal index - supported <- - first - (VampireObligationLocalProjectionFailed ordinal) - (Backend.projectSupportedProposition - globalType - (Vector.empty :: Vector (Void, CoreType)) - (closed proposition)) - first - (VampireObligationLocalClassificationFailed ordinal) - (Backend.typedLocalPremise - globalType ordinal () supported) - -acceptValidatedVampireTask - :: (CandidateProofState - -> ExceptT DeclarationError IO CandidateProofState) - -> Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> CandidateProof () -acceptValidatedVampireTask validate prepared = CandidateProof do - initial <- State.get - validated <- State.lift (validate initial) - result <- - case candidateProofCachedValidation initial of - Nothing -> do - let resolver = - declarationVampireResolver - (candidateProofDeclaration initial) - Just <$> State.lift (resolveOneVampire resolver prepared) - Just _validation -> - pure Nothing - final <- - State.lift - (acceptVampireBatchMemberResult - prepared result validated) - State.put final - --- | Complete one checked source candidate after all of its obligations have --- been accepted in source order. The enclosing proof declaration owns the --- exact syntax key and selects live or cached execution before this action. -authorizeVampireCandidate - :: ReservedCandidate - -> CandidateProof () - -> Declaration () -authorizeVampireCandidate candidate proof = - authorizeOneCandidate candidate \initial -> do - cached <- - selectProofCandidateValidation candidate initial - let preparedInitial = - initial - { candidateProofCachedValidation = cached - } - ((), final) <- - State.runStateT (runCandidateProof proof) preparedInitial - case acceptedRequestIds final of - [] -> - Except.throwError - VampireProofHasNoAcceptedObligations - requests -> - completeCandidateWithValidation - candidate - (CheckedSourceProof requests) - (candidateProofSafety final) - final - -data PreparedVampireCandidateBatchMember = - PreparedVampireCandidateBatchMember - !Location - !ReservedCandidate - !(Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - Void - () - ObjectId) - !CandidateProofState - -data ResolvedVampireCandidateBatchMember = - ResolvedVampireCandidateBatchMember - !PreparedVampireCandidateBatchMember - !(Maybe - (Either - Provers.ProverProcessError - Provers.ProverAnswer)) - --- | Authorize one complete, source-ordered candidate stage whose members are --- mutually independent and each require exactly one closed Vampire request. --- Every member is prepared and validated against the same declaration --- baseline. Results are applied only after the complete live batch returns, --- so no same-stage sibling can become authority for another member. -authorizeVampireCandidateBatch - :: NonEmpty - ( Location - , ReservedCandidate - , CandidateProof (PreparedVampireObligation Void ()) - ) - -> Declaration () -authorizeVampireCandidateBatch inputs = Declaration do - unprepared <- State.get - baseline <- - State.lift - (Except.liftEither - (prepareDeclarationClosure unprepared)) - let supplied = - [ candidate - | (_location, candidate, _prepare) <- NonEmpty.toList inputs - ] - frontier = declarationAuthorizationFrontier baseline - expected = - List.filter - ((== CandidateStage frontier) . reservedStage) - (Map.elems (declarationReservations baseline)) - traverse_ - (State.lift - . Except.liftEither - . validateReservedCandidate baseline) - supplied - traverse_ - (\candidate -> - when - (Map.member - (reservedCandidateSlot candidate) - (declarationPending baseline)) - (State.lift - (Except.throwError - (CandidateAlreadyAuthorized - (reservedCandidateSlot candidate))))) - supplied - unless (supplied == expected) - (State.lift - (Except.throwError - (VampireCandidateBatchMismatch - (reservedCandidateSlot <$> expected) - (reservedCandidateSlot <$> supplied)))) - prepared <- - State.lift - (traverse - (prepareVampireCandidateBatchMember baseline) - inputs) - State.lift - (validateCachedVampireCandidateBatch - (NonEmpty.toList prepared)) - let live = - [ task - | PreparedVampireCandidateBatchMember - _location _candidate task final <- - NonEmpty.toList prepared - , isNothing (candidateProofCachedValidation final) - ] - liveResults <- - case NonEmpty.nonEmpty live of - Nothing -> pure [] - Just nonempty -> do - let resolver = - declarationVampireResolver baseline - results <- - liftIO - (resolveSynchronousVampireBatch resolver nonempty) - State.lift - (Except.liftEither - (validateVampireResolverResultCount - (length live) - results)) - pending <- - State.lift - (completeVampireCandidateBatch - (NonEmpty.toList prepared) - liveResults) - let withPending = - baseline - { declarationPending = - foldl' - (\entries item@(PendingCandidate candidate _ _) -> - Map.insert - (reservedCandidateSlot - candidate) - item - entries) - (declarationPending baseline) - pending - } - State.put (advanceAuthorizationFrontier withPending) - -prepareVampireCandidateBatchMember - :: DeclarationState - -> ( Location - , ReservedCandidate - , CandidateProof (PreparedVampireObligation Void ()) - ) - -> ExceptT DeclarationError IO PreparedVampireCandidateBatchMember -prepareVampireCandidateBatchMember - baseline (location, candidate, prepare) = do - initial <- - Except.liftEither - (initialCandidateProofState baseline candidate) - cached <- selectProofCandidateValidation candidate initial - let selected = - initial{candidateProofCachedValidation = cached} - (obligation, preparedState) <- - State.runStateT - (runCandidateProof - (locateProofObligation location prepare)) - selected - unless (null (acceptedRequestIds preparedState)) - (Except.throwError - (VampireCandidateBatchProofShapeMismatch - (reservedCandidateSlot candidate))) - let PreparedVampireObligation expected task = obligation - validated <- - Except.withExceptT - (ProofObligationFailedAt location) - (validatePreparedVampireProblem - expected task preparedState) - pure - (PreparedVampireCandidateBatchMember - location candidate task validated) - -completeVampireCandidateBatch - :: [PreparedVampireCandidateBatchMember] - -> [Either Provers.ProverProcessError Provers.ProverAnswer] - -> ExceptT DeclarationError IO [PendingCandidate] -completeVampireCandidateBatch members liveResults = do - resolved <- - Except.liftEither - (associateVampireCandidateBatchResults - members liveResults) - -- Integrity dominates ranked proof failure: validate every accepted run - -- before inspecting any ordinary process or prover rejection. - traverse_ validateAcceptedVampireBatchMember resolved - traverse_ rejectOrdinaryVampireBatchMember resolved - traverse completeVampireCandidateBatchMember resolved - -validateCachedVampireCandidateBatch - :: [PreparedVampireCandidateBatchMember] - -> ExceptT DeclarationError IO () -validateCachedVampireCandidateBatch = - traverse_ \member -> - when - (preparedVampireCandidateBatchMemberIsCached member) - (void - (completeVampireCandidateBatchMember - (ResolvedVampireCandidateBatchMember member Nothing))) - -associateVampireCandidateBatchResults - :: [PreparedVampireCandidateBatchMember] - -> [Either Provers.ProverProcessError Provers.ProverAnswer] - -> Either - DeclarationError - [ResolvedVampireCandidateBatchMember] -associateVampireCandidateBatchResults members = - go members - where - go [] [] = Right [] - go [] results = - Left - (VampireResolverBatchSizeMismatch - 0 - (length results)) - go (member : remaining) results - | preparedVampireCandidateBatchMemberIsCached member = - (ResolvedVampireCandidateBatchMember member Nothing :) - <$> go remaining results - | otherwise = - case results of - [] -> - Left (VampireResolverBatchSizeMismatch 1 0) - current : later -> - (ResolvedVampireCandidateBatchMember - member (Just current) :) - <$> go remaining later - -preparedVampireCandidateBatchMemberIsCached - :: PreparedVampireCandidateBatchMember - -> Bool -preparedVampireCandidateBatchMemberIsCached - (PreparedVampireCandidateBatchMember - _location _candidate _task state) = - isJust (candidateProofCachedValidation state) - -validateAcceptedVampireBatchMember - :: ResolvedVampireCandidateBatchMember - -> ExceptT DeclarationError IO () -validateAcceptedVampireBatchMember - (ResolvedVampireCandidateBatchMember - (PreparedVampireCandidateBatchMember - location _candidate task _validated) - result) = - Except.withExceptT - (ProofObligationFailedAt location) - (validateAcceptedVampireResult task result) - -rejectOrdinaryVampireBatchMember - :: ResolvedVampireCandidateBatchMember - -> ExceptT DeclarationError IO () -rejectOrdinaryVampireBatchMember - (ResolvedVampireCandidateBatchMember - (PreparedVampireCandidateBatchMember - location _candidate _task _validated) - result) = - traverse_ - (Except.throwError . ProofObligationFailedAt location) - (result >>= vampireResultFailure) - -completeVampireCandidateBatchMember - :: ResolvedVampireCandidateBatchMember - -> ExceptT DeclarationError IO PendingCandidate -completeVampireCandidateBatchMember - (ResolvedVampireCandidateBatchMember - (PreparedVampireCandidateBatchMember - location candidate task validated) - result) = do - final <- - Except.withExceptT - (ProofObligationFailedAt location) - (applyAcceptedVampireResult task result validated) - completeCandidateWithValidation - candidate - (CheckedSourceProof (acceptedRequestIds final)) - (candidateProofSafety final) - final - -acceptVampireBatchMemberResult - :: Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> Maybe (Either Provers.ProverProcessError Provers.ProverAnswer) - -> CandidateProofState - -> ExceptT DeclarationError IO CandidateProofState -acceptVampireBatchMemberResult prepared result validated = do - validateAcceptedVampireResult prepared result - traverse_ Except.throwError (result >>= vampireResultFailure) - applyAcceptedVampireResult prepared result validated - -validateAcceptedVampireResult - :: Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> Maybe (Either Provers.ProverProcessError Provers.ProverAnswer) - -> ExceptT DeclarationError IO () -validateAcceptedVampireResult prepared result = do - let request = Provers.preparedTypedProverRequest prepared - traverse_ - (\resolved -> - traverse_ - (\accepted -> - unless - (Provers.acceptedVampireRequestId accepted - == Provers.preparedVerificationRequestId request) - (Except.throwError VampireRequestMismatch)) - (either (const Nothing) Provers.provedVampireRun resolved)) - result - -vampireResultFailure - :: Either Provers.ProverProcessError Provers.ProverAnswer - -> Maybe DeclarationError -vampireResultFailure = \case - Left failure -> - Just (VampireProcessFailed failure) - Right answer -> - case Provers.provedVampireRun answer of - Nothing -> - Just (VampireObligationRejected answer) - Just _accepted -> - Nothing - -applyAcceptedVampireResult - :: Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> Maybe (Either Provers.ProverProcessError Provers.ProverAnswer) - -> CandidateProofState - -> ExceptT DeclarationError IO CandidateProofState -applyAcceptedVampireResult prepared result validated = do - traverse_ - (\resolved -> - case vampireResultFailure resolved of - Just failure -> - Except.throwError failure - Nothing -> - pure ()) - result - let request = Provers.preparedTypedProverRequest prepared - requestId = Provers.preparedVerificationRequestId request - pure - validated - { candidateProofAcceptedRequestsReversed = - requestId - : candidateProofAcceptedRequestsReversed validated - } - -selectProofCandidateValidation - :: ReservedCandidate - -> CandidateProofState - -> ExceptT - DeclarationError - IO - (Maybe Materialization.CandidateValidation) -selectProofCandidateValidation candidate initial = - case declarationValidationMode - (candidateProofDeclaration initial) of - EnvironmentImportMode -> - Except.throwError - ProofValidationOutsideProofDeclaration - ProofValidationMode{} -> do - (syntax, cached) <- - runDeclarationLookup - (lookupProofValidation candidate) - initial - pure - ((\record -> - Materialization.candidateProofValidation - record syntax) - <$> cached) - DeclarationValidationMode{} -> - pure (candidateProofCachedValidation initial) - -completeCandidateWithValidation - :: ReservedCandidate - -> DirectAuthorization - -> CandidateSafety - -> CandidateProofState - -> ExceptT DeclarationError IO PendingCandidate -completeCandidateWithValidation candidate direct safety final = do - pending <- - Except.liftEither - (freshCompletion - candidate - direct - safety - final) - traverse_ - (\validation -> - case Materialization.checkCandidateValidation - (logicalBuilderTheory - (candidateProofBuilder final)) - (logicalBuilderPrefix - (candidateProofBuilder final)) - (candidateCheckedProposition candidate) - (validationTarget - (pendingCandidateCertificate pending)) - direct - validation of - Left failure -> - liftIO - (throwIO - (CachedValidationIntegrityError failure)) - Right () -> - pure ()) - (candidateProofCachedValidation final) - pure pending - -runDeclarationLookup - :: Declaration value - -> CandidateProofState - -> ExceptT DeclarationError IO value -runDeclarationLookup action initial = - fst - <$> State.runStateT - (runDeclaration action) - (candidateProofDeclaration initial) - -pendingCandidateCertificate :: PendingCandidate -> ValidationCertificate -pendingCandidateCertificate - (PendingCandidate _ certificate _) = - certificate - -acceptedRequestIds :: CandidateProofState -> [PreparedRequestId] -acceptedRequestIds = - reverse . candidateProofAcceptedRequestsReversed - -freshCompletion - :: ReservedCandidate - -> DirectAuthorization - -> CandidateSafety - -> CandidateProofState - -> Either DeclarationError PendingCandidate -freshCompletion candidate direct safety proofState = do - let builder = candidateProofBuilder proofState - declaration = candidateProofDeclaration proofState - reference = candidateTheoremReference builder candidate - authority = candidateFactAuthority reference safety - void - (first DeclarationPropositionValidationFailed - (validateAssertedPropositionContent - (candidateProofObjectClosure proofState) - (checkedPropositionId - (candidateCheckedProposition candidate)) - (frozenCoreTerm - (checkedPropositionTerm - (candidateCheckedProposition candidate))))) - certificate <- - first ValidationCertificateFailed - (validationCertificate authority direct) - let authorization = - PendingFactAuthorization - (logicalBuilderIdentity builder) - (logicalBuilderPrefix builder) - (declarationInvocation declaration) - (reservedCandidateSlot candidate) - authority - (reservedStage candidate) - pure - (PendingCandidate - candidate - certificate - authorization) - -authorizeOneCandidate - :: ReservedCandidate - -> (CandidateProofState - -> ExceptT DeclarationError IO PendingCandidate) - -> Declaration () -authorizeOneCandidate candidate complete = Declaration do - unprepared <- State.get - state <- - State.lift - (Except.liftEither - (prepareDeclarationClosure unprepared)) - State.lift - (Except.liftEither - (validateReservedCandidate state candidate)) - when - (Map.member - (reservedCandidateSlot candidate) - (declarationPending state)) - (State.lift - (Except.throwError - (CandidateAlreadyAuthorized - (reservedCandidateSlot candidate)))) - unless - (reservedStage candidate - == CandidateStage - (declarationAuthorizationFrontier state)) - (State.lift - (Except.throwError - (CandidateOutsideAuthorizationFrontier - (reservedCandidateSlot candidate) - (reservedCandidateStage candidate) - (declarationAuthorizationFrontier state)))) - initial <- State.lift - (Except.liftEither - (initialCandidateProofState state candidate)) - pending <- State.lift (complete initial) - let state' = - state - { declarationPending = - Map.insert - (reservedCandidateSlot candidate) - pending - (declarationPending state) - } - State.put (advanceAuthorizationFrontier state') - -advanceAuthorizationFrontier - :: DeclarationState - -> DeclarationState -advanceAuthorizationFrontier state - | all stageCompleted currentCandidates = - state - { declarationAuthorizationFrontier = - frontier + 1 - } - | otherwise = - state - where - frontier = declarationAuthorizationFrontier state - currentCandidates = - List.filter - ((== CandidateStage frontier) . reservedStage) - (Map.elems (declarationReservations state)) - stageCompleted candidate = - Map.member - (reservedCandidateSlot candidate) - (declarationPending state) - -initialCandidateProofState - :: DeclarationState - -> ReservedCandidate - -> Either DeclarationError CandidateProofState -initialCandidateProofState declaration candidate = do - closure <- declarationClosure declaration - cached <- - cachedDeclarationCandidateValidation declaration candidate - pure CandidateProofState - { candidateProofDeclaration = declaration - , candidateProofObjectClosure = closure - , candidateProofCandidate = candidate - , candidateProofCachedValidation = cached - , candidateProofPremisesReversed = [] - , candidateProofPremiseCount = 0 - , candidateProofSafety = initialCandidateSafety - , candidateProofAcceptedRequestsReversed = [] - } - -cachedDeclarationCandidateValidation - :: DeclarationState - -> ReservedCandidate - -> Either - DeclarationError - (Maybe Materialization.CandidateValidation) -cachedDeclarationCandidateValidation declaration candidate = - case declarationValidationSelection declaration of - DeclarationValidationUnselected -> - Right Nothing - FreshDeclarationValidation -> - Right Nothing - CachedDeclarationValidation - syntax objects theorems record ordinals -> - maybe - (Left - (CachedDeclarationCandidateMissing - (reservedCandidateSlot candidate))) - (Right - . Just - . Materialization.candidateDeclarationValidation - record syntax objects theorems) - (Map.lookup - (reservedCandidateSlot candidate) - ordinals) - -reservedStage :: ReservedCandidate -> CandidateStage -reservedStage - (ReservedCandidate _ _ _ stage _ _) = - stage - -validateReservedCandidate - :: DeclarationState - -> ReservedCandidate - -> Either DeclarationError () -validateReservedCandidate declaration candidate = do - let builder = declarationBuilder declaration - ReservedCandidate - identity prefix invocation _stage slot _spec = candidate - unless - ( identity == logicalBuilderIdentity builder - && prefix == logicalBuilderPrefix builder - && invocation == declarationInvocation declaration - && Map.lookup slot - (declarationReservations declaration) - == Just candidate - ) - (Left (CandidateOutsideDeclaration slot)) - -instance Eq ReservedCandidate where - left == right = - reservedCandidateKey left == reservedCandidateKey right - -reservedCandidateKey - :: ReservedCandidate - -> (BuilderIdentity, PrefixContextId, DeclarationInvocation, CandidateStage, FactSlot) -reservedCandidateKey - (ReservedCandidate identity prefix invocation stage slot _spec) = - (identity, prefix, invocation, stage, slot) - - -consumeBuilderAuthorizedFact - :: FactEntry BuilderFactAuthorization - -> CandidateProofState - -> StateT - CandidateProofState - (ExceptT DeclarationError IO) - CheckedPropositionContent -consumeBuilderAuthorizedFact - (FactEntry proposition occurrence authorization) - state = do - let builder = candidateProofBuilder state - BuilderFactAuthorization - identity slot authority = authorization - unless - ( identity == logicalBuilderIdentity builder - && slot == semanticFactSlot occurrence - && authority == semanticFactAuthority occurrence - ) - (State.lift - (Except.throwError BuilderFactAuthorizationMismatch)) - accumulateAuthorizedSafety - proposition - authority - state - pure proposition - -consumePendingFact - :: PendingCandidate - -> CandidateProofState - -> StateT - CandidateProofState - (ExceptT DeclarationError IO) - CheckedPropositionContent -consumePendingFact - (PendingCandidate premise certificate authorization) - state = do - let builder = candidateProofBuilder state - declaration = candidateProofDeclaration state - PendingFactAuthorization - identity prefix invocation slot authority - premiseStageValue = authorization - current = candidateProofCandidate state - unless - ( identity == logicalBuilderIdentity builder - && prefix == logicalBuilderPrefix builder - && invocation == declarationInvocation declaration - && slot == reservedCandidateSlot premise - && authority == validationTarget certificate - && premiseStageValue == reservedStage premise - ) - (State.lift - (Except.throwError PendingFactAuthorizationMismatch)) - unless - (reservedStage premise < reservedStage current) - (State.lift - (Except.throwError - (StagedPremiseNotEarlier - (reservedCandidateSlot premise) - (reservedCandidateStage premise) - (reservedCandidateSlot current) - (reservedCandidateStage current)))) - let proposition = candidateCheckedProposition premise - accumulateAuthorizedSafety - proposition - authority - state - pure proposition - -accumulateAuthorizedSafety - :: CheckedPropositionContent - -> FactAuthority - -> CandidateProofState - -> StateT - CandidateProofState - (ExceptT DeclarationError IO) - () -accumulateAuthorizedSafety proposition authority state = do - let expected = - theoremRef - (logicalBuilderTheory - (candidateProofBuilder state)) - (checkedPropositionId proposition) - safety <- - State.lift - (Except.liftEither - (first FactSafetyFailed - (accumulateFactSafety - expected - authority - (candidateProofSafety state)))) - State.put state{candidateProofSafety = safety} - -registerKernelImport - :: CheckedPropositionContent - -> CandidateProof ImportIx -registerKernelImport proposition = CandidateProof do - state <- State.get - appendCandidatePremise proposition state - -appendCandidatePremise - :: CheckedPropositionContent - -> CandidateProofState - -> StateT - CandidateProofState - (ExceptT DeclarationError IO) - ImportIx -appendCandidatePremise proposition state = do - let index = candidateProofPremiseCount state - State.put - state - { candidateProofPremisesReversed = - CandidatePremise proposition - : candidateProofPremisesReversed state - , candidateProofPremiseCount = index + 1 - } - pure (importIx index) - -findPendingByFingerprint - :: SemanticFactOccurrenceFingerprint - -> Map FactSlot PendingCandidate - -> Maybe PendingCandidate -findPendingByFingerprint fingerprint = - find - (\(PendingCandidate candidate certificate _authorization) -> - semanticFactOccurrenceFingerprint - (reservedCandidateSlot candidate) - (validationTarget certificate) - == fingerprint) - . Map.elems - -candidateImportJudgments - :: CandidateProofState - -> Either DeclarationError (Vector (DerivationImportJudgment ObjectId)) -candidateImportJudgments state = - Vector.fromList - <$> traverse - (\(CandidatePremise proposition) -> - first DerivationImportFailed - (derivationImportJudgment - (checkedPropositionTerm proposition))) - (reverse - (candidateProofPremisesReversed state)) - -replayCandidateKernel - :: CheckedPropositionContent - -> KernelDerivation ObjectId - -> CandidateProofState - -> Either - DeclarationError - (ReplayedKernelDerivation ObjectId) -replayCandidateKernel proposition derivation state = do - imports <- candidateImportJudgments state - let builder = candidateProofBuilder state - closure = candidateProofObjectClosure state - first KernelCompletionFailed - (replayKernelDerivation - (logicalBuilderFoundation builder) - defaultKernelReplayLimits - (`lookupCheckedObjectType` closure) - imports - (checkedPropositionTerm proposition) - derivation) - -validateKernelConstruction - :: KernelConstructionDescriptor - -> CheckedPropositionContent - -> ReplayedKernelDerivation ObjectId - -> CandidateProofState - -> Either DeclarationError () -validateKernelConstruction descriptor proposition replayed proofState = - unless matches - (Left KernelConstructionDescriptorMismatch) - where - builder = candidateProofBuilder proofState - noImports = Set.null (replayedKernelImportUses replayed) - noFoundation = Set.null (replayedKernelFoundationUses replayed) - noRules = Set.null (replayedKernelRuleUses replayed) - - matches = - case descriptor of - FoundationLeaf tag -> - noImports - && replayedKernelFoundationUses replayed - == Set.singleton tag - && noRules - && checkedPropositionTerm proposition - == mapFrozenGlobals - absurd - (foundationAxiomFrozen - (logicalBuilderFoundation builder) - tag) - GuardedFoundationRules rules -> - replayedKernelRuleUses replayed - == guardedRuleTags rules - CheckedDefinitionEquation identity -> - noImports - && noFoundation - && noRules - && matchesDefinitionEquation identity proposition proofState - -matchesDefinitionEquation - :: ObjectId - -> CheckedPropositionContent - -> CandidateProofState - -> Bool -matchesDefinitionEquation identity proposition proofState = - case lookupCheckedObjectContent - identity - (candidateProofObjectClosure proofState) of - Just - (TransparentObjectContent - contentTheory coreType body) -> - contentTheory - == logicalBuilderTheory - (candidateProofBuilder proofState) - && frozenCoreTerm (checkedPropositionTerm proposition) - `elem` definitionEquationTargets identity coreType body - _ -> - False - -definitionEquationTargets - :: ObjectId - -> CoreType - -> CanonicalTerm ObjectId - -> [CanonicalTerm ObjectId] -definitionEquationTargets identity coreType body = - CEq coreType (CGlobal identity) body - : case (coreType, body) of - (TyArrow TySet TyProp, CLam TySet predicate) -> - [ CForall TySet - (CEq TyProp - (CApp (CGlobal identity) (CBound 0)) - predicate) - ] - _ -> [] - - -validateCandidateVampireProblem - :: Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - Void - origin - ObjectId - -> CandidateProofState - -> ExceptT DeclarationError IO CandidateProofState -validateCandidateVampireProblem prepared initial = do - let problem = Provers.preparedTypedProverLogicalProblem prepared - claim = Backend.typedProblemClaim problem - target = candidateCheckedProposition - (candidateProofCandidate initial) - Except.liftEither do - unless - ( Vector.null (Backend.supportedPropositionSupport claim) - && Backend.supportedPropositionTerm claim - == frozenCoreTerm (checkedPropositionTerm target) - ) - (Left VampireTargetMismatch) - unless - (Vector.null (Backend.typedProblemLocalPremises problem)) - (Left VampireLocalPremisesNotSupported) - validateVampireProblemEnvironment prepared initial - -validatePreparedVampireProblem - :: (Eq local, Eq origin) - => Backend.TypedProblem - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> CandidateProofState - -> ExceptT DeclarationError IO CandidateProofState -validatePreparedVampireProblem expectedProblem prepared initial = do - let problem = Provers.preparedTypedProverLogicalProblem prepared - Except.liftEither - (unless (problem == expectedProblem) - (Left VampireTargetMismatch) - ) - validateVampireProblemEnvironment prepared initial - -validateVampireProblemEnvironment - :: Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId - -> CandidateProofState - -> ExceptT DeclarationError IO CandidateProofState -validateVampireProblemEnvironment prepared initial = do - let problem = Provers.preparedTypedProverLogicalProblem prepared - builder = candidateProofBuilder initial - closure = candidateProofObjectClosure initial - Except.liftEither do - traverse_ - (\(identity, reportedType) -> - unless - (lookupCheckedObjectType identity closure - == Just reportedType) - (Left (VampireGlobalTypeMismatch identity))) - (Map.toList (Backend.typedProblemGlobalTypes problem)) - traverse_ - (validateFoundationAuxiliary builder) - (Backend.typedProblemAuxiliaries problem) - execCandidateProof initial do - traverse_ - validatePremise - (Backend.typedProblemGlobalPremises problem) - where - validatePremise selected = do - let fingerprint = Backend.typedBackendFactReference selected - proposition <- consumeAuthorizedFact fingerprint - state <- CandidateProof State.get - unless - ( Backend.supportedPropositionTerm - (Backend.typedBackendFactProposition selected) - == frozenCoreTerm - (checkedPropositionTerm proposition) - ) - (failCandidateProof - (VampirePremiseMismatch fingerprint)) - let closure = - candidateProofObjectClosure state - supported <- - either - (const - (failCandidateProof - (VampirePremiseCapabilityMismatch - fingerprint))) - pure - (Backend.supportedProposition - Vector.empty - (embedClosedCore - [] - (checkedPropositionTerm proposition))) - capability <- - either - (const - (failCandidateProof - (VampirePremiseCapabilityMismatch - fingerprint))) - pure - (Backend.classifySupportedProposition - (`lookupCheckedObjectType` closure) - supported) - unless - (capability - == Backend.typedBackendFactCapability selected) - (failCandidateProof - (VampirePremiseCapabilityMismatch fingerprint)) - - validateFoundationAuxiliary builder auxiliary = do - let tag = Backend.typedProblemAuxiliaryTag auxiliary - actual = - Backend.supportedPropositionTerm - (Backend.typedProblemAuxiliaryProposition auxiliary) - expectedTerm = - frozenCoreTerm - (mapFrozenGlobals - absurd - (foundationAxiomFrozen - (logicalBuilderFoundation builder) - tag)) - unless (actual == expectedTerm) - (Left (VampireFoundationMismatch tag)) - -execCandidateProof - :: CandidateProofState - -> CandidateProof value - -> ExceptT DeclarationError IO CandidateProofState -execCandidateProof initial action = - snd <$> State.runStateT (runCandidateProof action) initial - -failCandidateProof - :: DeclarationError - -> CandidateProof value -failCandidateProof = - CandidateProof . State.lift . Except.throwError - -data ValidationMode - = EnvironmentImportMode - | ProofValidationMode !ProofSyntaxId - | DeclarationValidationMode !DeclarationSyntaxId - -data PlannedVampireDisposition - = PlannedCachedRequest !Provers.PreparedVerificationRequest - | PlannedLiveRequest - !Provers.PreparedVerificationRequest - !Provers.VampireHandle - | PlannedSynchronousRequest !Provers.PreparedVerificationRequest - -data PlannedCandidate = PlannedCandidate - !ReservedCandidate - !FactAuthority - !DirectAuthorization - ![PlannedVampireDisposition] - -data PlannedReplayRequest - = ReplayLive - !Provers.PreparedVerificationRequest - !Provers.VampireHandle - | ReplaySynchronous !Provers.PreparedVerificationRequest - -data PlannedValidationSelection - = PlannedFreshValidation - | PlannedProofValidation - !ProofValidationKey - !ProofValidationRecord - | PlannedCompiledValidation - !DeclarationValidationKey - !DeclarationValidationRecord - --- | One completely lowered and submitted declaration. It carries no --- builder authorization or materialized certificate; all authority is --- reconstructed by the source-ordered admission cursor. -data PlannedDeclaration body = PlannedDeclaration - !(CheckedDeclaration body) - !PrefixContextId - !PrefixContextId - !DeclarationInterfaceDelta - ![AssertedObject] - ![CheckedPropositionContent] - ![NonEmpty PlannedCandidate] - !PlannedValidationSelection - -plannedDeclarationPreviousPrefix - :: PlannedDeclaration body - -> PrefixContextId -plannedDeclarationPreviousPrefix - (PlannedDeclaration _checked previous _next _delta - _objects _propositions _candidates _validation) = - previous - -plannedDeclarationNextPrefix - :: PlannedDeclaration body - -> PrefixContextId -plannedDeclarationNextPrefix - (PlannedDeclaration _checked _previous next _delta - _objects _propositions _candidates _validation) = - next - -plannedDeclarationDelta - :: PlannedDeclaration body - -> DeclarationInterfaceDelta -plannedDeclarationDelta - (PlannedDeclaration _checked _previous _next delta - _objects _propositions _candidates _validation) = - delta - -newtype PlanningIntegrityError = PlanningIntegrityError Text - deriving stock (Show) - -instance Exception.Exception PlanningIntegrityError - --- | Advance the authority-free semantic projection through one complete --- checked declaration. Validation selection and every deterministic check --- finish before the first live request is submitted. -planCheckedDeclaration - :: CheckedDeclaration body - -> LoweringDriver (Either DeclarationError (PlannedDeclaration body)) -planCheckedDeclaration checked@(CheckedDeclaration - mode objects explicitPropositions globals descriptors stages - _body) = LoweringDriver do - state@(LoweringState resolver (ProspectiveBuilder builder) validationRun) <- - State.get - prepared <- liftIO (Except.runExceptT do - closure <- - Except.liftEither - (first DeclarationObjectValidationFailed - (extendObjectClosure - (logicalBuilderObjectClosure builder) - objects)) - let reservedStages = - reservePlanningStages builder stages - plannedWithoutDisposition <- - Except.liftEither - (preparePlannedCandidates builder closure reservedStages) - let orderedCandidates = fmap (fmap fst) plannedWithoutDisposition - occurrences = - [ candidateOccurrence reserved authority - | stage <- plannedWithoutDisposition - , (PlannedCandidate reserved authority _direct _requests, - _requestValues) <- toList stage - ] - aliases = - [ semanticAlias alias - (semanticFactFingerprint - (candidateOccurrence reserved authority)) - | stage <- plannedWithoutDisposition - , (PlannedCandidate reserved authority _direct _requests, - _requestValues) <- toList stage - , alias <- candidateAliases reserved - ] - allCandidatePropositions = - candidateCheckedProposition . fst - <$> concatMap toList reservedStages - propositions = - stableUniqueBy checkedPropositionId - (explicitPropositions <> allCandidatePropositions) - objectIds = assertedObjectId <$> objects - propositionIds = checkedPropositionId <$> propositions - ownSlot = declarationSlot - (logicalBuilderOwner builder) - (localDeclarationOrdinal - (logicalBuilderNextDeclaration builder)) - traverse_ - (\proposition -> - void - (Except.liftEither - (first DeclarationPropositionValidationFailed - (validateAssertedPropositionContent - closure - (checkedPropositionId proposition) - (frozenCoreTerm - (checkedPropositionTerm proposition)))))) - propositions - (resolvedStructures, delta, next) <- - Except.liftEither - (buildCheckedDeclarationDelta - builder closure ownSlot occurrences aliases objectIds - propositionIds (reverse globals) (reverse descriptors)) - selection <- - selectPlannedValidation - validationRun mode builder objects orderedCandidates - planned <- - submitPlannedCandidates resolver selection - plannedWithoutDisposition - let nextBuilder = - appendProspectiveBuilder - closure resolvedStructures delta next planned builder - declaration = - PlannedDeclaration checked - (logicalBuilderPrefix builder) - next delta objects propositions planned selection - pure (declaration, nextBuilder)) - case prepared of - Left failure -> pure (Left failure) - Right (declaration, nextBuilder) -> do - let LoweringState currentResolver _current currentValidation = state - State.put - (LoweringState - currentResolver - (ProspectiveBuilder nextBuilder) - currentValidation) - pure (Right declaration) - -reservePlanningStages - :: BuilderState PlanningEvidence - -> [NonEmpty CheckedCandidate] - -> [NonEmpty (ReservedCandidate, CandidatePlanningSpec)] -reservePlanningStages builder = - snd . mapAccumPlanning reserveStage (logicalBuilderNextFact builder) - where - invocation = DeclarationInvocation (logicalBuilderNextInvocation builder) - reserveStage nextFact (stageIndex, specs) = - let candidates = - NonEmpty.zipWith - (\offset (CheckedCandidate spec planning) -> - ( ReservedCandidate - (logicalBuilderIdentity builder) - (logicalBuilderPrefix builder) - invocation - (CandidateStage stageIndex) - (factSlot - (logicalBuilderOwner builder) - (localFactOrdinal (nextFact + offset))) - spec - , planning - )) - (0 :| [1..]) - specs - in ( nextFact + fromIntegral (NonEmpty.length specs) - , candidates - ) - - mapAccumPlanning action initial values = - go initial (zip [0..] values) - where - go accumulator [] = (accumulator, []) - go accumulator (value : remaining) = - let (next, result) = action accumulator value - (final, results) = go next remaining - in (final, result : results) - -preparePlannedCandidates - :: BuilderState PlanningEvidence - -> CheckedObjectClosure - -> [NonEmpty (ReservedCandidate, CandidatePlanningSpec)] - -> Either - DeclarationError - [NonEmpty (PlannedCandidate, [CheckedPlannedVampireRequest])] -preparePlannedCandidates builder closure stages = - snd <$> mapAccumM prepareStage Map.empty (zip [0..] stages) - where - prepareStage earlier (stageIndex, stage) = do - (sameStage, planned) <- - mapAccumM - (prepareCandidate stageIndex earlier) - Map.empty - (zip [0..] (toList stage)) - pure (Map.union earlier sameStage, NonEmpty.fromList planned) - - prepareCandidate stageIndex earlier sameStage - (candidateIndex, (candidate, contract)) = do - let position = PlannedCandidatePosition stageIndex candidateIndex - (direct, safety, requests) <- - prepareCandidatePlanningContract - builder closure earlier position candidate contract - let authority = - candidateFactAuthority - (candidateTheoremReference builder candidate) - safety - planned = PlannedCandidate candidate authority direct [] - pure - ( Map.insert position (candidate, authority) sameStage - , (planned, requests) - ) - - mapAccumM action initial values = - go initial [] values - where - go accumulator outputs = \case - [] -> pure (accumulator, reverse outputs) - value : remaining -> do - (next, output) <- action accumulator value - go next (output : outputs) remaining - -prepareCandidatePlanningContract - :: BuilderState PlanningEvidence - -> CheckedObjectClosure - -> Map PlannedCandidatePosition (ReservedCandidate, FactAuthority) - -> PlannedCandidatePosition - -> ReservedCandidate - -> CandidatePlanningSpec - -> Either - DeclarationError - ( DirectAuthorization - , CandidateSafety - , [CheckedPlannedVampireRequest] - ) -prepareCandidatePlanningContract builder closure earlier current candidate - (CandidatePlanningSpec direct extraFacts staged requests) = do - safetyWithFacts <- - foldM (accumulatePlanningFact builder closure) - initialCandidateSafety - (stableUniqueBy id - ( extraFacts - <> concatMap requestFacts requests - )) - safetyWithStages <- - foldM consumeStage safetyWithFacts staged - let safety = case direct of - PlanningSourceAxiom -> - addCandidateEscape SourceAxiom safetyWithStages - PlanningOmitted -> - addCandidateEscape Omitted safetyWithStages - _ -> safetyWithStages - requestIds = requestIdentity <$> requests - directAuthorization = case direct of - PlanningDefinitionEquation identity -> - CheckedKernelConstruction - (CheckedDefinitionEquation identity) - PlanningSourceAxiom -> SourceAxiomAuthorization - PlanningTrustedDatatype descriptor -> - TrustedCompilation (DatatypeCompilation descriptor) - PlanningKernelConstruction descriptor -> - CheckedKernelConstruction descriptor - PlanningCheckedSourceProof -> - CheckedSourceProof requestIds - PlanningOmitted -> OmittedAuthorization - validatePlanningDirect directAuthorization safety - pure (directAuthorization, safety, requests) - where - requestFacts - (CheckedPlannedVampireRequest _location _request facts) = facts - requestIdentity - (CheckedPlannedVampireRequest _location request _facts) = - Provers.preparedVerificationRequestId request - - consumeStage safety position = do - (premise, authority) <- - maybe - (Left - (PlanningFactContractMismatch - (reservedCandidateSlot candidate))) - Right - (Map.lookup position earlier) - let PlannedCandidatePosition premiseStage _premiseIndex = position - PlannedCandidatePosition currentStage _currentIndex = current - unless (premiseStage < currentStage) - (Left - (StagedPremiseNotEarlier - (reservedCandidateSlot premise) - premiseStage - (reservedCandidateSlot candidate) - currentStage)) - first FactSafetyFailed - (accumulateFactSafety - (candidateTheoremReference builder premise) - authority - safety) - -accumulatePlanningFact - :: BuilderState PlanningEvidence - -> CheckedObjectClosure - -> CandidateSafety - -> SemanticFactOccurrenceFingerprint - -> Either DeclarationError CandidateSafety -accumulatePlanningFact builder closure safety fingerprint = do - FactEntry proposition occurrence (PlanningEvidence authority _provenance) <- - maybe - (Left (AuthorizedFactNotVisible fingerprint)) - Right - (Map.lookup fingerprint (logicalBuilderFacts builder)) - unless - ( semanticFactFingerprint occurrence == fingerprint - && semanticFactAuthority occurrence == authority - && propositionMatchesClosure closure proposition - ) - (Left (PlanningFactContractMismatch (semanticFactSlot occurrence))) - first FactSafetyFailed - (accumulateFactSafety - (theoremRef - (logicalBuilderTheory builder) - (checkedPropositionId proposition)) - authority - safety) - -validatePlanningDirect - :: DirectAuthorization - -> CandidateSafety - -> Either DeclarationError () -validatePlanningDirect direct safety = - case direct of - SourceAxiomAuthorization -> - unless - (candidateSafetyAuthority safety - == authoritySafety (singletonEscapeKind SourceAxiom)) - (Left - (ValidationCertificateFailed - (SourceAxiomSafetyMismatch - (candidateSafetyAuthority safety)))) - OmittedAuthorization -> - unless - (Omitted `elem` escapeKindsToList - (authoritySafetyEscapeKinds - (candidateSafetyAuthority safety))) - (Left - (ValidationCertificateFailed - (OmittedSafetyMissing - (candidateSafetyAuthority safety)))) - _ -> pure () - -selectPlannedValidation - :: ValidationRun - -> CheckedDeclarationMode - -> BuilderState PlanningEvidence - -> [AssertedObject] - -> [NonEmpty PlannedCandidate] - -> ExceptT DeclarationError IO PlannedValidationSelection -selectPlannedValidation validationRun mode builder objects stages = - case mode of - CheckedProofMode syntax -> - case concatMap toList stages of - [planned@(PlannedCandidate _candidate authority _direct _)] -> do - let key = proofValidationKey - (theoremId (factAuthorityTheorem authority)) - syntax - (logicalBuilderPrefix builder) - cached <- case validationRun of - FreshValidation -> pure Nothing - WarmValidation (ValidationLookup lookupProof _) -> - liftIO (lookupProof key) - traverse_ - (validateProof planned syntax) - cached - pure case cached of - Nothing -> PlannedFreshValidation - Just record -> PlannedProofValidation key record - candidates -> - Except.throwError - (CheckedProofCandidateCountMismatch - (length candidates)) - CheckedCompiledMode syntax -> do - let planned = concatMap toList stages - objectIds = assertedObjectId <$> objects - theorems = - theoremId . factAuthorityTheorem . plannedAuthority - <$> planned - key = declarationValidationKey syntax - (logicalBuilderPrefix builder) objectIds theorems - cached <- case validationRun of - FreshValidation -> pure Nothing - WarmValidation (ValidationLookup _ lookupDeclaration) -> - liftIO (lookupDeclaration key) - traverse_ - (validateCompiled planned syntax objectIds theorems) - cached - pure case cached of - Nothing -> PlannedFreshValidation - Just record -> PlannedCompiledValidation key record - where - plannedAuthority (PlannedCandidate _ authority _ _) = authority - - validateProof - (PlannedCandidate candidate authority direct _) - syntax record = - case Materialization.checkCandidateValidation - (logicalBuilderTheory builder) - (logicalBuilderPrefix builder) - (candidateCheckedProposition candidate) - authority direct - (Materialization.candidateProofValidation record syntax) of - Left failure -> - liftIO - (throwIO (CachedValidationIntegrityError failure)) - Right () -> pure () - - validateCompiled planned syntax objectIds theorems record = do - case Materialization.checkDeclarationValidationRecord - (logicalBuilderPrefix builder) - syntax objectIds theorems record of - Left failure -> - liftIO - (throwIO (CachedValidationIntegrityError failure)) - Right () -> pure () - traverse_ - (\(ordinal, - PlannedCandidate candidate authority direct _) -> - case Materialization.checkCandidateValidation - (logicalBuilderTheory builder) - (logicalBuilderPrefix builder) - (candidateCheckedProposition candidate) - authority direct - (Materialization.candidateDeclarationValidation - record syntax objectIds theorems ordinal) of - Left failure -> - liftIO - (throwIO - (CachedValidationIntegrityError failure)) - Right () -> pure ()) - (zip [0..] planned) - -submitPlannedCandidates - :: VampireResolver - -> PlannedValidationSelection - -> [NonEmpty (PlannedCandidate, [CheckedPlannedVampireRequest])] - -> ExceptT DeclarationError IO [NonEmpty PlannedCandidate] -submitPlannedCandidates resolver selection candidates - | cached = - pure (fmap (fmap cachedCandidate) candidates) - | otherwise = do - let requests = - [ request - | stage <- candidates - , (_candidate, plannedRequests) <- toList stage - , CheckedPlannedVampireRequest - _location request _facts <- plannedRequests - ] - case resolver of - VampireResolver SynchronousVampireResolution{} _observe -> - pure (fmap (fmap synchronousCandidate) candidates) - VampireResolver - (AsynchronousVampireSubmission submit) _observe -> do - handles <- case NonEmpty.nonEmpty requests of - Nothing -> pure [] - Just nonempty -> do - submitted <- liftIO (submit nonempty) - unless - (NonEmpty.length submitted == length requests) - (Except.throwError - (VampireResolverBatchSizeMismatch - (length requests) - (NonEmpty.length submitted))) - pure (toList submitted) - let (planned, remaining) = - State.runState - (traverse (traverse liveCandidate) candidates) - handles - unless (null remaining) - (Except.throwError - (VampireResolverBatchSizeMismatch - (length requests) - (length requests + length remaining))) - pure planned - where - cached = case selection of - PlannedFreshValidation -> False - PlannedProofValidation{} -> True - PlannedCompiledValidation{} -> True - - cachedCandidate - (PlannedCandidate candidate authority direct _dispositions, - requests) = - PlannedCandidate candidate authority direct - [ PlannedCachedRequest request - | CheckedPlannedVampireRequest - _location request _facts <- requests - ] - - liveCandidate - (PlannedCandidate candidate authority direct _dispositions, - requests) = do - dispositions <- traverse takeHandle requests - pure (PlannedCandidate candidate authority direct dispositions) - - synchronousCandidate - (PlannedCandidate candidate authority direct _dispositions, - requests) = - PlannedCandidate candidate authority direct - [ PlannedSynchronousRequest request - | CheckedPlannedVampireRequest - _location request _facts <- requests - ] - - takeHandle - (CheckedPlannedVampireRequest _location request _facts) = do - remaining <- State.get - case remaining of - [] -> - impossible - "validated prospective handle count became exhausted" - handle : later -> do - State.put later - pure (PlannedLiveRequest request handle) - -appendProspectiveBuilder - :: CheckedObjectClosure - -> Map SemanticStructurePhrase ResolvedStructure - -> DeclarationInterfaceDelta - -> PrefixContextId - -> [NonEmpty PlannedCandidate] - -> BuilderState PlanningEvidence - -> BuilderState PlanningEvidence -appendProspectiveBuilder closure structures delta next planned builder = - builder - { logicalBuilderPrefix = next - , logicalBuilderObjectClosure = closure - , logicalBuilderFacts = - foldl' insertPlanningFact - (logicalBuilderFacts builder) - (concatMap toList planned) - , logicalBuilderAliases = - foldl' - (\entries alias -> - Map.insert - (semanticAliasName alias) - (ImportedAliasBinding - (semanticAliasTarget alias) - (ImportedAliasOrigin - (declarationDeltaSlot delta) - (semanticAliasTarget alias))) - entries) - (logicalBuilderAliases builder) - (declarationDeltaAliases delta) - , logicalBuilderGlobals = - foldl' - (\entries binding -> - Map.insert - (semanticGlobalBindingKey binding) - (semanticGlobalBindingTarget binding) - entries) - (logicalBuilderGlobals builder) - (semanticEnvironmentBindings - (declarationDeltaEnvironment delta)) - , logicalBuilderStructures = structures - , logicalBuilderDeltas = delta : logicalBuilderDeltas builder - , logicalBuilderNextDeclaration = - logicalBuilderNextDeclaration builder + 1 - , logicalBuilderNextFact = - logicalBuilderNextFact builder - + fromIntegral (sum (fmap NonEmpty.length planned)) - , logicalBuilderNextInvocation = - logicalBuilderNextInvocation builder + 1 - } - where - insertPlanningFact entries - (PlannedCandidate candidate authority _direct _requests) = - let occurrence = candidateOccurrence candidate authority - fingerprint = semanticFactFingerprint occurrence - evidence = PlanningEvidence authority - (Just - (PlanningProvenance - (declarationDeltaSlot delta) - (reservedStageValue candidate) - (reservedCandidateSlot candidate))) - in Map.insert fingerprint - (FactEntry - (candidateCheckedProposition candidate) - occurrence - evidence) - entries - - -- Keep the constructor match private while storing exact stage provenance. - reservedStageValue - (ReservedCandidate _identity _prefix _invocation stage _slot _spec) = - stage - --- | Admit one checked declaration through the existing authoritative --- source-order cursor. The callback interprets a closed family recipe over --- freshly reserved stage slots; it is not retained in the checked value. -admitCheckedDeclaration - :: CheckedDeclaration body - -> (body -> [NonEmpty ReservedCandidate] -> Declaration ()) - -> ModuleDriver failure CommittedDeclarationBatch -admitCheckedDeclaration - (CheckedDeclaration - mode objects propositions globals structures stages body) - authorize = - snd <$> do - case mode of - CheckedProofMode syntax -> - commitProofDeclaration syntax do - reserved <- installCheckedStructure - authorize body reserved - CheckedCompiledMode syntax -> - commitCompiledDeclaration syntax do - reserved <- installCheckedStructure - authorizeCompiledDeclaration - (authorize body reserved) - where - installCheckedStructure = do - traverse_ addDeclarationObject objects - traverse_ addDeclarationProposition propositions - traverse_ - (\binding -> - stageSemanticGlobalBinding - (semanticGlobalBindingKey binding) - (semanticGlobalBindingTarget binding)) - globals - traverse_ stageSemanticStructureDescriptor structures - traverse - (reserveCandidateBatch . fmap checkedCandidateSemanticSpec) - stages - - checkedCandidateSemanticSpec - (CheckedCandidate spec _planning) = spec - --- | Admit one retained plan against the real authorized builder. The family --- callback performs the existing authority checks, but every live resolver --- result comes from the handle submitted during planning and every validation --- lookup is the inert selection retained by the plan. -admitPlannedCheckedDeclaration - :: PlannedDeclaration body - -> (body -> [NonEmpty ReservedCandidate] -> Declaration ()) - -> ModuleDriver failure CommittedDeclarationBatch -admitPlannedCheckedDeclaration planned@(PlannedDeclaration - checked previous _expectedNext _expectedDelta _objects _propositions - candidates selection) authorize = ModuleDriver do - DriverState originalResolver builder prefix originalValidation <- - State.get - unless (logicalBuilderPrefix builder == previous) - (liftIO - (throwIO - (PlanningIntegrityError - "planned declaration predecessor does not match the admitted builder"))) - liveRef <- liftIO - (newIORef - [ replay - | stage <- candidates - , PlannedCandidate _candidate _authority _direct dispositions <- - toList stage - , disposition <- dispositions - , replay <- case disposition of - PlannedCachedRequest{} -> [] - PlannedLiveRequest request handle -> - [ReplayLive request handle] - PlannedSynchronousRequest request -> - [ReplaySynchronous request] - ]) - replay <- liftIO (plannedReplayResolver originalResolver liveRef) - let validation = plannedAdmissionValidation selection - State.put (DriverState replay builder prefix validation) - batch <- runDriverStep (admitCheckedDeclaration checked authorize) - remaining <- liftIO (readIORef liveRef) - unless (null remaining) - (liftIO - (throwIO - (PlanningIntegrityError - "admission did not consume every planned live request"))) - liftIO (validateAdmittedPlan planned batch) - DriverState _replay admittedBuilder admittedPrefix _plannedValidation <- - State.get - State.put - (DriverState - originalResolver admittedBuilder admittedPrefix originalValidation) - pure batch - -plannedReplayResolver - :: VampireResolver - -> IORef [PlannedReplayRequest] - -> IO VampireResolver -plannedReplayResolver original liveRef = - pure - (vampireBatchResolverWithPreparationObserver resolve - (observeVampirePreparation original)) - where - resolve - :: forall local origin. - NonEmpty - (Provers.PreparedTypedProverTask - SemanticFactOccurrenceFingerprint - local - origin - ObjectId) - -> IO - (NonEmpty - (Either - Provers.ProverProcessError - Provers.ProverAnswer)) - resolve tasks = do - expected <- atomicModifyIORef' liveRef \remaining -> - let amount = NonEmpty.length tasks - (selected, later) = splitAt amount remaining - in (later, selected) - unless (length expected == NonEmpty.length tasks) - (throwIO - (PlanningIntegrityError - "admission requested a different number of live Vampire results")) - traverse_ validateExpected (zip (toList tasks) expected) - case expected of - ReplayLive{} : _ -> do - unless (all isLive expected) - (throwIO - (PlanningIntegrityError - "planned resolver batch mixed execution modes")) - results <- traverse awaitOne expected - maybe - (throwIO - (PlanningIntegrityError - "an admission resolver batch was unexpectedly empty")) - pure - (NonEmpty.nonEmpty results) - ReplaySynchronous{} : _ -> - resolveSynchronousVampireBatch original tasks - [] -> - throwIO - (PlanningIntegrityError - "an admission resolver batch was unexpectedly empty") - - validateExpected (task, replay) = do - let actual = Provers.preparedTypedProverRequest task - expected = replayRequest replay - unless (actual == expected) - (throwIO - (PlanningIntegrityError - "admission request differs from its planned exact request")) - - awaitOne (ReplayLive expected handle) = - Provers.awaitPreparedVampireRequest expected handle - awaitOne ReplaySynchronous{} = - impossible "validated live resolver batch changed execution mode" - - replayRequest = \case - ReplayLive request _handle -> request - ReplaySynchronous request -> request - - isLive = \case - ReplayLive{} -> True - ReplaySynchronous{} -> False - -plannedAdmissionValidation - :: PlannedValidationSelection - -> ValidationRun -plannedAdmissionValidation = \case - PlannedFreshValidation -> FreshValidation - PlannedProofValidation expected record -> - WarmValidation - (validationLookup - (\actual -> - if actual == expected - then pure (Just record) - else throwIO - (PlanningIntegrityError - "proof validation key changed during admission")) - (\_actual -> pure Nothing)) - PlannedCompiledValidation expected record -> - WarmValidation - (validationLookup - (\_actual -> pure Nothing) - (\actual -> - if actual == expected - then pure (Just record) - else throwIO - (PlanningIntegrityError - "declaration validation key changed during admission"))) - -validateAdmittedPlan - :: PlannedDeclaration body - -> CommittedDeclarationBatch - -> IO () -validateAdmittedPlan - (PlannedDeclaration _checked expectedPrevious expectedNext expectedDelta - expectedObjects expectedPropositions candidates selection) - batch = do - let expectedContracts = - [ (authority, direct) - | stage <- candidates - , PlannedCandidate _candidate authority direct _requests <- - toList stage - ] - actualCertificates = - (proofValidationRecordCertificate - <$> committedBatchProofValidations batch) - <> maybe - [] - declarationValidationRecordCertificates - (committedBatchDeclarationValidation batch) - actualContracts = - [ ( validationTarget certificate - , validationDirectAuthorization certificate - ) - | certificate <- actualCertificates - ] - validationAgrees = case selection of - PlannedFreshValidation -> True - PlannedProofValidation _ record -> - committedBatchProofValidations batch == [record] - PlannedCompiledValidation _ record -> - committedBatchDeclarationValidation batch == Just record - unless - ( committedBatchPreviousPrefix batch == expectedPrevious - && committedBatchNextPrefix batch == expectedNext - && committedBatchDelta batch == expectedDelta - && committedBatchObjects batch == expectedObjects - && fmap propositionContract (committedBatchPropositions batch) - == fmap propositionContract expectedPropositions - && actualContracts == expectedContracts - && validationAgrees - ) - (throwIO - (PlanningIntegrityError - "admitted declaration differs from its prospective contract")) - where - propositionContract proposition = - ( checkedPropositionId proposition - , checkedPropositionTerm proposition - ) - -commitProofDeclaration - :: ProofSyntaxId - -> Declaration value - -> ModuleDriver failure - (value, CommittedDeclarationBatch) -commitProofDeclaration syntax = - commitDeclaration (ProofValidationMode syntax) - -commitCompiledDeclaration - :: DeclarationSyntaxId - -> Declaration value - -> ModuleDriver failure - (value, CommittedDeclarationBatch) -commitCompiledDeclaration syntax = - commitDeclaration (DeclarationValidationMode syntax) - -commitDeclaration - :: ValidationMode - -> Declaration value - -> ModuleDriver failure - (value, CommittedDeclarationBatch) -commitDeclaration mode action = ModuleDriver do - DriverState resolver builder pendingPrefix validationRun <- - State.get - let - declaration = - initialDeclarationState - resolver - validationRun - mode - builder - result <- - liftIO - (Except.runExceptT - (State.runStateT - (runDeclaration action) - declaration)) - case result of - Left err -> - Except.throwError (DriverDeclarationFailed err) - Right (value, prepared) -> - case appendDeclaration mode prepared of - Left err -> - Except.throwError (DriverDeclarationFailed err) - Right (builder', batch) -> - let prefix' = appendPendingBatch batch pendingPrefix - in do - State.put - (DriverState - resolver - builder' - prefix' - validationRun) - pure (value, batch) - -initialDeclarationState - :: VampireResolver - -> ValidationRun - -> ValidationMode - -> LogicalBuilder - -> DeclarationState -initialDeclarationState resolver validationRun validationMode builder = - DeclarationState - { declarationVampireResolver = resolver - , declarationValidationRun = validationRun - , declarationValidationMode = validationMode - , declarationValidationSelection = - DeclarationValidationUnselected - , declarationBuilder = builder - , declarationOwnSlot = - declarationSlot - (logicalBuilderOwner builder) - (localDeclarationOrdinal - (logicalBuilderNextDeclaration builder)) - , declarationInvocation = - DeclarationInvocation - (logicalBuilderNextInvocation builder) - , declarationObjectsReversed = [] - , declarationObjectClosure = Nothing - , declarationPropositionsReversed = [] - , declarationGlobalBindingsReversed = [] - , declarationStructureDescriptorsReversed = [] - , declarationReservations = Map.empty - , declarationPending = Map.empty - , declarationNextFact = logicalBuilderNextFact builder - , declarationNextStage = 0 - , declarationAuthorizationFrontier = 0 - } - -appendDeclaration - :: ValidationMode - -> DeclarationState - -> Either - DeclarationError - (LogicalBuilder, CommittedDeclarationBatch) -appendDeclaration mode declaration = do - let builder = declarationBuilder declaration - reservations = Map.elems (declarationReservations declaration) - pending = declarationPending declaration - unless - (Map.keysSet pending - == Map.keysSet (declarationReservations declaration)) - (Left DeclarationHasUnauthorizedCandidates) - unless - (declarationAuthorizationFrontier declaration - == declarationNextStage declaration) - (Left DeclarationAuthorizationFrontierIncomplete) - case mode of - DeclarationValidationMode{} -> - case declarationValidationSelection declaration of - DeclarationValidationUnselected -> - Left DeclarationValidationNotSelected - _ -> pure () - _ -> pure () - closure <- declarationClosure declaration - propositions <- validateDeclarationPropositions closure declaration - traverse_ (validatePendingAuthorization declaration) (Map.elems pending) - let orderedPending = - [ pendingCandidate - | reservation <- reservations - , let slot = reservedCandidateSlot reservation - , Just pendingCandidate <- [Map.lookup slot pending] - ] - occurrences = occurrenceFromPending <$> orderedPending - aliases = concatMap aliasesFromPending orderedPending - objectIds = - assertedObjectId - <$> reverse - (declarationObjectsReversed declaration) - propositionIds = - checkedPropositionId <$> propositions - (structures, delta, next) <- - buildCheckedDeclarationDelta - builder - closure - (declarationOwnSlot declaration) - occurrences - aliases - objectIds - propositionIds - (declarationGlobalBindingsReversed declaration) - (declarationStructureDescriptorsReversed declaration) - let previous = logicalBuilderPrefix builder - (proofValidations, declarationValidation) <- - buildValidationRecords - mode previous objectIds orderedPending - let builder' = - appendBuilderState - closure - structures - delta - next - orderedPending - builder - declaration - batch = - CommittedDeclarationBatch - (logicalBuilderOwner builder) - (declarationOwnSlot declaration) - previous - next - delta - (reverse - (declarationObjectsReversed declaration)) - propositions - proofValidations - declarationValidation - pure (builder', batch) - --- | Construct and collision-check one canonical semantic delta without --- inspecting fact evidence. This remains the admitted append path now and --- is the shared delta seam for the later prospective builder. -buildCheckedDeclarationDelta - :: BuilderState evidence - -> CheckedObjectClosure - -> DeclarationSlot - -> [SemanticFactOccurrence] - -> [SemanticAlias] - -> [ObjectId] - -> [PropositionId] - -> [SemanticGlobalBinding] - -> [SemanticStructureDescriptor] - -> Either - DeclarationError - ( Map SemanticStructurePhrase ResolvedStructure - , DeclarationInterfaceDelta - , PrefixContextId - ) -buildCheckedDeclarationDelta - builder closure slot occurrences aliases objectIds propositionIds - reversedBindings reversedDescriptors = do - let bindings = - List.sortOn - semanticGlobalBindingKey - (reverse reversedBindings) - descriptors = - List.sortOn - semanticStructureDescriptorPhrase - (reverse reversedDescriptors) - traverse_ - (\binding -> - first - (DeclarationGlobalTargetInvalid - (semanticGlobalBindingKey binding) - (semanticGlobalBindingTarget binding)) - (validateSemanticGlobalBindingTarget - (structureOperationBindings - (logicalBuilderStructures builder)) - closure binding)) - bindings - traverse_ - (\descriptor -> - let structurePhrase = semanticStructureDescriptorPhrase descriptor - in when - (Map.member structurePhrase - (logicalBuilderStructures builder)) - (Left (BuilderStructureCollision structurePhrase))) - descriptors - structures <- foldM - (insertSemanticStructure closure) - (logicalBuilderStructures builder) - descriptors - environment <- - first DeclarationEnvironmentFailed - (semanticEnvironmentWithStructures bindings descriptors) - delta <- - first DeclarationInterfaceFailed - (declarationInterfaceDelta - slot - occurrences - aliases - objectIds - propositionIds - environment) - validateBuilderCollisions builder delta - pure - ( structures - , delta - , nextPrefixContextId (logicalBuilderPrefix builder) delta - ) - -declarationClosure - :: DeclarationState - -> Either DeclarationError CheckedObjectClosure -declarationClosure declaration = - case declarationObjectClosure declaration of - Just closure -> - Right closure - Nothing -> - first DeclarationObjectValidationFailed - (extendObjectClosure - (logicalBuilderObjectClosure - (declarationBuilder declaration)) - (reverse - (declarationObjectsReversed declaration))) - -prepareDeclarationClosure - :: DeclarationState - -> Either DeclarationError DeclarationState -prepareDeclarationClosure declaration = do - closure <- declarationClosure declaration - pure declaration{declarationObjectClosure = Just closure} - -validateDeclarationPropositions - :: CheckedObjectClosure - -> DeclarationState - -> Either DeclarationError [CheckedPropositionContent] -validateDeclarationPropositions closure declaration = do - let explicit = - reverse - (declarationPropositionsReversed declaration) - reserved = - candidateCheckedProposition - <$> Map.elems - (declarationReservations declaration) - propositions = stableUniqueBy checkedPropositionId (explicit <> reserved) - traverse_ - (\proposition -> - void - (first DeclarationPropositionValidationFailed - (validateAssertedPropositionContent - closure - (checkedPropositionId proposition) - (frozenCoreTerm - (checkedPropositionTerm proposition))))) - propositions - pure propositions - -validatePendingAuthorization - :: DeclarationState - -> PendingCandidate - -> Either DeclarationError () -validatePendingAuthorization declaration - (PendingCandidate candidate certificate authorization) = do - validateReservedCandidate declaration candidate - let builder = declarationBuilder declaration - PendingFactAuthorization - identity prefix invocation slot authority stage = - authorization - unless - ( identity == logicalBuilderIdentity builder - && prefix == logicalBuilderPrefix builder - && invocation == declarationInvocation declaration - && slot == reservedCandidateSlot candidate - && authority == validationTarget certificate - && stage == reservedStage candidate - ) - (Left PendingFactAuthorizationMismatch) - -occurrenceFromPending - :: PendingCandidate - -> SemanticFactOccurrence -occurrenceFromPending - (PendingCandidate candidate certificate _authorization) = - candidateOccurrence candidate (validationTarget certificate) - -aliasesFromPending :: PendingCandidate -> [SemanticAlias] -aliasesFromPending pending@(PendingCandidate - candidate _certificate _authorization) = - let occurrence = occurrenceFromPending pending - fingerprint = semanticFactFingerprint occurrence - in (`semanticAlias` fingerprint) <$> candidateAliases candidate - -buildValidationRecords - :: ValidationMode - -> PrefixContextId - -> [ObjectId] - -> [PendingCandidate] - -> Either - DeclarationError - ([ProofValidationRecord], Maybe DeclarationValidationRecord) -buildValidationRecords mode prefix objects pending = - case mode of - EnvironmentImportMode -> - impossible - "environment import produced declaration validation records" - ProofValidationMode syntax -> - case pending of - [PendingCandidate _ certificate _] -> - let authority = validationTarget certificate - key = - proofValidationKey - (theoremId - (factAuthorityTheorem authority)) - syntax - prefix - in Right - ( [proofValidationRecord key certificate] - , Nothing - ) - _ -> - Left ProofDeclarationMustProduceOneFact - DeclarationValidationMode syntax -> - let certificates = - [ certificate - | PendingCandidate _ certificate _ <- pending - ] - theorems = - theoremId - . factAuthorityTheorem - . validationTarget - <$> certificates - key = - declarationValidationKey - syntax prefix objects theorems - in Right - ( [] - , Just - (declarationValidationRecord - key certificates) - ) - -validateBuilderCollisions - :: BuilderState evidence - -> DeclarationInterfaceDelta - -> Either DeclarationError () -validateBuilderCollisions builder delta = do - traverse_ - (\occurrence -> - when - (Map.member - (semanticFactFingerprint occurrence) - (logicalBuilderFacts builder)) - (Left - (BuilderFactCollision - (semanticFactFingerprint occurrence)))) - (declarationDeltaFacts delta) - traverse_ - (\alias -> - when - (Map.member - (semanticAliasName alias) - (logicalBuilderAliases builder)) - (Left - (BuilderAliasCollision - (semanticAliasName alias)))) - (declarationDeltaAliases delta) - traverse_ - (\identity -> - when - (identity - `Set.member` checkedObjectIds - (logicalBuilderObjectClosure builder)) - (Left (BuilderObjectCollision identity))) - (declarationDeltaObjects delta) - traverse_ - (\binding -> - case Map.lookup - (semanticGlobalBindingKey binding) - (logicalBuilderGlobals builder) of - Nothing -> pure () - Just existing -> - Left - (BuilderGlobalCollision - (semanticGlobalBindingKey binding) - existing)) - (semanticEnvironmentBindings - (declarationDeltaEnvironment delta)) - -appendBuilderState - :: CheckedObjectClosure - -> Map SemanticStructurePhrase ResolvedStructure - -> DeclarationInterfaceDelta - -> PrefixContextId - -> [PendingCandidate] - -> LogicalBuilder - -> DeclarationState - -> LogicalBuilder -appendBuilderState closure structures delta next pending builder declaration = - builder - { logicalBuilderPrefix = next - , logicalBuilderObjectClosure = closure - , logicalBuilderFacts = - foldl' - (insertAuthorizedFact builder) - (logicalBuilderFacts builder) - pending - , logicalBuilderAliases = - foldl' - (\entries alias -> - Map.insert - (semanticAliasName alias) - (ImportedAliasBinding - (semanticAliasTarget alias) - (ImportedAliasOrigin - (declarationDeltaSlot delta) - (semanticAliasTarget alias))) - entries) - (logicalBuilderAliases builder) - (declarationDeltaAliases delta) - , logicalBuilderGlobals = - foldl' - (\entries binding -> - Map.insert - (semanticGlobalBindingKey binding) - (semanticGlobalBindingTarget binding) - entries) - (logicalBuilderGlobals builder) - (semanticEnvironmentBindings - (declarationDeltaEnvironment delta)) - , logicalBuilderStructures = structures - , logicalBuilderDeltas = - delta : logicalBuilderDeltas builder - , logicalBuilderNextDeclaration = - logicalBuilderNextDeclaration builder + 1 - , logicalBuilderNextFact = - declarationNextFact declaration - , logicalBuilderNextInvocation = - logicalBuilderNextInvocation builder + 1 - } - -insertAuthorizedFact - :: LogicalBuilder - -> Map - SemanticFactOccurrenceFingerprint - (FactEntry BuilderFactAuthorization) - -> PendingCandidate - -> Map - SemanticFactOccurrenceFingerprint - (FactEntry BuilderFactAuthorization) -insertAuthorizedFact builder entries pending@(PendingCandidate - candidate certificate _pendingAuthorization) = - let occurrence = occurrenceFromPending pending - fingerprint = semanticFactFingerprint occurrence - authority = validationTarget certificate - authorization = - BuilderFactAuthorization - (logicalBuilderIdentity builder) - (reservedCandidateSlot candidate) - authority - in Map.insert - fingerprint - (FactEntry - (candidateCheckedProposition candidate) - occurrence - authorization) - entries - -stableUniqueBy :: Ord key => (value -> key) -> [value] -> [value] -stableUniqueBy key = - reverse . snd - . foldl' - (\(seen, values) value -> - let identity = key value - in if identity `Set.member` seen - then (seen, values) - else - ( Set.insert identity seen - , value : values - )) - (Set.empty, []) - - -data DeclarationError - = CandidateOutsideDeclaration !FactSlot - | CandidateAlreadyAuthorized !FactSlot - | CandidateOutsideAuthorizationFrontier - !FactSlot !Natural !Natural - | DeclarationHasUnauthorizedCandidates - | DeclarationAuthorizationFrontierIncomplete - | CandidatePropositionNotClosed - | CandidatePropositionNotProposition !CoreType - | StagedPremiseNotEarlier - !FactSlot !Natural !FactSlot !Natural - | StagedPremiseNotAuthorized !FactSlot - | AuthorizedFactNotVisible - !SemanticFactOccurrenceFingerprint - | BuilderFactAuthorizationMismatch - | PendingFactAuthorizationMismatch - | PlanningFactContractMismatch !FactSlot - | CheckedAuthorizationCandidateShapeMismatch !Int !Int - | CheckedProofCandidateCountMismatch !Int - | LocalClaimOutsideCandidate - | FactSafetyFailed !FactSafetyError - | ValidationCertificateFailed !ValidationCertificateError - | DerivationImportFailed !DerivationImportError - | KernelCompletionFailed !KernelReplayError - | KernelConstructionDescriptorMismatch - | DefinitionEquationObjectMissing !ObjectId - | DefinitionEquationObjectNotTransparent !ObjectId - | DefinitionEquationObjectNotPointwisePredicate !ObjectId - | DefinitionEquationCandidateMismatch - | DatatypeCompilationDescriptorMismatch - | ProofObligationFailedAt !Location !DeclarationError - | VampireProcessFailed !Provers.ProverProcessError - | VampireObligationRejected !Provers.ProverAnswer - | VampireProofHasNoAcceptedObligations - | VampireCandidateBatchMismatch ![FactSlot] ![FactSlot] - | VampireCandidateBatchProofShapeMismatch !FactSlot - | VampireResolverBatchSizeMismatch !Int !Int - | OmittedProofDidNotRecordUse - | VampireRequestMismatch - | VampireTargetMismatch - | VampireLocalPremisesNotSupported - | VampireGlobalTypeMismatch !ObjectId - | VampirePremiseMismatch - !SemanticFactOccurrenceFingerprint - | VampirePremiseCapabilityMismatch - !SemanticFactOccurrenceFingerprint - | VampireFoundationMismatch !FoundationAxiomTag - | CurrentCandidateVampirePreparationFailed - !(VampireObligationPreparationError Void) - | ProofValidationOutsideProofDeclaration - | DeclarationValidationOutsideCompiledDeclaration - | DeclarationValidationAlreadySelected - | DeclarationValidationNotSelected - | DeclarationShapeChangedAfterValidationLookup - | CachedDeclarationCandidateMissing !FactSlot - | ImportedModuleNotDirect !SemanticInterfaceId - | ImportedFactMaterializationFailed - !Materialization.MaterializationError - | ImportedFactCollision - !SemanticFactOccurrenceFingerprint - | ImportedAliasCollision - !SemanticName !ImportedAliasOrigin !ImportedAliasOrigin - | ImportedAliasTargetMissing - !SemanticFactOccurrenceFingerprint - | ImportedGlobalCollision - !SemanticGlobalKey !SemanticGlobalTarget !SemanticGlobalTarget - | ImportedGlobalTargetInvalid - !SemanticGlobalKey - !SemanticGlobalTarget - !SemanticGlobalTargetError - | ImportedStructureCollision - !SemanticStructurePhrase - !SemanticStructureDescriptor - !SemanticStructureDescriptor - | SemanticStructureParentMissing - !SemanticStructurePhrase !SemanticStructurePhrase - | SemanticStructureOperationConflict - !StructSymbol !SemanticStructurePhrase !SemanticStructurePhrase - | SemanticStructurePredicateTargetInvalid - !SemanticStructurePhrase !ObjectId !(Maybe CoreType) !CoreType - | SemanticStructureOperationTargetInvalid - !SemanticStructurePhrase !StructSymbol !ObjectId !(Maybe CoreType) !CoreType - | ImportedEvidenceDirectMismatch - ![SemanticInterfaceId] ![SemanticInterfaceId] - | ImportedEvidenceInterfaceFailed !SemanticInterfaceError - | ImportedEvidenceObjectMissing !ObjectId - | ImportedEvidencePropositionMissing !PropositionId - | ImportedModuleAfterAuthorization - | DeclarationObjectAddedAfterAuthorization - | DeclarationObjectValidationFailed !ObjectValidationError - | DeclarationPropositionValidationFailed - !PropositionValidationError - | DeclarationInterfaceFailed !DeclarationInterfaceError - | DeclarationEnvironmentFailed !SemanticEnvironmentError - | DeclarationGlobalAlreadyStaged !SemanticGlobalKey - | DeclarationStructureAlreadyStaged !SemanticStructurePhrase - | DeclarationGlobalTargetInvalid - !SemanticGlobalKey - !SemanticGlobalTarget - !SemanticGlobalTargetError - | ProofDeclarationMustProduceOneFact - | BuilderFactCollision - !SemanticFactOccurrenceFingerprint - | BuilderAliasCollision !SemanticName - | BuilderObjectCollision !ObjectId - | BuilderGlobalCollision !SemanticGlobalKey !SemanticGlobalTarget - | BuilderStructureCollision !SemanticStructurePhrase - deriving stock (Show, Eq) - -declarationErrorLocation :: DeclarationError -> Maybe Location -declarationErrorLocation = \case - ProofObligationFailedAt location _failure -> - Just location - _failure -> - Nothing - -renderDeclarationError :: DeclarationError -> Text -renderDeclarationError = \case - CandidateOutsideDeclaration slot -> - "candidate " <> shown slot <> " does not belong to this declaration" - CandidateAlreadyAuthorized slot -> - "candidate " <> shown slot <> " was authorized more than once" - CandidateOutsideAuthorizationFrontier slot expected actual -> - "candidate " <> shown slot <> " is outside authorization frontier " - <> shown expected <> " (found " <> shown actual <> ")" - DeclarationHasUnauthorizedCandidates -> - "the declaration has unauthorized candidates" - DeclarationAuthorizationFrontierIncomplete -> - "the declaration authorization frontier is incomplete" - CandidatePropositionNotClosed -> - "the candidate proposition still has open local binders" - CandidatePropositionNotProposition actual -> - "the candidate has type " <> shown actual <> " instead of Prop" - StagedPremiseNotEarlier candidate candidateOrdinal premise premiseOrdinal -> - "candidate " <> shown candidate <> " at stage " <> shown candidateOrdinal - <> " depends on non-earlier premise " <> shown premise - <> " at stage " <> shown premiseOrdinal - StagedPremiseNotAuthorized slot -> - "staged premise " <> shown slot <> " is not authorized" - AuthorizedFactNotVisible fingerprint -> - "authorized fact " <> shown fingerprint <> " is not visible" - BuilderFactAuthorizationMismatch -> - "builder fact authority does not match the checked declaration" - PendingFactAuthorizationMismatch -> - "pending fact authority does not match the checked declaration" - PlanningFactContractMismatch slot -> - "checked declaration-stage fact " <> shown slot - <> " has inconsistent semantic provenance" - CheckedAuthorizationCandidateShapeMismatch expected actual -> - "checked declaration recipe expected " <> shown expected - <> " candidate stages but received " <> shown actual - CheckedProofCandidateCountMismatch actual -> - "checked proof declaration requires exactly one candidate but received " - <> shown actual - LocalClaimOutsideCandidate -> - "proof-local claim was used outside a candidate proof" - FactSafetyFailed{} -> - "fact-safety validation failed" - ValidationCertificateFailed{} -> - "validation-certificate checking failed" - DerivationImportFailed{} -> - "kernel derivation import failed" - KernelCompletionFailed{} -> - "kernel replay failed" - KernelConstructionDescriptorMismatch -> - "kernel construction does not match its checked descriptor" - DefinitionEquationObjectMissing identity -> - "definition equation references missing object " <> shown identity - DefinitionEquationObjectNotTransparent identity -> - "definition equation references non-transparent object " <> shown identity - DefinitionEquationObjectNotPointwisePredicate identity -> - "definition equation object " <> shown identity - <> " is not a unary predicate definition" - DefinitionEquationCandidateMismatch -> - "definition equation does not match its checked object content" - DatatypeCompilationDescriptorMismatch -> - "datatype compilation does not match its complete checked family" - ProofObligationFailedAt location failure -> - locationToText location <> ": " <> renderDeclarationError failure - VampireProcessFailed{} -> - "Vampire process failed while authorizing the declaration" - VampireObligationRejected{} -> - "Vampire did not accept a declaration obligation" - VampireProofHasNoAcceptedObligations -> - "Vampire proof contains no accepted obligations" - VampireCandidateBatchMismatch expected actual -> - "Vampire candidate batch does not match the complete authorization " - <> "stage (expected " <> shown expected - <> ", found " <> shown actual <> ")" - VampireCandidateBatchProofShapeMismatch slot -> - "Vampire candidate " <> shown slot - <> " performed execution before its ready batch" - VampireResolverBatchSizeMismatch expected actual -> - "Vampire resolver returned " <> shown actual - <> " results for " <> shown expected <> " requests" - OmittedProofDidNotRecordUse -> - "omitted proof completion did not record an omission" - VampireRequestMismatch -> - "accepted Vampire run does not match the prepared request" - VampireTargetMismatch -> - "Vampire request target does not match the candidate theorem" - VampireLocalPremisesNotSupported -> - "typed Vampire requests do not yet support local premises" - VampireGlobalTypeMismatch object -> - "Vampire request has the wrong type for global object " <> shown object - VampirePremiseMismatch fingerprint -> - "Vampire request premise does not match visible fact " <> shown fingerprint - VampirePremiseCapabilityMismatch fingerprint -> - "Vampire request lacks authority for premise " <> shown fingerprint - VampireFoundationMismatch tag -> - "Vampire request has inconsistent foundation axiom " <> shown tag - CurrentCandidateVampirePreparationFailed failure -> - "the staged Vampire obligation could not be prepared: " <> shown failure - ProofValidationOutsideProofDeclaration -> - "proof validation requires a proof declaration" - DeclarationValidationOutsideCompiledDeclaration -> - "declaration validation requires a compiled declaration" - DeclarationValidationAlreadySelected -> - "compiled declaration validation was selected more than once" - DeclarationValidationNotSelected -> - "compiled declaration validation was not selected" - DeclarationShapeChangedAfterValidationLookup -> - "compiled declaration shape changed after validation lookup" - CachedDeclarationCandidateMissing slot -> - "cached declaration validation has no candidate for " <> shown slot - ImportedModuleNotDirect interface -> - "sealed semantic interface is not a direct import: " <> shown interface - ImportedFactMaterializationFailed{} -> - "imported fact failed materialization checks" - ImportedFactCollision fingerprint -> - "imported fact " <> shown fingerprint <> " is already registered" - ImportedAliasCollision alias earlier later -> - "imported semantic alias " <> shown alias - <> " conflicts between " <> shown earlier - <> " and " <> shown later - ImportedAliasTargetMissing fingerprint -> - "imported alias targets missing fact " <> shown fingerprint - ImportedGlobalCollision key earlier later -> - "imported global " <> shown key - <> " has conflicting targets " <> shown earlier - <> " and " <> shown later - ImportedGlobalTargetInvalid key target _failure -> - "imported global " <> shown key - <> " has invalid target " <> shown target - ImportedEvidenceDirectMismatch expected actual -> - "imported semantic parents differ: expected " <> shown expected - <> ", found " <> shown actual - ImportedStructureCollision structurePhrase _existing _incoming -> - "structure " <> shown structurePhrase <> " has conflicting descriptors" - SemanticStructureParentMissing structurePhrase parent -> - "structure " <> shown structurePhrase <> " has unknown parent " <> shown parent - SemanticStructureOperationConflict symbol firstOrigin secondOrigin -> - "structure operation " <> shown symbol <> " conflicts between " - <> shown firstOrigin <> " and " <> shown secondOrigin - SemanticStructurePredicateTargetInvalid structurePhrase object _actual expected -> - "structure " <> shown structurePhrase <> " has invalid predicate object " - <> shown object <> " (expected " <> shown expected <> ")" - SemanticStructureOperationTargetInvalid structurePhrase symbol object _actual expected -> - "structure " <> shown structurePhrase <> " has invalid operation " - <> shown symbol <> " object " <> shown object - <> " (expected " <> shown expected <> ")" - ImportedEvidenceInterfaceFailed{} -> - "imported semantic interface failed validation" - ImportedEvidenceObjectMissing identity -> - "imported semantic interface is missing object " <> shown identity - ImportedEvidencePropositionMissing identity -> - "imported semantic interface is missing proposition " <> shown identity - ImportedModuleAfterAuthorization -> - "a sealed module was imported after candidate authorization" - DeclarationObjectAddedAfterAuthorization -> - "the declaration added an object after candidate authorization" - DeclarationObjectValidationFailed{} -> - "declaration object validation failed" - DeclarationPropositionValidationFailed{} -> - "declaration proposition validation failed" - DeclarationInterfaceFailed{} -> - "declaration interface validation failed" - DeclarationEnvironmentFailed{} -> - "declaration environment delta is inconsistent" - DeclarationGlobalAlreadyStaged key -> - "global " <> shown key <> " was staged more than once" - DeclarationStructureAlreadyStaged structurePhrase -> - "structure " <> shown structurePhrase <> " was staged more than once" - DeclarationGlobalTargetInvalid key target _failure -> - "global " <> shown key <> " has invalid target " <> shown target - ProofDeclarationMustProduceOneFact -> - "a proof declaration must produce exactly one fact" - BuilderFactCollision fingerprint -> - "fact " <> shown fingerprint <> " is already registered" - BuilderAliasCollision alias -> - "semantic alias " <> shown alias <> " is already registered" - BuilderObjectCollision object -> - "object " <> shown object <> " is already registered" - BuilderGlobalCollision key object -> - "global " <> shown key <> " is already bound to " <> shown object - BuilderStructureCollision structurePhrase -> - "structure " <> shown structurePhrase <> " is already registered" - where - shown :: Show value => value -> Text - shown = Text.pack . show |
