3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-06-05 08:30:50 +00:00

Add Z3_mk_polymorphic_datatype to Python, .NET, Go, and TypeScript bindings (#9181)

* Add Z3_mk_polymorphic_datatype to Python, .NET, Go, and TypeScript bindings

Agent-Logs-Url: https://github.com/Z3Prover/z3/sessions/13ef481d-61f5-47e1-8659-59cd91692fdd

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

* Improve Python error message for polymorphic datatype self-reference check

Agent-Logs-Url: https://github.com/Z3Prover/z3/sessions/13ef481d-61f5-47e1-8659-59cd91692fdd

Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
Copilot 2026-03-31 14:15:34 -07:00 committed by GitHub
parent 56eeb5b52c
commit 56a8259717
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 292 additions and 0 deletions

View file

@ -127,6 +127,41 @@ func (c *Context) MkDatatypeSort(name string, constructors []*Constructor) *Sort
return newSort(c, C.Z3_mk_datatype(c.ptr, sym.ptr, C.uint(numCons), &cons[0]))
}
// MkPolymorphicDatatypeSort creates a polymorphic datatype sort with explicit type parameters.
// typeParams should be sorts created with MkTypeVariable.
// Self-recursive field sorts should be passed as nil; use the fieldSortRefs parameter in
// MkConstructor to indicate the recursive reference by index.
func (c *Context) MkPolymorphicDatatypeSort(name string, typeParams []*Sort, constructors []*Constructor) *Sort {
sym := c.MkStringSymbol(name)
numParams := len(typeParams)
numCons := len(constructors)
var paramPtr *C.Z3_sort
if numParams > 0 {
paramPtrs := make([]C.Z3_sort, numParams)
for i, p := range typeParams {
paramPtrs[i] = p.ptr
}
paramPtr = &paramPtrs[0]
}
var consPtr *C.Z3_constructor
if numCons > 0 {
consPtrs := make([]C.Z3_constructor, numCons)
for i, cons := range constructors {
consPtrs[i] = cons.ptr
}
consPtr = &consPtrs[0]
}
return newSort(c, C.Z3_mk_polymorphic_datatype(
c.ptr, sym.ptr,
C.uint(numParams), paramPtr,
C.uint(numCons), consPtr,
))
}
// MkDatatypeSorts creates multiple mutually recursive datatype sorts.
func (c *Context) MkDatatypeSorts(names []string, constructorLists [][]*Constructor) []*Sort {
numTypes := uint(len(names))