-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathminisat.cc
104 lines (85 loc) · 1.95 KB
/
minisat.cc
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "minisat/core/Solver.h"
using namespace SmtenMinisat;
Lit lit(int x)
{
Lit l;
l.x = x;
return l;
}
int unlit(Lit x)
{
return x.x;
}
extern "C" Solver* minisat_new()
{
return new Solver();
}
extern "C" void minisat_delete(Solver* s)
{
delete s;
}
extern "C" int minisat_true(Solver* s)
{
Var x = s->newVar();
s->addClause(mkLit(x, true));
return unlit(mkLit(x, true));
}
extern "C" int minisat_false(Solver* s)
{
Var x = s->newVar();
s->addClause(mkLit(x, true));
return unlit(mkLit(x, false));
}
extern "C" int minisat_var(Solver* s)
{
return unlit(mkLit(s->newVar(), true));
}
extern "C" int minisat_not(Solver* s, int x)
{
return unlit(~lit(x));
}
extern "C" int minisat_and(Solver* s, int a, int b)
{
Lit x = mkLit(s->newVar(), true);
s->addClause(~x, lit(a)); // x -> a
s->addClause(~x, lit(b)); // x -> b
s->addClause(~lit(a), ~lit(b), x); // a & b -> x
return unlit(x);
}
extern "C" int minisat_or(Solver* s, int a, int b)
{
Lit x = mkLit(s->newVar(), true);
s->addClause(~lit(a), x); // a -> x
s->addClause(~lit(b), x); // b -> x
s->addClause(~x, lit(a), lit(b)); // x -> a | b
return unlit(x);
}
extern "C" int minisat_ite(Solver* s, int p, int a, int b)
{
Lit x = mkLit(s->newVar(), true);
s->addClause(~lit(p), lit(a), ~x); // p -> a | ~x
s->addClause(~lit(p), ~lit(a), x); // p -> ~a | x
s->addClause(lit(p), lit(b), ~x); // ~p -> b | ~x
s->addClause(lit(p), ~lit(b), x); // ~p -> ~b | x
return unlit(x);
}
extern "C" void minisat_assert(Solver* s, int x)
{
s->addClause(lit(x));
}
// 0 if UNSAT
// 1 if SAT
extern "C" int minisat_check(Solver* s)
{
if (!s->simplify()) {
return 0;
}
bool r = s->solve();
return r ? 1 : 0;
}
// 0 if False
// 1 if True
extern "C" int minisat_getvar(Solver* s, int v)
{
return toInt(s->model[var(lit(v))]);
}