KISSAT(1)

KISSAT(1) 🌸

User Commands β€” bestie, it's the Kissat satisfiability solver manual and it's giving main character energy πŸ’…

NAME

kissat β€” Kissat Satisfiability Solver. That's the whole vibe. ✨


DESCRIPTION


okay so <hotpink>`<option>`</hotpink> can be one of these common options:

- **`--help`** β€” print this list of all command line options πŸ“œ
- **`-h`** β€” print only reduced list of command line options ✨
- **`-f`** β€” force writing proofs (to existing CNF alike file) πŸ’ͺ
- **`-l`** β€” print logging messages (see also `--log`) πŸ“
- **`-n`** β€” do not print satisfying assignment πŸ™…β€β™€οΈ
- **`-q`** β€” suppress all messages (see also `--quiet`) 🀫
- **`-s`** β€” print all statistics (see also `--statistics`) πŸ“Š
- **`-v`** β€” increase verbose level (see also `--verbose`) πŸ—£οΈ

Further <hotpink>`<option>`</hotpink> can be one of the following less frequent options:

- **`--banner`** β€” print solver information 🏷️
- **`--build`** β€” print build information πŸ› οΈ
- **`--color`** β€” use colors (default if connected to terminal) 🌈
- **`--no-color`** β€” no colors (default if not connected to terminal) 🚫🌈
- **`--compiler`** β€” print compiler information πŸ§‘β€πŸ’»
- **`--copyright`** β€” print copyright information ©️
- **`--embedded`** β€” print embedded option list πŸ“‹
- **`--force`** β€” same as `-f` (force writing proof) πŸ’₯
- **`--id`** β€” print `git` identifier (SHA-1 hash) πŸ†”
- **`--range`** β€” print option range list πŸ“
- **`--relaxed`** β€” relaxed parsing (ignore DIMACS header) 😌
- **`--strict`** β€” stricter parsing (no empty header lines) 😀
- **`--version`** β€” print version 🏷️

The following solving limits can be enforced:

- **`--conflicts=<limit>`** β€” limit on conflicts ⏳
- **`--decisions=<limit>`** β€” limit on decisions πŸ€”
- **`--time=<seconds>`** β€” time limit in seconds ⏰

Satisfying assignments have by default values for all variables unless `--partial` is specified, then only values are printed for variables which are necessary to satisfy the formula. πŸ’…

The following predefined 'configurations' (option settings) are supported:

- **`--basic`** β€” basic CDCL solving (`--plain` but no restarts, minimize, reduce) 🧱
- **`--default`** β€” default configuration 🌟
- **`--plain`** β€” plain CDCL solving without advanced techniques 🍦
- **`--sat`** β€” target satisfiable instances (`--target=2 --restartint=50`) 🎯
- **`--unsat`** β€” target unsatisfiable instances (`--stable=0`) 🚫

Or <hotpink>`<option>`</hotpink> is one of the following long options:

> okay bestie, this list is long but every single one is iconic, no skips, periodt πŸ’…

