summaryrefslogtreecommitdiff
path: root/source/Checking/FinalPrelude.hs
diff options
context:
space:
mode:
Diffstat (limited to 'source/Checking/FinalPrelude.hs')
-rw-r--r--source/Checking/FinalPrelude.hs170
1 files changed, 146 insertions, 24 deletions
diff --git a/source/Checking/FinalPrelude.hs b/source/Checking/FinalPrelude.hs
index 1e05199..ac2a941 100644
--- a/source/Checking/FinalPrelude.hs
+++ b/source/Checking/FinalPrelude.hs
@@ -9,12 +9,15 @@ module Checking.FinalPrelude
, finalPreludeSemantic
, finalPreludePrefix
, finalPreludeObjects
+ , PreludePublicRole(..)
+ , expectedFinalPreludePublicRoles
, FinalPreludeRoleTarget(..)
, finalPreludePublicRole
, FinalPreludeValidationError(..)
, FinalPreludeFailure(..)
, FinalPreludeBuildResult(..)
, buildFinalPreludeCandidate
+ , buildParsedFinalPreludeCandidate
) where
import Base hiding (Empty)
@@ -28,17 +31,19 @@ import Checking.Identity
import Checking.Semantic
import Checking.Semantic qualified as Semantic
import Felix.Module
-import Felix.Migration qualified as Migration
import Felix.Parse
import Felix.Prelude qualified as Prelude
import Felix.Source (ImportRef)
import Report.Location
import Syntax.Abstract qualified as Raw
import Syntax.Interface
+import Syntax.Lexicon qualified as Lexicon
import Control.Monad (unless)
+import Data.Bifunctor (first)
import Data.List qualified as List
import Data.Map.Strict qualified as Map
+import Data.Set qualified as Set
data FinalPreludeCandidate = FinalPreludeCandidate
@@ -47,7 +52,7 @@ data FinalPreludeCandidate = FinalPreludeCandidate
!SemanticInterface
!Declaration.PendingModulePrefix
!CheckedObjectClosure
- !(Map.Map Migration.PreludePublicRole FinalPreludeRoleTarget)
+ !(Map.Map PreludePublicRole FinalPreludeRoleTarget)
finalPreludeParsed
:: FinalPreludeCandidate
@@ -94,9 +99,23 @@ data FinalPreludeRoleTarget
| FinalPreludeTheoremRole !TheoremRef
deriving stock (Show, Eq, Ord)
+-- | Stable public roles exported by the packaged final prelude.
+data PreludePublicRole
+ = PreludeInfinityTheorem
+ | PreludeOmegaObject
+ | PreludeOmegaDefiningEquation
+ | PreludeNaturalsAlias
+ | PreludeNaturalsInductiveTheorem
+ | PreludeNaturalsMinimalTheorem
+ deriving stock (Show, Eq, Ord, Enum, Bounded)
+
+expectedFinalPreludePublicRoles :: Set PreludePublicRole
+expectedFinalPreludePublicRoles =
+ Set.fromList [minBound .. maxBound]
+
finalPreludePublicRole
:: FinalPreludeCandidate
- -> Migration.PreludePublicRole
+ -> PreludePublicRole
-> Maybe FinalPreludeRoleTarget
finalPreludePublicRole
(FinalPreludeCandidate _parsed _syntax _semantic _prefix _objects
@@ -115,7 +134,8 @@ data FinalPreludeValidationError
| FinalPreludeFactContentMismatch !Text
| FinalPreludeValidationInventoryMismatch !DeclarationSlot
| FinalPreludeAuthorityMismatch !DeclarationSlot
- | FinalPreludePublicRoleMismatch !Migration.PreludePublicRole
+ | FinalPreludeBaseStructureMismatch
+ | FinalPreludePublicRoleMismatch !PreludePublicRole
deriving stock (Show, Eq)
data FinalPreludeFailure
@@ -157,7 +177,9 @@ buildFinalPreludeCandidate foundation resolver =
buildParsedFinalPreludeCandidate
foundation parsed resolver
--- The packaged loader above is the only entry to final-candidate construction.
+-- The production acquisition path establishes packaged provenance before
+-- passing its already parsed source here. The explicit parsed seam avoids a
+-- second load and parse on a cache miss.
buildParsedFinalPreludeCandidate
:: CheckedFoundation
-> Prelude.ReservedParsedPrelude
@@ -225,7 +247,7 @@ buildParsedFinalPreludeCandidate foundation parsed resolver =
[]
compileBlocks _blockIndex [] =
- pure ()
+ commitBaseStructure
compileBlocks blockIndex (block : remaining) =
case block of
Raw.BlockClaim{} ->
@@ -249,6 +271,39 @@ buildParsedFinalPreludeCandidate foundation parsed resolver =
Declaration.failModuleDriver
(FinalPreludeUnsupportedBlock (locate block))
+ commitBaseStructure = do
+ slot <- Declaration.nextDeclarationSlotDriver
+ theory <- Declaration.currentTheoryDriver
+ let seed =
+ opaqueDeclarationSeed
+ (declarationSlotModule slot)
+ (declarationSlotOrdinal slot)
+ StructureDeclaration
+ (generatedObjectSlot 0)
+ coreType = TyArrow TySet TySet
+ content = OpaqueObjectContent theory seed coreType
+ identity = opaqueObjectId theory seed coreType
+ asserted = assertedObject identity content
+ structurePhrase =
+ semanticStructurePhrase Lexicon._Onesorted
+ operation =
+ semanticStructureOperation Raw.CarrierSymbol identity
+ descriptor <-
+ either
+ (Declaration.failModuleDriver
+ . FinalPreludeDeclarationFailed
+ . Declaration.DeclarationEnvironmentFailed)
+ pure
+ (semanticStructureDescriptor
+ structurePhrase Nothing [] [operation])
+ void
+ (Declaration.commitCompiledDeclaration
+ (declarationSyntaxId
+ "felix-final-prelude-base-structure-v1") do
+ Declaration.addDeclarationObject asserted
+ Declaration.stageSemanticStructureDescriptor descriptor
+ Declaration.authorizeCompiledDeclaration (pure ()))
+
compileBinding blockIndex block = do
prepared <-
Exact.prepareExactDeclaration
@@ -312,10 +367,12 @@ validateFinalPrelude
-> CheckedObjectClosure
-> Either
FinalPreludeValidationError
- (Map.Map Migration.PreludePublicRole FinalPreludeRoleTarget)
+ (Map.Map PreludePublicRole FinalPreludeRoleTarget)
validateFinalPrelude foundation parsed semantic prefix objects = do
- declarations <- associatePreludeDeclarations parsed prefix
- validateConfinedAuthority foundation semantic objects declarations
+ (declarations, baseStructure) <-
+ associatePreludeDeclarations parsed prefix
+ validateConfinedAuthority
+ foundation semantic objects declarations baseStructure
resolveAndValidatePublicRoles foundation objects declarations
resolveAndValidatePublicRoles
@@ -324,7 +381,7 @@ resolveAndValidatePublicRoles
-> [PreludeDeclaration]
-> Either
FinalPreludeValidationError
- (Map.Map Migration.PreludePublicRole FinalPreludeRoleTarget)
+ (Map.Map PreludePublicRole FinalPreludeRoleTarget)
resolveAndValidatePublicRoles foundation objects declarations = do
successor <-
expectDefinition
@@ -403,30 +460,30 @@ resolveAndValidatePublicRoles foundation objects declarations = do
minimalOmega
let roles = Map.fromList
- [ ( Migration.PreludeInfinityTheorem
+ [ ( PreludeInfinityTheorem
, FinalPreludeTheoremRole infinity
)
- , ( Migration.PreludeOmegaObject
+ , ( PreludeOmegaObject
, FinalPreludeObjectRole omegaId
)
- , ( Migration.PreludeOmegaDefiningEquation
+ , ( PreludeOmegaDefiningEquation
, FinalPreludeTheoremRole omegaEquation
)
- , ( Migration.PreludeNaturalsAlias
+ , ( PreludeNaturalsAlias
, FinalPreludeObjectRole omegaId
)
- , ( Migration.PreludeNaturalsInductiveTheorem
+ , ( PreludeNaturalsInductiveTheorem
, FinalPreludeTheoremRole naturalsInductive
)
- , ( Migration.PreludeNaturalsMinimalTheorem
+ , ( PreludeNaturalsMinimalTheorem
, FinalPreludeTheoremRole naturalsMinimal
)
]
unless
- (Map.keysSet roles == Migration.expectedFinalPreludePublicRoles)
+ (Map.keysSet roles == expectedFinalPreludePublicRoles)
(Left
(FinalPreludePublicRoleMismatch
- Migration.PreludeInfinityTheorem))
+ PreludeInfinityTheorem))
pure roles
validatePackagedPreludeInput
@@ -460,12 +517,19 @@ validatePackagedPreludeInput parsed syntax
associatePreludeDeclarations
:: Prelude.ReservedParsedPrelude
-> Declaration.PendingModulePrefix
- -> Either FinalPreludeValidationError [PreludeDeclaration]
+ -> Either
+ FinalPreludeValidationError
+ ([PreludeDeclaration], Declaration.CommittedDeclarationBatch)
associatePreludeDeclarations parsed prefix = do
- unless
- (length sourceDeclarations == length batches)
- (Left FinalPreludeDeclarationAssociationMismatch)
- pure (zipWith PreludeDeclaration sourceDeclarations batches)
+ case List.splitAt (length sourceDeclarations) batches of
+ (sourceBatches, [baseStructure])
+ | length sourceBatches == length sourceDeclarations ->
+ pure
+ ( zipWith PreludeDeclaration
+ sourceDeclarations sourceBatches
+ , baseStructure
+ )
+ _ -> Left FinalPreludeDeclarationAssociationMismatch
where
sourceDeclarations =
[ block
@@ -483,8 +547,10 @@ validateConfinedAuthority
-> SemanticInterface
-> CheckedObjectClosure
-> [PreludeDeclaration]
+ -> Declaration.CommittedDeclarationBatch
-> Either FinalPreludeValidationError ()
-validateConfinedAuthority foundation semantic objects declarations = do
+validateConfinedAuthority
+ foundation semantic objects declarations baseStructure = do
unless
( semanticInterfaceOwner semantic == preludeModuleName
&& null (semanticInterfaceDirectInputs semantic)
@@ -499,12 +565,68 @@ validateConfinedAuthority foundation semantic objects declarations = do
(declarationBatch declaration))
]
traverse_ (validateDeclarationAuthority foundation objects) declarations
+ validateBaseStructure foundation objects baseStructure
where
requireTransparent identity =
case lookupCheckedObjectContent identity objects of
Just TransparentObjectContent{} -> pure ()
_ -> Left (FinalPreludeUnexpectedObject identity)
+validateBaseStructure
+ :: CheckedFoundation
+ -> CheckedObjectClosure
+ -> Declaration.CommittedDeclarationBatch
+ -> Either FinalPreludeValidationError ()
+validateBaseStructure foundation objects batch = do
+ let slot = Declaration.committedBatchSlot batch
+ delta = Declaration.committedBatchDelta batch
+ environment = declarationDeltaEnvironment delta
+ structurePhrase = semanticStructurePhrase Lexicon._Onesorted
+ expectedSeed =
+ opaqueDeclarationSeed
+ (declarationSlotModule slot)
+ (declarationSlotOrdinal slot)
+ StructureDeclaration
+ (generatedObjectSlot 0)
+ expectedType = TyArrow TySet TySet
+ expectedObject = opaqueObjectId (theoryId foundation) expectedSeed expectedType
+ expectedContent =
+ OpaqueObjectContent
+ (theoryId foundation)
+ expectedSeed
+ expectedType
+ descriptor <-
+ case semanticEnvironmentStructures environment of
+ [single] -> Right single
+ _ -> Left FinalPreludeBaseStructureMismatch
+ expectedDescriptor <-
+ first (const FinalPreludeBaseStructureMismatch)
+ (semanticStructureDescriptor
+ structurePhrase
+ Nothing
+ []
+ [semanticStructureOperation Raw.CarrierSymbol expectedObject])
+ unless
+ ( declarationSlotModule slot == preludeModuleName
+ && descriptor == expectedDescriptor
+ && null (semanticEnvironmentBindings environment)
+ && declarationDeltaObjects delta == [expectedObject]
+ && null (declarationDeltaFacts delta)
+ && null (declarationDeltaAliases delta)
+ && null (declarationDeltaPropositions delta)
+ && Declaration.committedBatchObjects batch
+ == [assertedObject expectedObject expectedContent]
+ && null (Declaration.committedBatchPropositions batch)
+ && null (Declaration.committedBatchProofValidations batch)
+ && maybe
+ False
+ (null . declarationValidationRecordCertificates)
+ (Declaration.committedBatchDeclarationValidation batch)
+ && lookupCheckedObjectContent expectedObject objects
+ == Just expectedContent
+ )
+ (Left FinalPreludeBaseStructureMismatch)
+
validateDeclarationAuthority
:: CheckedFoundation
-> CheckedObjectClosure