lean4-htt/tests/lean/run/eqn_preprocessor1.lean
Leonardo de Moura d4f2bb77b8 feat(frontends/lean): recursive equation preprocessor
To make the equation compiler more convenient to use, we will add a
couple of preprocessing steps.
This commit adds the first one of them. In this step, we use
type inference to refine pattern variables, and we relax the
restrictions on inaccessible annotations.

We will also add a preprocessing step that implements the "complete
transition" step before we execute the elim_match step.
2017-08-18 15:06:11 -07:00

58 lines
1.6 KiB
Text

open nat
inductive Vec (A : Type) : nat → Type
| nil {} : Vec 0
| cons : Π {n}, A → Vec n → Vec (succ n)
open Vec
def append1 {A : Type} : Π {m n : nat}, Vec A m -> Vec A n -> Vec A (n + m)
| _ m nil ys := ys
| _ m (cons x xs) ys := cons x (append1 xs ys)
def append2 {A : Type} : Π {m n : nat}, Vec A m -> Vec A n -> Vec A (n + m)
| _ _ nil ys := ys
| _ _ (cons x xs) ys := cons x (append2 xs ys)
def append3 {A : Type} : Π {m n : nat}, Vec A m -> Vec A n -> Vec A (n + m)
| ._ m nil ys := ys
| ._ m (cons x xs) ys := cons x (append1 xs ys)
inductive Fin : nat → Type
| fzero : Π {n}, Fin (nat.succ n)
open Fin
def fmin1 : Π {n : nat} (x y : Fin n), Fin n
| ._ fzero fzero := fzero
def fmin2 : Π {n : nat} (x y : Fin n), Fin n
| _ fzero fzero := fzero
def fmin3 : Π {n : nat} (x y : Fin n), Fin n
| n fzero fzero := fzero
def fmin4 : Π {n : nat} (x y : Fin n), Fin n
| .(succ n) (@fzero n) (@fzero .(n)) := fzero
def fmin5 : Π {n : nat} (x y : Fin n), Fin n
| .(succ n) (@fzero .(n)) (@fzero n) := fzero
def fmin6 : Π {n : nat} (x y : Fin n), Fin n
| .(succ _) fzero fzero := fzero
example (n : nat) (x y : Fin n) : fmin1 x y = fmin2 x y :=
begin cases x, cases y, refl end
example (n : nat) (x y : Fin n) : fmin1 x y = fmin3 x y :=
begin cases x, cases y, refl end
example (n : nat) (x y : Fin n) : fmin1 x y = fmin4 x y :=
begin cases x, cases y, refl end
example (n : nat) (x y : Fin n) : fmin1 x y = fmin5 x y :=
begin cases x, cases y, refl end
example (n : nat) (x y : Fin n) : fmin1 x y = fmin6 x y :=
begin cases x, cases y, refl end