/- Copyright (c) 2020 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Leonardo de Moura -/ import Lean.Util.Recognizers import Lean.Meta.Basic namespace Lean.Meta @[inline] def testHelper (e : Expr) (p : Expr → MetaM Bool) : MetaM Bool := do if (← p e) then return true else p (← whnf e) @[inline] def matchHelper? (e : Expr) (p? : Expr → MetaM (Option α)) : MetaM (Option α) := do match (← p? e) with | none => p? (← whnf e) | s => return s def matchEq? (e : Expr) : MetaM (Option (Expr × Expr × Expr)) := matchHelper? e fun e => return Expr.eq? e def matchFalse (e : Expr) : MetaM Bool := do testHelper e fun e => return e.isConstOf ``False def matchNot? (e : Expr) : MetaM (Option Expr) := matchHelper? e fun e => do if let some e := e.not? then return e else if let some (a, b) := e.arrow? then if (← matchFalse b) then return some a else return none else return none def matchNe? (e : Expr) : MetaM (Option (Expr × Expr × Expr)) := matchHelper? e fun e => do if let some r := e.ne? then return r else if let some e ← matchNot? e then matchEq? e else return none def matchConstructorApp? (e : Expr) : MetaM (Option ConstructorVal) := do let env ← getEnv matchHelper? e fun e => return e.isConstructorApp? env end Lean.Meta