diff --git a/bin/main.ml b/bin/main.ml
index bdd27e0c2e98a93c11692c54d41eed9c56d6b378..dc353713b56f142e4ab91fb72231a26b5c113c1f 100644
--- a/bin/main.ml
+++ b/bin/main.ml
@@ -3,10 +3,31 @@ open Dsl
 let files =Array.to_list (Sys.readdir repo);;
 print_endline(String.concat "; " files);;
 *)
+(*
+let rec generate_filename base n =
+  let name = base ^ string_of_int n in
+  if  Sys.file_exists name then generate_filename base (n+1) else name
+*)
+
 
-let gen (x : string) = 
+
+let gen (args : string array) = 
 (*  Gencoq.generate_coq (Interface.parse_description x) (Filename.basename x);; *)
+  let list_args =   Array.to_list args in
+  let rec parse_args args (proof_name : string) (type_name : string) (overwrite: bool) (repo_gen : string) :(string * string * bool * string)= 
+    match args with
+      | "-proof" :: proof :: tl -> parse_args tl proof type_name overwrite repo_gen
+      | "-type" :: type_ :: tl -> parse_args tl proof_name type_ overwrite repo_gen
+      | "-n" :: tl -> parse_args tl proof_name type_name (not overwrite) repo_gen
+      | "-r" :: repo :: tl -> parse_args tl proof_name type_name overwrite repo
+      | "-h" :: _ -> print_endline " Usage: dsl filename_dsl [-proof filename_proof] [-type filename_type] [-r repository_out] [-n] [-h] \n -n : don't overwrite type file"; exit 0
+      | _ :: tl ->parse_args tl proof_name type_name overwrite repo_gen
+      | [] -> (proof_name, type_name, overwrite,repo_gen) 
+
+  in
+  let name = args.(1) in
+  let (proof_name, type_name, overwrite,repo_gen) = parse_args list_args ((Filename.basename name)^"_proof") ((Filename.basename name)^"_world_type") true "./generate" in 
 
-  Gencoq.generate_coq_2files (Interface.parse_description x) (Filename.basename x);;
+  Gencoq.generate_coq_2files (Interface.parse_description name) (Filename.basename name) proof_name type_name overwrite repo_gen;;
 
-gen Sys.argv.(1);;
+gen Sys.argv;;
diff --git a/lib/gencoq.ml b/lib/gencoq.ml
index 92253e7c3034ba5ed8f580d63ee90f7d27536427..1a9dd8cd8ab2aa7743a7160866ee2a7ad1fd3f7f 100644
--- a/lib/gencoq.ml
+++ b/lib/gencoq.ml
@@ -542,28 +542,36 @@ let generate_coq (Description(d,r,Measure g) : description) (name : string)=
      () 
 
 
+     let rec generate_filename base n repo=
+      print_endline (base);
+      let name = base ^ string_of_int n in
+      if (Sys.file_exists (repo^"/"^base^".v")) then 
+        (if  (Sys.file_exists (repo^"/"^name^".v"))  then generate_filename base (n+1) repo else name)
+      else base
+
+
 (**[generate_coq d s]generates 2 coq files
                       1 containing the world description module, the type module  -> regenerate all the time
                       the other the proof module -> generate only the first time
     @param description 
     @param string s
     @return[unit] *)
-let generate_coq_2files (Description(d,r,Measure g) : description) (name : string)=
+let generate_coq_2files (Description(d,r,Measure g) : description) (name : string) (proof_name:string) (type_name : string) (ecrase : bool) (repo : string)=
   if Ast.check_description (Description(d,r,Measure g)) 
   then
       let gmpptype, gmpp_proof = generate_measure_per_phase g in
       let gdp_type, gdp_proof = generate_definition_phase g in
       Ast.png_from_graph g name;
       Ast.png_from_graph2 (Ast.scc_graph g;) (name^"_scc_graph");
-    
+      let name_gen =  if ecrase then type_name else  generate_filename type_name 1 repo in 
       let module_world_type = (generate_requires d)@Module("World",(generate_instances d)@newline::generate_robogram r d)
                               :: generate_module_type (Measure g) name gmpptype gdp_type in
-                              write_coq_file module_world_type ("./generate/"^name^"_world_type.v");
-      let file_exists =
-        Sys.file_exists ("./generate/"^name^"_proof.v") in
-      if not(file_exists) then 
-        write_coq_file ((generate_requires d)@Require(true,["Pactole.CaseStudies.Generate_test."^name^"_world_type"])::generate_module_proof (Measure g) name gmpp_proof gdp_proof) ("./generate/"^name^"_proof.v")
-
+      write_coq_file module_world_type (repo^"/"^name_gen^".v");
+      let file_proof_exists =
+        Sys.file_exists (repo^"/"^proof_name^".v") in
+      if not(file_proof_exists) then 
+        write_coq_file ((generate_requires d)@Require(true,["Pactole.CaseStudies.Generate_test."^type_name])::generate_module_proof (Measure g) name gmpp_proof gdp_proof) (repo^"/"^proof_name^".v")
+      
 
   else 
      ()