aboutsummaryrefslogtreecommitdiff
path: root/tactics
diff options
context:
space:
mode:
authorglondu2010-12-02 09:24:33 +0000
committerglondu2010-12-02 09:24:33 +0000
commit64a5d7b33c4c66fc82974f255cf40badd0b7bacf (patch)
treed4b9f0c5beb36a98a3a8868ae5c13545b54d4644 /tactics
parenta281f908a65ba7ba0678f42e20b3a0ed78250b18 (diff)
Add tactic has_evar (#2433)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@13664 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'tactics')
-rw-r--r--tactics/extratactics.ml425
1 files changed, 25 insertions, 0 deletions
diff --git a/tactics/extratactics.ml4 b/tactics/extratactics.ml4
index 393934abfa..78a1f51b78 100644
--- a/tactics/extratactics.ml4
+++ b/tactics/extratactics.ml4
@@ -718,3 +718,28 @@ TACTIC EXTEND is_evar
| _ -> tclFAIL 0 (str "Not an evar")
]
END
+
+let rec has_evar x =
+ match kind_of_term x with
+ | Evar _ -> true
+ | Rel _ | Var _ | Meta _ | Sort _ | Const _ | Ind _ | Construct _ ->
+ false
+ | Cast (t1, _, t2) | Prod (_, t1, t2) | Lambda (_, t1, t2) ->
+ has_evar t1 || has_evar t2
+ | LetIn (_, t1, t2, t3) ->
+ has_evar t1 || has_evar t2 || has_evar t3
+ | App (t1, ts) ->
+ has_evar t1 || has_evar_array ts
+ | Case (_, t1, t2, ts) ->
+ has_evar t1 || has_evar t2 || has_evar_array ts
+ | Fix ((_, tr)) | CoFix ((_, tr)) ->
+ has_evar_prec tr
+and has_evar_array x =
+ array_exists has_evar x
+and has_evar_prec (_, ts1, ts2) =
+ array_exists has_evar ts1 || array_exists has_evar ts2
+
+TACTIC EXTEND has_evar
+| [ "has_evar" constr(x) ] ->
+ [ if has_evar x then tclIDTAC else tclFAIL 0 (str "No evars") ]
+END