module Tactic.Nat where
open import Prelude
open import Tactic.Nat.Reflect public using (cantProve; invalidGoal; QED)
open import Tactic.Nat.Induction public
open import Tactic.Nat.Subtract public renaming
( autosub to auto
; simplifysub to simplify
; refutesub to refute )
open import Tactic.Reflection public using (apply-tactic; apply-goal-tactic)
private
auto-example₁ : (a b : Nat) → (a - b) * (a + b) ≡ a ^ 2 - b ^ 2
auto-example₁ a b = auto
auto-example₂ : (a b : Nat) → (a + b) ^ 2 ≥ a ^ 2 + b ^ 2
auto-example₂ a b = auto
private
by-example₁ : ∀ xs ys → sum (xs ++ ys) ≡ sum ys + sum xs
by-example₁ [] ys = auto
by-example₁ (x ∷ xs) ys = by (by-example₁ xs ys)
by-example₂ : (a b c : Nat) → a + c < b + c → a < b
by-example₂ a b c lt = by lt
by-example₃ : (a b : Nat) → a ≡ b * 2 → a + b < (b + 1) * 3
by-example₃ a b eq = by eq
by-example₄ : (a b c : Nat) → a + b + c ≤ b → 2 * c ≡ c
by-example₄ a b c lt = by lt
private
refute-example₁ : {Anything : Set} (a : Nat) → a ≡ 2 * a + 1 → Anything
refute-example₁ a eq = refute eq
refute-example₂ : {Anything : Set} (a b : Nat) → a + b < a → Anything
refute-example₂ a b lt = refute lt
private
simplify-goal-example : (a b : Nat) → a - b ≡ b - a → a ≡ b
simplify-goal-example zero b eq = by eq
simplify-goal-example (suc a) zero eq = refute eq
simplify-goal-example (suc a) (suc b) eq =
simplify-goal => simplify-goal-example a b eq
private
lemma : (a b : Nat) → a + b ≡ 0 → a ≡ 0
lemma zero b eq = refl
lemma (suc a) b eq = refute eq
simplify-example : ∀ a b → (a + 1) * (b + 1) ≡ a * b + 1 → a ≡ 0
simplify-example a b eq = simplify eq to eq′ => lemma a b eq′
private
downFrom : Nat → List Nat
downFrom zero = []
downFrom (suc n) = suc n ∷ downFrom n
induction-example : ∀ n → sum (downFrom n) * 2 ≡ n * (n + 1)
induction-example = induction