aboutsummaryrefslogtreecommitdiff
path: root/theories/Pattern.v
diff options
context:
space:
mode:
authorPierre-Marie Pédrot2017-10-25 12:13:27 +0200
committerPierre-Marie Pédrot2017-10-27 11:48:40 +0200
commitd4172d2c7a48d932b42248fe57c6c2a87ac57e30 (patch)
tree48f49fa0490659f3f505f26ef6fb86d6ae0eae64 /theories/Pattern.v
parent0b26bfc8e068e1e95eeea9db0c3bda7436ac8338 (diff)
Stubs for goal matching: quotation and matching function.
Diffstat (limited to 'theories/Pattern.v')
-rw-r--r--theories/Pattern.v29
1 files changed, 26 insertions, 3 deletions
diff --git a/theories/Pattern.v b/theories/Pattern.v
index a672ad0fe7..fb450d9dfa 100644
--- a/theories/Pattern.v
+++ b/theories/Pattern.v
@@ -12,11 +12,15 @@ Ltac2 Type t := pattern.
Ltac2 Type context.
-Ltac2 Type 'a constr_match := [
-| ConstrMatchPattern (pattern, constr array -> 'a)
-| ConstrMatchContext (pattern, context -> constr array -> 'a)
+Ltac2 Type match_kind := [
+| MatchPattern
+| MatchContext
].
+Ltac2 @ external empty_context : unit -> context :=
+ "ltac2" "pattern_empty_context".
+(** A trivial context only made of the hole. *)
+
Ltac2 @ external matches : t -> constr -> (ident * constr) list :=
"ltac2" "pattern_matches".
(** If the term matches the pattern, returns the bound variables. If it doesn't,
@@ -38,6 +42,25 @@ Ltac2 @ external matches_subterm_vect : t -> constr -> context * constr array :=
"ltac2" "pattern_matches_subterm_vect".
(** Internal version of [matches_subterms] that does not return the identifiers. *)
+Ltac2 @ external matches_goal : bool -> (match_kind * t) list -> (match_kind * t) ->
+ ident array * context array * constr array * context :=
+ "ltac2" "pattern_matches_goal".
+(** Given a list of patterns [hpats] for hypotheses and one pattern [cpat] for the
+ conclusion, [matches_goal rev hpats cpat] produces (a stream of) tuples of:
+ - An array of idents, whose size is the length of [hpats], corresponding to the
+ name of matched hypotheses.
+ - An array of contexts, whose size is the length of [hpats], corresponding to
+ the contexts matched for every hypothesis pattern. In case the match kind of
+ a hypothesis was [MatchPattern], the corresponding context is ensured to be empty.
+ - An array of terms, whose size is the total number of pattern variables without
+ duplicates. Terms are ordered by identifier order, e.g. ?a comes before ?b.
+ - A context corresponding to the conclusion, which is ensured to be empty if
+ the kind of [cpat] was [MatchPattern].
+ This produces a backtracking stream of results containing all the possible
+ result combinations. The order of considered hypotheses is reversed if [rev]
+ is true.
+*)
+
Ltac2 @ external instantiate : context -> constr -> constr :=
"ltac2" "pattern_instantiate".
(** Fill the hole of a context with the given term. *)