in
let g a = a in
aux g t S.empty
+
+let rec aux n = function
+ | C.Sort _
+ | C.Implicit _
+ | C.Rel _ -> succ n
+ | C.Appl ts -> List.fold_left aux (succ n) ts
+ | C.Const (_, ss)
+ | C.MutConstruct (_, _, _, ss)
+ | C.MutInd (_, _, ss)
+ | C.Var (_, ss) ->
+ let map n (_, t) = aux n t in
+ List.fold_left map (succ n) ss
+ | C.Meta (_, ss) ->
+ let map n = function
+ | None -> n
+ | Some t -> aux n t
+ in
+ List.fold_left map (succ n) ss
+ | C.Cast (t1, t2)
+ | C.LetIn (_, t1, t2)
+ | C.Lambda (_, t1, t2)
+ | C.Prod (_, t1, t2) -> aux (aux (succ n) t2) t1
+ | C.MutCase (_, _, t1, t2, ss) ->
+ aux (aux (List.fold_left aux (succ n) ss) t2) t1
+ | C.Fix (_, ss) ->
+ let map n (_, _, t1, t2) = aux (aux n t2) t1 in
+ List.fold_left map (succ n) ss
+ | C.CoFix (_, ss) ->
+ let map n (_, t1, t2) = aux (aux n t2) t1 in
+ List.fold_left map (succ n) ss
+
+let count_nodes = aux