Skip to content

Commit 76b1acf

Browse files
Add support for DatatypeSort (#110)
This adds support for the (confusingly named) `DatatypeSort` function/class that is used to create unresolved datatype sorts in the Z3 Python API. This closes #109 --------- Co-authored-by: Daniel Larraz <daniel-larraz@users.noreply.github.com>
1 parent 27d50b6 commit 76b1acf

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

cvc5_pythonic_api/cvc5_pythonic.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8689,6 +8689,13 @@ def CreateDatatypes(*ds):
86898689
return tuple(result)
86908690

86918691

8692+
def DatatypeSort(name, ctx=None):
8693+
"""Create a reference to a sort that will be declared as a recursive datatype"""
8694+
ctx = _get_ctx(ctx)
8695+
s = ctx.tm.mkUnresolvedDatatypeSort(name)
8696+
return SortRef(s, ctx)
8697+
8698+
86928699
class DatatypeSortRef(SortRef):
86938700
"""Datatype sorts."""
86948701

test/pgm_outputs/example_datatypes.py.out

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ t is a 'cons': True
1313

1414
[a = 51]
1515
proved
16+
17+
Sorts match: True
18+
Operation on resolved sort works: True

test/pgms/example_datatypes.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,18 @@
4242
solve(List.head(List.cons(a, List.nil)) > 50)
4343

4444
prove(Not(List.is_nil(List.cons(a, List.nil))))
45+
46+
print()
47+
48+
# Test DatatypeSort for unresolved datatype sorts.
49+
SomeType = Datatype('SomeType')
50+
SomeTypeSort = DatatypeSort('SomeType')
51+
SomeType.declare('nil')
52+
SomeType.declare('some', ('someof', SeqSort(SomeTypeSort), ))
53+
SomeTypeSort = SomeType.create()
54+
55+
nil = SomeTypeSort.nil
56+
some = SomeTypeSort.some(Unit(nil))
57+
58+
print("Sorts match:", SomeTypeSort == SomeTypeSort.someof(some)[0].sort())
59+
print("Operation on resolved sort works:", simplify(SomeTypeSort.is_nil(SomeTypeSort.someof(some)[0])))

0 commit comments

Comments
 (0)