- **`--ands=<bool>`** β€” extract and eliminate and gates `[true]` ✨
- **`--backbone=0..2`** β€” binary clause backbone (`2=eager`) `[1]` 🦴
- **`--backboneeffort=0..1e5`** β€” effort in per mille `[20]` πŸ’ͺ
- **`--backbonemaxrounds=1...`** β€” maximum backbone rounds `[1e3]` πŸ”„
- **`--backbonerounds=1...`** β€” backbone rounds limit `[100]` πŸ”„
- **`--bigbigfraction=0..1e3`** β€” big binary clause fraction per mille `[990]` 🐘
- **`--bump=<bool>`** β€” enable variable bumping `[true]` πŸ†™
- **`--bumpreasons=<bool>`** β€” bump reason side literals too `[true]` πŸ†™
- **`--bumpreasonslimit=1...`** β€” relative reason literals limit `[10]` πŸ“
- **`--bumpreasonsrate=1...`** β€” decision rate limit `[10]` ⏱️
- **`--check=0..2`** β€” check model (`1`) and derived clauses (`2`) `[2]` βœ…
- **`--chrono=<bool>`** β€” allow chronological backtracking `[true]` ⏳
- **`--chronolevels=0...`** β€” maximum jumped over levels `[100]` 🦘
- **`--compact=<bool>`** β€” enable compacting garbage collection `[true]` πŸ—‘οΈ
- **`--compactlim=0..100`** β€” compact inactive limit (in percent) `[10]` πŸ“‰
- **`--congruence=<bool>`** β€” congruence closure on extracted gates `[true]` πŸ”—
- **`--congruenceandarity=2..5e7`** β€” AND gate arity limit `[1e6]` πŸ”’
- **`--congruenceands=<bool>`** β€” extract AND gates for congruence closure `[true]` 🧩
- **`--congruencebinaries=<bool>`** β€” extract certain binary clauses `[true]` 🧩
- **`--congruenceites=<bool>`** β€” extract ITE gates for congruence closure `[true]` 🧩
- **`--congruenceonce=<bool>`** β€” congruence closure only initially `[false]` 1️⃣
- **`--congruencexorarity=2..20`** β€” congruence XOR gate arity limit `[4]` πŸ”’
- **`--congruencexorcounts=1...`** β€” XOR counting rounds `[2]` πŸ”„
- **`--congruencexors=<bool>`** β€” extract XOR gates for congruence closure `[true]` 🧩
- **`--decay=1..200`** β€” per mille scores decay `[50]` πŸ“‰
- **`--definitioncores=1..100`** β€” how many cores `[2]` 🍎
- **`--definitions=<bool>`** β€” extract general definitions `[true]` πŸ“–
- **`--definitionticks=0...`** β€” kitten ticks limits `[1e6]` 🐱
- **`--defraglim=50..100`** β€” usable defragmentation limit in percent `[75]` 🧹
- **`--defragsize=10...`** β€” size defragmentation limit `[2^18]` 🧹
- **`--eagersubsume=0..4`** β€” eagerly subsume previous learned clauses `[4]` πŸ¦…
- **`--eliminate=<bool>`** β€” bounded variable elimination BVE `[true]` 🚫
- **`--eliminatebound=0..2^13`** β€” maximum elimination bound `[16]` πŸ”’
- **`--eliminateclslim=1...`** β€” elimination clause size limit `[100]` πŸ“
- **`--eliminateeffort=0..2e3`** β€” effort in per mille `[100]` πŸ’ͺ
- **`--eliminateinit=0...`** β€” initial elimination interval `[500]` ⏱️
- **`--eliminateint=10...`** β€” base elimination interval `[500]` ⏱️
- **`--eliminateocclim=0...`** β€” elimination occurrence limit `[2e3]` πŸ“
- **`--eliminaterounds=1..1e4`** β€” elimination rounds limit `[2]` πŸ”„
- **`--emafast=10..1e6`** β€” fast exponential moving average window `[33]` πŸƒ
- **`--emaslow=100..1e6`** β€” slow exponential moving average window `[1e5]` 🐒
- **`--embedded=<bool>`** β€” parse and apply embedded options `[true]` πŸ“‹
- **`--equivalences=<bool>`** β€” extract and eliminate equivalence gates `[true]` βš–οΈ
- **`--extract=<bool>`** β€” extract gates in variable elimination `[true]` 🧲
- **`--factor=<bool>`** β€” bounded variable addition `[true]` βž•
- **`--factorcandrounds=0...`** β€” candidates reduction rounds `[2]` πŸ”„
- **`--factordelay=0..12`** β€” delaying factor `[4]` ⏳
- **`--factoreffort=0..1e6`** β€” bounded variable effort in per mille `[50]` πŸ’ͺ
- **`--factorhops=1..10`** β€” structural factoring heuristic hops `[3]` 🦘
- **`--factoriniticks=1..1e6`** β€” initial ticks ticks in millions `[700]` πŸ•’
- **`--factorsize=2...`** β€” bounded variable addition clause size `[5]` πŸ“
- **`--factorstructural=<bool>`** β€” structural bounded variable addition `[false]` πŸ—οΈ
- **`--fastel=<bool>`** β€” initial fast variable elimination `[false]` ⚑
- **`--fastelclslim=1...`** β€” fast elimination clause length limit `[100]` πŸ“
- **`--fastelim=1..1e3`** β€” fast elimination resolvents limit `[8]` ⚑
- **`--fasteloccs=1..1e3`** β€” fast elimination occurrence limit `[100]` πŸ“
- **`--fastelrounds=1..1e3`** β€” fast elimination rounds `[4]` πŸ”„
- **`--fastelsub=<bool>`** β€” forward subsuming fast variable elimination `[true]` ⚑
- **`--flushproof=<bool>`** β€” flush proof lines immediately `[false]` 🚽
- **`--focusedtiers=<bool>`** β€” always used focused mode tiers `[true]` 🎯
- **`--forcephase=<bool>`** β€” force initial phase `[false]` πŸ’ͺ
- **`--forward=<bool>`** β€” forward subsumption in BVE `[true]` ➑️
- **`--forwardeffort=0..1e6`** β€” effort in per mille `[100]` πŸ’ͺ
- **`--ifthenelse=<bool>`** β€” extract and eliminate if-then-else gates `[true]` πŸ”€
- **`--incremental=<bool>`** β€” enable incremental solving `[false]` βž•
- **`--jumpreasons=<bool>`** β€” jump binary reasons `[true]` 🦘
- **`--log=0..5`** β€” logging level (`1=on`,`2=more`,`3=check`,`4/5=mem`) `[0]` πŸ“
- **`--lucky=<bool>`** β€” try some lucky assignments `[true]` πŸ€
- **`--luckyearly=<bool>`** β€” lucky assignments before preprocessing `[true]` πŸ€
- **`--luckylate=<bool>`** β€” lucky assignments after preprocessing `[true]` πŸ€
- **`--mineffort=0...`** β€” minimum absolute effort in millions `[10]` πŸ’ͺ
- **`--minimize=<bool>`** β€” learned clause minimization `[true]` πŸ“‰
- **`--minimizedepth=1..1e6`** β€” minimization depth `[1e3]` πŸ•³οΈ
- **`--minimizeticks=<bool>`** β€” count ticks in minimize and shrink `[true]` πŸ•’
- **`--modeinit=10..1e8`** β€” initial focused conflicts limit `[1e3]` ⏱️
- **`--modeint=10..1e8`** β€” focused conflicts interval `[1e3]` ⏱️
- **`--otfs=<bool>`** β€” on-the-fly strengthening `[true]` πŸ›«
- **`--phase=<bool>`** β€” initial decision phase `[true]` πŸŒ”
- **`--phasesaving=<bool>`** β€” enable phase saving `[true]` πŸ’Ύ
- **`--preprocess=<bool>`** β€” initial preprocessing `[true]` πŸ”§
- **`--preprocessbackbone=<bool>`** β€” backbone preprocessing `[true]` 🦴
- **`--preprocesscongruence=<bool>`** β€” congruence preprocessing `[true]` πŸ”—
- **`--preprocessfactor=<bool>`** β€” variable addition preprocessing `[true]` βž•
- **`--preprocessprobe=<bool>`** β€” probing preprocessing `[true]` πŸ”
- **`--preprocessrounds=1...`** β€” initial preprocessing rounds `[1]` πŸ”„
- **`--preprocessweep=<bool>`** β€” sweep preprocessing `[true]` 🧹
- **`--probe=<bool>`** β€” enable probing `[true]` πŸ”
- **`--probeinit=0...`** β€” initial probing interval `[100]` ⏱️
- **`--probeint=2...`** β€” probing interval `[100]` ⏱️
- **`--proberounds=1...`** β€” probing rounds `[2]` πŸ”„
- **`--profile=0..4`** β€” profile level `[2]` πŸ“Š
- **`--promote=<bool>`** β€” promote clauses `[true]` ⬆️
- **`--quiet=<bool>`** β€” disable all messages `[false]` 🀫
- **`--randec=<bool>`** β€” random decisions `[true]` 🎲
- **`--randecfocused=<bool>`** β€” random decisions in focused mode `[true]` 🎲
- **`--randecinit=0...`** β€” random decisions interval `[500]` ⏱️
- **`--randecint=0...`** β€” initial random decisions interval `[500]` ⏱️
- **`--randeclength=1...`** β€” random conflicts length `[10]` πŸ“
- **`--randecstable=<bool>`** β€” random decisions in stable mode `[false]` 🎲
- **`--reduce=<bool>`** β€” learned clause reduction `[true]` πŸ“‰
- **`--reducehigh=0..1e3`** β€” high reduce fraction per mille `[900]` πŸ“‰
- **`--reduceinit=2..1e5`** β€” initial reduce interval `[1e3]` ⏱️
- **`--reduceint=2..1e5`** β€” base reduce interval `[1e3]` ⏱️
- **`--reducelow=0..1e3`** β€” low reduce fraction per mille `[500]` πŸ“‰
- **`--reluctant=<bool>`** β€” stable reluctant doubling restarting `[true]` πŸ”„
- **`--reluctantint=2..2^15`** β€” reluctant interval `[2^10]` ⏱️
- **`--reluctantlim=0..2^30`** β€” reluctant limit (`0=unlimited`) `[2^20]` 🚫
- **`--reorder=0..2`** β€” reorder decisions (`1=stable-mode-only`) `[2]` πŸ”€
- **`--reorderinit=0..1e5`** β€” initial reorder interval `[1e4]` ⏱️
- **`--reorderint=1..1e5`** β€” base reorder interval `[1e4]` ⏱️
- **`--reordermaxsize=2..2^8`** β€” reorder maximum clause size `[100]` πŸ“
- **`--rephase=<bool>`** β€” reinitialization of decision phases `[true]` πŸ”„
- **`--rephaseinit=10..1e5`** β€” initial rephase interval `[1e3]` ⏱️
- **`--rephaseint=10..1e5`** β€” base rephase interval `[1e3]` ⏱️
- **`--restart=<bool>`** β€” enable restarts `[true]` πŸ”„
- **`--restartint=1..1e4`** β€” base restart interval `[1]` ⏱️
- **`--restartmargin=0..25`** β€” fast/slow margin in percent `[10]` πŸ“
- **`--restartreusetrail=<bool>`** β€” restarts tries to reuse trail `[true]` πŸ”„
- **`--seed=0...`** β€” random seed `[0]` 🌱
- **`--shrink=0..3`** β€” learned clauses (`1=bin`,`2=lrg`,`3=rec`) `[3]` πŸ“‰
- **`--simplify=<bool>`** β€” enable probing and elimination `[true]` πŸ”§
- **`--smallclauses=0...`** β€” small clauses limit `[1e5]` πŸ“
- **`--stable=0..2`** β€” enable stable search mode `[1]` 🧘
- **`--statistics=<bool>`** β€” print complete statistics `[false]` πŸ“Š

