mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-06 03:05:31 -05:00
fix(th-bool-dyn): add clauses in partial check; register simplifier
This commit is contained in:
parent
57941a952a
commit
e4acb2cfca
1 changed files with 19 additions and 21 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue