From: Claudio Sacerdoti Coen Date: Mon, 25 Aug 2008 13:14:54 +0000 (+0000) Subject: Non-linear patterns are now allowed in notations. X-Git-Tag: make_still_working~4844 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=a46b2e95dd4b2496956c45e9895602a74e92fd3b;p=helm.git Non-linear patterns are now allowed in notations. --- diff --git a/helm/software/components/acic_content/acic2astMatcher.ml b/helm/software/components/acic_content/acic2astMatcher.ml index d62786cc7..c71108320 100644 --- a/helm/software/components/acic_content/acic2astMatcher.ml +++ b/helm/software/components/acic_content/acic2astMatcher.ml @@ -77,9 +77,9 @@ struct module M = PatternMatcher.Matcher (Pattern32) let compiler rows = - let match_cb rows = - let pl, pid = try List.hd rows with Not_found -> assert false in - (fun matched_terms constructors -> + let match_cb rows matched_terms constructors = + HExtlib.list_findopt + (fun (pl,pid) -> let env = try List.map2 @@ -89,9 +89,23 @@ struct | Ast.VarPattern name -> name, t | _ -> assert false) pl matched_terms - with Invalid_argument _ -> assert false + with Invalid_argument _ -> assert false in + let rec check_non_linear_patterns = + function + [] -> true + | (name,t)::tl -> + List.for_all + (fun (name',t') -> + name <> name' || + CicUtil.alpha_equivalence + (Deannotate.deannotate_term t) (Deannotate.deannotate_term t') + ) tl && check_non_linear_patterns tl in - Some (env, constructors, pid)) + if check_non_linear_patterns env then + Some (env, constructors, pid) + else + None + ) rows in M.compiler rows match_cb (fun () -> None) end