- <pink>**`--substitute=<bool>`**</pink> β€” swapping a literal for its equivalent literal, like a little glow-up for your clause. Default `<yellow>`true`</yellow>` ✨

- <pink>**`--substituteeffort=1..1e3`**</pink> β€” how much effort to pour into that, measured in per mille. Default `10`.

- <pink>**`--substituterounds=1..100`**</pink> β€” max rounds of substitution, so it doesn't just keep going forever like my playlist. Default `2`.

- <pink>**`--subsumeclslim=1...`**</pink> β€” clause size limit for subsumption. Default `1e3`.

- <pink>**`--subsumeocclim=0...`**</pink> β€” occurrence limit for subsumption. Default `1e3`.

- <pink>**`--sweep=<bool>`**</pink> β€” turn on SAT sweeping 🧹✨ Default `<yellow>`true`</yellow>`.

- <pink>**`--sweepclauses=0...`**</pink> β€” environment clauses. Default `2^10`.

- <pink>**`--sweepcomplete=<bool>`**</pink> β€” run SAT sweeping alllll the way until it's fully done. Default `<yellow>`false`</yellow>`.

- <pink>**`--sweepdepth=0...`**</pink> β€” environment depth. Default `2`.

- <pink>**`--sweepeffort=0..1e4`**</pink> β€” effort in per mille. Default `100`.

