RetractAll
This commit is contained in:
parent
4d334c1600
commit
1179e6a29b
4 changed files with 94 additions and 16 deletions
|
@ -1,5 +1,6 @@
|
|||
package prolog.builtins
|
||||
|
||||
import io.Logger
|
||||
import prolog.Answers
|
||||
import prolog.Substitutions
|
||||
import prolog.ast.logic.Clause
|
||||
|
@ -86,7 +87,7 @@ open class AssertZ(val clause: Clause) : Operator(Atom("assertz"), null, clause)
|
|||
*
|
||||
* @see [SWI-Prolog Predicate retract/1](https://www.swi-prolog.org/pldoc/doc_for?object=retract/1)
|
||||
*/
|
||||
class Retract(val term: Term) : Operator(Atom("retract"), null, term) {
|
||||
open class Retract(val term: Term) : Operator(Atom("retract"), null, term) {
|
||||
override fun satisfy(subs: Substitutions): Answers = sequence {
|
||||
// Check that term is a structure or atom
|
||||
if (term !is Structure && term !is Atom) {
|
||||
|
@ -101,6 +102,12 @@ class Retract(val term: Term) : Operator(Atom("retract"), null, term) {
|
|||
return@sequence
|
||||
}
|
||||
|
||||
// Check if the predicate is dynamic
|
||||
if (!predicate.dynamic) {
|
||||
yield(Result.failure(Exception("No permission to modify static procedure '$functorName'")))
|
||||
return@sequence
|
||||
}
|
||||
|
||||
predicate.clauses.toList().forEach { clause ->
|
||||
unifyLazy(term, clause.head, subs).forEach { unifyResult ->
|
||||
unifyResult.fold(
|
||||
|
@ -119,3 +126,29 @@ class Retract(val term: Term) : Operator(Atom("retract"), null, term) {
|
|||
|
||||
override fun applySubstitution(subs: Substitutions): Retract = Retract(applySubstitution(term, subs))
|
||||
}
|
||||
|
||||
class RetractAll(term: Term) : Retract(term) {
|
||||
override fun satisfy(subs: Substitutions): Answers {
|
||||
// Check that term is a structure or atom
|
||||
if (term !is Structure && term !is Atom) {
|
||||
return sequenceOf(Result.failure(Exception("Cannot retract a non-structure or non-atom")))
|
||||
}
|
||||
|
||||
// If the predicate does not exist, implicitly create it
|
||||
val functor = term.functor
|
||||
val predicate = Program.db.predicates[functor]
|
||||
if (predicate == null) {
|
||||
Logger.debug("Predicate $functor not found, creating it")
|
||||
Program.db.predicates += functor to Predicate(functor, dynamic = true)
|
||||
}
|
||||
|
||||
// Propagate errors from the super class
|
||||
super.satisfy(subs).forEach {
|
||||
if (it.isFailure) {
|
||||
return sequenceOf(it)
|
||||
}
|
||||
}
|
||||
|
||||
return sequenceOf(Result.success(emptyMap()))
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue