RetractAll
This commit is contained in:
parent
4d334c1600
commit
1179e6a29b
4 changed files with 94 additions and 16 deletions
|
@ -15,6 +15,7 @@ import prolog.ast.logic.Fact
|
|||
import prolog.ast.logic.Predicate
|
||||
import prolog.ast.logic.Rule
|
||||
import prolog.ast.terms.Atom
|
||||
import prolog.ast.terms.Functor
|
||||
import prolog.ast.terms.Structure
|
||||
import prolog.ast.terms.Variable
|
||||
|
||||
|
@ -131,7 +132,7 @@ class DatabaseOperatorsTests {
|
|||
|
||||
@Test
|
||||
fun `simple retract`() {
|
||||
val predicate = Predicate(listOf(Fact(Atom("a"))))
|
||||
val predicate = Predicate(listOf(Fact(Atom("a"))), dynamic = true)
|
||||
Program.db.load(predicate)
|
||||
|
||||
assertEquals(1, Program.query(Atom("a")).count())
|
||||
|
@ -146,11 +147,13 @@ class DatabaseOperatorsTests {
|
|||
|
||||
@Test
|
||||
fun `retract atom`() {
|
||||
val predicate = Predicate(listOf(
|
||||
Fact(Atom("a")),
|
||||
Fact(Atom("a")),
|
||||
Fact(Atom("a"))
|
||||
))
|
||||
val predicate = Predicate(
|
||||
listOf(
|
||||
Fact(Atom("a")),
|
||||
Fact(Atom("a")),
|
||||
Fact(Atom("a"))
|
||||
), dynamic = true
|
||||
)
|
||||
Program.db.load(predicate)
|
||||
|
||||
val control = Program.query(Atom("a")).toList()
|
||||
|
@ -181,11 +184,13 @@ class DatabaseOperatorsTests {
|
|||
|
||||
@Test
|
||||
fun `retract compound with variable`() {
|
||||
val predicate = Predicate(listOf(
|
||||
Fact(Structure(Atom("a"), listOf(Atom("b")))),
|
||||
Fact(Structure(Atom("a"), listOf(Atom("c")))),
|
||||
Fact(Structure(Atom("a"), listOf(Atom("d"))))
|
||||
))
|
||||
val predicate = Predicate(
|
||||
listOf(
|
||||
Fact(Structure(Atom("a"), listOf(Atom("b")))),
|
||||
Fact(Structure(Atom("a"), listOf(Atom("c")))),
|
||||
Fact(Structure(Atom("a"), listOf(Atom("d"))))
|
||||
), dynamic = true
|
||||
)
|
||||
Program.db.load(predicate)
|
||||
|
||||
val control = Program.query(Structure(Atom("a"), listOf(Variable("X")))).toList()
|
||||
|
@ -289,4 +294,45 @@ class DatabaseOperatorsTests {
|
|||
assertEquals(Atom("bob"), result2[Variable("X")], "Expected bob")
|
||||
assertEquals(Atom("sushi"), result2[Variable("Y")], "Expected sushi")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `retract all`() {
|
||||
val predicate = Predicate(
|
||||
listOf(
|
||||
Fact(Structure(Atom("a"), listOf(Atom("b")))),
|
||||
Fact(Structure(Atom("a"), listOf(Atom("c")))),
|
||||
Fact(Structure(Atom("a"), listOf(Atom("d"))))
|
||||
), dynamic = true
|
||||
)
|
||||
|
||||
Program.db.load(predicate)
|
||||
|
||||
val control = Program.query(Structure(Atom("a"), listOf(Variable("X")))).toList()
|
||||
assertEquals(3, control.size, "Expected 3 results")
|
||||
assertEquals(3, Program.db.predicates["a/1"]!!.clauses.size, "Expected 3 clauses")
|
||||
|
||||
val retract = RetractAll(Structure(Atom("a"), listOf(Variable("X"))))
|
||||
val result = retract.satisfy(emptyMap()).toList()
|
||||
|
||||
assertEquals(1, result.size, "Expected 1 result")
|
||||
assertTrue(result[0].isSuccess, "Expected success")
|
||||
assertEquals(0, Program.db.predicates["a/1"]!!.clauses.size, "Expected 0 clauses")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `If Head refers to a predicate that is not defined, it is implicitly created as a dynamic predicate`() {
|
||||
val predicateName = "idonotyetexist"
|
||||
val predicateFunctor = "$predicateName/1"
|
||||
|
||||
assertFalse(predicateFunctor in Program.db.predicates, "Expected predicate to not exist before")
|
||||
|
||||
val retractAll = RetractAll(Structure(Atom(predicateName), listOf(Variable("X"))))
|
||||
val result = retractAll.satisfy(emptyMap()).toList()
|
||||
|
||||
assertEquals(1, result.size, "Expected 1 result")
|
||||
assertTrue(result[0].isSuccess, "Expected success")
|
||||
|
||||
assertTrue(predicateFunctor in Program.db.predicates, "Expected predicate to exist after")
|
||||
assertTrue(Program.db.predicates[predicateFunctor]!!.dynamic, "Expected predicate to be dynamic")
|
||||
}
|
||||
}
|
Reference in a new issue