Checkpoint
This commit is contained in:
parent
e3c84e1761
commit
e73e5cbfc8
32 changed files with 1354 additions and 92 deletions
|
@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
Reference in a new issue