Checkpoint

This commit is contained in:
Tibo De Peuter 2025-04-11 19:27:01 +02:00
parent e3c84e1761
commit e73e5cbfc8
32 changed files with 1354 additions and 92 deletions

View file

@ -1,24 +1,24 @@
/**
* Comparison and Unification of Terms
*
* [SWI Prolog Documentation](https://www.swi-prolog.org/pldoc/man?section=compare)
*/
package prolog.builtins
import prolog.ast.terms.Atom
import prolog.ast.terms.Structure
import prolog.ast.terms.Operator
import prolog.ast.terms.Term
import prolog.ast.terms.Variable
import prolog.logic.Substituted
import prolog.logic.applySubstitution
import prolog.logic.equivalent
/**
* True if Term1 is equivalent to Term2. A variable is only identical to a sharing variable.
*/
fun equivalent(term1: Term, term2: Term): Boolean {
return when {
term1 is Variable && term2 is Variable -> term1 == term2
term1 is Variable -> term1.alias().isPresent && equivalent(term1.alias().get(), term2)
term2 is Variable -> term2.alias().isPresent && equivalent(term2.alias().get(), term1)
term1 is Atom && term2 is Atom -> term1.compareTo(term2) == 0
term1 is Structure && term2 is Structure -> term1.compareTo(term2) == 0
else -> false
class Equivalent(private val term1: Term, private val term2: Term) : Operator(Atom("=="), term1, term2) {
override fun prove(subs: Substituted): Sequence<Substituted> = sequence {
val t1 = applySubstitution(term1, subs)
val t2 = applySubstitution(term2, subs)
if (equivalent(t1, t2)) {
yield(emptyMap())
}
}
}
/**
*
*/