3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-29 20:05:51 +00:00

add char_decl_plugin

This commit is contained in:
Nikolaj Bjorner 2021-01-26 16:43:03 -08:00
parent 20332c6d3e
commit 32058d9c68
6 changed files with 241 additions and 11 deletions

75
src/model/char_factory.h Normal file
View file

@ -0,0 +1,75 @@
/*++
Copyright (c) 2011 Microsoft Corporation
Module Name:
char_factory.h
Author:
Nikolaj Bjorner (nbjorner) 2011-14-11
Revision History:
--*/
#pragma once
#include "util/uint_set.h"
#include "ast/char_decl_plugin.h"
#include "ast/seq_decl_plugin.h"
#include "model/model_core.h"
#include "model/value_factory.h"
class char_factory : public value_factory {
model_core& m_model;
ast_manager& m;
seq_util u;
uint_set m_chars;
unsigned m_next { 'A' };
expr_ref_vector m_trail;
public:
char_factory(ast_manager & m, family_id fid, model_core& md):
value_factory(m, fid),
m_model(md),
m(m),
u(m),
m_trail(m)
{
}
expr* get_some_value(sort* s) override {
m_chars.insert('a');
return u.mk_char('a');
}
bool get_some_values(sort* s, expr_ref& v1, expr_ref& v2) override {
v1 = u.mk_char('a');
v2 = u.mk_char('b');
m_chars.insert('a');
m_chars.insert('b');
return true;
}
expr* get_fresh_value(sort* s) override {
while (m_chars.contains(m_next))
++m_next;
if (m_next > u.max_char())
throw default_exception("Character range exhausted");
m_chars.insert(m_next);
return u.mk_char(m_next++);
}
void register_value(expr* n) override {
unsigned ch;
if (u.is_const_char(n, ch))
m_chars.insert(ch);
}
void add_trail(expr* e) {
m_trail.push_back(e);
}
};