X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=ocaml%2Fnum.ml;h=81bb1dafe0bb1dbfb1f0a05ad896edae95a594a2;hb=edc8a9dacfdf59bc23570756f7d346f9cd28ae6b;hp=9d803139e4dcafa89e1938c08752cdc5d2ff3110;hpb=dc3d76330323f0eba348377062934481c763d450;p=fireball-separation.git diff --git a/ocaml/num.ml b/ocaml/num.ml index 9d80313..81bb1da 100644 --- a/ocaml/num.ml +++ b/ocaml/num.ml @@ -40,6 +40,12 @@ let hd_of = | `N _ -> None | `Match _ -> assert false +let arity_of_hd = +function + `I ((_,a),_) +| `Var(_,a) -> a +| _ -> 0 (* FIXME? *) + let lift m (t : nf) = let aux_var l (n, ar) = (if n < l then n else n+m), ar in let rec aux_i_num_var l = @@ -102,23 +108,9 @@ end (************ Pretty-printing ************************************) -let rec print ?(l=[]) = - function - `Var(n,_) -> print_name l n - | `N n -> string_of_int n - | `Match(t,_,bs_lift,bs,args) -> - "([" ^ print ~l (t :> nf) ^ - " ? " ^ String.concat " | " (List.map (fun (n,t) -> string_of_int n ^ " => " ^ print ~l (lift bs_lift t)) !bs) ^ "] " ^ - String.concat " " (List.map (print ~l) args) ^ ")" - | `I((n,_),args) -> "(" ^ print_name l n ^ " " ^ String.concat " " (Listx.to_list (Listx.map (print ~l) args)) ^ ")" - | `Lam(_,nf) -> - let name = string_of_var (List.length l) in - "λ" ^ name ^ "." ^ print ~l:(name::l) (nf : nf) -;; - let rec string_of_term l = let rec string_of_term_w_pars l = function - | `Var(n,_) -> print_name l n + | `Var(n,ar) -> print_name l n ^ ":" ^ string_of_int ar | `N n -> string_of_int n | `I _ as t -> "(" ^ string_of_term_no_pars_app l (t :> nf) ^ ")" | `Lam _ as t -> "(" ^ string_of_term_no_pars_lam l t ^ ")" @@ -127,7 +119,7 @@ let rec string_of_term l = " with " ^ String.concat " | " (List.map (fun (n,t) -> string_of_int n ^ " => " ^ string_of_term l (lift bs_lift t)) !bs) ^ "] " ^ String.concat " " (List.map (string_of_term l) args) ^ ")" and string_of_term_no_pars_app l = function - | `I((n,_), args) -> print_name l n ^ " " ^ String.concat " " (List.map (string_of_term_w_pars l) (Listx.to_list args)) + | `I((n,ar), args) -> print_name l n ^ ":" ^ string_of_int ar ^ " " ^ String.concat " " (List.map (string_of_term_w_pars l) (Listx.to_list args)) | #nf as t -> string_of_term_w_pars l t and string_of_term_no_pars_lam l = function | `Lam(_,t) -> let name = string_of_var (List.length l) in @@ -165,6 +157,13 @@ let cast_to_i_num_var = prerr_endline (print (t :> nf)); assert false (* algorithm failed *) +let set_arity arity = function +| `Var(n,_) -> `Var(n,arity) +| `Lam(false, `N _) +| `Lam(false, `Lam _) as t -> t +| `Lam(false, `Match(t,(n,ar),bs_lift,bs,args)) -> `Lam(false, `Match(t,(n,arity),bs_lift,bs,args)) +| _ -> assert false + let rec mk_app (h : nf) (arg : nf) = (*let res =*) match h with @@ -182,29 +181,34 @@ and mk_appl h args = and mk_appx h args = Listx.fold_left mk_app h args -and mk_match t ar bs_lift bs args = +and mk_match t (n,ar) bs_lift bs args = (*prerr_endline ("MK_MATCH: ([" ^ print t ^ "] " ^ String.concat " " (Listx.to_list (Listx.map (fun (n,t) -> string_of_int n ^ " => " ^ print t) bs)) ^ ") " ^ String.concat " " (List.map print args));*) match t with `N m -> (try let h = List.assoc m !bs in + let h = set_arity (ar-1) h in let h = lift bs_lift h in mk_appl h args with Not_found -> - `Match (t,ar,bs_lift,bs,args)) - | `I _ | `Var _ | `Match _ -> `Match(t,ar,bs_lift,bs,args) + `Match (t,(n,ar),bs_lift,bs,args)) + | `I _ | `Var _ | `Match _ -> `Match(t,(n,ar),bs_lift,bs,args) and subst delift_by_one what (with_what : nf) (where : nf) = + let aux_propagate_arity ar = function + | `Lam(false,`Match(`I(v,args),(x,_),liftno,bs,args')) -> + `Lam(false,`Match(`I(v,args),(x,ar),liftno,bs,args')) + | _ as t -> t in let rec aux_i_num_var l = function `I((n,ar),args) -> if n = what + l then - mk_appx (lift l with_what) (Listx.map (aux l) args) + mk_appx (lift l (aux_propagate_arity ar with_what)) (Listx.map (aux l) args) else `I (((if delift_by_one && n >= l then n-1 else n), ar), Listx.map (aux l) args) | `Var(n,ar) -> if n = what + l then - lift l with_what + lift l (aux_propagate_arity ar with_what) else `Var((if delift_by_one && n >= l then n-1 else n), ar) | `N _ as x -> x @@ -230,12 +234,15 @@ prerr_endline ("subst l:" ^ string_of_int l ^ " delift_by_one:" ^ string_of_bool (************ Parsing ************************************) let parse' strs = + let fix_arity = function + | `I((n,_),args) -> `I((n,Listx.length args),args) + | _ -> assert false in let rec aux = function | Parser.Lam t -> `Lam (true, aux t) - | Parser.App (t1, t2) -> mk_app (aux t1) (aux t2) - | Parser.Var v -> `Var(v,-666) - in let (tms, free) = Parser.parse_many strs - in (List.map aux tms, free) + | Parser.App (t1, t2) -> fix_arity (mk_app (aux t1) (aux t2)) + | Parser.Var v -> `Var(v,0) in + let (tms, free) = Parser.parse_many strs in + List.map aux tms, free ;; (************** Algorithm(s) ************************) @@ -294,3 +301,43 @@ let rec eta_subterm sub t = ;; let eta_subterm (#nf as x) (#nf as y) = eta_subterm x y;; + + +let max_arity_tms n = + let aux_var l (m,a) = if n + l = m then a else -1 in + let rec aux l = function + | `Var v -> aux_var l v + | `I(v,tms) -> max (aux_var l v) (aux_tms l (Listx.to_list tms)) + | `Lam(_,t) -> aux (l+1) t + | `Match(u,_,_,bs,args) -> max (max (aux l (u :> nf)) (aux_tms l args)) (aux_tms l (List.map snd !bs)) + | `N _ -> -1 + and aux_tms l = + List.fold_left (fun acc t -> Pervasives.max acc (aux l t)) ~-1 in + fun tms -> aux_tms 0 (tms :> nf list) +;; + +let get_first_args var = +let rec aux l = function +| `Lam(_,t) -> aux (l+1) t +| `Match(u,orig,liftno,bs,args) -> Util.concat_map (aux l) args +| `I((n,_), args) -> if n = var + l then [Listx.last args] else [] +| `N _ +| `Var _ -> [] +in aux 0 +;; + +let compute_arities m = + let rec aux n tms = + if n = 0 + then [] + else + let tms = Util.filter_map (function `Lam(_,t) -> Some t | _ -> None ) tms in + let arity = max 0 (max_arity_tms (m-n) tms) in (* FIXME: 0 or -1 ??? *) + arity :: (aux (n-1) tms) + in fun tms -> List.rev (aux m tms) +;; + +let compute_arities var special_k all_tms = + let tms = List.fold_left (fun acc t -> acc @ (get_first_args var t)) [] all_tms in + compute_arities special_k tms +;;