Talk:DPLL algorithm

From Wikipedia, the free encyclopedia
Jump to: navigation, search
WikiProject Computer science (Rated Start-class, High-importance)
WikiProject icon This article is within the scope of WikiProject Computer science, a collaborative effort to improve the coverage of Computer science related articles on Wikipedia. If you would like to participate, please visit the project page, where you can join the discussion and see a list of open tasks.
Start-Class article Start  This article has been rated as Start-Class on the project's quality scale.
 High  This article has been rated as High-importance on the project's importance scale.


I've checked the original CACM-1962 paper, and it does not mention subsumption in the DPLL algorithm at all. The three rules are I) the one literal clause rule, now known as "unit propagation", II) affirmative-negative rule, now "pure literal elemination", and III*) Splitting Rule, still known under that name. The authors do mention "systematic elemination of redundancy", but only with respect to the original Davis-Putnam algorithm, not with respect to DPLL. I'll revert todays change (with some extra clarification). If anyone has more information, I'm interested in hearing it. --Stephan Schulz 17:40, 24 October 2005 (UTC)

Ok. I had based my description on not-so-recent papers. In particular, I think that one by Crawford and Auton mentioned the clause subsumption rule (and said it was not useful); the fact that the pure literal rule was decided not useful seems to be a very recent finding--I didn't know it. User:Tizio 18:23, 24 October 2005 (UTC)
The "two watch literal" technique pioneered in Chaff has made unit propagation very cheap. In particular, it makes the speed of unit propagation nearly independent of the number of clauses. Thus the gain of a smaller (by number of clauses) formula is nearly nil, while a comparable breakthrough in searching for pure literals has not yet been found. --Stephan Schulz 18:53, 24 October 2005 (UTC)

Good to know! Thanks for the clarification. User:Tizio 21:39, 24 October 2005 (UTC)

In the DPLL pseudocode, why is the second argument provided, given that it is neither used nor returned? Wouldn't the pseudocode be clearer and shorter without this second argument? If the second argument were to be retained, shouldn't the text describe how the algorithm can be modified to return a satisfying truth assignment if there is one? 04:10, 29 October 2006 (UTC)

But it is used, in the recursive calls to the sub-provers. It's not returned, though. I've added a note to this effect.--Stephan Schulz 22:54, 29 October 2006 (UTC)

It is true that is used to call the recursive calls, but it is never used in that function, and it is never passed to a different function. In the current example, we don't care about what is the whole current assignation of variables, we only care about the current assignation, but not even that is necessary to pass because we simplify the formula before calling DPLL again. I also think this should be changed. This argument could be usefull if in the middle of the program we would need to now about the previous assignments that have been done, but not otherwise. —Preceding unsigned comment added by (talkcontribs) 02:53, 6 August 2007

Indeed, since assigned literals are added to the formula, there is no need to carry the assignment to the recursive calls. Tizio 08:50, 6 August 2007 (UTC)

CNF is ambiguous[edit]

The article goes

The DPLL algorithm can be summarized in the following pseudocode, where Φ is the CNF formula:

Does CNF mean Conjunctive normal form or Clausal normal form in this context? Also see CNF —Preceding unsigned comment added by (talk) 09:28, 7 November 2007 (UTC)

It does not matter. The two are strictly isomorphic (and fairly obviously so for propositional logic). --Stephan Schulz 10:24, 7 November 2007 (UTC)
Here CNF is Conjunctive Normal Form.

Pseudo code is ambiguous[edit]

Seems to me that the 'l' variable is used to represent both unit clause and literal:

  for every unit clause l in Φ
     Φ=unit-propagate(l, Φ);
  for every literal l that occurs pure in Φ
     Φ=pure-literal-assign(l, Φ);
  l := choose-literal(Φ);

Wouldn't it be clearer to have:

  for every unit clause {l} in Φ
     Φ=unit-propagate(l, Φ);
  for every literal l that occurs pure in Φ
     Φ=pure-literal-assign(l, Φ);
  l := choose-literal(Φ);

Very confusing the way it is currently... —Preceding unsigned comment added by (talk) 01:49, 15 November 2007 (UTC)

Instead of killing the author in plenty of painful ways, I'd suggest rewriting the pseudocode so that it doesn't use variables which are single letters, but instead names them with respect to their role in the algorithm. Still I cannot resist suggesting a special warm place in hell should be reserved for those who use minuscule Latin letter "L" to name variables. I could see them fitting nicely together, right next to those who use inconsistent spacing and minus signs in function names in the same time they use infix math operators. Aren't there any standards for how code should be written in Wiki? PS. This algorithm in its current form worth nothing w/o "unit propagation" and "pure literal assign" being defined. (talk) 23:01, 19 October 2013 (UTC)

Purity elimination eliminated[edit]

I'm a bit concerned about the complete elimination of the text on purity. As far as I know, most modern solvers indeed omit it (MiniSAT does not seem to implement it, and Chaff and Berkmin certainly don't. See [1]). --Stephan Schulz (talk) 21:17, 24 June 2011 (UTC)

Of course, nowadays solvers do not use this algorithm, they use the CDCL algorithm. See the CDCL algorithm's page. — Preceding unsigned comment added by (talk) 14:15, 22 December 2015 (UTC)

2 watched literals[edit]

A possible addition to the article could be that modern SAT solver use "2 watched literals" to efficiently implement DPLL. — Preceding unsigned comment added by RainCT (talkcontribs) 11:44, 22 January 2012 (UTC)

The 2 watched literals is a structure used with the CDCL algorithm. — Preceding unsigned comment added by (talk) 14:24, 22 December 2015 (UTC)

Problem in the example[edit]

I think there is a problem in the example. After assigning a to 0, b should be assigned to 0 due to the pure literal rule and not to a decision. — Preceding unsigned comment added by Ludowsky (talkcontribs) 14:37, 22 December 2015 (UTC)