The main example SAT instances in TAOCP 7.2.2.2

This tarball contains source programs by which I've generated a variety
of test programs while writing about satisfiability for The Art of
Computer Programming (Section 7.2.2.2, to be included in Volume 4B).

I use my own format for clauses, as described near the beginning of
each of my SAT solvers. The main solvers, called sat0.w through sat13.w,
are online at
  http://www-cs-faculty.stanford.edu/~knuth/programs.html
near the bottom. That same webpage has conversion filters
sat-to-dimacs.w and dimacs-to-sat.w, which transform between this
format and the .cnf files that are used in SAT competitions.

The sources appear in directory "sources". Example clauses that I've
been using as benchmarks appear in the directories "benchmarks-SAT" and
"benchmarks-UNSAT". Some of the benchmarks exceed the default limits
of my solvers; so I usually run them with command-line parameters. For
example, here's the C-shell script I've been using:
   foreach v ( *.sat )
   echo results for $v\:
   ~/tmp/sat13 h14 b10000 T50000000000 $1 < $v > /dev/null
   end
     
There also are directories "benchmarks-SAT-cnf" and "benchmarks-UNSAT-cnf",
which contain the same benchmarks in DIMACS format.

Below I'll try to explain how to install and use the programs by which
I've generated clauses of various kinds while writing the book and
testing my solvers. Each program is written in CWEB; for example,
the source file for the generator `sat-waerden' is `sat-waerden.w'.

Many of these generator programs (and all of the solvers) use the
library of the Stanford GraphBase (libgb.a), especially its
random number generator. They import relevant header files
such as `gb_flip.h'. So you need to download and install the SGB
system, as explained online. You can keep all of these SAT programs
in the same directory as the SGB sources, if you want, because the
Makefile for SGB works also when making the SAT generators, solvers,
and filters.

CWEB programs often have variants that are defined by "change
files," having the extension `.ch'. To make a program called foo-bar,
whose sources are foo.w and foo-bar.ch, I set up the handy UNIX alias
     alias chmake 'ctangle \!* \!$ ; make \!$'
and say
     chmake foo foo-bar
because otherwise it's necessary to type the commands
     ctangle foo foo-bar foo-bar
     make foo-bar
in detail.

All of my examples below assume that `.' is part of my PATH environment.
In other words, I write
     sat-waerden 3 3 9 | sat0
instead of
     ./sat-waerden 3 3 9 | ./sat0
etc. (I don't understand how anybody can work efficiently without
this current-directory-in-execute-path convention, although all of
the books seem to tell me that I shouldn't be doing it!)

The example shell commands below are based on "tcsh" instead of "bash",
in that I use ">!" to mean "redirect the output even though that
file may already exist". (I have "set noclobber", in order to avoid
unintentionally wiping files out.) The bash equivalent, I guess, is >|.

OK now, here are the main examples I've been using, together with
a few of lesser importance.

----- van der Waerden numbers

Make `sat-waerden'. Say for example `sat-waerden 3 10 97' for the
problem of 97-bit strings that have no three equally spaced zeros
and no ten equally spaced ones.

----- dense arithmetic-progression-free sets

Make `sat-arithprog'. Say for example
   sat-arithprog-redux 3 100 27 | sat13
to find a 100-bit string with no three equally spaced ones, but
with 27 ones. And (harder) change 100 to 99, to get an
unsatisfiable problem that tries to do this with only 99 bits.
The first parameter should be 3, 4, 5, or 6.

(I refer to this problem only in one exercise. But it does seem to
make a series of interesting benchmarks, and I would like to know
how to tune the parameters of sat13 so that it treats this series
of problems as efficiently as possible. With the (old) version of SAT13
that was current in August 2013, I gave up on the case of parameters "3 136 33"
after one day, although knowing that this problem was proved to be
unsatisfiable ten years ago, by a programmer who just used backtracking!
Also my program took unexpectedly long in the case "4 76 36".)

----- Langford pairs

Make `sat-dance' and `langford'. The former takes any input that
has been prepared in the format used by my dancing-links programs
and generates clauses for an equivalent satisfiability problem.
The latter generates dancing-links data for Langford pairs, namely
the problem of putting two 1s, ..., two ns into a string of length 2n
so that exactly k digits intervene between the two appearances of k,
for k = 1, 2, ..., n. (This problem is well known to be satisfiable
if and only if k mod 4 is 0 or 3.) Say for example
     langford 12 | sat-dance | sat0
