test script for removal of unneeded arguments
Load removeNonAug.
Inductive listáµ— (A : Type) (Aáµ— : A -> Type) : list A -> Type :=
niláµ— : listáµ— A Aáµ— []
| consáµ— : forall H : A,
Aáµ— H -> forall H0 : list A, listáµ— A Aáµ— H0 -> listáµ— A Aáµ— (H :: H0).
Inductive booláµ— : bool -> Set :=
trueáµ— : booláµ— true | falseáµ— : booláµ— false.
Inductive natáµ— : nat -> Set :=
Oáµ— : natáµ— 0
| Sáµ— : forall H : nat, natáµ— H -> natáµ— (S H).
Definition vec := VectorDef.t.
Inductive
vecáµ— (A : Type) (Aáµ— : A -> Type)
: forall H : nat, natáµ— H -> vec A H -> Type :=
vecniláµ— : vecáµ— A Aáµ— 0 Oáµ— (@Vector.nil A)
| vecconsáµ— : forall H : A,
Aáµ— H ->
forall (n : nat) (náµ— : natáµ— n)
(H0 : vec A n),
vecáµ— A Aáµ— n náµ— H0 ->
vecáµ— A Aáµ— (S n) (Sáµ— n náµ—)
(@Vector.cons A H n H0).
(* Inductive *)
(* vecáµ—' (A : Type) (Aáµ— : A -> Type) *)
(* : forall H : nat, vec A H -> Type := *)
(* vecniláµ—' : vecáµ—' A Aáµ— 0 (@Vector.nil A) *)
(* | vecconsáµ—' : forall H : A, *)
(* Aáµ— H -> *)
(* forall (n : nat) *)
(* (1* (náµ— : natáµ— n) *1) *)
(* (H0 : vec A n), *)
(* vecáµ—' A Aáµ— n H0 -> *)
(* vecáµ—' A Aáµ— (S n) *)
(* (@Vector.cons A H n H0). *)
(*
Print vecáµ—.
Inductive
vecáµ— (A : Type) (Aáµ— : A -> Type)
: forall H : nat, natáµ— H -> vec A H -> Type :=
vecniláµ— : vecáµ— A Aáµ— 0 Oáµ— (Vector.nil A)
| vecconsáµ— : forall H : A,
Aáµ— H ->
forall (n : nat) (náµ— : natáµ— n) (H0 : vec A n),
vecáµ— A Aáµ— n náµ— H0 ->
vecáµ— A Aáµ— (S n) (Sáµ— n náµ—) (Vector.cons A H n H0)
*)
(* MetaCoq Run (cleanInd "vecáµ—" >>= tmMsg). *)
(* MetaCoq Run (cleanInd listáµ— >>= tmMsg). *)
(* Print vecáµ—0. *)
(* Print listáµ—0. *)
Print tmMkInductive.
Print mutual_inductive_entry.
Search mutual_inductive_entry.
Print mutual_inductive_body.
Print context_decl.
MetaCoq Run (tmQuoteInductive "vecáµ—" >>= tmPrint).
Compute (removeArgList (tApp (tRel 0) [tRel 1;tRel 2;tRel 3]) [1]).
About print_term.
Search global_env_ext.
(* MetaCoq Run ( *)
(* xp <- removeNonAugmentable <*)
(* , forall H : nat, natáµ— H -> vec A H -> Type *)
(* y <- tmEval all (xp);; *)
(* tmPrint y;; *)
(* tmMsg (print_term (empty_ext ) true y.1)). *)
(* MetaCoq Run ( *)
(* x <- removeNonAugmentable *)
(* <*)
(* forall(A : Type) (Aáµ— : A -> Type), *)
(* forall H : A, *)
(* Aáµ— H -> *)
(* forall (n : nat) (náµ— : natáµ— n) *)
(* (H0 : vec A n), *)
(* vecáµ— A Aáµ— n náµ— H0 -> *)
(* vecáµ— A Aáµ— (S n) (Sáµ— n náµ—) *)
(* (@Vector.cons A H n H0) *)
(* *)
(* y <- tmEval all (x);; *)
(* tmPrint y;; *)
(* tmMsg (print_term (empty_ext ) true y.1);; *)
(* tmMsg "";; *)
(* tmMsg "";; *)
(* tmMsg "";; *)
(* y2 <- tmEval all (removeArgList (y.1) 3);; *)
(* tmPrint y2;; *)
(* tmMsg (print_term (empty_ext ) true y2) *)
(* ). *)
(*
1. remove Parameter after non augmentable inductive
2. delete parameter in recursive call
should the function look inside the arguments?
TODO: find examples like (T -> nat) or (nat -> T) in an argument
*)