src/Tools/Argo/argo_cls.ML
changeset 63960 3daf02070be5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/Argo/argo_cls.ML	Thu Sep 29 20:54:44 2016 +0200
@@ -0,0 +1,45 @@
+(*  Title:      Tools/Argo/argo_cls.ML
+    Author:     Sascha Boehme
+
+Representation of clauses. Clauses are disjunctions of literals with a proof that explains
+why the disjunction holds.
+*)
+
+signature ARGO_CLS =
+sig
+  type clause = Argo_Lit.literal list * Argo_Proof.proof
+  val eq_clause: clause * clause -> bool
+
+  (* two-literal watches for clauses *)
+  type table
+  val table: table
+  val put_watches: clause -> Argo_Lit.literal * Argo_Lit.literal -> table -> table
+  val get_watches: table -> clause -> Argo_Lit.literal * Argo_Lit.literal
+end
+
+structure Argo_Cls: ARGO_CLS =
+struct
+
+type clause = Argo_Lit.literal list * Argo_Proof.proof
+
+fun eq_clause ((_, p1), (_, p2)) = Argo_Proof.eq_proof_id (apply2 Argo_Proof.id_of (p1, p2))
+fun clause_ord ((_, p1), (_, p2)) = Argo_Proof.proof_id_ord (apply2 Argo_Proof.id_of (p1, p2))
+
+
+(* two-literal watches for clauses *)
+
+(*
+  The CDCL solver keeps a mapping of some literals to clauses. Exactly two literals
+  of a clause are used to index the clause.
+*)
+
+structure Clstab = Table(type key = clause val ord = clause_ord)
+
+type table = (Argo_Lit.literal * Argo_Lit.literal) Clstab.table
+
+val table: table = Clstab.empty
+
+fun put_watches cls lp table = Clstab.update (cls, lp) table
+fun get_watches table cls = the (Clstab.lookup table cls)
+
+end