Stable models are one of the most popular semantics for non-stratified
programs. The intuition behind the stable model semantics for a
ground program can be seen as follows. Each negative literal
in
is treated as a special kind of atom called an
assumption. To compute the stable model, a guess is made about
whether each assumption is true or false, creating an assumption set,
. Once an assumption set is given, negative literals do not need
to be evaluated as in the well-founded semantics; rather an evaluation
treats a negative literal as an atom that succeeds or fails depending
on whether it is true or false in
.
writes_manual(terry)-![]() |
writes_manual(kostis)-![]() |
has_time(terry). |
has_time(kostis). |
writes_manual(terry)-![]() |
writes_manual(kostis)-![]() |
has_time(terry). |
has_time(kostis). |
Computing stable models is an intractable problem, meaning that any algorithm to evaluate stable models may have to fall back on generating possible assumption sets, in pathological cases. For a ground program, if it is ensured that residual clauses are produced for all atoms, using the residual program may bring a performance gain since the search space of algorithms to compute stable models will be correspondingly reduced. In fact, by using XSB in conjunction with a Stable Model generator, Smodels [30], an efficient system has been devised for model checking of concurrent systems that is 10-20 times faster than competing systems [28].