src/Tools/induct.ML
changeset 27809 a1e409db516b
parent 27370 8e8f96dfaf63
child 27865 27a8ad9612a3
equal deleted inserted replaced
27808:4dd3d5efcc7f 27809:a1e409db516b
   684 
   684 
   685 
   685 
   686 
   686 
   687 (** concrete syntax **)
   687 (** concrete syntax **)
   688 
   688 
       
   689 structure P = OuterParse;
       
   690 
   689 val arbitraryN = "arbitrary";
   691 val arbitraryN = "arbitrary";
   690 val takingN = "taking";
   692 val takingN = "taking";
   691 val ruleN = "rule";
   693 val ruleN = "rule";
   692 
   694 
   693 local
   695 local
   724 fun unless_more_args scan = Scan.unless (Scan.lift
   726 fun unless_more_args scan = Scan.unless (Scan.lift
   725   ((Args.$$$ arbitraryN || Args.$$$ takingN || Args.$$$ typeN ||
   727   ((Args.$$$ arbitraryN || Args.$$$ takingN || Args.$$$ typeN ||
   726     Args.$$$ predN || Args.$$$ setN || Args.$$$ ruleN) -- Args.colon)) scan;
   728     Args.$$$ predN || Args.$$$ setN || Args.$$$ ruleN) -- Args.colon)) scan;
   727 
   729 
   728 val arbitrary = Scan.optional (Scan.lift (Args.$$$ arbitraryN -- Args.colon) |--
   730 val arbitrary = Scan.optional (Scan.lift (Args.$$$ arbitraryN -- Args.colon) |--
   729   Args.and_list1 (Scan.repeat (unless_more_args free))) [];
   731   P.and_list1' (Scan.repeat (unless_more_args free))) [];
   730 
   732 
   731 val taking = Scan.optional (Scan.lift (Args.$$$ takingN -- Args.colon) |--
   733 val taking = Scan.optional (Scan.lift (Args.$$$ takingN -- Args.colon) |--
   732   Scan.repeat1 (unless_more_args inst)) [];
   734   Scan.repeat1 (unless_more_args inst)) [];
   733 
   735 
   734 in
   736 in
   735 
   737 
   736 fun cases_meth src =
   738 fun cases_meth src =
   737   Method.syntax (Args.and_list (Scan.repeat (unless_more_args inst)) -- Scan.option cases_rule) src
   739   Method.syntax (P.and_list' (Scan.repeat (unless_more_args inst)) -- Scan.option cases_rule) src
   738   #> (fn ((insts, opt_rule), ctxt) =>
   740   #> (fn ((insts, opt_rule), ctxt) =>
   739     Method.METHOD_CASES (fn facts =>
   741     Method.METHOD_CASES (fn facts =>
   740       Seq.DETERM (HEADGOAL (cases_tac ctxt insts opt_rule facts))));
   742       Seq.DETERM (HEADGOAL (cases_tac ctxt insts opt_rule facts))));
   741 
   743 
   742 fun induct_meth src =
   744 fun induct_meth src =
   743   Method.syntax (Args.and_list (Scan.repeat (unless_more_args def_inst)) --
   745   Method.syntax (P.and_list' (Scan.repeat (unless_more_args def_inst)) --
   744     (arbitrary -- taking -- Scan.option induct_rule)) src
   746     (arbitrary -- taking -- Scan.option induct_rule)) src
   745   #> (fn ((insts, ((arbitrary, taking), opt_rule)), ctxt) =>
   747   #> (fn ((insts, ((arbitrary, taking), opt_rule)), ctxt) =>
   746     Method.RAW_METHOD_CASES (fn facts =>
   748     Method.RAW_METHOD_CASES (fn facts =>
   747       Seq.DETERM (HEADGOAL (induct_tac ctxt insts arbitrary taking opt_rule facts))));
   749       Seq.DETERM (HEADGOAL (induct_tac ctxt insts arbitrary taking opt_rule facts))));
   748 
   750