mirror of
https://github.com/Z3Prover/z3
synced 2025-11-05 13:56:03 +00:00
Add finite_set_value_factory implementation
Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
8fff6afe2b
commit
bcc7076ebf
4 changed files with 101 additions and 0 deletions
|
|
@ -2,6 +2,7 @@ z3_add_component(model
|
||||||
SOURCES
|
SOURCES
|
||||||
array_factory.cpp
|
array_factory.cpp
|
||||||
datatype_factory.cpp
|
datatype_factory.cpp
|
||||||
|
finite_set_value_factory.cpp
|
||||||
func_interp.cpp
|
func_interp.cpp
|
||||||
model2expr.cpp
|
model2expr.cpp
|
||||||
model_core.cpp
|
model_core.cpp
|
||||||
|
|
|
||||||
62
src/model/finite_set_value_factory.cpp
Normal file
62
src/model/finite_set_value_factory.cpp
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2006 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
finite_set_value_factory.cpp
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Factory for creating finite set values
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Leonardo de Moura (leonardo) 2008-11-06.
|
||||||
|
|
||||||
|
Revision History:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#include "model/finite_set_value_factory.h"
|
||||||
|
#include "model/model_core.h"
|
||||||
|
|
||||||
|
finite_set_value_factory::finite_set_value_factory(ast_manager & m, family_id fid, model_core & md):
|
||||||
|
struct_factory(m, fid, md) {
|
||||||
|
}
|
||||||
|
|
||||||
|
expr * finite_set_value_factory::get_some_value(sort * s) {
|
||||||
|
// Check if we already have a value for this sort
|
||||||
|
value_set * set = nullptr;
|
||||||
|
if (m_sort2value_set.find(s, set) && !set->empty()) {
|
||||||
|
return *(set->begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
// For finite sets, we can start with an empty set representation
|
||||||
|
// This is a placeholder - the actual implementation would depend on
|
||||||
|
// how finite sets are represented in the specific theory
|
||||||
|
expr * r = m_model.get_some_value(s);
|
||||||
|
if (r != nullptr) {
|
||||||
|
register_value(r);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
expr * finite_set_value_factory::get_fresh_value(sort * s) {
|
||||||
|
// Get a fresh value for a finite set sort
|
||||||
|
value_set * set = get_value_set(s);
|
||||||
|
|
||||||
|
// If no values have been generated yet, use get_some_value
|
||||||
|
if (set->empty()) {
|
||||||
|
return get_some_value(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to generate a fresh value using the model's get_fresh_value
|
||||||
|
expr * fresh = m_model.get_fresh_value(s);
|
||||||
|
if (fresh != nullptr) {
|
||||||
|
register_value(fresh);
|
||||||
|
return fresh;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For finite domains, we may not be able to generate fresh values
|
||||||
|
// if all values have been exhausted
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
34
src/model/finite_set_value_factory.h
Normal file
34
src/model/finite_set_value_factory.h
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2006 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
finite_set_value_factory.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Factory for creating finite set values
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Leonardo de Moura (leonardo) 2008-11-06.
|
||||||
|
|
||||||
|
Revision History:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "model/struct_factory.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Factory for finite set values.
|
||||||
|
*/
|
||||||
|
class finite_set_value_factory : public struct_factory {
|
||||||
|
public:
|
||||||
|
finite_set_value_factory(ast_manager & m, family_id fid, model_core & md);
|
||||||
|
|
||||||
|
expr * get_some_value(sort * s) override;
|
||||||
|
|
||||||
|
expr * get_fresh_value(sort * s) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -26,6 +26,7 @@ Revision History:
|
||||||
#include "ast/array_decl_plugin.h"
|
#include "ast/array_decl_plugin.h"
|
||||||
#include "ast/bv_decl_plugin.h"
|
#include "ast/bv_decl_plugin.h"
|
||||||
#include "ast/recfun_decl_plugin.h"
|
#include "ast/recfun_decl_plugin.h"
|
||||||
|
#include "ast/dl_decl_plugin.h"
|
||||||
#include "ast/well_sorted.h"
|
#include "ast/well_sorted.h"
|
||||||
#include "ast/used_symbols.h"
|
#include "ast/used_symbols.h"
|
||||||
#include "ast/for_each_expr.h"
|
#include "ast/for_each_expr.h"
|
||||||
|
|
@ -40,6 +41,7 @@ Revision History:
|
||||||
#include "model/numeral_factory.h"
|
#include "model/numeral_factory.h"
|
||||||
#include "model/fpa_factory.h"
|
#include "model/fpa_factory.h"
|
||||||
#include "model/char_factory.h"
|
#include "model/char_factory.h"
|
||||||
|
#include "model/finite_set_value_factory.h"
|
||||||
|
|
||||||
|
|
||||||
model::model(ast_manager & m):
|
model::model(ast_manager & m):
|
||||||
|
|
@ -104,6 +106,7 @@ value_factory* model::get_factory(sort* s) {
|
||||||
if (m_factories.plugins().empty()) {
|
if (m_factories.plugins().empty()) {
|
||||||
seq_util su(m);
|
seq_util su(m);
|
||||||
fpa_util fu(m);
|
fpa_util fu(m);
|
||||||
|
datalog::dl_decl_plugin dl_plugin;
|
||||||
m_factories.register_plugin(alloc(basic_factory, m, 0));
|
m_factories.register_plugin(alloc(basic_factory, m, 0));
|
||||||
m_factories.register_plugin(alloc(array_factory, m, *this));
|
m_factories.register_plugin(alloc(array_factory, m, *this));
|
||||||
m_factories.register_plugin(alloc(datatype_factory, m, *this));
|
m_factories.register_plugin(alloc(datatype_factory, m, *this));
|
||||||
|
|
@ -111,6 +114,7 @@ value_factory* model::get_factory(sort* s) {
|
||||||
m_factories.register_plugin(alloc(arith_factory, m));
|
m_factories.register_plugin(alloc(arith_factory, m));
|
||||||
m_factories.register_plugin(alloc(seq_factory, m, su.get_family_id(), *this));
|
m_factories.register_plugin(alloc(seq_factory, m, su.get_family_id(), *this));
|
||||||
m_factories.register_plugin(alloc(fpa_value_factory, m, fu.get_family_id()));
|
m_factories.register_plugin(alloc(fpa_value_factory, m, fu.get_family_id()));
|
||||||
|
m_factories.register_plugin(alloc(finite_set_value_factory, m, m.mk_family_id("datalog"), *this));
|
||||||
//m_factories.register_plugin(alloc(char_factory, m, char_decl_plugin(m).get_family_id());
|
//m_factories.register_plugin(alloc(char_factory, m, char_decl_plugin(m).get_family_id());
|
||||||
}
|
}
|
||||||
family_id fid = s->get_family_id();
|
family_id fid = s->get_family_id();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue