diff options
| author | Pierre-Marie Pédrot | 2017-10-25 12:13:27 +0200 |
|---|---|---|
| committer | Pierre-Marie Pédrot | 2017-10-27 11:48:40 +0200 |
| commit | d4172d2c7a48d932b42248fe57c6c2a87ac57e30 (patch) | |
| tree | 48f49fa0490659f3f505f26ef6fb86d6ae0eae64 /theories/Pattern.v | |
| parent | 0b26bfc8e068e1e95eeea9db0c3bda7436ac8338 (diff) | |
Stubs for goal matching: quotation and matching function.
Diffstat (limited to 'theories/Pattern.v')
| -rw-r--r-- | theories/Pattern.v | 29 |
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. *) |
