-(** create a ProofEngineTypes.mk_fresh_name_type function which uses given
- * names as long as they are available, then it fallbacks to name generation
- * using FreshNamesGenerator module *)
-let namer_of names =
- let len = List.length names in
- let count = ref 0 in
- fun metasenv context name ~typ ->
- if !count < len then begin
- let name = match List.nth names !count with
- | Some s -> Cic.Name s
- | None -> Cic.Anonymous
- in
- incr count;
- name
- end else
- FreshNamesGenerator.mk_fresh_name ~subst:[] metasenv context name ~typ
-
-let rec tactic_of_ast status ast =
- let module PET = ProofEngineTypes in
- match ast with
- (* Higher order tactics *)
- | GrafiteAst.Do (loc, n, tactic) ->
- Tacticals.do_tactic n (tactic_of_ast status tactic)
- | GrafiteAst.Seq (loc, tactics) -> (* tac1; tac2; ... *)
- Tacticals.seq (List.map (tactic_of_ast status) tactics)
- | GrafiteAst.Repeat (loc, tactic) ->
- Tacticals.repeat_tactic (tactic_of_ast status tactic)
- | GrafiteAst.Then (loc, tactic, tactics) -> (* tac; [ tac1 | ... ] *)
- Tacticals.thens
- (tactic_of_ast status tactic)
- (List.map (tactic_of_ast status) tactics)
- | GrafiteAst.First (loc, tactics) ->
- Tacticals.first (List.map (tactic_of_ast status) tactics)
- | GrafiteAst.Try (loc, tactic) ->
- Tacticals.try_tactic (tactic_of_ast status tactic)
- | GrafiteAst.Solve (loc, tactics) ->
- Tacticals.solve_tactics (List.map (tactic_of_ast status) tactics)
- | GrafiteAst.Progress (loc, tactic) ->
- Tacticals.progress_tactic (tactic_of_ast status tactic)
- (* First order tactics *)
- | GrafiteAst.Absurd (_, term) -> Tactics.absurd term
- | GrafiteAst.Apply (_, term) -> Tactics.apply term
- | GrafiteAst.ApplyRule (_, term) -> Tactics.apply term
- | GrafiteAst.ApplyP (_, term) -> Tactics.applyP term
- | GrafiteAst.ApplyS (_, term, params) ->
- Tactics.applyS ~term ~params ~dbd:(LibraryDb.instance ())
- ~automation_cache:status#automation_cache
- | GrafiteAst.Assumption _ -> Tactics.assumption
- | GrafiteAst.AutoBatch (_,params) ->
- Tactics.auto ~params ~dbd:(LibraryDb.instance ())
- ~automation_cache:status#automation_cache
- | GrafiteAst.Cases (_, what, pattern, (howmany, names)) ->
- Tactics.cases_intros ?howmany ~mk_fresh_name_callback:(namer_of names)
- ~pattern what
- | GrafiteAst.Change (_, pattern, with_what) ->
- Tactics.change ~pattern with_what
- | GrafiteAst.Clear (_,id) -> Tactics.clear id
- | GrafiteAst.ClearBody (_,id) -> Tactics.clearbody id
- | GrafiteAst.Compose (_,t1,t2,times,(howmany, names)) ->
- Tactics.compose times t1 t2 ?howmany
- ~mk_fresh_name_callback:(namer_of names)
- | GrafiteAst.Contradiction _ -> Tactics.contradiction
- | GrafiteAst.Constructor (_, n) -> Tactics.constructor n
- | GrafiteAst.Cut (_, ident, term) ->
- let names = match ident with None -> [] | Some id -> [Some id] in
- Tactics.cut ~mk_fresh_name_callback:(namer_of names) term
- | GrafiteAst.Decompose (_, names) ->
- let mk_fresh_name_callback = namer_of names in
- Tactics.decompose ~mk_fresh_name_callback ()
- | GrafiteAst.Demodulate (_, params) ->
- Tactics.demodulate
- ~dbd:(LibraryDb.instance ()) ~params
- ~automation_cache:status#automation_cache
- | GrafiteAst.Destruct (_,xterms) -> Tactics.destruct xterms
- | GrafiteAst.Elim (_, what, using, pattern, (depth, names)) ->
- Tactics.elim_intros ?using ?depth ~mk_fresh_name_callback:(namer_of names)
- ~pattern what
- | GrafiteAst.ElimType (_, what, using, (depth, names)) ->
- Tactics.elim_type ?using ?depth ~mk_fresh_name_callback:(namer_of names)
- what
- | GrafiteAst.Exact (_, term) -> Tactics.exact term
- | GrafiteAst.Exists _ -> Tactics.exists
- | GrafiteAst.Fail _ -> Tactics.fail
- | GrafiteAst.Fold (_, reduction_kind, term, pattern) ->
- let reduction =
- match reduction_kind with
- | `Normalize ->
- PET.const_lazy_reduction
- (CicReduction.normalize ~delta:false ~subst:[])
- | `Simpl -> PET.const_lazy_reduction ProofEngineReduction.simpl
- | `Unfold None ->
- PET.const_lazy_reduction (ProofEngineReduction.unfold ?what:None)
- | `Unfold (Some lazy_term) ->
- (fun context metasenv ugraph ->
- let what, metasenv, ugraph = lazy_term context metasenv ugraph in
- ProofEngineReduction.unfold ~what, metasenv, ugraph)
- | `Whd ->
- PET.const_lazy_reduction (CicReduction.whd ~delta:false ~subst:[])
- in
- Tactics.fold ~reduction ~term ~pattern
- | GrafiteAst.Fourier _ -> Tactics.fourier
- | GrafiteAst.FwdSimpl (_, hyp, names) ->
- Tactics.fwd_simpl ~mk_fresh_name_callback:(namer_of names)
- ~dbd:(LibraryDb.instance ()) hyp
- | GrafiteAst.Generalize (_,pattern,ident) ->
- let names = match ident with None -> [] | Some id -> [Some id] in
- Tactics.generalize ~mk_fresh_name_callback:(namer_of names) pattern
- | GrafiteAst.IdTac _ -> Tactics.id
- | GrafiteAst.Intros (_, (howmany, names)) ->
- PrimitiveTactics.intros_tac ?howmany
- ~mk_fresh_name_callback:(namer_of names) ()
- | GrafiteAst.Inversion (_, term) ->
- Tactics.inversion term
- | GrafiteAst.LApply (_, linear, how_many, to_what, what, ident) ->
- let names = match ident with None -> [] | Some id -> [Some id] in
- Tactics.lapply ~mk_fresh_name_callback:(namer_of names)
- ~linear ?how_many ~to_what what
- | GrafiteAst.Left _ -> Tactics.left
- | GrafiteAst.LetIn (loc,term,name) ->
- Tactics.letin term ~mk_fresh_name_callback:(namer_of [Some name])
- | GrafiteAst.Reduce (_, reduction_kind, pattern) ->
- (match reduction_kind with
- | `Normalize -> Tactics.normalize ~pattern
- | `Simpl -> Tactics.simpl ~pattern
- | `Unfold what -> Tactics.unfold ~pattern what
- | `Whd -> Tactics.whd ~pattern)
- | GrafiteAst.Reflexivity _ -> Tactics.reflexivity
- | GrafiteAst.Replace (_, pattern, with_what) ->
- Tactics.replace ~pattern ~with_what
- | GrafiteAst.Rewrite (_, direction, t, pattern, names) ->
- EqualityTactics.rewrite_tac ~direction ~pattern t
-(* to be replaced with ~mk_fresh_name_callback:(namer_of names) *)
- (List.map (function Some s -> s | None -> assert false) names)
- | GrafiteAst.Right _ -> Tactics.right
- | GrafiteAst.Ring _ -> Tactics.ring
- | GrafiteAst.Split _ -> Tactics.split
- | GrafiteAst.Symmetry _ -> Tactics.symmetry
- | GrafiteAst.Transitivity (_, term) -> Tactics.transitivity term
- (* Implementazioni Aggiunte *)
- | GrafiteAst.Assume (_, id, t) -> Declarative.assume id t
- | GrafiteAst.Suppose (_, t, id, t1) -> Declarative.suppose t id t1
- | GrafiteAst.By_just_we_proved (_, just, ty, id, t1) ->
- Declarative.by_just_we_proved ~dbd:(LibraryDb.instance())
- ~automation_cache:status#automation_cache just ty id t1
- | GrafiteAst.We_need_to_prove (_, t, id, t2) ->
- Declarative.we_need_to_prove t id t2
- | GrafiteAst.Bydone (_, t) ->
- Declarative.bydone ~dbd:(LibraryDb.instance())
- ~automation_cache:status#automation_cache t
- | GrafiteAst.We_proceed_by_cases_on (_, t, t1) ->
- Declarative.we_proceed_by_cases_on t t1
- | GrafiteAst.We_proceed_by_induction_on (_, t, t1) ->
- Declarative.we_proceed_by_induction_on t t1
- | GrafiteAst.Byinduction (_, t, id) -> Declarative.byinduction t id
- | GrafiteAst.Thesisbecomes (_, t) -> Declarative.thesisbecomes t
- | GrafiteAst.ExistsElim (_, just, id1, t1, id2, t2) ->
- Declarative.existselim ~dbd:(LibraryDb.instance())
- ~automation_cache:status#automation_cache just id1 t1 id2 t2
- | GrafiteAst.Case (_,id,params) -> Declarative.case id params
- | GrafiteAst.AndElim(_,just,id1,t1,id2,t2) ->
- Declarative.andelim ~dbd:(LibraryDb.instance ())
- ~automation_cache:status#automation_cache just id1 t1 id2 t2
- | GrafiteAst.RewritingStep (_,termine,t1,t2,cont) ->
- Declarative.rewritingstep ~dbd:(LibraryDb.instance ())
- ~automation_cache:status#automation_cache termine t1 t2 cont