type direction = [ `Left | `Right ]
type reduction_kind = [ `Reduce | `Simpl | `Whd | `Normalize ]
-(* type 'term pattern = Pattern of 'term *)
-
- (* everywhere includes goal and hypotheses *)
-type 'term pattern = [ `Goal | `Everywhere ]
-
- (* when an 'ident option is None, the default is to apply the tactic
- to the current goal *)
type loc = CicAst.location
+type ('term, 'ident) pattern =
+ ('ident * 'term) list * 'term option
+
type ('term, 'ident) tactic =
| Absurd of loc * 'term
| Apply of loc * 'term
| Auto of loc * int option
| Assumption of loc
| Change of loc * 'term * 'term * 'ident option (* what, with what, where *)
- | Change_pattern of loc * 'term pattern * 'term * 'ident option
- (* what, with what, where *)
| Contradiction of loc
| Cut of loc * 'term
| Decompose of loc * 'ident * 'ident list (* where, which principles *)
| Intros of loc * int option * 'ident list
| Left of loc
| LetIn of loc * 'term * 'ident
-(* | Named_intros of loc * 'ident list (* joined with Intros above *) *)
-(* | Reduce of loc * reduction_kind * 'term pattern * 'ident option (* what, where *) *)
- | ReduceAt of loc * reduction_kind * 'ident * 'term
- | Reduce of loc * reduction_kind * ('term list * 'term pattern) option
- (* kind, (what, where)
- * if second argument is None, reduction is applied to the current goal,
- * otherwise to each occurrence of loc * terms given in list occuring in term
- * pattern *)
+ | Reduce of loc * reduction_kind * ('term, 'ident) pattern
| Reflexivity of loc
| Replace of loc * 'term * 'term (* what, with what *)
- | Replace_pattern of loc * 'term pattern * 'term
- | Rewrite of loc * direction * 'term * 'ident option
+ | Rewrite of loc * direction * 'term * ('term, 'ident) pattern
| Right of loc
| Ring of loc
| Split of loc
(match where with
None -> size2
| Some ident -> size2 + 3 + String.length ident)
- | Change_pattern _ -> assert false (* TODO *)
+(* | Change_pattern _ -> assert false (* TODO *) *)
| Contradiction _ -> current_size + 13
| Cut (_, term) -> countterm (current_size + 4) term
| Decompose (_, ident, principles) ->
| Left _ -> current_size + 4
| LetIn (_, term, ident) ->
countterm (current_size + 5 + String.length ident) term
- | Reduce _
- | ReduceAt _ -> assert false (* TODO *)
+(* | Reduce _ *)
+ | Reduce _ -> assert false (* TODO *)
| Reflexivity _ -> current_size + 11
| Replace (_, t1, t2) ->
let size1 = countterm (current_size + 14) t1 in (* replace, with *)
countterm size1 t2
- | Replace_pattern _ -> assert false (* TODO *)
+(* | Replace_pattern _ -> assert false (* TODO *) *)
| Rewrite _ -> assert false (* TODO *)
| Right _ -> current_size + 5
| Ring _ -> current_size + 4
(pretty_append
[Box.Text([],"with")]
t2)@where)
- | Change_pattern _ -> assert false (* TODO *)
+(* | Change_pattern _ -> assert false (* TODO *) *)
| Contradiction _ -> Box.Text([],"contradiction")
| Cut (_, term) ->
Box.V([],[Box.Text([],"cut");
Box.smallskip;
Box.Text([],"=")]);
Box.indent (ast2astBox term)])
- | Reduce _
- | ReduceAt _ -> assert false (* TODO *)
+(* | Reduce _ *)
+ | Reduce _ -> assert false (* TODO *)
| Reflexivity _ -> Box.Text([],"reflexivity")
| Replace (_, t1, t2) ->
Box.V([],
(pretty_append
[Box.Text([],"with")]
t2))
- | Replace_pattern _ -> assert false (* TODO *)
+(* | Replace_pattern _ -> assert false (* TODO *) *)
| Rewrite _ -> assert false (* TODO *)
| Right _ -> Box.Text([],"right")
| Ring _ -> Box.Text([],"ring")
| `Simpl -> "simplify"
| `Whd -> "whd"
| `Normalize -> "normalize"
+
+let pp_pattern (hyp, goal) =
+ let pp_hyp_pattern l =
+ String.concat "; "
+ (List.map (fun (name, p) -> sprintf "%s : %s" name (pp_term_ast p)) l)
+ in
+ let pp_goal_pattern p =
+ match p with
+ | None -> ""
+ | Some p -> pp_term_ast p
+ in
+ let separator =
+ if hyp <> [] then " \vdash " else " "
+ in
+ pp_hyp_pattern hyp ^ separator ^ pp_goal_pattern goal
let rec pp_tactic = function
| Absurd (_, term) -> "absurd" ^ pp_term_ast term
| Apply (_, term) -> "apply " ^ pp_term_ast term
| Change (_, t1, t2, where) ->
sprintf "change %s with %s%s" (pp_term_ast t1) (pp_term_ast t2)
(match where with None -> "" | Some ident -> "in " ^ ident)
- | Change_pattern (_, _, _, _) -> assert false (* TODO *)
+(* | Change_pattern (_, _, _, _) -> assert false (* TODO *) *)
| Contradiction _ -> "contradiction"
| Cut (_, term) -> "cut " ^ pp_term_ast term
| Decompose (_, ident, principles) ->
(match idents with [] -> "" | idents -> " " ^ pp_idents idents)
| Left _ -> "left"
| LetIn (_, term, ident) -> sprintf "let %s in %s" (pp_term_ast term) ident
- | Reduce (_, kind, None)
- | Reduce (_, kind, Some ([], `Goal)) -> pp_reduction_kind kind
- | Reduce (_, kind, Some ([], `Everywhere)) ->
- sprintf "%s in hyp" (pp_reduction_kind kind)
- | Reduce (_, kind, Some (terms, `Goal)) ->
- sprintf "%s %s" (pp_reduction_kind kind)
- (String.concat ", " (List.map pp_term_ast terms))
- | Reduce (_, kind, Some (terms, `Everywhere)) ->
- sprintf "%s in hyp %s" (pp_reduction_kind kind)
- (String.concat ", " (List.map pp_term_ast terms))
- | ReduceAt (_, kind, id, term) ->
- sprintf "%s %s at %s" (pp_reduction_kind kind) id
- (pp_term_ast term)
+(* | Reduce (_, kind, None) *)
+(* | Reduce (_, kind, Some ([], `Goal)) -> pp_reduction_kind kind *)
+(* | Reduce (_, kind, Some ([], `Everywhere)) -> *)
+(* sprintf "%s in hyp" (pp_reduction_kind kind) *)
+(* | Reduce (_, kind, Some (terms, `Goal)) -> *)
+(* sprintf "%s %s" (pp_reduction_kind kind) *)
+(* (String.concat ", " (List.map pp_term_ast terms)) *)
+(* | Reduce (_, kind, Some (terms, `Everywhere)) -> *)
+(* sprintf "%s in hyp %s" (pp_reduction_kind kind) *)
+(* (String.concat ", " (List.map pp_term_ast terms)) *)
+ | Reduce (_, kind, pat) ->
+ sprintf "%s in %s" (pp_reduction_kind kind) (pp_pattern pat)
| Reflexivity _ -> "reflexivity"
| Replace (_, t1, t2) ->
sprintf "replace %s with %s" (pp_term_ast t1) (pp_term_ast t2)
- | Replace_pattern (_, _, _) -> assert false (* TODO *)
- | Rewrite (_, pos, t, None) ->
- sprintf "rewrite %s %s"
+(* | Replace_pattern (_, _, _) -> assert false (* TODO *) *)
+ | Rewrite (_, pos, t, pattern) ->
+ sprintf "rewrite %s %s in %s"
(if pos = `Left then "left" else "right") (pp_term_ast t)
- | Rewrite _ -> assert false (* TODO *)
+ (pp_pattern pattern)
| Right _ -> "right"
| Ring _ -> "ring"
| Split _ -> "split"