Library lazyPCF.SubjRed.NF



Require Import syntax.


Inductive F : tmProp :=
  | F_abs : (v : vari) (s : ty) (e : tm), F (abs v s e)
  | F_clos : (e e1 : tm) (v : vari) (s : ty), F eF (clos e v s e1).
Inductive Sno : tmProp :=
  | Sno_o : Sno o
  | Sno_s : e : tm, Sno eSno (succ e).

Inductive NF : tmProp :=
  | NF_ttt : NF ttt
  | NF_fff : NF fff
  | NF_Sno : e : tm, Sno eNF e
  | NF_F : e : tm, F eNF e.


Definition NFsucc (e : tm) :=
  match e return Prop with
  | o
       True
      
  | tttTrue
      
  | fffTrue
      
  | abs v s eTrue
      
  | appl e1 e2True
      
  | cond e1 e2 e3True
      
  | var vTrue
      
  | succ nSno (succ n)
      
  | prd nTrue
      
  | is_o nTrue
      
  | Fix v s eTrue
      
  | clos e v s e1True
  end.

Goal e : tm, NF (succ e) → Sno (succ e).
intros e HNF. change (NFsucc (succ e)) in |- ×.
elim HNF; simpl in |- *; intros; exact I || elim H; simpl in |- *; intros;
 exact I || apply Sno_s; assumption.
Save inv_NF_Sno.

Definition SnoSucc (e : tm) :=
  match e return Prop with
  | o
       True
      
  | tttTrue
      
  | fffTrue
      
  | abs v s eTrue
      
  | appl e1 e2True
      
  | cond e1 e2 e3True
      
  | var vTrue
      
  | succ nSno n
      
  | prd nTrue
      
  | is_o nTrue
      
  | Fix v s eTrue
      
  | clos e v s e1True
  end.

Goal e : tm, Sno (succ e) → Sno e.
intros e HSno. change (SnoSucc (succ e)) in |- ×.
elim HSno; simpl in |- *; intros; exact I || assumption.
Save inv_Sno_s.