- <pink>**`--sweepfliprounds=0...`**</pink> β€” flipping rounds. Default `1`.

- <pink>**`--sweepmaxclauses=2...`**</pink> β€” maximum environment clauses. Default `2^15`.

- <pink>**`--sweepmaxdepth=1...`**</pink> β€” maximum environment depth. Default `3`.

- <pink>**`--sweepmaxvars=2...`**</pink> β€” maximum environment variables. Default `2^13`.

- <pink>**`--sweeprand=<bool>`**</pink> β€” randomize the sweeping environment, chaotic queen behaviour. Default `<yellow>`false`</yellow>`.

- <pink>**`--sweepvars=0...`**</pink> β€” environment variables. Default `2^8`.

- <pink>**`--target=0..2`**</pink> β€” target phases: `1` = stable, `2` = focused. Default `1` πŸ‘‘

- <pink>**`--tier1=1..100`**</pink> β€” learned clause tier one glue limit. Default `2`.

- <pink>**`--tier1relative=0..1e3`**</pink> β€” relative tier one glue limit. Default `500`.

- <pink>**`--tier2=1..1e3`**</pink> β€” learned clause tier two glue limit. Default `6`.

- <pink>**`--tier2relative=0..1e3`**</pink> β€” relative tier two glue limit. Default `900`.

