let module C = Cic in
let more_to_be_restricted = ref [] in
let rec aux k = function
- C.Rel r when List.mem (r+k) to_be_restricted -> raise Occur
+ C.Rel r when List.mem (r - k) to_be_restricted -> raise Occur
| C.Rel _
| C.Sort _ as t -> t
| C.Implicit -> assert false
String.concat ", "
(List.map
(fun i ->
- match List.nth context i with
- | None -> assert false
- | Some (n, _) -> CicPp.ppname n)
- indexes)
+ try
+ match List.nth context i with
+ | None -> assert false
+ | Some (n, _) -> CicPp.ppname n
+ with
+ Failure _ -> assert false
+ ) indexes)
in
let force_does_not_occur_in_context to_be_restricted = function
| None -> [], None
let (more_to_be_restricted, t') =
force_does_not_occur subst to_be_restricted t
in
- more_to_be_restricted, Some (name, Cic.Decl t)
+ more_to_be_restricted, Some (name, Cic.Decl t')
| Some (name, Cic.Def (bo, ty)) ->
let (more_to_be_restricted, bo') =
force_does_not_occur subst to_be_restricted bo
let rec erase i to_be_restricted n = function
| [] -> [], to_be_restricted, []
| hd::tl ->
- let restrict_me = List.mem i to_be_restricted in
+ let more_to_be_restricted,restricted,tl' =
+ erase (i+1) to_be_restricted n tl
+ in
+ let restrict_me = List.mem i restricted in
if restrict_me then
- let more_to_be_restricted, restricted, new_tl =
- erase (i+1) (i :: to_be_restricted) n tl
- in
- more_to_be_restricted, restricted, None :: new_tl
+ more_to_be_restricted, restricted, None:: tl'
else
(try
- let more_to_be_restricted, hd' =
- force_does_not_occur_in_context to_be_restricted hd
- in
- let more_to_be_restricted', restricted, tl' =
- erase (i+1) to_be_restricted n tl
+ let more_to_be_restricted', hd' =
+ let delifted_restricted =
+ let rec aux =
+ function
+ [] -> []
+ | j::tl when j > i -> (j - i)::aux tl
+ | _::tl -> aux tl
+ in
+ aux restricted
+ in
+ force_does_not_occur_in_context delifted_restricted hd
in
- more_to_be_restricted @ more_to_be_restricted',
- restricted, hd' :: tl'
+ more_to_be_restricted @ more_to_be_restricted',
+ restricted, hd' :: tl'
with Occur ->
- let more_to_be_restricted, restricted, tl' =
- erase (i+1) (i :: to_be_restricted) n tl
- in
- more_to_be_restricted, restricted, None :: tl')
+ more_to_be_restricted, (i :: restricted), None :: tl')
in
let (more_to_be_restricted, metasenv, subst) =
List.fold_right
List.map snd (List.filter (fun (m, _) -> m = n) to_be_restricted)
in
let (more_to_be_restricted, restricted, context') =
+ (* just an optimization *)
+ if to_be_restricted = [] then
+ [],[],context
+ else
erase 1 to_be_restricted n context
in
try
(*CSC: maybe we should rename delift in abstract, as I did in my dissertation *)
let delift n subst context metasenv l t =
let module S = CicSubstitution in
+(* THIS CODE SHOULD NOT BE USEFUL AT ALL
+ let l =
+ let (_, canonical_context, _) = CicUtil.lookup_meta n metasenv in
+ List.map2 (fun ct lt ->
+ match (ct, lt) with
+ | None, _ -> None
+ | Some _, _ -> lt)
+ canonical_context l
+ in
+*)
let to_be_restricted = ref [] in
let rec deliftaux k =
let module C = Cic in
let t2 = apply_subst subst t2 in
CicReduction.are_convertible context t1 t2
+let tempi_type_of_aux_subst = ref 0.0;;
+let tempi_type_of_aux = ref 0.0;;
+
let type_of_aux' metasenv subst context term =
+let time1 = Unix.gettimeofday () in
let term = apply_subst subst term in
let context = apply_subst_context subst context in
let metasenv =
(fun (i, _, _) -> not (List.exists (fun (j, _) -> (j = i)) subst))
metasenv)
in
+let time2 = Unix.gettimeofday () in
+let res =
try
CicTypeChecker.type_of_aux' metasenv context term
with CicTypeChecker.TypeCheckerFailure msg ->
raise (MetaSubstFailure ("Type checker failure: " ^ msg))
-
+in
+let time3 = Unix.gettimeofday () in
+ tempi_type_of_aux_subst := !tempi_type_of_aux_subst +. time3 -. time1 ;
+ tempi_type_of_aux := !tempi_type_of_aux +. time2 -. time1 ;
+ res