All Downloads are FREE. Search and download functionalities are using the official Maven repository.

main.io.ksmt.solver.cvc5.KCvc5TermManager.kt Maven / Gradle / Ivy

There is a newer version: 0.5.29
Show newest version
package io.ksmt.solver.cvc5

import io.github.cvc5.AbstractPointer
import io.github.cvc5.Kind
import io.github.cvc5.Op
import io.github.cvc5.Sort
import io.github.cvc5.Term
import io.github.cvc5.TermManager
import it.unimi.dsi.fastutil.Hash
import it.unimi.dsi.fastutil.HashCommon
import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet

class KCvc5TermManager : AutoCloseable {
    val termManager: TermManager = TermManager()

    fun mkTerm(kind: Kind): Term =
        termManager.mkTerm(kind).also { registerPointer(it) }

    fun mkTerm(kind: Kind, arg: Term): Term =
        termManager.mkTerm(kind, arg).also { registerPointer(it) }

    fun mkTerm(kind: Kind, arg0: Term, arg1: Term): Term =
        termManager.mkTerm(kind, arg0, arg1).also { registerPointer(it) }

    fun mkTerm(kind: Kind, arg0: Term, arg1: Term, arg2: Term): Term =
        termManager.mkTerm(kind, arg0, arg1, arg2).also { registerPointer(it) }

    fun mkTerm(kind: Kind, args: Array): Term =
        termManager.mkTerm(kind, args).also { registerPointer(it) }

    fun mkTerm(op: Op): Term =
        termManager.mkTerm(op).also { registerPointer(it) }

    fun mkTerm(op: Op, arg0: Term): Term =
        termManager.mkTerm(op, arg0).also { registerPointer(it) }

    fun mkTerm(op: Op, arg1: Term, arg2: Term): Term =
        termManager.mkTerm(op, arg1, arg2).also { registerPointer(it) }

    fun mkTerm(op: Op, arg0: Term, arg1: Term, arg2: Term): Term =
        termManager.mkTerm(op, arg0, arg1, arg2).also { registerPointer(it) }

    fun mkTerm(op: Op, args: Array): Term =
        termManager.mkTerm(op, args).also { registerPointer(it) }

    fun mkQuantifier(isUniversal: Boolean, boundVars: Array, body: Term): Term {
        val kind = if (isUniversal) Kind.FORALL else Kind.EXISTS
        val quantifiedVars = mkTerm(Kind.VARIABLE_LIST, boundVars)
        return mkTerm(kind, quantifiedVars, body)
    }

    fun mkLambda(boundVars: Array, body: Term): Term {
        val lambdaVars = mkTerm(Kind.VARIABLE_LIST, boundVars)
        return mkTerm(Kind.LAMBDA, lambdaVars, body)
    }

    fun mkOp(kind: Kind): Op =
        termManager.mkOp(kind).also { registerPointer(it) }

    fun mkOp(kind: Kind, arg: String): Op =
        termManager.mkOp(kind, arg).also { registerPointer(it) }

    fun mkOp(kind: Kind, arg: Int): Op =
        termManager.mkOp(kind, arg).also { registerPointer(it) }

    fun mkOp(kind: Kind, arg0: Int, arg1: Int): Op =
        termManager.mkOp(kind, arg0, arg1).also { registerPointer(it) }

    fun mkOp(kind: Kind, args: IntArray): Op =
        termManager.mkOp(kind, args).also { registerPointer(it) }

    inline fun  builder(body: TermManager.() -> T): T =
        body(termManager).also { registerPointer(it) }

    fun termSort(term: Term): Sort = term.sort.also { registerPointer(it) }

    fun termChild(term: Term, idx: Int): Term = term.getChild(idx).also { registerPointer(it) }

    inline fun  termOp(term: Term, body: Term.() -> T): T =
        body(term).also { registerPointer(it) }

    inline fun  sortOp(sort: Sort, body: Sort.() -> T): T =
        body(sort).also { registerPointer(it) }

    private val pointers = ObjectOpenCustomHashSet(PointerHash)

    fun  registerPointer(ptr: T): T {
        pointers.add(ptr)
        return ptr
    }

    override fun close() {
        for (ptr in pointers) {
            ptr.deletePointer()
        }
        termManager.deletePointer()
    }

    private object PointerHash : Hash.Strategy {
        override fun equals(p0: AbstractPointer?, p1: AbstractPointer?): Boolean {
            if (p0 == null || p1 == null) return p0 === p1
            return p0.pointer == p1.pointer
        }

        override fun hashCode(p0: AbstractPointer?): Int {
            if (p0 == null) return 0
            return HashCommon.long2int(p0.pointer)
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy