Skip to content

Lambda sort and DatatypeRef in _to_expr_ref #100

Description

@philzook58

I'm looking at getting cvc5 to be an alternate backend to my project and there are a couple z3 incompatibilities.

There's a missing cast to DatatypeRef here

def _to_expr_ref(a, ctx, r=None):

which I backpatched as

def Const(name, sort):
    # _to_expr doesn't have a DatatypeRef case
    x = cvc5.pythonic.Const(name, sort)
    if isinstance(sort, DatatypeSortRef):
        x = DatatypeRef(x.ast, x.ctx, x.reverse_children)
    return x

And the sort returned by lambdas is not right

I tried patching this as

def _qsort(self):
    if self.is_lambda():
        return ArraySort(self.var_sort(0), self.body().sort())
    else:
        return BoolSort(self.ctx)


QuantifierRef.sort = _qsort

but I get a deeper error which I don't understand

________________________________________________________________ ERROR collecting tests/test_kernel.py ________________________________________________________________
tests/test_kernel.py:9: in <module>
    import knuckledragger.theories.Interval
knuckledragger/theories/Interval.py:9: in <module>
    setof = kd.define("setof", [i], smt.Lambda([x], smt.And(i.lo <= x, x <= i.hi)))
knuckledragger/kernel.py:132: in define
    f(*args) == body
../../../.local/lib/python3.10/site-packages/cvc5/pythonic/cvc5_pythonic.py:375: in __eq__
    return BoolRef(c.solver.mkTerm(Kind.EQUAL, a.as_ast(), b.as_ast()), c)
cvc5.pxi:2556: in cvc5.cvc5_python_base.Solver.mkTerm
    ???
cvc5.pxi:1538: in cvc5.cvc5_python_base.TermManager.mkTerm
    ???
E   RuntimeError: Subexpressions must have the same type:
E   Equation: (= (setof i) (lambda ((x Real)) (and (<= (lo i) x) (<= x (hi i)))))
E   Type 1: (Array Real Bool)
E   Type 2: (-> Real Bool)

Are lambda sorts distinct from Arrays?

Activity

  1. msakai commented on Aug 9, 2026

    @msakai

    The sort of lambda expressions is ArraySort in Z3, but in cvc5 it appears to be FunctionSort.

    I think the correct fix is #115.

  2. daniel-larraz commented on Aug 13, 2026

    @daniel-larraz
    Contributor

    @philzook58 Both reported items are now fixed on main through PRs #118 and #120. In cvc5, lambda has a function type, not an array type. These two types are not interchangeable, although PR #118, which extends the solution provided by @msakai in #115, helps narrow the gap.

  3. daniel-larraz commented on Aug 16, 2026

    @daniel-larraz
    Contributor

    @philzook58 FYI, based on the output excerpt in your report, you may also need the changes from PR #122 for your code to work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions