144 and occur (Const _) = false |
144 and occur (Const _) = false |
145 | occur (Bound _) = false |
145 | occur (Bound _) = false |
146 | occur (Free _) = false |
146 | occur (Free _) = false |
147 | occur (Var (w,_)) = |
147 | occur (Var (w,_)) = |
148 if mem_ix (w, !seen) then false |
148 if mem_ix (w, !seen) then false |
149 else if v=w then true |
149 else if eq_ix(v,w) then true |
150 (*no need to lookup: v has no assignment*) |
150 (*no need to lookup: v has no assignment*) |
151 else (seen := w:: !seen; |
151 else (seen := w:: !seen; |
152 case Envir.lookup(env,w) of |
152 case Envir.lookup(env,w) of |
153 None => false |
153 None => false |
154 | Some t => occur t) |
154 | Some t => occur t) |
207 and occur (Const _) = NoOcc |
207 and occur (Const _) = NoOcc |
208 | occur (Bound _) = NoOcc |
208 | occur (Bound _) = NoOcc |
209 | occur (Free _) = NoOcc |
209 | occur (Free _) = NoOcc |
210 | occur (Var (w,_)) = |
210 | occur (Var (w,_)) = |
211 if mem_ix (w, !seen) then NoOcc |
211 if mem_ix (w, !seen) then NoOcc |
212 else if v=w then Rigid |
212 else if eq_ix(v,w) then Rigid |
213 else (seen := w:: !seen; |
213 else (seen := w:: !seen; |
214 case Envir.lookup(env,w) of |
214 case Envir.lookup(env,w) of |
215 None => NoOcc |
215 None => NoOcc |
216 | Some t => occur t) |
216 | Some t => occur t) |
217 | occur (Abs(_,_,body)) = occur body |
217 | occur (Abs(_,_,body)) = occur body |
218 | occur (t as f$_) = (*switch to nonrigid search?*) |
218 | occur (t as f$_) = (*switch to nonrigid search?*) |
219 (case head_of_in (env,f) of |
219 (case head_of_in (env,f) of |
220 Var (w,_) => (*w is not assigned*) |
220 Var (w,_) => (*w is not assigned*) |
221 if v=w then Rigid |
221 if eq_ix(v,w) then Rigid |
222 else nonrigid t |
222 else nonrigid t |
223 | Abs(_,_,body) => nonrigid t (*not in normal form*) |
223 | Abs(_,_,body) => nonrigid t (*not in normal form*) |
224 | _ => occomb t) |
224 | _ => occomb t) |
225 in occur t end; |
225 in occur t end; |
226 |
226 |
591 fun add_ffpair ((rbinder,t0,u0), (env,tpairs)) |
591 fun add_ffpair ((rbinder,t0,u0), (env,tpairs)) |
592 : Envir.env * (term*term)list = |
592 : Envir.env * (term*term)list = |
593 let val t = Envir.norm_term env t0 and u = Envir.norm_term env u0 |
593 let val t = Envir.norm_term env t0 and u = Envir.norm_term env u0 |
594 in case (head_of t, head_of u) of |
594 in case (head_of t, head_of u) of |
595 (Var(v,T), Var(w,U)) => (*Check for identical variables...*) |
595 (Var(v,T), Var(w,U)) => (*Check for identical variables...*) |
596 if v=w then (*...occur check would falsely return true!*) |
596 if eq_ix(v,w) then (*...occur check would falsely return true!*) |
597 if T=U then (env, add_tpair (rbinder, (t,u), tpairs)) |
597 if T=U then (env, add_tpair (rbinder, (t,u), tpairs)) |
598 else raise TERM ("add_ffpair: Var name confusion", [t,u]) |
598 else raise TERM ("add_ffpair: Var name confusion", [t,u]) |
599 else if xless(v,w) then (*prefer to update the LARGER variable*) |
599 else if xless(v,w) then (*prefer to update the LARGER variable*) |
600 clean_ffpair ((rbinder, u, t), (env,tpairs)) |
600 clean_ffpair ((rbinder, u, t), (env,tpairs)) |
601 else clean_ffpair ((rbinder, t, u), (env,tpairs)) |
601 else clean_ffpair ((rbinder, t, u), (env,tpairs)) |