mirror of
https://github.com/Z3Prover/z3
synced 2025-10-05 23:43:59 +00:00
add js-model interfacing
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
0af00e62de
commit
3478b8b924
11 changed files with 275 additions and 59 deletions
|
@ -23,14 +23,17 @@ Revision History:
|
|||
void jobshop_decl_plugin::set_manager(ast_manager* m, family_id fid) {
|
||||
decl_plugin::set_manager(m, fid);
|
||||
m_int_sort = m_manager->mk_sort(m_manager->mk_family_id("arith"), INT_SORT);
|
||||
m_alist_sort = m_manager->mk_sort(symbol("AList"), sort_info(m_family_id, ALIST_SORT));
|
||||
m_job_sort = m_manager->mk_sort(symbol("Job"), sort_info(m_family_id, JOB_SORT));
|
||||
m_resource_sort = m_manager->mk_sort(symbol("Resource"), sort_info(m_family_id, RESOURCE_SORT));
|
||||
m_manager->inc_ref(m_int_sort);
|
||||
m_manager->inc_ref(m_resource_sort);
|
||||
m_manager->inc_ref(m_job_sort);
|
||||
m_manager->inc_ref(m_alist_sort);
|
||||
}
|
||||
|
||||
void jobshop_decl_plugin::finalize() {
|
||||
m_manager->dec_ref(m_alist_sort);
|
||||
m_manager->dec_ref(m_job_sort);
|
||||
m_manager->dec_ref(m_resource_sort);
|
||||
m_manager->dec_ref(m_int_sort);
|
||||
|
@ -43,12 +46,13 @@ sort * jobshop_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parame
|
|||
switch (static_cast<js_sort_kind>(k)) {
|
||||
case JOB_SORT: return m_job_sort;
|
||||
case RESOURCE_SORT: return m_resource_sort;
|
||||
case ALIST_SORT: return m_alist_sort;
|
||||
default: UNREACHABLE(); return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
func_decl * jobshop_decl_plugin::mk_func_decl(
|
||||
decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const *, sort *) {
|
||||
decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort *) {
|
||||
switch (static_cast<js_op_kind>(k)) {
|
||||
case OP_JS_JOB:
|
||||
check_arity(arity);
|
||||
|
@ -70,6 +74,18 @@ func_decl * jobshop_decl_plugin::mk_func_decl(
|
|||
check_arity(arity);
|
||||
check_index1(num_parameters, parameters);
|
||||
return m_manager->mk_func_decl(symbol("job2resource"), 0, (sort* const*)nullptr, m_int_sort, func_decl_info(m_family_id, k, num_parameters, parameters));
|
||||
case OP_JS_MODEL:
|
||||
// has no parameters
|
||||
// all arguments are of sort alist
|
||||
return m_manager->mk_func_decl(symbol("js-model"), arity, domain, m_manager->mk_bool_sort(), func_decl_info(m_family_id, k, num_parameters, parameters));
|
||||
case OP_AL_KV:
|
||||
// has two parameters, first is symbol
|
||||
// has no arguments
|
||||
return m_manager->mk_func_decl(symbol("kv"), arity, domain, m_alist_sort, func_decl_info(m_family_id, k, num_parameters, parameters));
|
||||
case OP_AL_LIST:
|
||||
// has no parameters
|
||||
// all arguments are of sort alist
|
||||
return m_manager->mk_func_decl(symbol("alist"), arity, domain, m_alist_sort, func_decl_info(m_family_id, k, num_parameters, parameters));
|
||||
default:
|
||||
UNREACHABLE(); return nullptr;
|
||||
}
|
||||
|
@ -96,17 +112,20 @@ bool jobshop_decl_plugin::is_value(app * e) const {
|
|||
}
|
||||
|
||||
void jobshop_decl_plugin::get_op_names(svector<builtin_name> & op_names, symbol const & logic) {
|
||||
if (logic == symbol("JOBSHOP")) {
|
||||
if (logic == symbol("CSP")) {
|
||||
op_names.push_back(builtin_name("job", OP_JS_JOB));
|
||||
op_names.push_back(builtin_name("resource", OP_JS_RESOURCE));
|
||||
op_names.push_back(builtin_name("job-start", OP_JS_START));
|
||||
op_names.push_back(builtin_name("job-end", OP_JS_END));
|
||||
op_names.push_back(builtin_name("job2resource", OP_JS_JOB2RESOURCE));
|
||||
op_names.push_back(builtin_name("js-model", OP_JS_MODEL));
|
||||
op_names.push_back(builtin_name("kv", OP_AL_KV));
|
||||
op_names.push_back(builtin_name("alist", OP_AL_LIST));
|
||||
}
|
||||
}
|
||||
|
||||
void jobshop_decl_plugin::get_sort_names(svector<builtin_name> & sort_names, symbol const & logic) {
|
||||
if (logic == symbol("JOBSHOP")) {
|
||||
if (logic == symbol("CSP")) {
|
||||
sort_names.push_back(builtin_name("Job", JOB_SORT));
|
||||
sort_names.push_back(builtin_name("Resource", RESOURCE_SORT));
|
||||
}
|
||||
|
@ -124,7 +143,7 @@ expr * jobshop_decl_plugin::get_some_value(sort * s) {
|
|||
|
||||
|
||||
jobshop_util::jobshop_util(ast_manager& m): m(m) {
|
||||
m_fid = m.mk_family_id("jobshop");
|
||||
m_fid = m.mk_family_id("csp");
|
||||
m_plugin = static_cast<jobshop_decl_plugin*>(m.get_plugin(m_fid));
|
||||
}
|
||||
|
||||
|
@ -174,3 +193,11 @@ app* jobshop_util::mk_job2resource(unsigned j) {
|
|||
return m.mk_const(m.mk_func_decl(m_fid, OP_JS_JOB2RESOURCE, 1, &p, 0, (sort*const*)nullptr, nullptr));
|
||||
}
|
||||
|
||||
bool jobshop_util::is_resource(expr* e, unsigned& r) {
|
||||
return is_app_of(e, m_fid, OP_JS_RESOURCE) && (r = resource2id(e), true);
|
||||
}
|
||||
|
||||
bool jobshop_util::is_job(expr* e, unsigned& j) {
|
||||
return is_app_of(e, m_fid, OP_JS_JOB) && (j = job2id(e), true);
|
||||
}
|
||||
|
||||
|
|
|
@ -68,7 +68,8 @@ Revision History:
|
|||
|
||||
enum js_sort_kind {
|
||||
JOB_SORT,
|
||||
RESOURCE_SORT
|
||||
RESOURCE_SORT,
|
||||
ALIST_SORT
|
||||
};
|
||||
|
||||
enum js_op_kind {
|
||||
|
@ -76,7 +77,10 @@ enum js_op_kind {
|
|||
OP_JS_RESOURCE, // value of type resource
|
||||
OP_JS_START, // start time of a job
|
||||
OP_JS_END, // end time of a job
|
||||
OP_JS_JOB2RESOURCE // resource associated with job
|
||||
OP_JS_JOB2RESOURCE, // resource associated with job
|
||||
OP_JS_MODEL, // jobscheduler model
|
||||
OP_AL_KV, // key-value pair
|
||||
OP_AL_LIST // tagged list
|
||||
};
|
||||
|
||||
class jobshop_decl_plugin : public decl_plugin {
|
||||
|
@ -96,9 +100,11 @@ public:
|
|||
expr * get_some_value(sort * s) override;
|
||||
sort * mk_job_sort() const { return m_job_sort; }
|
||||
sort * mk_resource_sort() const { return m_resource_sort; }
|
||||
sort * mk_alist_sort() const { return m_alist_sort; }
|
||||
private:
|
||||
sort* m_job_sort;
|
||||
sort* m_resource_sort;
|
||||
sort* m_alist_sort;
|
||||
sort* m_int_sort;
|
||||
|
||||
void check_arity(unsigned arity);
|
||||
|
@ -116,12 +122,59 @@ public:
|
|||
sort* mk_resource_sort();
|
||||
|
||||
app* mk_job(unsigned j);
|
||||
bool is_job(expr* e, unsigned& j);
|
||||
unsigned job2id(expr* j);
|
||||
|
||||
app* mk_resource(unsigned r);
|
||||
bool is_resource(expr* e, unsigned& r);
|
||||
unsigned resource2id(expr* r);
|
||||
|
||||
app* mk_start(unsigned j);
|
||||
app* mk_end(unsigned j);
|
||||
app* mk_job2resource(unsigned j);
|
||||
|
||||
// alist features
|
||||
app* mk_kv(symbol const& key, rational const& r) {
|
||||
parameter ps[2] = { parameter(key), parameter(r) };
|
||||
return m.mk_const(m.mk_func_decl(m_fid, OP_AL_KV, 2, ps, 0, (sort*const*)nullptr, nullptr));
|
||||
}
|
||||
app* mk_kv(symbol const& key, symbol const& val) {
|
||||
parameter ps[2] = { parameter(key), parameter(val) };
|
||||
return m.mk_const(m.mk_func_decl(m_fid, OP_AL_KV, 2, ps, 0, (sort*const*)nullptr, nullptr));
|
||||
}
|
||||
app* mk_alist(symbol const& key, unsigned n, expr* const* args) {
|
||||
parameter p(key);
|
||||
return m.mk_app(m.mk_func_decl(m_fid, OP_AL_LIST, 1, &p, n, args, nullptr), n, args);
|
||||
|
||||
}
|
||||
bool is_kv(expr* e, symbol& key, rational& r) {
|
||||
return
|
||||
(is_app_of(e, m_fid, OP_AL_KV) &&
|
||||
to_app(e)->get_decl()->get_num_parameters() == 2 &&
|
||||
to_app(e)->get_decl()->get_parameter(1).is_rational() &&
|
||||
(r = to_app(e)->get_decl()->get_parameter(1).get_rational(), key = to_app(e)->get_decl()->get_parameter(0).get_symbol(), true)) ||
|
||||
(is_app_of(e, m_fid, OP_AL_KV) &&
|
||||
to_app(e)->get_decl()->get_num_parameters() == 2 &&
|
||||
to_app(e)->get_decl()->get_parameter(1).is_int() &&
|
||||
(r = rational(to_app(e)->get_decl()->get_parameter(1).get_int()), key = to_app(e)->get_decl()->get_parameter(0).get_symbol(), true));
|
||||
|
||||
|
||||
}
|
||||
bool is_kv(expr* e, symbol& key, symbol& s) {
|
||||
return is_app_of(e, m_fid, OP_AL_KV) &&
|
||||
to_app(e)->get_decl()->get_num_parameters() == 2 &&
|
||||
to_app(e)->get_decl()->get_parameter(1).is_symbol() &&
|
||||
(s = to_app(e)->get_decl()->get_parameter(1).get_symbol(), key = to_app(e)->get_decl()->get_parameter(0).get_symbol(), true);
|
||||
}
|
||||
|
||||
bool is_model(expr* e) const { return is_app_of(e, m_fid, OP_JS_MODEL); }
|
||||
bool is_alist(expr* e) const { return is_app_of(e, m_fid, OP_AL_LIST); }
|
||||
bool is_alist(expr* e, symbol& key) const {
|
||||
return is_alist(e) &&
|
||||
to_app(e)->get_decl()->get_num_parameters() == 1 &&
|
||||
to_app(e)->get_decl()->get_parameter(0).is_symbol() &&
|
||||
(key = to_app(e)->get_decl()->get_parameter(0).get_symbol(), true);
|
||||
}
|
||||
|
||||
// app* mk_model(unsigned n, expr* const* alist);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue