else
(fun () -> 0)
-let choice_of_uri uri =
- let term = CicUtil.term_of_uri uri in
- (uri, (fun _ _ _ -> term))
+let choice_of_uri suri =
+ let term = CicUtil.term_of_uri (UriManager.uri_of_string suri) in
+ (suri, (fun _ _ _ -> term))
let grammar = Grammar.gcreate cic_lexer
| PAREN "("; t = term; PAREN ")" -> return_term loc t
]
];
- tactic_where: [
- [ where = OPT [ "in"; ident = IDENT -> ident ] -> where ]
- ];
tactic_term: [ [ t = term -> t ] ];
ident_list0: [
[ PAREN "["; idents = LIST0 IDENT SEP SYMBOL ";"; PAREN "]" -> idents ]
];
- ident_list1: [
- [ PAREN "["; idents = LIST1 IDENT SEP SYMBOL ";"; PAREN "]" -> idents ]
- ];
reduction_kind: [
[ [ IDENT "reduce" ] -> `Reduce
| [ IDENT "simplify" ] -> `Simpl
| [ IDENT "whd" ] -> `Whd
| [ 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) ]
+ ];
+ direction: [
+ [ IDENT "left" -> `Left
+ | SYMBOL ">" -> `Left
+ | IDENT "right" -> `Right
+ | SYMBOL "<" -> `Right ]
+ ];
tactic: [
[ [ IDENT "absurd" ]; t = tactic_term ->
TacticAst.Absurd (loc, t)
| [ IDENT "auto" ] ; num = OPT [ i = NUM -> int_of_string i ] ->
TacticAst.Auto (loc,num)
| [ IDENT "change" ];
- t1 = tactic_term; "with"; t2 = tactic_term;
- where = tactic_where ->
+ t1 = tactic_term; "with"; t2 = tactic_term; where = pattern_spec ->
TacticAst.Change (loc, t1, t2, where)
(* TODO Change_pattern *)
| [ IDENT "contradiction" ] ->
| [ IDENT "cut" ];
t = tactic_term ->
TacticAst.Cut (loc, t)
- | [ IDENT "decompose" ];
- principles = ident_list1; where = IDENT ->
- TacticAst.Decompose (loc, where, principles)
+ | [ IDENT "decompose" ]; where = term ->
+ TacticAst.Decompose (loc, where)
| [ IDENT "discriminate" ];
- hyp = IDENT ->
- TacticAst.Discriminate (loc, hyp)
+ t = tactic_term ->
+ TacticAst.Discriminate (loc, t)
| [ IDENT "elimType" ]; t = tactic_term ->
TacticAst.ElimType (loc, t)
| [ IDENT "elim" ];
| [ IDENT "fourier" ] ->
TacticAst.Fourier loc
| IDENT "goal"; n = NUM -> TacticAst.Goal (loc, int_of_string n)
- | [ IDENT "injection" ]; ident = IDENT ->
- TacticAst.Injection (loc, ident)
+ | [ IDENT "injection" ]; t = term ->
+ TacticAst.Injection (loc, t)
| [ IDENT "intros" ];
num = OPT [ num = int -> num ];
idents = OPT ident_list0 ->
where = IDENT ; SYMBOL <:unicode<def>> ; t = tactic_term ->
TacticAst.LetIn (loc, t, where)
| kind = reduction_kind;
- pat = OPT [
- "in"; pat = [ IDENT "goal" -> `Goal | IDENT "hyp" -> `Everywhere ] ->
- pat
- ];
- terms = LIST0 term SEP SYMBOL "," ->
- (match (pat, terms) with
- | None, [] -> TacticAst.Reduce (loc, kind, None)
- | None, terms -> TacticAst.Reduce (loc, kind, Some (terms, `Goal))
- | Some pat, [] -> fail loc "Missing term [list]"
- | Some pat, terms -> TacticAst.Reduce (loc, kind, Some (terms, pat)))
- | kind = reduction_kind; where = IDENT ; IDENT "at" ; pat = term ->
- TacticAst.ReduceAt (loc, kind, where, pat)
+ p = OPT [ pattern_spec ] ->
+ let p = match p with None -> [], None | Some p -> p in
+ TacticAst.Reduce (loc, kind, p)
+ | IDENT "generalize"; t = tactic_term; p = OPT [ pattern_spec ] ->
+ let p = match p with None -> [], None | Some p -> p in
+ TacticAst.Generalize (loc,t,p)
| [ IDENT "reflexivity" ] ->
TacticAst.Reflexivity loc
| [ IDENT "replace" ];
t1 = tactic_term; "with"; t2 = tactic_term ->
TacticAst.Replace (loc, t1, t2)
- | [ IDENT "rewrite" ; IDENT "left" ] ; t = term ->
- TacticAst.Rewrite (loc,`Left, t, None)
- | [ IDENT "rewrite" ; IDENT "right" ] ; t = term ->
- TacticAst.Rewrite (loc,`Right, t, None)
- (* TODO Replace_pattern *)
+ | 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 "right" ] -> TacticAst.Right loc
| [ IDENT "ring" ] -> TacticAst.Ring loc
| [ IDENT "split" ] -> TacticAst.Split loc
| [ IDENT "transitivity" ];
t = tactic_term ->
TacticAst.Transitivity (loc, t)
+ | [ IDENT "fwd" ]; t = term ->
+ TacticAst.FwdSimpl (loc, t)
+ | [ IDENT "lapply" ]; what = tactic_term;
+ to_what = OPT [ "to" ; t = tactic_term -> t ] ->
+ TacticAst.LApply (loc, to_what, what)
]
];
tactical:
]
];
statements: [
- [ l = LIST0 [ statement ] -> l
+ [ l = LIST0 statement ; EOI -> l
]
];
END
alias: [ (* return a pair <domain_item, codomain_item> from an alias *)
[ IDENT "alias";
choice =
- [ IDENT "id"; id = IDENT; SYMBOL "="; uri = URI ->
- (Id id, choice_of_uri uri)
+ [ IDENT "id"; id = IDENT; SYMBOL "="; suri = URI ->
+ (Id id, choice_of_uri suri)
| IDENT "symbol"; symbol = QSTRING;
PAREN "("; IDENT "instance"; instance = NUM; PAREN ")";
SYMBOL "="; dsc = QSTRING ->