- <pink>**`--transitive=<bool>`**</pink> β€” transitive reduction of binary clauses. Default `<yellow>`true`</yellow>`.

- <pink>**`--transitiveeffort=0..2e3`**</pink> β€” effort in per mille. Default `20`.

- <pink>**`--transitivekeep=<bool>`**</pink> β€” keep the transitivity candidates around. Default `<yellow>`true`</yellow>`.

- <pink>**`--tumble=<bool>`**</pink> β€” tumbled external indices order. Default `<yellow>`true`</yellow>`.

- <pink>**`--verbose=0..3`**</pink> β€” verbosity level. Default `0`, so like, silent-treatment mode by default πŸ™ˆ

- <pink>**`--vivify=<bool>`**</pink> β€” vivify clauses, give them a whole new life πŸ’… Default `<yellow>`true`</yellow>`.

- <pink>**`--vivifyeffort=0..1e3`**</pink> β€” effort in per mille. Default `100`.

- <pink>**`--vivifyfocusedtiers=<bool>`**</pink> β€” use focused tier limits. Default `<yellow>`true`</yellow>`.

- <pink>**`--vivifyirr=0..100`**</pink> β€” relative irredundant effort. Default `3`.

- <pink>**`--vivifysort=<bool>`**</pink> β€” sort the vivification candidates, keep that to-do list tidy. Default `<yellow>`true`</yellow>`.

- <pink>**`--vivifytier1=0..100`**</pink> β€” relative tier1 effort. Default `3`.

- <pink>**`--vivifytier2=0..100`**</pink> β€” relative tier2 effort. Default `3`.

- <pink>**`--vivifytier3=0..100`**</pink> β€” relative tier3 effort. Default `1`.

- <pink>**`--walkeffort=0..1e6`**</pink> β€” effort in per mille. Default `50`.

- <pink>**`--walkinitially=<bool>`**</pink> β€” do an initial local search. Default `<yellow>`false`</yellow>`.

- <pink>**`--warmup=<bool>`**</pink> β€” initialize phases by unit propagation, like stretching before the main character moment. Default `<yellow>`true`</yellow>`.

---

<rainbow>okay bestie, and here's the stuff about the actual FILES πŸ’–</rainbow>

<purple>**`<dimacs>`**</purple> is your input file, in DIMACS format. No `<dimacs>` given? Then the solver reads from `<stdin>` instead β€” it's flexible like that. 🫢

And the glow-up part: if the path ends in `'.bz2'`, `'.gz'`, `'.lzma'`, `'7z'` or `'.xz'`, the solver goes hunting for the matching decompression tool β€” `'bzip2'`, `'gzip'`, `'lzma'`, `'7z'`, or `'xz'` respectively β€” to decompress the input file *on-the-fly*. But first it checks the input file actually has the correct format, i.e. it starts with the corresponding signature bytes. Vibe check before decompression, no cap. πŸ”

If `<proof>` is specified, a proof trace gets written to that file. Special case: if the file name is `'-'`, the proof goes to `<stdout>`, and in that case the **ASCII** version of the **DRAT** format is used. For real files (not `'-'`), the **binary** proof format is used, unless you pass `--no-binary`. πŸ“

Writing compressed proof files works exactly the same way as reading compressed files β€” the compression format comes from the file suffix, and it's checked that the corresponding compression utility can actually be found. Symmetry, she said. ✨

---

> <red>heads up bestie:</red> all of the above is verbatim-what-the-manpage-says, so don't come for me if you set `--substituteeffort=1e3` and your solve takes a lil minute πŸ’€

That's the whole page, fr fr β€” no crumbs left. This one's `kissat 4.0.4`, dated `March 2026`, and it's `KISSAT(1)` in the house πŸ‘‘πŸ¦‹ she ate and left absolutely zero notes. periodt. πŸ’…βœ¨
πŸ“¦ where this page comes from