Backtracking fixed
This commit is contained in:
parent
a85169dced
commit
fd16c4cedc
18 changed files with 213 additions and 39 deletions
|
@ -14,6 +14,8 @@ import prolog.ast.terms.Atom
|
|||
import prolog.ast.terms.Structure
|
||||
import prolog.ast.terms.Variable
|
||||
import prolog.ast.Database.Program
|
||||
import prolog.ast.arithmetic.Integer
|
||||
import prolog.ast.terms.AnonymousVariable
|
||||
|
||||
class EvaluationTests {
|
||||
@BeforeEach
|
||||
|
@ -108,8 +110,8 @@ class EvaluationTests {
|
|||
val variable2 = Variable("Y")
|
||||
|
||||
val parent = Rule(
|
||||
Structure(Atom("parent"), listOf(variable1, variable2)),
|
||||
/* :- */ Disjunction(
|
||||
Structure(Atom("parent"), listOf(variable1, variable2)), /* :- */
|
||||
Disjunction(
|
||||
Structure(Atom("father"), listOf(variable1, variable2)),
|
||||
/* ; */
|
||||
Structure(Atom("mother"), listOf(variable1, variable2))
|
||||
|
@ -118,10 +120,14 @@ class EvaluationTests {
|
|||
|
||||
Program.load(listOf(father, mother, parent))
|
||||
|
||||
val result1 = Program.query(Structure(Atom("parent"), listOf(Atom("john"), Atom("jimmy"))))
|
||||
assertTrue(result1.toList().isNotEmpty())
|
||||
val result2 = Program.query(Structure(Atom("parent"), listOf(Atom("jane"), Atom("jimmy"))))
|
||||
assertTrue(result2.toList().isNotEmpty())
|
||||
val result1 = Program.query(Structure(Atom("parent"), listOf(Atom("john"), Atom("jimmy")))).toList()
|
||||
assertEquals(1, result1.size, "Expected 1 result")
|
||||
assertTrue(result1[0].isSuccess, "Expected success")
|
||||
assertTrue(result1[0].getOrNull()!!.isEmpty(), "Expected no substitutions")
|
||||
val result2 = Program.query(Structure(Atom("parent"), listOf(Atom("jane"), Atom("jimmy")))).toList()
|
||||
assertEquals(1, result2.size, "Expected 1 result")
|
||||
assertTrue(result2[0].isSuccess, "Expected success")
|
||||
assertTrue(result2[0].getOrNull()!!.isEmpty(), "Expected no substitutions")
|
||||
|
||||
val result3 = Program.query(Structure(Atom("parent"), listOf(Atom("john"), Atom("jane"))))
|
||||
assertFalse(result3.any())
|
||||
|
@ -414,4 +420,63 @@ class EvaluationTests {
|
|||
assertEquals(Atom("bob"), subs5[Variable("Person")], "Expected bob")
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `leq Peano`() {
|
||||
val fact = Fact(Structure(Atom("leq"), listOf(Integer(0), AnonymousVariable.create())))
|
||||
val rule = Rule(
|
||||
Structure(
|
||||
Atom("leq"),
|
||||
listOf(Structure(Atom("s"), listOf(Variable("X"))), Structure(Atom("s"), listOf(Variable("Y"))))
|
||||
),
|
||||
Structure(Atom("leq"), listOf(Variable("X"), Variable("Y"))),
|
||||
)
|
||||
|
||||
Program.db.load(listOf(fact, rule))
|
||||
|
||||
val result1 = Program.query(Structure(Atom("leq"), listOf(Variable("X"), Integer(0)))).toList()
|
||||
|
||||
assertEquals(1, result1.size, "Expected 1 result")
|
||||
assertTrue(result1[0].isSuccess, "Expected success")
|
||||
val subs = result1[0].getOrNull()!!
|
||||
assertEquals(1, subs.size, "Expected 1 substitution")
|
||||
assertEquals(Integer(0), subs[Variable("X")], "Expected X to be 0")
|
||||
|
||||
val result2 =
|
||||
Program.query(Structure(Atom("leq"), listOf(Variable("X"), Structure(Atom("s"), listOf(Integer(0))))))
|
||||
.toList()
|
||||
|
||||
assertEquals(2, result2.size, "Expected 2 results")
|
||||
|
||||
assertTrue(result2[0].isSuccess, "Expected success")
|
||||
val subs2a = result2[0].getOrNull()!!
|
||||
assertEquals(1, subs2a.size, "Expected 1 substitution")
|
||||
assertEquals(Integer(0), subs2a[Variable("X")], "Expected X to be 0")
|
||||
|
||||
assertTrue(result2[1].isSuccess, "Expected success")
|
||||
val subs2b = result2[1].getOrNull()!!
|
||||
assertEquals(1, subs2b.size, "Expected 1 substitution")
|
||||
assertEquals(Structure(Atom("s"), listOf(Integer(0))), subs2b[Variable("X")], "Expected X to be s(0)")
|
||||
|
||||
val result3 = Program.query(
|
||||
Structure(
|
||||
Atom("leq"),
|
||||
listOf(Variable("X"), Structure(Atom("s"), listOf(Structure(Atom("s"), listOf(Integer(0))))))
|
||||
)
|
||||
).toList()
|
||||
|
||||
assertEquals(3, result3.size, "Expected 3 results")
|
||||
assertTrue(result3[0].isSuccess, "Expected success")
|
||||
val subs3a = result3[0].getOrNull()!!
|
||||
assertEquals(1, subs3a.size, "Expected 1 substitution")
|
||||
assertEquals(Integer(0), subs3a[Variable("X")], "Expected X to be 0")
|
||||
assertTrue(result3[1].isSuccess, "Expected success")
|
||||
val subs3b = result3[1].getOrNull()!!
|
||||
assertEquals(1, subs3b.size, "Expected 1 substitution")
|
||||
assertEquals(Structure(Atom("s"), listOf(Integer(0))), subs3b[Variable("X")], "Expected X to be s(0)")
|
||||
assertTrue(result3[2].isSuccess, "Expected success")
|
||||
val subs3c = result3[2].getOrNull()!!
|
||||
assertEquals(1, subs3c.size, "Expected 1 substitution")
|
||||
assertEquals(Structure(Atom("s"), listOf(Structure(Atom("s"), listOf(Integer(0))))), subs3c[Variable("X")], "Expected X to be s(s(0))")
|
||||
}
|
||||
}
|
||||
|
|
Reference in a new issue