fix(th-bool-dyn): add clauses in partial check; register simplifier

This commit is contained in:
Simon Cruanes 2022-08-16 21:35:13 -04:00
parent 57941a952a
commit e4acb2cfca
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4

View file

@ -161,7 +161,7 @@ end = struct
| _ -> ()); | _ -> ());
() ()
let tseitin ~final (self : state) solver (acts : SI.theory_actions) let tseitin ~final:_ (self : state) solver (acts : SI.theory_actions)
(lit : Lit.t) (t : term) (v : term bool_view) : unit = (lit : Lit.t) (t : term) (v : term bool_view) : unit =
Log.debugf 50 (fun k -> k "(@[th-bool-dyn.tseitin@ %a@])" Lit.pp lit); Log.debugf 50 (fun k -> k "(@[th-bool-dyn.tseitin@ %a@])" Lit.pp lit);
@ -240,7 +240,7 @@ end = struct
( mk_step_ @@ fun () -> ( mk_step_ @@ fun () ->
Proof_rules.lemma_bool_c "and-e" [ t; Lit.term sub ] )) Proof_rules.lemma_bool_c "and-e" [ t; Lit.term sub ] ))
subs subs
else if final then ( else (
(* axiom [¬(and …t_i)=> \/_i (¬ t_i)], only in final-check *) (* axiom [¬(and …t_i)=> \/_i (¬ t_i)], only in final-check *)
let c = Lit.neg lit :: List.map Lit.neg subs in let c = Lit.neg lit :: List.map Lit.neg subs in
add_axiom c add_axiom c
@ -258,7 +258,7 @@ end = struct
( mk_step_ @@ fun () -> ( mk_step_ @@ fun () ->
Proof_rules.lemma_bool_c "or-i" [ t; Lit.term sub ] )) Proof_rules.lemma_bool_c "or-i" [ t; Lit.term sub ] ))
subs subs
else if final then ( else (
(* axiom [lit => \/_i subs_i] *) (* axiom [lit => \/_i subs_i] *)
let c = Lit.neg lit :: subs in let c = Lit.neg lit :: subs in
add_axiom c (mk_step_ @@ fun () -> Proof_rules.lemma_bool_c "or-e" [ t ]) add_axiom c (mk_step_ @@ fun () -> Proof_rules.lemma_bool_c "or-e" [ t ])
@ -266,37 +266,35 @@ end = struct
| B_imply (a, b) -> | B_imply (a, b) ->
let a = Lit.atom a in let a = Lit.atom a in
let b = Lit.atom b in let b = Lit.atom b in
if Lit.sign lit && final then ( if Lit.sign lit then (
(* axiom [lit => a => b] *) (* axiom [lit => a => b] *)
let c = [ Lit.neg lit; Lit.neg a; b ] in let c = [ Lit.neg lit; Lit.neg a; b ] in
add_axiom c add_axiom c
(mk_step_ @@ fun () -> Proof_rules.lemma_bool_c "imp-e" [ t ]) (mk_step_ @@ fun () -> Proof_rules.lemma_bool_c "imp-e" [ t ])
) else if not @@ Lit.sign lit then ( ) else if not @@ Lit.sign lit then (
(* propagate [¬ lit => ¬b] and [¬lit => a] *) (* propagate [¬ lit => ¬b] and [¬lit => a] *)
Stat.incr self.n_propagate; add_axiom
SI.propagate_l solver acts a [ lit ] [ a; Lit.neg lit ]
( mk_step_ @@ fun () -> ( mk_step_ @@ fun () ->
Proof_rules.lemma_bool_c "imp-i" [ t; Lit.term a ] ); Proof_rules.lemma_bool_c "imp-i" [ t; Lit.term a ] );
Stat.incr self.n_propagate; add_axiom
SI.propagate_l solver acts (Lit.neg b) [ lit ] [ Lit.neg b; Lit.neg lit ]
( mk_step_ @@ fun () -> ( mk_step_ @@ fun () ->
Proof_rules.lemma_bool_c "imp-i" [ t; Lit.term b ] ) Proof_rules.lemma_bool_c "imp-i" [ t; Lit.term b ] )
) )
| B_ite (a, b, c) -> | B_ite (a, b, c) ->
assert (T.is_bool b); assert (T.is_bool b);
if final then ( (* boolean ite:
(* boolean ite: just add [a => (ite a b c <=> b)]
just add [a => (ite a b c <=> b)] and [¬a => (ite a b c <=> c)] *)
and [¬a => (ite a b c <=> c)] *) let lit_a = Lit.atom a in
let lit_a = Lit.atom a in add_axiom
add_axiom [ Lit.neg lit_a; Lit.make_eq self.tst t b ]
[ Lit.neg lit_a; Lit.make_eq self.tst t b ] (mk_step_ @@ fun () -> Proof_rules.lemma_ite_true ~ite:t);
(mk_step_ @@ fun () -> Proof_rules.lemma_ite_true ~ite:t); add_axiom
add_axiom [ Lit.neg lit; lit_a; Lit.make_eq self.tst t c ]
[ Lit.neg lit; lit_a; Lit.make_eq self.tst t c ] (mk_step_ @@ fun () -> Proof_rules.lemma_ite_false ~ite:t)
(mk_step_ @@ fun () -> Proof_rules.lemma_ite_false ~ite:t)
)
| B_equiv (a, b) -> | B_equiv (a, b) ->
let a = Lit.atom a in let a = Lit.atom a in
let b = Lit.atom b in let b = Lit.atom b in
@ -337,10 +335,10 @@ end = struct
expanded = Lit.Tbl.create 24; expanded = Lit.Tbl.create 24;
n_expanded = Stat.mk_int stat "th.bool.dyn.expanded"; n_expanded = Stat.mk_int stat "th.bool.dyn.expanded";
n_clauses = Stat.mk_int stat "th.bool.dyn.clauses"; n_clauses = Stat.mk_int stat "th.bool.dyn.clauses";
n_propagate = Stat.mk_int stat "th.bool.dyn.propagate";
n_simplify = Stat.mk_int stat "th.bool.dyn.simplify"; n_simplify = Stat.mk_int stat "th.bool.dyn.simplify";
} }
in in
SI.add_simplifier solver (simplify self);
SI.on_preprocess solver (preprocess_ self); SI.on_preprocess solver (preprocess_ self);
SI.on_final_check solver (final_check self); SI.on_final_check solver (final_check self);
SI.on_partial_check solver (partial_check self); SI.on_partial_check solver (partial_check self);