and does_not_occur ?(subst=[]) context n nn te =
let module C = Cic in
- (*CSC: whd sembra essere superflua perche' un caso in cui l'occorrenza *)
- (*CSC: venga mangiata durante la whd sembra presentare problemi di *)
- (*CSC: universi *)
- match CicReduction.whd ~subst context te with
+ match te with
C.Rel m when m > n && m <= nn -> false
- | C.Rel _
+ | C.Rel m ->
+ (try
+ (match List.nth context (m-1) with
+ Some (_,C.Def (bo,_)) ->
+ does_not_occur ~subst context n nn (CicSubstitution.lift m bo)
+ | _ -> true)
+ with
+ Failure _ -> assert false)
| C.Sort _
| C.Implicit _ -> true
| C.Meta (_,l) ->
(fun x i ->
match x with
None -> i
- | Some x -> i && does_not_occur ~subst context n nn x) l true
+ | Some x -> i && does_not_occur ~subst context n nn x) l true &&
+ (try
+ let (canonical_context,term,ty) = CicUtil.lookup_subst n subst in
+ does_not_occur ~subst context n nn (CicSubstitution.subst_meta l term)
+ with
+ CicUtil.Subst_not_found _ -> true)
| C.Cast (te,ty) ->
does_not_occur ~subst context n nn te && does_not_occur ~subst context n nn ty
| C.Prod (name,so,dest) ->