commonMain.it.unibo.tuprolog.solve.solver.StreamsExecutionContext.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of solve-streams-jvm Show documentation
Show all versions of solve-streams-jvm Show documentation
Experimental, functional-programming-based implementation of Prolog's SLDNF resolution principle
package it.unibo.tuprolog.solve.solver
import it.unibo.tuprolog.core.Struct
import it.unibo.tuprolog.core.Substitution
import it.unibo.tuprolog.core.operators.OperatorSet
import it.unibo.tuprolog.solve.*
import it.unibo.tuprolog.solve.channel.InputChannel
import it.unibo.tuprolog.solve.channel.OutputChannel
import it.unibo.tuprolog.solve.exception.PrologWarning
import it.unibo.tuprolog.solve.library.Libraries
import it.unibo.tuprolog.theory.Theory
/**
* The execution context implementation for [StreamsSolver]
*
* @author Enrico
*/
internal data class StreamsExecutionContext(
override val libraries: Libraries = Libraries(),
override val flags: PrologFlags = emptyMap(),
override val staticKb: Theory = Theory.empty(),
override val dynamicKb: Theory = Theory.empty(),
override val operators: OperatorSet = getAllOperators(libraries, staticKb, dynamicKb).toOperatorSet(),
override val inputChannels: Map> = ExecutionContextAware.defaultInputChannels(),
override val outputChannels: Map> = ExecutionContextAware.defaultOutputChannels(),
override val substitution: Substitution.Unifier = Substitution.empty(),
/** The key strategies that a solver should use during resolution process */
val solverStrategies: SolverStrategies = SolverStrategies.prologStandard,
/** The side effects manager to be used during resolution process */
val sideEffectManager: SideEffectManagerImpl = SideEffectManagerImpl()
) : ExecutionContext {
constructor(context: ExecutionContext, newCurrentSubstitution: Substitution.Unifier) : this( // to be tested
context.libraries,
context.flags,
context.staticKb,
context.dynamicKb,
context.operators,
context.inputChannels,
context.outputChannels,
newCurrentSubstitution,
(context as? StreamsExecutionContext)?.solverStrategies ?: SolverStrategies.prologStandard,
(context as? StreamsExecutionContext)?.sideEffectManager ?: SideEffectManagerImpl()
)
override val procedure: Struct?
get() = sideEffectManager.logicalParentRequests.map { it.query }.firstOrNull()
override val prologStackTrace: List by lazy {
sideEffectManager.logicalParentRequests.asSequence().map { it.query }.toList()
}
override fun createSolver(
libraries: Libraries,
flags: PrologFlags,
staticKb: Theory,
dynamicKb: Theory,
stdIn: InputChannel,
stdOut: OutputChannel,
stdErr: OutputChannel,
warnings: OutputChannel
) = StreamsSolverFactory.solverOf(
libraries,
flags,
staticKb,
dynamicKb,
stdIn,
stdOut,
stdErr
)
override fun apply(sideEffect: SideEffect): StreamsExecutionContext {
return super.apply(sideEffect) as StreamsExecutionContext
}
override fun apply(sideEffects: Iterable): StreamsExecutionContext {
return super.apply(sideEffects) as StreamsExecutionContext
}
override fun apply(sideEffects: Sequence): StreamsExecutionContext {
return super.apply(sideEffects) as StreamsExecutionContext
}
override fun update(
libraries: Libraries,
flags: PrologFlags,
staticKb: Theory,
dynamicKb: Theory,
operators: OperatorSet,
inputChannels: PrologInputChannels<*>,
outputChannels: PrologOutputChannels<*>
): StreamsExecutionContext {
return copy(
libraries = libraries,
flags = flags,
staticKb = staticKb,
dynamicKb = dynamicKb,
operators = operators,
inputChannels = inputChannels,
outputChannels = outputChannels
)
}
}
/** Extension method to get [SideEffectManagerImpl], if this context is of right type*/
internal fun ExecutionContext.getSideEffectManager(): SideEffectManagerImpl? =
(this as? StreamsExecutionContext)?.sideEffectManager
© 2015 - 2025 Weber Informatics LLC | Privacy Policy