signature ARGO_CDCL = sig (* types *) type'a explain = Argo_Lit.literal -> 'a -> Argo_Cls.clause * 'a
(* context *) type context val context: context val assignment_of: context -> Argo_Lit.literal -> booloption
(* enriching the context *) val add_atom: Argo_Term.term -> context -> context val add_axiom: Argo_Cls.clause -> context -> int * context
(* main operations *) val assume: 'a explain -> Argo_Lit.literal -> context -> 'a ->
Argo_Cls.clause option * context * 'a val propagate: context -> Argo_Common.literal Argo_Common.implied * context val decide: context -> context option val analyze: 'a explain -> Argo_Cls.clause -> context -> 'a -> int * context * 'a val restart: context -> int * context end
structure Argo_Cdcl: ARGO_CDCL = struct
(* basic types and operations *)
type'a explain = Argo_Lit.literal -> 'a -> Argo_Cls.clause * 'a
datatype reason =
Level0 of Argo_Proof.proof |
Decided of int * int * (bool * reason) Argo_Termtab.table |
Implied of int * int * (Argo_Lit.literal * reason) list * Argo_Proof.proof |
External of int
fun level_of (Level0 _) = 0
| level_of (Decided (l, _, _)) = l
| level_of (Implied (l, _, _, _)) = l
| level_of (External l) = l
type justified = Argo_Lit.literal * reason
type watches = Argo_Cls.clause list * Argo_Cls.clause list
fun get_watches wts t = Argo_Termtab.lookup wts t fun map_watches f t wts = Argo_Termtab.map_default (t, ([], [])) f wts
fun map_lit_watches f (Argo_Lit.Pos t) = map_watches (apsnd f) t
| map_lit_watches f (Argo_Lit.Neg t) = map_watches (apfst f) t
fun watches_of wts (Argo_Lit.Pos t) = (case get_watches wts t of SOME (ws, _) => ws | NONE => [])
| watches_of wts (Argo_Lit.Neg t) = (case get_watches wts t of SOME (_, ws) => ws | NONE => [])
fun attach cls lit = map_lit_watches (cons cls) lit fun detach cls lit = map_lit_watches (remove Argo_Cls.eq_clause cls) lit
(* literal values *)
fun raw_val_of vals lit = Argo_Termtab.lookup vals (Argo_Lit.term_of lit)
fun justified vals lit = Option.map (pair lit o snd) (raw_val_of vals lit) fun the_reason_of vals lit = snd (the (raw_val_of vals lit))
fun assign (Argo_Lit.Pos t) r = Argo_Termtab.update (t, (true, r))
| assign (Argo_Lit.Neg t) r = Argo_Termtab.update (t, (false, r))
(* context *)
type trail = int * justified list(* the trail height and the sequence of assigned literals *)
type context = {
units: Argo_Common.literal list, (* the literals that await propagation *)
level: int, (* the decision level *)
trail: int * justified list, (* the trail height and the sequence of assigned literals *)
vals: (bool * reason) Argo_Termtab.table, (* mapping of terms to polarity and reason *)
wts: watches Argo_Termtab.table, (* clauses watched by terms *)
heap: Argo_Heap.heap, (* max-priority heap for decision heuristics *)
clss: Argo_Cls.table, (* information about clauses *)
prf: Argo_Proof.context} (* the proof context *)
fun mk_context units level trail vals wts heap clss prf: context =
{units=units, level=level, trail=trail, vals=vals, wts=wts, heap=heap, clss=clss, prf=prf}
fun drop_levels n (Decided (l, h, vals)) trail heap = if l = n + 1then ((h, trail), vals, heap) else drop_literal n trail heap
| drop_levels n _ tr heap = drop_literal n tr heap
and drop_literal n ((lit, r) :: trail) heap = drop_levels n r trail (Argo_Heap.insert lit heap)
| drop_literal _ [] _ = raise Fail "bad trail"
fun backjump_to new_level (cx as {level, trail=(_, tr), wts, heap, clss, prf, ...}: context) = if new_level >= level then (0, cx) else letval (trail, vals, heap) = drop_literal (Integer.max 0 new_level) tr heap in (level - new_level, mk_context [] new_level trail vals wts heap clss prf) end
(* proofs *)
fun tag_clause (lits, p) prf = Argo_Proof.mk_clause lits p prf |>> pair lits
fun level0_unit_proof (lit, Level0 p') (p, prf) = Argo_Proof.mk_unit_res lit p p' prf
| level0_unit_proof _ _ = raise Fail "bad reason"
fun level0_unit_proofs lrs p prf = fold level0_unit_proof lrs (p, prf)
fun unsat ({vals, prf, ...}: context) (lits, p) = letval lrs = map (fn lit => (lit, the_reason_of vals lit)) lits in Argo_Proof.unsat (fst (level0_unit_proofs lrs p prf)) end
fun assignment_of ({vals, ...}: context) = value_of vals
fun replace_watches old new cls ({units, level, trail, vals, wts, heap, clss, prf}: context) =
mk_context units level trail vals (attach cls new (detach cls old wts)) heap clss prf
(* clause operations *)
fun as_clause cls ({units, level, trail, vals, wts, heap, clss, prf}: context) = letval (cls, prf) = tag_clause cls prf in (cls, mk_context units level trail vals wts heap clss prf) end
fun min lit i NONE = SOME (lit, i)
| min lit i (SOME (lj as (_, j))) = SOME (if i < j then (lit, i) else lj)
fun level_ord ((_, r1), (_, r2)) = int_ord (level_of r2, level_of r1) fun add_max lr lrs = Ord_List.insert level_ord lr lrs
fun part [] [] t us fs = (t, us, fs)
| part (NONE :: vs) (l :: ls) t us fs = part vs ls t (l :: us) fs
| part (SOME (true, r) :: vs) (l :: ls) t us fs = part vs ls (min l (level_of r) t) us fs
| part (SOME (false, r) :: vs) (l :: ls) t us fs = part vs ls t us (add_max (l, r) fs)
| part _ _ _ _ _ = raise Fail "mismatch between values and literals"
fun backjump_add (lit, r) (lit', r') cls lrs cx = let val add = if level_of r = level_of r' then attach_clause lit lit' cls else add_asserting lit lit' cls lrs in backjump_to (level_of r - 1) cx ||> add end
fun redundant stop (lr as (lit, Implied (_, h, lrs, p))) (lps, essential_lrs) = (
(fold (rec_redundant stop) lrs ((h, lit, p) :: lps), essential_lrs) handle ESSENTIAL () => (lps, lr :: essential_lrs))
| redundant _ lr (lps, essential_lrs) = (lps, lr :: essential_lrs)
fun resolve_step (_, l, p') (p, prf) = Argo_Proof.mk_unit_res l p p' prf
fun reduce lrs p prf = let val lits = map fst lrs val levels = fold (insert (op =) o level_of o snd) lrs [] fun stop lit level = if member Argo_Lit.eq_lit lits lit thentrue elseif member (op =) levels level thenfalse elseraise ESSENTIAL ()
val (lps, lrs) = fold (redundant stop) lrs ([], []) in (lrs, fold resolve_step (sort_distinct history_ord lps) (p, prf)) end
fun analyze explain cls (cx as {level, trail, vals, wts, heap, clss, prf, ...}: context) x = let fun from_clause [] trail ms lrs h p prf x =
from_trail (first_lit (marked ms) trail) ms lrs h p prf x
| from_clause ((lit, r) :: clause_lrs) trail ms lrs h p prf x =
from_reason r lit clause_lrs trail ms lrs h p prf x
and from_reason (Level0 p') lit clause_lrs trail ms lrs h p prf x = letval (p, prf) = Argo_Proof.mk_unit_res lit p p' prf in from_clause clause_lrs trail ms lrs h p prf x end
| from_reason r lit clause_lrs trail ms lrs h p prf x = if level_of r = level then if marked ms lit then from_clause clause_lrs trail ms lrs h p prf x else from_clause clause_lrs trail (lit :: ms) lrs (Argo_Heap.increase lit h) p prf x else let val (lrs, h) = if AList.defined Argo_Lit.eq_id lrs lit then (lrs, h) else ((lit, r) :: lrs, Argo_Heap.increase lit h) in from_clause clause_lrs trail ms lrs h p prf x end
and from_trail ((lit, _), _) [_] lrs h p prf x = letval (lrs, (p, prf)) = reduce lrs p prf in (Argo_Lit.negate lit :: map fst lrs, lrs, h, p, prf, x) end
| from_trail ((lit, r), trail) ms lrs h p prf x = let val (clause_lrs, p', x) = justification_for explain vals lit r x val (p, prf) = Argo_Proof.mk_unit_res lit p' p prf in from_clause clause_lrs trail (unmark lit ms) lrs h p prf x end
val (ls, p) = cls val lrs = if level = 0then unsat cx cls elsemap (fn l => (l, the_reason_of vals l)) ls val (lits, lrs, heap, p, prf, x) = from_clause lrs (snd trail) [] [] heap p prf x val heap = Argo_Heap.decay heap val (levels, cx) = learn_clause lrs (lits, p) (mk_context [] level trail vals wts heap clss prf) in (levels, cx, x) end
(* restarting *)
fun restart cx = backjump_to 0 cx
end
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.