summaryrefslogtreecommitdiff
path: root/source/Checking/Obligation.hs
diff options
context:
space:
mode:
Diffstat (limited to 'source/Checking/Obligation.hs')
-rw-r--r--source/Checking/Obligation.hs428
1 files changed, 0 insertions, 428 deletions
diff --git a/source/Checking/Obligation.hs b/source/Checking/Obligation.hs
deleted file mode 100644
index 22309b7..0000000
--- a/source/Checking/Obligation.hs
+++ /dev/null
@@ -1,428 +0,0 @@
-{-# LANGUAGE NoImplicitPrelude #-}
-
--- | Strict, invocation-local proof obligations emitted by the legacy checker.
-module Checking.Obligation
- ( ObligationPremiseOrigin(..)
- , PreparedPremise
- , preparedPremise
- , preparedPremiseHypothesis
- , preparedPremiseOrigin
- , PreparedObligation
- , preparedObligationOrdinal
- , preparedObligationProverTask
- , preparedObligationTask
- , ObligationMethod(..)
- , preparedObligationMethod
- , preparedObligationSelectedPremises
- , PreparedObligationBatch
- , preparedBatchMarker
- , preparedBatchLocation
- , preparedBatchPremises
- , preparedBatchObligations
- , prepareObligationBatch
- , prepareOmittedObligationBatch
- , ResolvedObligation
- , resolvedObligationPrepared
- , resolvedObligationVampireRun
- , resolvedObligationGapLocation
- , ResolvedObligationBatch
- , resolvedBatchPrepared
- , resolvedBatchObligations
- , resolveObligationWithVampire
- , resolveObligationAsGap
- , resolveObligationBatch
- , ObligationResolutionError(..)
- ) where
-
-import Base
-import Checking.Facts qualified as Facts
-import Checking.Legacy
-import Provers
-import Report.Location
-import Syntax.Internal
-
-import Control.Monad (unless)
-import Data.Vector (Vector)
-import Data.Vector qualified as Vector
-
-
-data ObligationPremiseOrigin
- = RegisteredFactPremise !Facts.FactOrigin
- | RegisteredLegacyFactPremise
- !LegacyFactRef
- !Facts.FactOrigin
- !LegacyTrustDependencies
- | LocalHypothesisPremise !Location !Marker
- deriving (Show, Eq)
-
-data PreparedPremise = PreparedPremise
- !Hypothesis
- !ObligationPremiseOrigin
- deriving (Show, Eq)
-
-preparedPremise
- :: Hypothesis
- -> ObligationPremiseOrigin
- -> PreparedPremise
-preparedPremise = PreparedPremise
-
-preparedPremiseHypothesis :: PreparedPremise -> Hypothesis
-preparedPremiseHypothesis
- (PreparedPremise hypothesis _origin) =
- hypothesis
-
-preparedPremiseOrigin
- :: PreparedPremise
- -> ObligationPremiseOrigin
-preparedPremiseOrigin
- (PreparedPremise _hypothesis origin) =
- origin
-
-
-data ObligationMethod
- = ProveWithVampire
- | RecordExplicitGap !Location
- deriving (Show, Eq)
-
-data PreparedObligation = PreparedObligation
- !LegacyObligationOrdinal
- !PreparedProverTask
- !ObligationMethod
- !(Vector PreparedPremise)
-
-preparedObligationOrdinal
- :: PreparedObligation
- -> LegacyObligationOrdinal
-preparedObligationOrdinal
- (PreparedObligation ordinal _proverTask _method _premises) =
- ordinal
-
-preparedObligationProverTask
- :: PreparedObligation
- -> PreparedProverTask
-preparedObligationProverTask
- (PreparedObligation _ordinal proverTask _method _premises) =
- proverTask
-
-preparedObligationMethod :: PreparedObligation -> ObligationMethod
-preparedObligationMethod
- (PreparedObligation _ordinal _proverTask method _premises) =
- method
-
-preparedObligationSelectedPremises
- :: PreparedObligation
- -> Vector PreparedPremise
-preparedObligationSelectedPremises
- (PreparedObligation _ordinal _proverTask _method premises) =
- premises
-
-preparedObligationTask :: PreparedObligation -> Task
-preparedObligationTask =
- preparedProverLogicalTask . preparedObligationProverTask
-
-
-data PreparedObligationBatch = PreparedObligationBatch
- !Marker
- !Location
- !(Vector PreparedPremise)
- !(Vector PreparedObligation)
-
-preparedBatchMarker :: PreparedObligationBatch -> Marker
-preparedBatchMarker
- (PreparedObligationBatch marker _location _premises _obligations) =
- marker
-
-preparedBatchLocation :: PreparedObligationBatch -> Location
-preparedBatchLocation
- (PreparedObligationBatch _marker location _premises _obligations) =
- location
-
-preparedBatchPremises
- :: PreparedObligationBatch
- -> Vector PreparedPremise
-preparedBatchPremises
- (PreparedObligationBatch _marker _location premises _obligations) =
- premises
-
-preparedBatchObligations
- :: PreparedObligationBatch
- -> Vector PreparedObligation
-preparedBatchObligations
- (PreparedObligationBatch _marker _location _premises obligations) =
- obligations
-
-
-prepareObligationBatch
- :: (Task -> Task)
- -> LegacyObligationOrdinal
- -> [PreparedPremise]
- -> Directness
- -> Marker
- -> Location
- -> [Formula]
- -> (PreparedObligationBatch, LegacyObligationOrdinal)
-prepareObligationBatch
- prepareTask
- firstOrdinal
- premises
- directness
- marker
- location
- goals =
- prepareObligationBatchWith
- ProveWithVampire
- prepareTask
- firstOrdinal
- premises
- directness
- marker
- location
- goals
-
-prepareOmittedObligationBatch
- :: (Task -> Task)
- -> LegacyObligationOrdinal
- -> [PreparedPremise]
- -> Directness
- -> Marker
- -> Location
- -> [Formula]
- -> (PreparedObligationBatch, LegacyObligationOrdinal)
-prepareOmittedObligationBatch
- prepareTask
- firstOrdinal
- premises
- directness
- marker
- location
- goals =
- prepareObligationBatchWith
- (RecordExplicitGap location)
- prepareTask
- firstOrdinal
- premises
- directness
- marker
- location
- goals
-
-prepareObligationBatchWith
- :: ObligationMethod
- -> (Task -> Task)
- -> LegacyObligationOrdinal
- -> [PreparedPremise]
- -> Directness
- -> Marker
- -> Location
- -> [Formula]
- -> (PreparedObligationBatch, LegacyObligationOrdinal)
-prepareObligationBatchWith
- method
- prepareTask
- firstOrdinal
- premises
- directness
- marker
- location
- goals =
- let (obligations, nextOrdinal) =
- prepareGoals firstOrdinal goals
- in
- ( PreparedObligationBatch
- marker
- location
- (Vector.fromList premises)
- (Vector.fromList obligations)
- , nextOrdinal
- )
- where
- hypotheses =
- preparedPremiseHypothesis <$> premises
-
- prepareGoals ordinal = \case
- [] ->
- ([], ordinal)
- goal : remainingGoals ->
- let task =
- prepareTask
- (Task
- directness
- hypotheses
- marker
- location
- goal)
- proverTask = prepareProverTask task
- obligation =
- PreparedObligation
- ordinal
- proverTask
- method
- (selectedPremises
- (taskHypotheses task)
- premises)
- nextOrdinal =
- legacyObligationOrdinal
- (legacyObligationOrdinalValue ordinal + 1)
- (remaining, finalOrdinal) =
- prepareGoals nextOrdinal remainingGoals
- in
- proverTask `seq`
- ( obligation : remaining
- , finalOrdinal
- )
-
--- Task preparation may only select existing premises. Resolution checks this
--- inventory before it can authorize a fact.
-selectedPremises
- :: [Hypothesis]
- -> [PreparedPremise]
- -> Vector PreparedPremise
-selectedPremises hypotheses premises =
- Vector.fromList (go hypotheses premises)
- where
- go [] _available =
- []
- go (hypothesis : remaining) available =
- case takeMatching hypothesis available of
- Nothing ->
- []
- Just (premise, available') ->
- premise : go remaining available'
-
- takeMatching _hypothesis [] =
- Nothing
- takeMatching hypothesis (premise : remaining)
- | preparedPremiseHypothesis premise == hypothesis =
- Just (premise, remaining)
- | otherwise = do
- (found, remaining') <-
- takeMatching hypothesis remaining
- pure (found, premise : remaining')
-
-
-data ResolvedObligation = ResolvedObligation
- !PreparedObligation
- !(Either Location AcceptedVampireRun)
-
-resolvedObligationPrepared
- :: ResolvedObligation
- -> PreparedObligation
-resolvedObligationPrepared
- (ResolvedObligation prepared _evidence) =
- prepared
-
-resolvedObligationVampireRun
- :: ResolvedObligation
- -> Maybe AcceptedVampireRun
-resolvedObligationVampireRun
- (ResolvedObligation _prepared evidence) =
- either (const Nothing) Just evidence
-
-resolvedObligationGapLocation
- :: ResolvedObligation
- -> Maybe Location
-resolvedObligationGapLocation
- (ResolvedObligation _prepared evidence) =
- either Just (const Nothing) evidence
-
-data ResolvedObligationBatch = ResolvedObligationBatch
- !PreparedObligationBatch
- !(Vector ResolvedObligation)
-
-resolvedBatchPrepared
- :: ResolvedObligationBatch
- -> PreparedObligationBatch
-resolvedBatchPrepared
- (ResolvedObligationBatch prepared _resolved) =
- prepared
-
-resolvedBatchObligations
- :: ResolvedObligationBatch
- -> Vector ResolvedObligation
-resolvedBatchObligations
- (ResolvedObligationBatch _prepared resolved) =
- resolved
-
-data ObligationResolutionError
- = VampireEvidenceForGap
- | GapEvidenceForVampire
- | VampireRequestMismatch
- | ResolvedBatchLengthMismatch !Int !Int
- | ResolvedBatchObligationMismatch !LegacyObligationOrdinal
- deriving (Show, Eq)
-
-resolveObligationWithVampire
- :: PreparedObligation
- -> AcceptedVampireRun
- -> Either ObligationResolutionError ResolvedObligation
-resolveObligationWithVampire prepared accepted =
- case preparedObligationMethod prepared of
- RecordExplicitGap{} ->
- Left VampireEvidenceForGap
- ProveWithVampire
- | acceptedVampireRequest accepted
- == preparedProverRequest
- (preparedObligationProverTask prepared) ->
- Right
- (ResolvedObligation
- prepared
- (Right accepted))
- | otherwise ->
- Left VampireRequestMismatch
-
-resolveObligationAsGap
- :: PreparedObligation
- -> Either ObligationResolutionError ResolvedObligation
-resolveObligationAsGap prepared =
- case preparedObligationMethod prepared of
- ProveWithVampire ->
- Left GapEvidenceForVampire
- RecordExplicitGap location ->
- Right
- (ResolvedObligation
- prepared
- (Left location))
-
-resolveObligationBatch
- :: PreparedObligationBatch
- -> Vector ResolvedObligation
- -> Either ObligationResolutionError ResolvedObligationBatch
-resolveObligationBatch prepared resolved
- | Vector.length expected /= Vector.length resolved =
- Left
- (ResolvedBatchLengthMismatch
- (Vector.length expected)
- (Vector.length resolved))
- | otherwise = do
- Vector.zipWithM_
- validate
- expected
- resolved
- pure (ResolvedObligationBatch prepared resolved)
- where
- expected =
- preparedBatchObligations prepared
-
- validate expectedObligation actual =
- unless
- (samePreparedObligation
- expectedObligation
- (resolvedObligationPrepared actual))
- (Left
- (ResolvedBatchObligationMismatch
- (preparedObligationOrdinal
- expectedObligation)))
-
- samePreparedObligation left right =
- preparedObligationOrdinal left
- == preparedObligationOrdinal right
- && preparedObligationMethod left
- == preparedObligationMethod right
- && preparedObligationTask left
- == preparedObligationTask right
- && preparedProverRequest
- (preparedObligationProverTask left)
- == preparedProverRequest
- (preparedObligationProverTask right)
- && preparedObligationSelectedPremises left
- == preparedObligationSelectedPremises right