https://github.com/EasyCrypt/easycrypt
Revision 6df81b68bb7fb2010d10043e5c11e4401cf56d37 authored by Benjamin Gregoire on 01 April 2014, 07:58:40 UTC, committed by Benjamin Gregoire on 01 April 2014, 07:58:40 UTC
1 parent e43821c
Tip revision: 6df81b68bb7fb2010d10043e5c11e4401cf56d37 authored by Benjamin Gregoire on 01 April 2014, 07:58:40 UTC
add product of two and 3 sets
add product of two and 3 sets
Tip revision: 6df81b6
ecHiTactics.ml
(* -------------------------------------------------------------------- *)
open EcUtils
open EcLocation
open EcParsetree
open EcFol
open EcLogic
open EcHiLogic
open EcCoreHiPhl
(* -------------------------------------------------------------------- *)
let process_case loc gp g =
let form_of_gp () =
match gp with
| [`Form (occ, pf)] ->
if occ <> None then
tacuerror ~loc "cannot specify an occurence selector"
else pf
| _ -> tacuerror ~loc "must give exactly one boolean formula"
in
match (get_concl g).f_node with
| FbdHoareS _ | FhoareS _ ->
EcPhlCase.t_hl_case
(process_phl_formula g (form_of_gp ())) g
| FequivS _ ->
EcPhlCase.t_equiv_case
(process_prhl_formula g (form_of_gp ())) g
| _ -> process_case loc gp g
(* -------------------------------------------------------------------- *)
let process_debug (juc, n) = (juc, [n])
(* -------------------------------------------------------------------- *)
let process_admit g =
(* FIXME: use notifier *)
EcFortune.pick () |> oiter (fun msg -> Printf.printf "[W] %s\n%!" msg);
t_admit g
(* -------------------------------------------------------------------- *)
let process_progress s (prtc, mkpv) t =
let t =
match t with
| None -> t_id None
| Some t ->
if s then tacuerror "progress * do not accept tactic";
prtc mkpv t
in
if s then t_progress_one
else t_progress t
(* -------------------------------------------------------------------- *)
let rec process_tactics mkpv (tacs : ptactic list) (gs : goals) : goals =
match tacs with
| [] -> gs
| tac1 :: tacs2 ->
let gs = process_tactic mkpv tac1 gs in
process_tactics mkpv tacs2 gs
(* -------------------------------------------------------------------- *)
and process_tactic_chain mkpv (t : ptactic_chain) (gs : goals) : goals =
match t with
| Psubtacs tacs -> t_subgoal (List.map (process_tactic1 mkpv) tacs) gs
| Pfirst (t, i) -> t_on_firsts (process_tactic1 mkpv t) i gs
| Plast (t, i) -> t_on_lasts (process_tactic1 mkpv t) i gs
| Protate (d, i) -> t_rotate d i gs
| Pexpect (t, n) ->
if List.length (snd gs) <> n then
tacuerror "expecting exactly %d subgoal(s)" n;
t_on_goals (process_tactic1 mkpv t) gs
(* -------------------------------------------------------------------- *)
and process_tactic mkpv (tac : ptactic) (gs : goals) : goals =
let cf =
match unloc tac.pt_core with
| Plogic (Pintro _ | Prewrite _ | Pgeneralize _ )
| Pidtac _ -> true
| _ -> false
in
let gs = process_tactic_core mkpv tac.pt_core gs in
let gs = EcHiLogic.process_mintros ~cf tac.pt_intros gs in
gs
(* -------------------------------------------------------------------- *)
and process_tactic1 mkpv (tac : ptactic) ((juc, n) : goal) : goals =
process_tactic mkpv tac (juc, [n])
(* -------------------------------------------------------------------- *)
and process_tactic_core mkpv (tac : ptactic_core) (gs : goals) : goals =
let loc = tac.pl_loc in
let eng = process_tactic_core1 mkpv in
let tac =
match unloc tac with
| Pidtac msg -> `One (t_id msg)
| Pdo ((b, n), t) -> `One (t_do b n (process_tactic_core1 mkpv t))
| Ptry t -> `One (t_try (process_tactic_core1 mkpv t))
| Pby t -> `One (process_by mkpv t)
| Por (t1, t2) -> `One (process_or mkpv t1 t2)
| Pseq tacs -> `One (fun (juc, n) -> process_tactics mkpv tacs (juc, [n]))
| Pcase i -> `One (process_case loc i)
| Pprogress (s,t) -> `One (process_progress s (process_tactic_core1,mkpv) t)
| Pintrosprogress -> `One (EcLogic.t_progress ~split:false (t_id None))
| Padmit -> `One (process_admit)
| Pdebug -> `One (process_debug)
| Plogic t -> `One (process_logic (eng, mkpv) loc t)
| PPhl tac -> `One (EcHiPhl.process_phl loc tac)
| Psubgoal tc -> `All (process_tactic_chain mkpv tc)
in
let tac = match tac with `One t -> t_on_goals t | `All t -> t in
set_loc loc tac gs
(* -------------------------------------------------------------------- *)
and process_tactic_core1 mkpv (tac : ptactic_core) ((juc, n) : goal) : goals =
process_tactic_core mkpv tac (juc, [n])
(* -------------------------------------------------------------------- *)
and process_by mkpv t (juc, n) =
let goal =
match t with
| None -> (juc, [n])
| Some t -> process_tactics mkpv t (juc, [n])
in
t_on_goals EcHiLogic.process_done goal
(* -------------------------------------------------------------------- *)
and process_or mkpv t1 t2 g =
t_or
(process_tactic1 mkpv t1)
(process_tactic1 mkpv t2)
g
Computing file changes ...