Skip to content

Commit 4ce6b53

Browse files
fix #2640
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent ca498e2 commit 4ce6b53

File tree

7 files changed

+190
-150
lines changed

7 files changed

+190
-150
lines changed

src/ast/seq_decl_plugin.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,11 @@ app* seq_decl_plugin::mk_string(zstring const& s) {
913913
}
914914

915915

916+
bool seq_decl_plugin::is_considered_uninterpreted(func_decl * f) {
917+
seq_util util(*m_manager);
918+
return util.str.is_nth_u(f);
919+
}
920+
916921
bool seq_decl_plugin::is_value(app* e) const {
917922
while (true) {
918923
if (is_app_of(e, m_family_id, OP_SEQ_EMPTY)) {

src/ast/seq_decl_plugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ class seq_decl_plugin : public decl_plugin {
207207

208208
bool has_re() const { return m_has_re; }
209209

210+
bool is_considered_uninterpreted(func_decl * f) override;
210211
};
211212

212213
class seq_util {

src/model/model.cpp

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ Revision History:
2929
#include "model/model.h"
3030
#include "model/model_params.hpp"
3131
#include "model/model_evaluator.h"
32+
#include "model/array_factory.h"
33+
#include "model/value_factory.h"
34+
#include "model/seq_factory.h"
35+
#include "model/datatype_factory.h"
36+
#include "model/numeral_factory.h"
37+
3238

3339
model::model(ast_manager & m):
3440
model_core(m),
@@ -88,40 +94,38 @@ bool model::eval_expr(expr * e, expr_ref & result, bool model_completion) {
8894
}
8995
}
9096

91-
struct model::value_proc : public some_value_proc {
92-
model & m_model;
93-
value_proc(model & m):m_model(m) {}
94-
expr * operator()(sort * s) override {
95-
ptr_vector<expr> * u = nullptr;
96-
if (m_model.m_usort2universe.find(s, u)) {
97-
if (!u->empty())
98-
return u->get(0);
99-
}
100-
return nullptr;
101-
}
102-
};
97+
value_factory* model::get_factory(sort* s) {
98+
if (m_factories.plugins().empty()) {
99+
seq_util su(m);
100+
m_factories.register_plugin(alloc(array_factory, m, *this));
101+
m_factories.register_plugin(alloc(datatype_factory, m, *this));
102+
m_factories.register_plugin(alloc(bv_factory, m));
103+
m_factories.register_plugin(alloc(arith_factory, m));
104+
m_factories.register_plugin(alloc(seq_factory, m, su.get_family_id(), *this));
105+
}
106+
family_id fid = s->get_family_id();
107+
return m_factories.get_plugin(fid);
108+
}
103109

104110
expr * model::get_some_value(sort * s) {
105-
value_proc p(*this);
106-
return m.get_some_value(s, &p);
111+
ptr_vector<expr> * u = nullptr;
112+
if (m_usort2universe.find(s, u)) {
113+
if (!u->empty())
114+
return u->get(0);
115+
}
116+
return m.get_some_value(s);
107117
}
108118

109119
expr * model::get_fresh_value(sort * s) {
110-
value_proc p(*this);
111-
return m.get_some_value(s, &p);
120+
return get_factory(s)->get_fresh_value(s);
112121
}
113122

114123
bool model::get_some_values(sort * s, expr_ref& v1, expr_ref& v2) {
115-
v1 = get_some_value(s);
116-
v2 = get_some_value(s);
117-
return true;
124+
return get_factory(s)->get_some_values(s, v1, v2);
118125
}
119126

120127
ptr_vector<expr> const & model::get_universe(sort * s) const {
121-
ptr_vector<expr> * u = nullptr;
122-
m_usort2universe.find(s, u);
123-
SASSERT(u != nullptr);
124-
return *u;
128+
return *m_usort2universe[s];
125129
}
126130

127131
bool model::has_uninterpreted_sort(sort * s) const {

src/model/model.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ Revision History:
1919
#ifndef MODEL_H_
2020
#define MODEL_H_
2121

22-
#include "model/model_core.h"
23-
#include "model/model_evaluator.h"
2422
#include "util/ref.h"
23+
#include "util/vector.h"
2524
#include "ast/ast_translation.h"
25+
#include "util/plugin_manager.h"
26+
#include "model/model_core.h"
27+
#include "model/model_evaluator.h"
28+
#include "model/value_factory.h"
2629

2730
class model;
2831
typedef ref<model> model_ref;
@@ -37,7 +40,7 @@ class model : public model_core {
3740
model_evaluator m_mev;
3841
bool m_cleaned;
3942
bool m_inline;
40-
struct value_proc;
43+
plugin_manager<value_factory> m_factories;
4144

4245
struct deps_collector;
4346
struct occs_collector;
@@ -52,6 +55,7 @@ class model : public model_core {
5255
expr_ref cleanup_expr(top_sort& ts, expr* e, unsigned current_partition);
5356
void remove_decls(ptr_vector<func_decl> & decls, func_decl_set const & s);
5457
bool can_inline_def(top_sort& ts, func_decl* f);
58+
value_factory* get_factory(sort* s);
5559

5660
public:
5761
model(ast_manager & m);

src/model/seq_factory.h

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
/*++
2+
Copyright (c) 2011 Microsoft Corporation
3+
4+
Module Name:
5+
6+
theory_seq_empty.h
7+
8+
Abstract:
9+
10+
<abstract>
11+
12+
Author:
13+
14+
Nikolaj Bjorner (nbjorner) 2011-14-11
15+
16+
Revision History:
17+
18+
--*/
19+
#ifndef SEQ_FACTORY_H_
20+
#define SEQ_FACTORY_H_
21+
22+
#include "ast/seq_decl_plugin.h"
23+
#include "model/model_core.h"
24+
25+
class seq_factory : public value_factory {
26+
typedef hashtable<symbol, symbol_hash_proc, symbol_eq_proc> symbol_set;
27+
model_core& m_model;
28+
ast_manager& m;
29+
seq_util u;
30+
symbol_set m_strings;
31+
unsigned m_next;
32+
std::string m_unique_delim;
33+
obj_map<sort, expr*> m_unique_sequences;
34+
expr_ref_vector m_trail;
35+
public:
36+
37+
seq_factory(ast_manager & m, family_id fid, model_core& md):
38+
value_factory(m, fid),
39+
m_model(md),
40+
m(m),
41+
u(m),
42+
m_next(0),
43+
m_unique_delim("!"),
44+
m_trail(m)
45+
{
46+
m_strings.insert(symbol(""));
47+
m_strings.insert(symbol("a"));
48+
m_strings.insert(symbol("b"));
49+
}
50+
51+
void add_trail(expr* e) {
52+
m_trail.push_back(e);
53+
}
54+
55+
void set_prefix(char const* p) {
56+
m_unique_delim = p;
57+
}
58+
59+
// generic method for setting unique sequences
60+
void set_prefix(expr* uniq) {
61+
m_trail.push_back(uniq);
62+
m_unique_sequences.insert(m.get_sort(uniq), uniq);
63+
}
64+
65+
expr* get_some_value(sort* s) override {
66+
if (u.is_seq(s)) {
67+
return u.str.mk_empty(s);
68+
}
69+
sort* seq = nullptr;
70+
if (u.is_re(s, seq)) {
71+
return u.re.mk_to_re(u.str.mk_empty(seq));
72+
}
73+
UNREACHABLE();
74+
return nullptr;
75+
}
76+
bool get_some_values(sort* s, expr_ref& v1, expr_ref& v2) override {
77+
if (u.is_string(s)) {
78+
v1 = u.str.mk_string(symbol("a"));
79+
v2 = u.str.mk_string(symbol("b"));
80+
return true;
81+
}
82+
sort* ch;
83+
if (u.is_seq(s, ch)) {
84+
if (m_model.get_some_values(ch, v1, v2)) {
85+
v1 = u.str.mk_unit(v1);
86+
v2 = u.str.mk_unit(v2);
87+
return true;
88+
}
89+
else {
90+
return false;
91+
}
92+
}
93+
NOT_IMPLEMENTED_YET();
94+
return false;
95+
}
96+
expr* get_fresh_value(sort* s) override {
97+
if (u.is_string(s)) {
98+
while (true) {
99+
std::ostringstream strm;
100+
strm << m_unique_delim << std::hex << m_next++ << std::dec << m_unique_delim;
101+
symbol sym(strm.str().c_str());
102+
if (m_strings.contains(sym)) continue;
103+
m_strings.insert(sym);
104+
return u.str.mk_string(sym);
105+
}
106+
}
107+
sort* seq = nullptr, *ch = nullptr;
108+
if (u.is_re(s, seq)) {
109+
expr* v0 = get_fresh_value(seq);
110+
return u.re.mk_to_re(v0);
111+
}
112+
if (u.is_char(s)) {
113+
//char s[2] = { ++m_char, 0 };
114+
//return u.str.mk_char(zstring(s), 0);
115+
return u.str.mk_char(zstring("a"), 0);
116+
}
117+
if (u.is_seq(s, ch)) {
118+
expr* v = m_model.get_fresh_value(ch);
119+
if (!v) return nullptr;
120+
return u.str.mk_unit(v);
121+
}
122+
UNREACHABLE();
123+
return nullptr;
124+
}
125+
void register_value(expr* n) override {
126+
symbol sym;
127+
if (u.str.is_string(n, sym)) {
128+
m_strings.insert(sym);
129+
if (sym.str().find(m_unique_delim) != std::string::npos) {
130+
add_new_delim();
131+
}
132+
}
133+
}
134+
private:
135+
136+
void add_new_delim() {
137+
bool found = true;
138+
while (found) {
139+
found = false;
140+
m_unique_delim += "!";
141+
symbol_set::iterator it = m_strings.begin(), end = m_strings.end();
142+
for (; it != end && !found; ++it) {
143+
found = it->str().find(m_unique_delim) != std::string::npos;
144+
}
145+
}
146+
}
147+
};
148+
149+
#endif

src/smt/proto_model/proto_model.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ Revision History:
3131
#include "model/model_core.h"
3232
#include "model/model_evaluator.h"
3333
#include "model/value_factory.h"
34-
#include "util/plugin_manager.h"
3534
#include "ast/arith_decl_plugin.h"
3635
#include "ast/func_decl_dependencies.h"
3736
#include "model/model.h"

0 commit comments

Comments
 (0)