83 cout <<
"==========================================================\n";
84 cout <<
"Example 1: Basic Boolean Formula\n";
85 cout <<
"==========================================================\n\n";
95 sat.add_clause(
sat.pos_lit(0),
sat.pos_lit(1));
96 sat.add_clause(
sat.neg_lit(0),
sat.pos_lit(2));
97 sat.add_clause(
sat.neg_lit(1),
sat.neg_lit(2));
98 sat.add_clause(
sat.pos_lit(0),
sat.pos_lit(2));
101 <<
" (x0 OR x1) AND (~x0 OR x2) AND (~x1 OR ~x2) AND (x0 OR x2)\n\n";
107 cout <<
"SATISFIABLE. Assignment:\n";
108 for (
size_t i = 0; i <
assignment.size(); ++i)
109 cout <<
" x" << i <<
" = " << (
assignment(i) ?
"true" :
"false")
113 cout <<
"UNSATISFIABLE\n";
124 cout <<
"==========================================================\n";
125 cout <<
"Example 2: Signed 1-based Variable API\n";
126 cout <<
"==========================================================\n\n";
135 sat.add_clause_signed(1, 2);
136 sat.add_clause_signed(-1, 3);
137 sat.add_clause_signed(-2, -3);
138 sat.add_clause_signed(1, 3);
140 cout <<
"Formula (same as Example 1, using signed API):\n"
141 <<
" (+1 OR +2) AND (-1 OR +3) AND (-2 OR -3) AND (+1 OR +3)\n\n";
147 cout <<
"SATISFIABLE. Assignment:\n";
148 for (
size_t i = 0; i <
assignment.size(); ++i)
149 cout <<
" x" << i <<
" = " << (
assignment(i) ?
"true" :
"false")
153 cout <<
"UNSATISFIABLE\n";
164 cout <<
"==========================================================\n";
165 cout <<
"Example 3: Graph 2-Coloring via 2-SAT\n";
166 cout <<
"==========================================================\n\n";
175 cout <<
"Path graph 0 - 1 - 2 - 3:\n";
177 sat.add_xor(
sat.pos_lit(0),
sat.pos_lit(1));
178 sat.add_xor(
sat.pos_lit(1),
sat.pos_lit(2));
179 sat.add_xor(
sat.pos_lit(2),
sat.pos_lit(3));
182 cout <<
" 2-colorable? " << (
ok ?
"YES" :
"NO") <<
"\n";
185 cout <<
" Coloring:";
186 for (
size_t i = 0; i < 4; ++i)
187 cout <<
" node" << i <<
"=" << (
assignment(i) ?
"A" :
"B");
195 cout <<
"Triangle 0 - 1 - 2 - 0:\n";
197 sat.add_xor(
sat.pos_lit(0),
sat.pos_lit(1));
198 sat.add_xor(
sat.pos_lit(1),
sat.pos_lit(2));
199 sat.add_xor(
sat.pos_lit(0),
sat.pos_lit(2));
201 auto [
ok,
_] =
sat.solve();
202 cout <<
" 2-colorable? " << (
ok ?
"YES" :
"NO") <<
"\n\n";
207 cout <<
"Square 0 - 1 - 2 - 3 - 0:\n";
209 sat.add_xor(
sat.pos_lit(0),
sat.pos_lit(1));
210 sat.add_xor(
sat.pos_lit(1),
sat.pos_lit(2));
211 sat.add_xor(
sat.pos_lit(2),
sat.pos_lit(3));
212 sat.add_xor(
sat.pos_lit(3),
sat.pos_lit(0));
215 cout <<
" 2-colorable? " << (
ok ?
"YES" :
"NO") <<
"\n";
218 cout <<
" Coloring:";
219 for (
size_t i = 0; i < 4; ++i)
220 cout <<
" node" << i <<
"=" << (
assignment(i) ?
"A" :
"B");
233 cout <<
"==========================================================\n";
234 cout <<
"Example 4: Team Assignment with Constraints\n";
235 cout <<
"==========================================================\n\n";
245 const char *
names[] = {
"Alice",
"Bob",
"Charlie",
"Diana",
"Eve"};
249 sat.add_equiv(
sat.pos_lit(0),
sat.pos_lit(1));
250 sat.add_clause(
sat.neg_lit(2),
sat.neg_lit(3));
251 sat.set_true(
sat.pos_lit(4));
252 sat.add_xor(
sat.pos_lit(4),
sat.pos_lit(1));
254 cout <<
"Constraints:\n"
255 <<
" Alice and Bob: same team\n"
256 <<
" Charlie and Diana: not both on team A\n"
257 <<
" Eve: must be on team A\n"
258 <<
" Eve and Bob: different teams\n\n";
264 cout <<
"SATISFIABLE. Assignment:\n";
265 for (
size_t i = 0; i < 5; ++i)
266 cout <<
" " <<
names[i] <<
" -> team "
270 cout <<
"UNSATISFIABLE: constraints cannot be met\n";
281 cout <<
"==========================================================\n";
282 cout <<
"Example 5: Different Graph Backends\n";
283 cout <<
"==========================================================\n\n";
288 auto run = [](
const string & name,
auto &
sat) {
289 sat.add_xor(
sat.pos_lit(0),
sat.pos_lit(1));
292 cout <<
" " << name <<
": ";
302 run(
"List_Digraph ",
sat);
310 run(
"List_SDigraph",
sat);
318 run(
"Array_Digraph",
sat);
2-SAT solver based on Tarjan's SCC algorithm.
Generic directed graph (digraph) wrapper template.
Arc for graphs implemented with simple adjacency lists.
2-SAT solver using Tarjan's SCC algorithm.
Main namespace for Aleph-w library functions.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
Array-based graph implementation.
Simple graph implementation with adjacency lists.
void example_team_assignment()
void example_graph_backends()
void example_2_coloring()
void example_basic_formula()
void example_signed_api()