src/Pure/unify.ML
changeset 2753 bcde71e5f371
parent 2193 b7e59795c75b
child 3991 4cb2f2422695
equal deleted inserted replaced
2752:74a9aead96c8 2753:bcde71e5f371
   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))