| [ IDENT "normalize" ] -> `Normalize ]
];
pattern_spec: [
- [ "in";
- hyp_paths =
- LIST0
- [ id = IDENT ;
- path = OPT [SYMBOL ":" ; path = term -> path ] ->
- (id,match path with Some p -> p | None -> CicAst.UserInput) ]
- SEP SYMBOL ";";
- goal_path = OPT [ SYMBOL <:unicode<vdash>>; term = term -> term ] ->
- (hyp_paths, goal_path) ]
+ [ wanted = OPT term;
+ hyp_paths_and_goal_path =
+ OPT [
+ "in";
+ hyp_paths =
+ LIST0
+ [ id = IDENT ;
+ path = OPT [SYMBOL ":" ; path = term -> path ] ->
+ (id,match path with Some p -> p | None -> CicAst.UserInput) ]
+ SEP SYMBOL ";";
+ goal_path = OPT [ SYMBOL <:unicode<vdash>>; term = term -> term ] ->
+ let goal_path =
+ match goal_path with
+ None -> CicAst.UserInput
+ | Some goal_path -> goal_path
+ in
+ hyp_paths,goal_path
+ ] ->
+ let hyp_paths,goal_path =
+ match hyp_paths_and_goal_path with
+ None -> [], CicAst.UserInput
+ | Some (hyp_paths,goal_path) -> hyp_paths,goal_path
+ in
+ wanted, hyp_paths, goal_path ]
];
direction: [
[ IDENT "left" -> `Left
TacticAst.Clear (loc,id)
| IDENT "clearbody"; id = IDENT ->
TacticAst.ClearBody (loc,id)
- | IDENT "change"; t1 = tactic_term; "with"; t2 = tactic_term; "in";
- where = pattern_spec ->
- TacticAst.Change (loc, t1, t2, where)
+ | IDENT "change"; what = pattern_spec; "with"; t = tactic_term ->
+ TacticAst.Change (loc, what, t)
| IDENT "compare"; t = tactic_term ->
TacticAst.Compare (loc,t)
| IDENT "constructor"; n = NUM ->
| IDENT "exists" ->
TacticAst.Exists loc
| IDENT "fail" -> TacticAst.Fail loc
- | IDENT "fold"; kind = reduction_kind; t = tactic_term;
- p = OPT [ pattern_spec ] ->
- let p = match p with None -> [], None | Some p -> p in
- TacticAst.Fold (loc, kind, t, p)
+ | IDENT "fold"; kind = reduction_kind; p = pattern_spec ->
+ TacticAst.Fold (loc, kind, p)
| IDENT "fourier" ->
TacticAst.Fourier loc
| IDENT "fwd"; t = term ->
TacticAst.FwdSimpl (loc, t)
- | IDENT "generalize"; t = tactic_term;
- id = OPT [ "as" ; id = IDENT -> id ];
- p = OPT [ pattern_spec ] ->
- let p = match p with None -> [], None | Some p -> p in
- TacticAst.Generalize (loc,t,id,p)
+ | IDENT "generalize"; p=pattern_spec; id = OPT ["as" ; id = IDENT -> id] ->
+ TacticAst.Generalize (loc,p,id)
| IDENT "goal"; n = NUM ->
TacticAst.Goal (loc, int_of_string n)
| IDENT "id" -> TacticAst.IdTac loc
| IDENT "left" -> TacticAst.Left loc
| IDENT "letin"; where = IDENT ; SYMBOL <:unicode<def>> ; t = tactic_term ->
TacticAst.LetIn (loc, t, where)
- | kind = reduction_kind; p = OPT [ pattern_spec ] ->
- let p = match p with None -> [], None | Some p -> p in
+ | kind = reduction_kind; p = pattern_spec ->
TacticAst.Reduce (loc, kind, p)
| IDENT "reflexivity" ->
TacticAst.Reflexivity loc
- | IDENT "replace"; p = OPT [ pattern_spec ]; "with"; t = tactic_term ->
- let p = match p with None -> [], None | Some p -> p in
+ | IDENT "replace"; p = pattern_spec; "with"; t = tactic_term ->
TacticAst.Replace (loc, p, t)
- | IDENT "rewrite" ; d = direction; t = term ; p = OPT [ pattern_spec ] ->
- let p = match p with None -> [], None | Some p -> p in
- TacticAst.Rewrite (loc, d, t, p)
+ | IDENT "rewrite" ; d = direction; t = term ; p = pattern_spec ->
+ let (pt,_,_) = p in
+ if pt <> None then
+ raise
+ (Parse_error
+ (loc,"the pattern cannot specify the term to rewrite, only its paths in the hypotheses and in the conclusion"))
+ else
+ TacticAst.Rewrite (loc, d, t, p)
| IDENT "right" ->
TacticAst.Right loc
| IDENT "ring" ->