module Tactic.Nat.Refute where

open import Prelude
open import Builtin.Reflection
open import Tactic.Reflection.Quote
open import Tactic.Reflection

open import Tactic.Nat.Reflect
open import Tactic.Nat.NF
open import Tactic.Nat.Exp
open import Tactic.Nat.Auto
open import Tactic.Nat.Auto.Lemmas
open import Tactic.Nat.Simpl.Lemmas
open import Tactic.Nat.Simpl

data Impossible : Set where

invalidEquation : 
invalidEquation = _

refutation :  {a} {A : Set a} {Atom : Set} {{_ : Eq Atom}} {{_ : Ord Atom}} eq (ρ : Env Atom) 
               ¬ CancelEq eq ρ  ExpEq eq ρ  A
refutation exp ρ !eq eq = ⊥-elim (!eq (complicateEq exp ρ eq))

refute-tactic : Term  Term
refute-tactic (pi (vArg (el _ a)) _) =
  case termToEq a of λ
  { nothing  failedProof (quote invalidEquation) a
  ; (just (eq , Γ)) 
    def (quote refutation)
        $ vArg (` eq)
         vArg (quotedEnv Γ)
         vArg absurd-lam
         []
  }
refute-tactic _ = def (quote Impossible) []

macro
  refute : Term  Term
  refute = on-type-of-term (quote refute-tactic)