Checkpoint
This commit is contained in:
parent
3724ac72f9
commit
7daae860fc
8 changed files with 119 additions and 9 deletions
|
@ -15,7 +15,10 @@ import prolog.ast.terms.Structure
|
|||
import prolog.ast.terms.Variable
|
||||
import prolog.ast.Database.Program
|
||||
import prolog.ast.arithmetic.Integer
|
||||
import prolog.ast.lists.List.Empty
|
||||
import prolog.ast.lists.List.Cons
|
||||
import prolog.ast.terms.AnonymousVariable
|
||||
import prolog.builtins.Unify
|
||||
|
||||
class EvaluationTests {
|
||||
@BeforeEach
|
||||
|
@ -479,4 +482,20 @@ class EvaluationTests {
|
|||
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))")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `foo(emptyList) = foo(X)`() {
|
||||
val list = Empty
|
||||
val left = Structure(Atom("foo"), listOf(list))
|
||||
val right = Structure(Atom("foo"), listOf(Variable("X")))
|
||||
|
||||
val unific = Unify(left, right)
|
||||
val result = unific.satisfy(emptyMap()).toList()
|
||||
|
||||
assertEquals(1, result.size, "Expected 1 result")
|
||||
assertTrue(result[0].isSuccess, "Expected success")
|
||||
val subs = result[0].getOrNull()!!
|
||||
assertEquals(1, subs.size, "Expected 1 substitution")
|
||||
assertEquals(list, subs[Variable("X")], "Expected X to be list(1, 2)")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test
|
|||
import prolog.ast.lists.List.Cons
|
||||
import prolog.ast.lists.List.Empty
|
||||
import prolog.ast.terms.Atom
|
||||
import prolog.ast.terms.Variable
|
||||
|
||||
class ListOperatorsTests {
|
||||
@Test
|
||||
|
@ -42,11 +43,23 @@ class ListOperatorsTests {
|
|||
assertTrue(result[0].getOrNull()!!.isEmpty(), "Expected empty substitution map")
|
||||
}
|
||||
|
||||
@Disabled("Not required functionality")
|
||||
@Test
|
||||
fun `member should only check shallow`() {
|
||||
val list = Cons(Atom("a"), Cons(Cons(Atom("b"), Empty), Empty))
|
||||
|
||||
var result = Member(Atom("a"), list).satisfy(emptyMap()).toList()
|
||||
assertEquals(1, result.size, "Expected one solution")
|
||||
assertTrue(result[0].isSuccess, "Expected success")
|
||||
assertTrue(result[0].getOrNull()!!.isEmpty(), "Expected empty substitution map")
|
||||
|
||||
result = Member(Atom("b"), list).satisfy(emptyMap()).toList()
|
||||
assertEquals(0, result.size, "Expected no solution")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `member with variable in list`() {
|
||||
val atom = Atom("a")
|
||||
val variable = Atom("X")
|
||||
val variable = Variable("X")
|
||||
val list = Cons(variable, Empty)
|
||||
|
||||
val member = Member(atom, list)
|
||||
|
|
|
@ -375,8 +375,16 @@ class UnificationTests {
|
|||
class `equivalent logic` {
|
||||
@Test
|
||||
fun `empty lists are equivalent`() {
|
||||
val eq = equivalent(Empty, Empty, emptyMap())
|
||||
var eq = equivalent(Empty, Empty, emptyMap())
|
||||
assertTrue(eq, "Empty lists should be equivalent")
|
||||
|
||||
val variable = Variable("X")
|
||||
|
||||
eq = equivalent(Empty, variable, mapOf(variable to Empty))
|
||||
assertTrue(eq, "Empty list and variable should be equivalent")
|
||||
|
||||
eq = equivalent(variable, Empty, mapOf(variable to Empty))
|
||||
assertTrue(eq, "Variable and empty list should be equivalent")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -385,9 +393,16 @@ class UnificationTests {
|
|||
val list1 = Cons(atom, Empty)
|
||||
val list2 = Cons(atom, Empty)
|
||||
|
||||
val eq = equivalent(list1, list2, emptyMap())
|
||||
|
||||
var eq = equivalent(list1, list2, emptyMap())
|
||||
assertTrue(eq, "Singleton lists should be equivalent")
|
||||
|
||||
val variable = Variable("X")
|
||||
|
||||
eq = equivalent(list1, variable, mapOf(variable to list2))
|
||||
assertTrue(eq, "Singleton list and variable should be equivalent")
|
||||
|
||||
eq = equivalent(variable, list1, mapOf(variable to list2))
|
||||
assertTrue(eq, "Variable and singleton list should be equivalent")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -401,6 +416,14 @@ class UnificationTests {
|
|||
|
||||
eq = equivalent(list2, list1, emptyMap())
|
||||
assertFalse(eq, "Empty and singleton lists should not be equivalent")
|
||||
|
||||
val variable = Variable("X")
|
||||
|
||||
eq = equivalent(list1, variable, mapOf(variable to list2))
|
||||
assertFalse(eq, "Singleton list and variable should not be equivalent")
|
||||
|
||||
eq = equivalent(variable, list1, mapOf(variable to list2))
|
||||
assertFalse(eq, "Variable and singleton list should not be equivalent")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -413,6 +436,14 @@ class UnificationTests {
|
|||
|
||||
eq = equivalent(list2, list1, emptyMap())
|
||||
assertTrue(eq, "Identical lists should be equivalent")
|
||||
|
||||
val variable = Variable("X")
|
||||
|
||||
eq = equivalent(list1, variable, mapOf(variable to list2))
|
||||
assertTrue(eq, "Identical lists should be equivalent")
|
||||
|
||||
eq = equivalent(variable, list2, mapOf(variable to list1))
|
||||
assertTrue(eq, "Identical lists should be equivalent")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -422,6 +453,17 @@ class UnificationTests {
|
|||
|
||||
var eq = equivalent(list1, list2, emptyMap())
|
||||
assertTrue(eq, "Identical nested lists should be equivalent")
|
||||
|
||||
eq = equivalent(list2, list1, emptyMap())
|
||||
assertTrue(eq, "Identical nested lists should be equivalent")
|
||||
|
||||
val variable = Variable("X")
|
||||
|
||||
eq = equivalent(list1, variable, mapOf(variable to list2))
|
||||
assertTrue(eq, "Identical nested lists should be equivalent")
|
||||
|
||||
eq = equivalent(variable, list2, mapOf(variable to list1))
|
||||
assertTrue(eq, "Identical nested lists should be equivalent")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -431,6 +473,17 @@ class UnificationTests {
|
|||
|
||||
var eq = equivalent(list1, list2, emptyMap())
|
||||
assertFalse(eq, "Lists with different nests should not be equivalent")
|
||||
|
||||
eq = equivalent(list2, list1, emptyMap())
|
||||
assertFalse(eq, "Lists with different nests should not be equivalent")
|
||||
|
||||
val variable = Variable("X")
|
||||
|
||||
eq = equivalent(list1, variable, mapOf(variable to list2))
|
||||
assertFalse(eq, "Lists with different nests should not be equivalent")
|
||||
|
||||
eq = equivalent(variable, list2, mapOf(variable to list1))
|
||||
assertFalse(eq, "Lists with different nests should not be equivalent")
|
||||
}
|
||||
}
|
||||
}
|
Reference in a new issue