X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Ftactics%2FvariousTactics.ml;h=226a8c87c831d29531078d1d56707ec3e9a919e0;hb=b47af4383d51dae275964d464e6a8faf2a5a3f51;hp=38ad2ebfbee4f1f76030e7fafaace0263a186b0c;hpb=31851952e1cc2db59168c5fd6f6093d9bc37ea86;p=helm.git diff --git a/helm/ocaml/tactics/variousTactics.ml b/helm/ocaml/tactics/variousTactics.ml index 38ad2ebfb..226a8c87c 100644 --- a/helm/ocaml/tactics/variousTactics.ml +++ b/helm/ocaml/tactics/variousTactics.ml @@ -45,7 +45,8 @@ let assumption_tac = fst (R.are_convertible context (S.lift n t) ty CicUniv.empty_ugraph) -> n | (Some (_, C.Def (_,Some ty'))) when - fst (R.are_convertible context ty' ty CicUniv.empty_ugraph) -> n + fst (R.are_convertible context (S.lift n ty') ty + CicUniv.empty_ugraph) -> n | (Some (_, C.Def (t,None))) -> let ty_t, u = (* TASSI: FIXME *) CicTypeChecker.type_of_aux' metasenv context (S.lift n t) @@ -63,35 +64,52 @@ let assumption_tac = (* ANCORA DA DEBUGGARE *) exception AllSelectedTermsMustBeConvertible;; +exception CannotGeneralizeInHypotheses;; (* serve una funzione che cerchi nel ty dal basso a partire da term, i lambda e li aggiunga nel context, poi si conta la lunghezza di questo nuovo contesto e si lifta di tot... COSA SIGNIFICA TUTTO CIO'?????? *) let generalize_tac - ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[]) terms + ?(mk_fresh_name_callback = FreshNamesGenerator.mk_fresh_name ~subst:[]) + ~term pattern = let module PET = ProofEngineTypes in - let generalize_tac mk_fresh_name_callback terms status = + let generalize_tac mk_fresh_name_callback ~term (hyps_pat,concl_pat) status = + if hyps_pat <> [] then raise CannotGeneralizeInHypotheses ; let (proof, goal) = status in let module C = Cic in let module P = PrimitiveTactics in let module T = Tacticals in let _,metasenv,_,_ = proof in let _,context,ty = CicUtil.lookup_meta goal metasenv in - let typ,_ = - match terms with - [] -> assert false - | he::tl -> - (* We need to check that all the convertibility of all the terms *) - let u = List.fold_left ( (* TASSI: FIXME *) - fun u t -> - let b,u1 = CicReduction.are_convertible context he t u in - if not b then - raise AllSelectedTermsMustBeConvertible - else - u1) CicUniv.empty_ugraph tl in - (CicTypeChecker.type_of_aux' metasenv context he u) + let terms = + let path = + match concl_pat with + None -> Cic.Implicit (Some `Hole) + | Some path -> path in + let roots = ProofEngineHelpers.select ~term:ty ~pattern:path in + List.fold_left + (fun acc (i, r) -> + ProofEngineHelpers.find_subterms + ~eq:ProofEngineReduction.alpha_equivalence ~wanted:term r @ acc + ) [] roots + in + let typ = + let typ,u = + CicTypeChecker.type_of_aux' metasenv context term CicUniv.empty_ugraph in + (* We need to check that all the convertibility of all the terms *) + ignore ( + (* TASSI: FIXME *) + List.fold_left + (fun u t -> + let b,u1 = CicReduction.are_convertible context term t u in + if not b then + raise AllSelectedTermsMustBeConvertible + else + u1 + ) u terms) ; + typ in PET.apply_tactic (T.thens @@ -106,10 +124,10 @@ let generalize_tac ~with_what:(List.map (function _ -> C.Rel 1) terms) ~where:ty) ))) - ~continuations: [(P.apply_tac ~term:(C.Rel 1)) ; T.id_tac]) + ~continuations: + [(P.apply_tac ~term:(C.Appl [C.Rel 1; CicSubstitution.lift 1 term])) ; + T.id_tac]) status in - PET.mk_tactic (generalize_tac mk_fresh_name_callback terms) + PET.mk_tactic (generalize_tac mk_fresh_name_callback ~term pattern) ;; - -