GRATgen
|
On ignoring unmarked RAT candidates
When, during backwards checking, the DRAT-trim tool encounters a RAT candidate that is not marked, it prints a warning and ignores the RAT candidate. Here, we briefly discuss the soundness of this in single threaded and multi-threaded mode.
We believe that it is sound to ignore unmarked RAT candidates. We can argue as follows: Let l be the pivot literal, and D the unmarked candidate clause (we have -l in D).
As D is unmarked, it is not used for any proof after the current position, and we could delete it right after the current lemma. Thus, it remains to show that D canot be used in the proof of the current lemma, after it has been ignored. Then, we could delete D before the current lemma, justifying to ignore it.
As l is the pivot literal, it is set to false at the beginning of the proof, making D a tautology. However, tautologies cannot participate in any conflict, thus D will not be used during the proof of the current lemma.
Unsound!
The clause may be marked by another thread, after it has been ignored by this thread.
For our tool, we decided to never ignore unmarked candidate clauses. This may yield slightly more marked clauses, but is thread safe. Currently, we allow the GRAT format to contain invalid RAT candidate IDs. These correspond to unmarked RAT candidates, and are ignored by the checker. TODO: Filter out those during certificate write out (VController::dump_proof()).