mirror of
https://github.com/AdaCore/why3.git
synced 2026-02-12 12:34:55 -08:00
52 lines
1.7 KiB
OCaml
52 lines
1.7 KiB
OCaml
(********************************************************************)
|
|
(* *)
|
|
(* The Why3 Verification Platform / The Why3 Development Team *)
|
|
(* Copyright 2010-2025 -- Inria - CNRS - Paris-Saclay University *)
|
|
(* *)
|
|
(* This software is distributed under the terms of the GNU Lesser *)
|
|
(* General Public License version 2.1, with the special exception *)
|
|
(* on linking described in file LICENSE. *)
|
|
(********************************************************************)
|
|
|
|
|
|
open Why3
|
|
|
|
(* push negations down *)
|
|
|
|
(* BEGIN{negate} *)
|
|
open Term
|
|
|
|
let rec negate (t:term) : term =
|
|
match t.t_node with
|
|
| Ttrue -> t_false
|
|
| Tfalse -> t_true
|
|
| Tnot t -> t
|
|
| Tbinop(Tand,t1,t2) -> t_or (negate t1) (negate t2)
|
|
| Tbinop(Tor,t1,t2) -> t_and (negate t1) (negate t2)
|
|
| Tquant(Tforall,tq) ->
|
|
let vars,triggers,t' = t_open_quant tq in
|
|
let tq' = t_close_quant vars triggers (negate t') in
|
|
t_exists tq'
|
|
| Tquant(Texists,tq) ->
|
|
let vars,triggers,t' = t_open_quant tq in
|
|
let tq' = t_close_quant vars triggers (negate t') in
|
|
t_forall tq'
|
|
| _ -> t_not t
|
|
|
|
let rec traverse (t:term) : term =
|
|
match t.t_node with
|
|
| Tnot t -> t_map traverse (negate t)
|
|
| _ -> t_map traverse t
|
|
(* END{negate} *)
|
|
|
|
(* BEGIN{register} *)
|
|
let negate_goal pr t = [Decl.create_prop_decl Decl.Pgoal pr (traverse t)]
|
|
|
|
let negate_trans = Trans.goal negate_goal
|
|
|
|
let () = Trans.register_transform
|
|
"push_negations_down" negate_trans
|
|
~desc:"In the current goal,@ push negations down,@ \
|
|
across logical connectives."
|
|
(* END{register} *)
|