to find a solution when n=12. The unsatisfiable problem that you get
when n=13 is beginning to be a little difficult; and when n=17,
Armin Biere's best parallel solvers needed several days to prove
unsatisfiability when I visited him in May 2013.

Also chmake `sat-dance-heule' and say e.g.
     langford 12 | sat-dance-heule | sat10
to get the corresponding result for what the text calls "langford'".

And chmake `sat-dance-aspvall', `sat-dance-prestwich' to get what the
text calls "langford''" and "langford'''".
(The latter seems to be a winner with respect to langford 10 and sat13.)

There's also a completely different set of clauses; make `sat-newlangford'
and try things like
     sat-newlangford 13 | sat11
     sat-newlangford 13 | sat13
These clauses are better than the others for sat13. (With default
parameters, sat13 is surprisingly bad at all clause sets that I
tried for n=13, although sat10 polishes that case off rather well.
Also curious is that sat10 beats sat11k with the clauses produced
by langford 13 | sat-dance. And sat10 also likes sat-newlangford 10
much better than langford 10 | sat-dance. On the other hand, the
satisfiable case `sat-newlangford 20 | sat10' got nowwhere --- I shut
it off after 12 hours --- while sat13 found a solution almost instantly.)

------ The Erd\H{o}s discrepancy problem

Chmake `sat-erdos-disc sat-erdos-disc-res'. Then say
     sat-erdos-disc-res n | sat11
with n=100, 200, 300, ..., to get solutions to an interesting
combinatorial problem, which is satisfiable if and only if n<1161.
(See the paper by Konev and Lisitsa arXiv:1402.2184 for why this problem
is causing waves.) The difficulty grows rapidly after n passes 600 or so;
sat13 does better than sat11, but I mentioned sat11 above because this
is a pure 3SAT problem. (Konev and Lisitsa used a different encoding,
which I believe is worse than mine but this has yet to be seen.
With theirs, the time for Glucose to prove unsatisfiability for n=1161
was about six hours; Plingeling found a solution for n=1160 in about
13 minutes. SAT13 handled these clauses for n=1161 --- in the untuned version
of February 2014 --- in slightly less than 50 hours (27.6 teramems),
while the case n=1160 was satisfied in slightly less than six hours (4.5 Tmu).

------ Graph coloring

Make `sat-color' and `mcgregor-graph' and `queen-graph'.
Chmake `sat-threshold-sinz-graphs' (in other words do
   chmake sat-threshold-sinz sat-threshold-sinz-graphs
using the alias macro above). The commands
   mcgregor-graph 10
   sat-color mcgregor10.gb 4 | sat13
will color the order-10 McGregor graph with four colors. Also
   sat-color mcgregor10.gb 4 >! /tmp/mcg10.sat
   sat-threshold-sinz-graphs 110 7 mcgregor10.gb 4 >! /tmp/mcg10le7.sat
   cat /tmp/mcg10.sat /tmp/mcg10le7.sat | sat13
will find a four-coloring that uses color 4 at most 7 times.

Alternatively, chmake `sat-threshold-bb-graphs' and use bb instead
of sinz in the above. The difference is that the at-most-7 constraints
are enforced by clauses devised by Bailleux and Boufkhad.

The problems become unsatisfiable if you change from at-most-7 to at-most-6.

A more esoteric variation of McGregor graph coloring asks how many of the
regions can be ``double-colored,'' because their neighbors block out only
two of the four possible colors. I once believed it impossible to color
mcgregor9.gb with more than 17 double-colored regions, but learned later
(via Armin Biere's solvers in 2013) than 18 are possible. To set this up, do
   sat-threshold-bb-graphs-double 90 18 mcgregor9.gb 4 >! /tmp/stbgd90-18.sat
   sat-color-kernel mcgregor9.gb 4 >! /tmp/sck9.sat
   echo 0.8.1\\n0.7.2\\n1.8.3\\n9.8.4 >! /tmp/test9.sat
   cat /tmp/stbgd90-18.sat /tmp/sck9.sat /tmp/test9.sat | sat13
and you get a solution. (I used to think this was a hard problem, but
sat13 now solves it in less than a minute --- only 10 gigamems.)  

Of course graph coloring leads to many other interesting problems. One can say
   queen-graph 5
   sat-color queen5x5.gb 5 | sat13
to color the 5x5 queen graph with five colors. The corresponding
8x8 problem is unsatisfiable; that is, you can't pack eight
solutions of the 8 queens problem together. (That run goes MUCH MUCH
MUCH faster if symmetry is broken by appending the eight unit clauses
0.0.1, 0.1.2, ..., 0.7.8.) On the other hand,
   sat-color queen8x8.gb 9 | sat13
is readily satisfiable.

Replacing `sat-color' by `sat-color-exclusion' appends additional clauses
to ensure that no vertex gets more than one color. Like `sat-color-kernel',
this variant doesn't affect satisfiability.

Replacing `sat-color' by `sat-color-log', `sat-color-log2', or `sat-color-log3'
encodes graph coloring problems in a different way, namely with O(log c)
binary variables per vertex instead of c, in a c-coloring problem.

There's also `sat-color-order', which uses the order encoding for
colors and may be the best of all --- especially when it's combined
with the clauses of `sat-queens-color-order-cliques' and/or
`sat-queens-color-order-organpipe'.

------ Factoring

Make `sat-dadda' and chmake `sat-dadda-lifo', `sat-dadda-miter'. The command
   sat-dadda 14 16 853922530 | sat13
will factor 853922530 into a 14-bit number times a 16-bit number. And
   sat-dadda-lifo 14 16 853922530 | sat13
will do it using a different way of summing the partial products.
(Incidentally, 853922530 can also be factored into 15-bit times 15-bit.)

And the "skeleton in the closet" of SAT solvers is revealed by
   sat-dadda-miter 10 10 | sat13
which simply makes two identical copies of a 10-bit by 10-bit multiplier
circuit and asserts that they give different results. Even on this
small problem, sat13 seems to need nearly 200 gigamems to show unsatisfiability
(while sat11k finishes in 50.2 gigamems).

------ Test patterns for single-stuck-at faults

Here the setup is much less automated. I refer you to pages 10--14 of
Section 7.2.2.2 for further discussion and explanations.

Make `make_prod' and `gates-to-wires' and `gates-stuck' and `sat-gates-stuck';
also chmake `sat-gates-stuck-namekludge'.

Now the program call
   make_prod 16 32
will create `/tmp/prod,16,32.gb', which defines an industrial-strength
parallel multiplication circuit for 16-bit by 32-bit numbers. And
   gates-to-wires /tmp/prod,16,32.gb /tmp/prod,16,32-wires.gb
will convert it to a circuit that takes proper account of the
fanout when one signal is split across several wires (each of which
might fail). Then
   gates-stuck /tmp/prod,16,32-wires.gb 1234567 .9
generates lots of random test cases in order to weed out the faults
that are easily handled. (Parameter 1234567 is the random seed; it
also says that 1234 random trials with no new hits should go by before
stopping. Parameter .9 says that each random input bit is 1 with
probability 0.9.) This run outputs a list of 181 remaining faults
that could be fed to a SAT solver; it begins with
  1A5:36#2 1A11:42#2 1A14:45#2 1P5:33#2
and ends with 0B47:47.

To test fault 1A5:36#2 (which means that wire $A^{5,2}_{36}$ is stuck at 1,
in the book's notation), say
    sat-gates-stuck-namekludge /tmp/prod,16,32-wires.gb 1A5:36#2 | sat13 h9 >! /tmp/tmp
and the result is UNSAT; this fault is undetectable because the
wire is redundant. To test the next fault 1A11:42#2, you have to say
    sat-gates-stuck-namekludge /tmp/prod,16,32-wires.gb 1A114202 | sat13 h9 >! /tmp/tmp
instead, because the nine characters of `1A11:42#2' are too long to be
the name of a variable in my SAT input format. That fault also turns out
to be UNSAT. But
    sat-gates-stuck-namekludge /tmp/prod,16,32-wires.gb 0B47:47 | sat13 h9 >! /tmp/tmp
is satisfiable, and a solution can be found in the X and Y variables
that are recorded in /tmp/tmp.

Only the first four are UNSAT. Most of the others are satisfied quite easily.
But the toughest cases seem to be nontrivial (more than 100 megamems); they are
  1W21#10
  0W21#18
  1W21#19
  0D29:8#16 [call this 0D290816]
  0D34:13#3 [call this 0D341303]
  0D34:13#8 [call this 0D341308]
  0D34:13#9 [call this 0D341309] (the hardest?)
  0B41:41
  0D42:13#2 [call this 0D421302]
  0B42:42
  0D43:9#2
  0B43:43
  0D44:10#2 [call this 0D441002]
[Well, I ranked those only by the performance with no random seed given.
With specified seeds (e.g. "s5" in addition to "h9") they weren't so bad.
The behavior on these satisfiable examples is highly variable.]

------ Learning a simple Boolean function

Here I've got programs that are not at all set up to be general (yet?).
Make sat-synth, sat-synth-data; chmake sat-synth-trunc-kluj. Then say
    sat-synth-data 1 0 >! /tmp/synth.sat
to get a thousand data points from which learning will take place.
Then try
    sat-synth-trunc-kluj 20 4 100 < /tmp/synth.sat | sat13
to see if there's a solution that fits the first 100 points of data for the
particular function (27) in my text, yet it isn't the same function.
[In this example, 108 points give a solution, but 109 gives UNSAT;
thus (27) is uniquely determined by the first 109 data points
in /tmp/synth.sat.]

------ Minimum-time sorting networks

Make sat-mintime-sort, and then say
   sat-mintime-sort 9 5 1 6 2 7 3 8 4 9 | sat13 h10
to get UNSAT, thus proving that no sorting network for nine elements
can sort everything in 6 parallel steps. (This result was first proved
in the 80s with a program that ran for hundreds of hours on a CRAY 2!) Also
   sat-mintime-sort 9 6 1 6 2 7 3 8 4 9 | sat13 h10
is SAT, showing that 7 parallel steps suffice. Both of these are
very easy for sat13, but other solvers seem to fail badly.

------ Conway's Life as example of bounded model checking

Make sat-life and sat-life-filter. Chmake sat-threshold-bb-life15,
sat-life-grid, and sat-life-upper.

Here's how I made the "LIFE in 3" example, which is currently
called Fig. 352 on page 17 of the text:
   sat-life-grid 7 15 3 >! /tmp/slg3.sat
   sat-threshold-bb-life15 105 39 >! /tmp/stb39.sat
   cat 7x15life3.dat /tmp/slg3.sat /tmp/stb39.sat | sat13 h10 | sat-life-filter
and the same sequence but with 39 changed to 38 in three places gives an
unsatisfiable problem.

An interesting unsatisfiable problem, "LIFE in 4", is obtained more
simply by
   sat-life-grid 7 15 4 >! /tmp/slg4.sat
   cat 7x15life4.dat /tmp/slg4.sat | sat13 h10
and one can tune parameters of sat13 by adding options such as
   s1 (or s2 or s3 etc., etc., means the random seed is 1, 2, 3, ...)
   i1 (means restart as often as possible)
   r.75 (means dampen the variable activity scores faster)
and various other options for retention of learned clauses, etc.

A large class of satisfiable test problems is exemplified by
   sat-life-upper -3 8 | sat13 h12 | sat-life-filter
which finds a way to make cells (x,y) alive for x,y<=0 in such a way
that cell (-3,8) will become alive at the earliest possible moment
(which happens to be 8+(8-3)=13 in this case). In general,
`sat-life-upper x0 y0' is allowed for y0>0 and -y0 <= x0;
I've tried all cases with y0<10 and -y0 <= x0 < 10; increasingly
more difficult benchmarks are obtained when the parameters grow.
For example, `sat-life-upper 7 7' creates a problem with
97909 variables and 401836 clauses (of total length 1020174).
(Note that it's best to use "h14" instead of "h12" when there are
this many variables; the h parameter tells sat13 how big to make
its hash tables during input.) With the default values of parameters,
by which I mean the defaults that were current in July 2013,
sat13 needs 65 gigamems to find a solution when (x0,y0)=(7,7),
but only 32 megamems when (x0,y0)=(-3,8). (That is, the number of
accesses to 64-bit memory words is 65 billion or 32 million, respectively.)

The assumption that these problems are always satisfiable is only a
conjecture, but I have little doubt in its truth.

------- Mutual exclusion

My text discusses mutual exclusion protocols as examples of bounded
model checking. Here are some of the example SAT instances that are mentioned:

Each protocol is specified in a simple language that is "compiled" into
clauses by "sat-mutex". For example,
   cat taking-turns.dat | sat-mutex 100 | sat13
is unsatisfiable, meaning that no violation of critical sections is
possible during 100 time steps. However,
   cat taking-turns.dat | sat-mutex-starve 7 5 | sat13
is satisfiable, meaning that Bob can be starved by a cycle that loops
from time 7 to time 5. (Parameters "7 4" would however be UNSAT.)
Also, a bug is detected in another attempted protocol because
   cat hyman.dat | sat-mutex 100 | sat13
is satisfiable. (Also satisfiable if 100 is changed to 9, but UNSAT with 8.)

The protocol of Peterson is more interesting:
  cat peterson.dat | sat-mutex 100 | sat13
is UNSAT, hence mutual exclusion isn't violated during 100 steps. Also
  cat peterson.dat | sat-mutex-distinct 54 | sat13
is satisfiable, hence a path of distinct states X_0 -> X_1 -> ... -> X_{54} 
is possible with this protocol. On the other hand, 54 is max, because
changing it to 55 gives an unsatisfiable set of clauses.

The most difficult protocol I treat (and I think it is original) is
shown to be starvation-free as follows. First
  cat four-bits-ez.dat | sat-mutex-lemmas 1 four-bits-ez.lemmas | sat13
verifies (by being UNSAT) that a given set of "lemmas" is an invariant. Then
  cat four-bits-ez.dat | sat-mutex-distinct-lemmas 12 four-bits-ez.alemmas | sat13
is also UNSAT; hence, if we add the additional lemmas in the "alemmas" file,
the longest sequence of distinct states is at most 11. (And indeed, changing
12 to 11 gives a satisfiable instance, exhibiting such a sequence.) Then
  cat four-bits-ez.dat | sat-mutex-starve-lemmas-11 four-bits-ez.alemmas | sat13
is UNSAT, showing that Alice cannot starve. Similarly, Bob cannot starve;
but the numbers "12" and "11" become "37" and "36", because sequences of
distinct states that satisfy the blemmas can be as long as 36.

You'll have to look at the documentation if you really want to understand this!

------- Random 3SAT

Make sat-rand-rep and say for example
    sat-rand-rep 3 1061 250 314159 | sat11
for a random 3SAT problem with 250 variables and 1061 clauses.
That problem happens to be satisfiable.

If the same random seed 314159 is used with, say,
    sat-rand-rep 3 1062 250 314159 | sat11
you get one more clause --- the first 1061 are the same --- and
these 1062 turn out to be unsatisfiable.

------- Digital tomography

Make sat-tomography, sat-tomography-prep, sat-tomography-filter;
chmake sat-tomography-2nd, sat-tomography-prep-2nd.
Then
    cat cheshire.dots | sat-tomography-prep 25 30 | sat-tomography
should produce a file that matches "cheshire-tom.dat" (which has been
supplied). That file is specifies an easily satisfiable problem.
We can make it harder by
    cat lexlast-5x18 cheshire-tom.dat | sat13 h10 | sat-tomography-filter
and we can make it unsatisfiable by
    cat lexlast-5x19 cheshire-tom.dat | sat13 h10 | sat-tomography-filter
using two other supplied files. Another kind of run
    cat cheshire.dots | sat-tomography-prep-2nd 25 26 | sat-tomography-2nd | sat13 h12 | sat-tomography-filter
is uniquely satisfiable by the first 26 columns of the Cheshire cat image.
(Changing 26 to 30 gives a problem that is also uniquely satisfiable, but
it appears to be much, much harder: My computer needed 160 hours to solve it,
using default parameters on the version of SAT13 that I had in September 2013.)

------- Flower snark line graph coloring

This family of 3SAT problems is based on three-coloring an
interesting family of graphs denoted by L(J_q), where q is odd.
(These graphs need four colors, so the problems are unsatisfiable.)

Make "flower-snark-line" and say for example
    flower-snark-line 15
to generate "fsnarkline15.gb" (the GraphBase representation of L(J_{15})).

Also chmake sat-color sat-color-snark[12345]. Then you can say for example
    sat-color-snark1 15 | sat11
if you have previously made fsnarkline15.gb. The running time for sat11
is roughly proportional to 2^q, but it appears to be linear when
sat13 is used. I don't fully understand why sat13 is so efficient.
I do know that a complex tree resolution strategy will refute the clauses
in O(q^6) steps; but it requires an "intelligent" divide-and-conquer approach!

Several variants are available. For example, sat-color-snark2 adds clauses
that forbid two colors for the same vertex, while sat-color-snark4 goes
the other way and insists that each color class is a maximal independent set.
(The clauses in the latter case belong to 5SAT, not 3SAT.)
In sat-color-snark3, the variables are presented in such a way that
the running time of non-lookahead methods that assign variables one by one
is order 10.25^q(!).

And sat-color-snark-subset leaves out two clauses, leaving a problem
that is satisfiable.

------- Domino covering

Make sat-tatami and chmake sat-tatami-mutilated. Then
  sat-tatami < tatami.dots | sat13 h9
produces one of the eye-catching exercises. And
  sat-tatami < tatamii.dots | sat13 h9
is quickly unsatisfiable (you can't put serifs on the `I'). Also
  sat-tatami-mutilated 8 8 | sat13
is quickly unsatisfiable, proving that the "mutilated chessboard" (an
8x8 board with opposite corners removed) cannot be covered with dominoes.
(The corresponding problem for 16x16 boards required 1.7 teramems
to learn 39 million clauses, when I first tried it. This is a problem
that is probably inherently difficult for regular resolution, but
"easy" for mathematicians or extended resolution.)

------- Posets with no maximal elements

Make sat-poset-nomax; chmake sat-poset-nomax-a and sat-poset-nomax-b. Then
  sat-poset-nomax 20 | sat13
is a set of clauses that is unsatisfiable because they assert the existence
of a partial ordering on 20 elements that has no maximal element. These
clauses for m-element posets are known to have a refutation of size O(m^3).
  sat-poset-nomax-a 20 | sat31
is also unsatisfiable, using only about 1/3 of the former clauses; again
there's a known refutation of size O(m^3). And the remarkable
  sat-poset-nomax-b 20 | sat13
is ALSO unsatisfiable, via a DIFFERENT 1/3 of the original clauses. The
latter appears to take considerably longer to refute, although it also
has a (somewhat more complicated) refutation of size O(m^3). In each case
the running times seem to grow much faster than order m^3.

Incidentally, the clauses of sat-poset-nomax-b are "minimally unsatisfiable":
Remove any clause, and you can satisfy all the others.

------- Boolean chains to synthesize functions

Make sat-chains and chmake sat-chains-lex-1234. Then
   sat-chains 4 9 6996 177e 0001 | sat13
will show how to compute the three bits of x1+x2+x3+x4 in nine steps, while
   sat-chains-lex-1234 4 8 6996 177e 0001 | sat13
will show that it can't be done in eight steps.

------- Late Binding solitaire

After chmake sat-graph-quench sat-graph-quench-noncomm-latebinding-random
(and hearing my apology for using such a long name), you can say
   sat-graph-quench-noncomm-latebinding-random 314159 | sat13
and this will solve a random card game that I've been playing with, off and on,
for more than 40 years. (A full description is in the text.)

------- Quad-free systems of points and lines

Several examples of symmetry-breaking in the text are based on problems
of `quad-free' matrices, aka Zarankewicz's problem in combinatorics.
After making sat-zarank and chmaking sat-zarank-symm you can say, for example,
   sat-zarank 13 13 52 8 8 | sat13
to find the projective plane of order 3, or
   sat-zarank-symm 13 13 52 8 8 | sat13
to prove that no "symmetrical" such system exists. (That would be a
system of 13 points and 13 lines with p_i in l_j if and only if p_j in l_i.)

------- Open shop scheduling

There's also a generator for random open shop scheduling problems, based
on methods of Gu\'eret, Prins, Tamura, Taga, Kitagawa, and Banbara.

Make the programs oss-data and sat-oss; also chmake sat-oss-sym and
sat-oss-sym-scaled. One of the examples that I discuss in the text of
Section 7.2.2.2 was generated by
   oss-data 8 1000 .5 256 31415 | sat-oss-sym-scaled 8 8 129 8 | sat13
and another (after I'd gotten partial results on scaled-down problems) by
   oss-data 8 1000 .5 256 31415 | sat-oss-sym 8 8 1059 | sat13 h13

------- Closest strings

Try also this
   sat-closest-string-dat 200 50 90 100 314159 | sat-closest-string | sat13 h13
to find a binary string that's "closest" to 50 given strings of length 200.
(The running time is several gigamems; but sat8 is 20 to 40 times faster
on instances like this!)

------- Connecting pairs (aka multicommodity routing)

Yet another interesting family of examples comes from (recreational?) graph
theory: To find disjoint paths between given pairs of vertices. Try
   makeboard 11 18 0 0 1 0 0
   sat-connection /tmp/board,11,18,0,0,1,0,0.gb < dudeney-connections.dat | sat13
for an example from Dudeney's Amusements in Mathematics.

------- Tseytin's graph-parity problems

One of the earliest family of hard SAT instances, described by Gregory
Tseytin in 1966, is generated from a given graph foo.gb by, e.g.,
   sat-tseytin foo.gb | sat13
Graphs with large girth lead to particularly difficult problems. The
program "rand-d4g6" generates more-or-less random 4-regular graphs
of girth at least 6; one such graph, with 50 vertices, is d4g6-50-0.gb.
A related generator called sat-eulerian-balance provides simpler 3SAT problems, 
You can also "chmake graph-cyc sat-graph-cyc" to generate endomorphisms
that can speed up instances produced by sat-tseytin and sat-eulerian-balance.

------- A note about understanding the solutions

By the way, I should mention a trick that I use to decipher the outputs
of many of the problems above, when a solution that satisfies the clauses
has been found. Explicit programs sat-life-filter and sat-tomography-filter
have been supplied for the most complex cases. But for the others,
I usually redirect the output to the file /tmp/tmp (say); then with
emacs I open file /tmp/tmp, delete the initial space, change all other
spaces to control-J (newline), and sort-lines. In this way, all of the positive
literals appear at the beginning, in alphabetic order, followed by all of
the negative ones. The symbolic names of the literals explain the result.

------------------------------------------------------------------
Here finally are the names of files that were explicitly or
implicitly mentioned above. These files, plus this README,
should appear in the tarball `SATexamples.tgz'.

sat-waerden.w
sat-arithprog.w
free[3456].dat (data files that give clues to sat-arithprog-redux)
sat-erdos-disc.w
sat-erdos-disc-res.ch
langford.w
sat-dance.w
sat-dance-heule.ch
sat-dance-aspvall.ch
sat-dance-prestwich.ch
sat-newlangford.w
mcgregor-graph.w
queen-graph.w
sat-color.w
sat-color-snark[12345].ch
sat-color-kernel.w
sat-color-exclusion.w
sat-color-snark[12345].ch
sat-color-snark-subset.ch
sat-color-log.w
sat-color-log2.w
sat-color-log3.w
sat-color-order.w
sat-queens-color-order-cliques.w
sat-queens-color-order-cliques2.w
sat-queens-color-order-organpipe.ch
sat-threshold-sinz.w
sat-threshold-sinz-graphs.ch
sat-threshold-bb.w
sat-threshold-bb-graphs.ch
sat-threshold-bb-graphs-double.ch
sat-threshold-bb-equal.w
sat-dadda.w
sat-dadda-lifo.ch
make_prod.w
gates-to-wires.w
gates-stuck.w
sat-gates-stuck.w
sat-gates-stuck-namekludge.ch
sat-gates-stuck-hardest.sh
sat-synth.w
sat-synth-data.w
sat-synth-trunc-kluj.ch
sat-mintime-sort.w
7x15life[1234].dat
sat-life.w
sat-life-filter.w
sat-threshold-bb-life15.ch
sat-life-grid.ch
sat-life-upper.ch
sat-mutex.w
sat-mutex-distinct.ch
sat-mutex-distinct-lemmas.ch
sat-mutex-starve.ch
sat-mutex-starve-lemmas.ch
taking-turns.dat
hyman.dat
peterson.dat
four-bits-ez.dat
four-bits-ez.lemmas
four-bits-ez.alemmas
four-bits-ez.blemmas
sat-tomography.w
sat-tomography-prep.w
sat-tomography-filter.w
cheshire.dots
cheshire-tom.dat
lexlast-5x18
lexlast-5x19
sat-tomography-2nd.ch
sat-tomography-prep-2nd.ch
sat-rand-rep.w
flower-snark-line.w
sat-tatami.w
sat-tatami-mutilated.ch
tatami.dots
tatamii.dots
sat-poset-nomax.w
sat-poset-nomax-a.ch
sat-poset-nomax-b.ch
sat-chains.w
sat-chains-lex-1234.ch
sat-graph-quench.w
sat-graph-quench-noncomm-latebinding-random.ch
sat-zarank.w
sat-zarank-symm.ch
oss-data.w
sat-oss.w
sat-oss-sym.ch
sat-oss-sym-scaled.ch
sat-closest-string.w
sat-closest-string-dat.w
makeboard.w
sat-connection.w
dudeney-connections.dat
sat-tseytin.w
sat-eulerian-balance.w
rand-d4g6.w
d4g6-50-0.gb
ezgraph.w
ezgraph-named.ch
graph-cyc.w
sat-graph-cyc.ch
