+ ntactic: [
+ [ IDENT "napply"; t = tactic_term -> GrafiteAst.NApply (loc, t)
+ | IDENT "nassert";
+ seqs = LIST0 [
+ hyps = LIST0
+ [ id = IDENT ; SYMBOL ":" ; ty = tactic_term -> id,`Decl ty
+ | id = IDENT ; SYMBOL ":" ; ty = tactic_term ;
+ SYMBOL <:unicode<def>> ; bo = tactic_term ->
+ id,`Def (bo,ty)];
+ SYMBOL <:unicode<vdash>>;
+ concl = tactic_term -> (hyps,concl) ] ->
+ GrafiteAst.NAssert (loc, seqs)
+ | IDENT "ncases"; what = tactic_term ; where = pattern_spec ->
+ GrafiteAst.NCases (loc, what, where)
+ | IDENT "nchange"; what = pattern_spec; "with"; with_what = tactic_term ->
+ GrafiteAst.NChange (loc, what, with_what)
+ | IDENT "nelim"; what = tactic_term ; where = pattern_spec ->
+ GrafiteAst.NElim (loc, what, where)
+ | IDENT "ngeneralize"; p=pattern_spec ->
+ GrafiteAst.NGeneralize (loc, p)
+ | IDENT "nletin"; name = IDENT ; SYMBOL <:unicode<def>> ; t = tactic_term;
+ where = pattern_spec ->
+ GrafiteAst.NLetIn (loc,where,t,name)
+ | IDENT "nrewrite"; dir = direction; what = tactic_term ; where = pattern_spec ->
+ GrafiteAst.NRewrite (loc, dir, what, where)
+ | IDENT "nwhd"; delta = OPT [ IDENT "nodelta" -> () ];
+ where = pattern_spec ->
+ let delta = match delta with None -> true | _ -> false in
+ GrafiteAst.NEval (loc, where, `Whd delta)
+ | SYMBOL "#"; n=IDENT -> GrafiteAst.NIntro (loc,n)
+ | SYMBOL "#"; SYMBOL "_" -> GrafiteAst.NIntro (loc,"_")
+ | SYMBOL "*" -> GrafiteAst.NCase1 (loc,"_")
+ | SYMBOL "*"; n=IDENT ->
+ GrafiteAst.NCase1 (loc,n)
+ ]
+ ];