-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsorting13.cpp
More file actions
64 lines (48 loc) · 1.81 KB
/
sorting13.cpp
File metadata and controls
64 lines (48 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "common.h"
int sorting13(unsigned size, sortingConstraints constraints) {
z3::context context;
z3::solver s(context, z3::solver::simple());
struct sort : multiSort {
z3::solver& s;
sort(z3::solver& s) : s(s) {}
void add(z3::expr_vector& in, z3::expr_vector& out) override {
for (int i = 1; i < out.size(); i++) {
s.add(z3::ule(out[i - 1], out[i]));
}
z3::context& ctx = s.ctx();
const z3::sort range = in[0].get_sort();
z3::sort_vector domain(ctx);
domain.push_back(ctx.bv_sort(log2i(in.size())));
z3::func_decl mappingFct = ctx.function("mappingFct", domain, range);
z3::expr_vector mapping(ctx);
for (int i = 0; i < in.size(); i++) {
z3::expr e = ctx.constant(("mapping_" + std::to_string(i)).c_str(), domain.back());
s.add(in[i] == mappingFct(i));
s.add(out[i] == mappingFct(e));
s.add(z3::ule(e, in.size() - 1));
z3::expr_vector a = s.assertions();
mapping.push_back(e);
}
for (int j = 0; j < mapping.size(); j++) {
for (int k = j + 1; k < mapping.size(); k++) {
s.add(mapping[j] != mapping[k]);
}
}
}
};
sort sort(s);
applyConstraints(s, size, sort, constraints);
z3::check_result result = s.check();
printStatistics(s);
if (constraints & outputReverse) {
assert(result == z3::unsat);
}
else if (!(constraints & pseudoBoolean)) {
z3::model m = s.get_model();
checkSorting(m, *sort.in, *sort.out, constraints);
}
else {
assert(result == z3::sat);
}
return -1;
}