mirror of
https://github.com/AdaCore/cvc5.git
synced 2026-02-12 12:32:16 -08:00
201 lines
5.0 KiB
Python
201 lines
5.0 KiB
Python
###############################################################################
|
|
# Top contributors (to current version):
|
|
# Aina Niemetz, Yoni Zohar, Andrew Reynolds
|
|
#
|
|
# This file is part of the cvc5 project.
|
|
#
|
|
# Copyright (c) 2009-2025 by the authors listed in the file AUTHORS
|
|
# in the top-level source directory and their institutional affiliations.
|
|
# All rights reserved. See the file COPYING in the top-level source
|
|
# directory for licensing information.
|
|
# #############################################################################
|
|
#
|
|
# Translated from test/unit/api/grammar_black.h
|
|
##
|
|
|
|
import pytest
|
|
|
|
import cvc5
|
|
from cvc5 import Term
|
|
|
|
|
|
@pytest.fixture
|
|
def tm():
|
|
return cvc5.TermManager()
|
|
@pytest.fixture
|
|
def solver(tm):
|
|
return cvc5.Solver(tm)
|
|
|
|
|
|
def test_is_null(tm, solver):
|
|
solver.setOption("sygus", "true")
|
|
boolean = tm.getBooleanSort()
|
|
start = tm.mkVar(boolean)
|
|
nts = tm.mkVar(boolean)
|
|
g = solver.mkGrammar([nts], [start])
|
|
assert not g.isNull()
|
|
|
|
|
|
def test_to_string(tm, solver):
|
|
solver.setOption("sygus", "true")
|
|
boolean = tm.getBooleanSort()
|
|
start = tm.mkVar(boolean)
|
|
nts = tm.mkVar(boolean)
|
|
g = solver.mkGrammar([nts], [start])
|
|
g.addRule(start, tm.mkBoolean(False))
|
|
str(g)
|
|
|
|
|
|
def test_add_rule(tm, solver):
|
|
solver.setOption("sygus", "true")
|
|
boolean = tm.getBooleanSort()
|
|
integer = tm.getIntegerSort()
|
|
|
|
start = tm.mkVar(boolean)
|
|
nts = tm.mkVar(boolean)
|
|
|
|
# expecting no error
|
|
g = solver.mkGrammar([], [start])
|
|
|
|
g.addRule(start, tm.mkBoolean(False))
|
|
|
|
# expecting errors
|
|
with pytest.raises(RuntimeError):
|
|
g.addRule(nts, tm.mkBoolean(False))
|
|
with pytest.raises(RuntimeError):
|
|
g.addRule(start, tm.mkInteger(0))
|
|
|
|
# expecting no errors
|
|
solver.synthFun("f", {}, boolean, g)
|
|
|
|
# expecting an error
|
|
with pytest.raises(RuntimeError):
|
|
g.addRule(start, tm.mkBoolean(False))
|
|
|
|
|
|
def test_add_rules(tm, solver):
|
|
solver.setOption("sygus", "true")
|
|
boolean = tm.getBooleanSort()
|
|
integer = tm.getIntegerSort()
|
|
|
|
start = tm.mkVar(boolean)
|
|
nts = tm.mkVar(boolean)
|
|
|
|
g = solver.mkGrammar([], [start])
|
|
|
|
g.addRules(start, {tm.mkBoolean(False)})
|
|
|
|
#Expecting errors
|
|
with pytest.raises(RuntimeError):
|
|
g.addRules(nts, [tm.mkBoolean(False)])
|
|
with pytest.raises(RuntimeError):
|
|
g.addRules(start, [tm.mkInteger(0)])
|
|
|
|
#Expecting no errors
|
|
solver.synthFun("f", {}, boolean, g)
|
|
|
|
#Expecting an error
|
|
with pytest.raises(RuntimeError):
|
|
g.addRules(start, tm.mkBoolean(False))
|
|
|
|
|
|
def test_add_any_constant(tm, solver):
|
|
solver.setOption("sygus", "true")
|
|
boolean = tm.getBooleanSort()
|
|
|
|
start = tm.mkVar(boolean)
|
|
nts = tm.mkVar(boolean)
|
|
|
|
g = solver.mkGrammar({}, {start})
|
|
|
|
g.addAnyConstant(start)
|
|
g.addAnyConstant(start)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
g.addAnyConstant(nts)
|
|
|
|
solver.synthFun("f", {}, boolean, g)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
g.addAnyConstant(start)
|
|
|
|
|
|
def test_add_any_variable(tm, solver):
|
|
solver.setOption("sygus", "true")
|
|
boolean = tm.getBooleanSort()
|
|
|
|
x = tm.mkVar(boolean)
|
|
start = tm.mkVar(boolean)
|
|
nts = tm.mkVar(boolean)
|
|
|
|
g1 = solver.mkGrammar({x}, {start})
|
|
g2 = solver.mkGrammar({}, {start})
|
|
|
|
g1.addAnyVariable(start)
|
|
g1.addAnyVariable(start)
|
|
g2.addAnyVariable(start)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
g1.addAnyVariable(nts)
|
|
|
|
solver.synthFun("f", {}, boolean, g1)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
g1.addAnyVariable(start)
|
|
|
|
def tesT_hash(tm, solver):
|
|
solver.setOption("sygus", "true")
|
|
bool_sort = tm.getBooleanSort()
|
|
x = tm.mkVar(bool_sort, "x")
|
|
start1 = tm.mkVar(bool_sort, "start")
|
|
start2 = tm.mkVar(bool_sort, "start")
|
|
|
|
g1 = solver.mkGrammar({}, {start1})
|
|
g2 = solver.mkGrammar({}, {start1})
|
|
assert hash(g1) == hash(g1)
|
|
assert hash(g1) == hash(g2)
|
|
assert g1 == g1
|
|
assert g1 != g2
|
|
|
|
g1 = solver.mkGrammar({}, {start1})
|
|
g2 = solver.mkGrammar({x}, {start1})
|
|
assert hash(g1) != hash(g2)
|
|
assert g1 == g1
|
|
assert g1 != g2
|
|
|
|
g1 = solver.mkGrammar({x}, {start1})
|
|
g2 = solver.mkGrammar({x}, {start2})
|
|
assert hash(g1) == hash(g2)
|
|
assert g1 == g1
|
|
assert g1 != g2
|
|
|
|
g1 = solver.mkGrammar({x}, {start1})
|
|
g2 = solver.mkGrammar({x}, {start1})
|
|
g2.addAnyVariable(start1)
|
|
assert hash(g1) != hash(g2)
|
|
assert g1 == g1
|
|
assert g1 != g2
|
|
|
|
g1 = solver.mkGrammar({x}, {start1})
|
|
g2 = solver.mkGrammar({x}, {start1})
|
|
g1.addRules(start1, tm.mkFalse())
|
|
g2.addRules(start1, tm.mkFalse())
|
|
assert hash(g1) == hash(g2)
|
|
assert g1 == g1
|
|
assert g1 != g2
|
|
|
|
g1 = solver.mkGrammar({x}, {start1})
|
|
g2 = solver.mkGrammar({x}, {start1})
|
|
g2.addRules(start1, tm.mkFalse())
|
|
assert hash(g1) != hash(g2)
|
|
assert g1 == g1
|
|
assert g1 != g2
|
|
|
|
g1 = solver.mkGrammar({x}, {start1})
|
|
g2 = solver.mkGrammar({x}, {start1})
|
|
g1.addRules(start1, tm.mkTrue())
|
|
g2.addRules(start1, tm.mkFalse())
|
|
assert hash(g1) != hash(g2)
|
|
assert g1 == g1
|
|
assert g1 != g2
|