@ -51,6 +51,18 @@ let pp = ppx (fun _ -> None)
 
			
		
	
		
			
				
					 *  and  formulas  stratified  below  conditional  terms  and  then  expressions . 
 
			
		
	
		
			
				
					 * ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					let  _ Ite  cnd  thn  els  =  
			
		
	
		
			
				
					  match  ( cnd  :  Fml . t )  with 
 
			
		
	
		
			
				
					  (*   ( tt ? t : e )  ==> t  *) 
 
			
		
	
		
			
				
					  |  Tt  ->  thn 
 
			
		
	
		
			
				
					  (*   ( ff ? t : e )  ==> e  *) 
 
			
		
	
		
			
				
					  |  Not  Tt  ->  els 
 
			
		
	
		
			
				
					  (*   ( c ? t : t )  ==> t  *) 
 
			
		
	
		
			
				
					  |  _  when  equal_cnd  thn  els  ->  thn 
 
			
		
	
		
			
				
					  (*   ( ¬c ? t : e )  ==>  ( c ? e : t )   *) 
 
			
		
	
		
			
				
					  |  _  when  Fml . is_negative  cnd  ->  ` Ite  ( Fml . not_  cnd ,  els ,  thn ) 
 
			
		
	
		
			
				
					  |  _  ->  ` Ite  ( cnd ,  thn ,  els ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					(* *  Map a unary function on terms over the leaves of a conditional term,  
			
		
	
		
			
				
					    rebuilding  the  tree  of  conditionals  with  the  supplied  ite  construction 
 
			
		
	
		
			
				
					    function .  * ) 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -67,7 +79,7 @@ let rec map_cnd : (fml -> 'a -> 'a -> 'a) -> (trm -> 'a) -> cnd -> 'a =
 
			
		
	
		
			
				
					let  embed_into_cnd  :  exp  ->  cnd  =  function  
			
		
	
		
			
				
					  |  # cnd  as  c  ->  c 
 
			
		
	
		
			
				
					  (*  p ==>  ( p ? 1 : 0 )   *) 
 
			
		
	
		
			
				
					  |  ` Fml  fml  ->  `Ite  ( fml ,  ` Trm  Trm . one ,   ` Trm  Trm . zero ) 
 
			
		
	
		
			
				
					  |  ` Fml  fml  ->  _Ite  fml  ( ` Trm  Trm . one )  (  ` Trm  Trm . zero ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					(* *  Project out a formula that is embedded into a conditional term.  
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -89,8 +101,8 @@ let ite : fml -> exp -> exp -> exp =
 
			
		
	
		
			
				
					  match  ( thn ,  els )  with 
 
			
		
	
		
			
				
					  |  ` Fml  pos ,  ` Fml  neg  ->  ` Fml  ( cond  cnd  pos  neg ) 
 
			
		
	
		
			
				
					  |  _  ->  ( 
 
			
		
	
		
			
				
					      let  c  =  `Ite  ( cnd ,  embed_into_cnd  thn ,   embed_into_cnd  els )  in 
 
			
		
	
		
			
				
					      match  project_out_fml  c  with  Some  f  ->  ` Fml  f  |  None  ->  c  ) 
 
			
		
	
		
			
				
					      let  c  =  _Ite  cnd  ( embed_into_cnd  thn )  (  embed_into_cnd  els )  in 
 
			
		
	
		
			
				
					      match  project_out_fml  c  with  Some  f  ->  ` Fml  f  |  None  ->  ( c  :>  exp )   ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					(* *  Embed a conditional term into a formula  ( associating 0 with false and  
			
		
	
		
			
				
					    non - 0  with  true ,  lifted  over  the  tree  mapping  conditional  terms  to 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -303,7 +315,7 @@ module Term = struct
 
			
		
	
		
			
				
					        let  thn'  =  map_vars_c  ~ f  thn  in 
 
			
		
	
		
			
				
					        let  els'  =  map_vars_c  ~ f  els  in 
 
			
		
	
		
			
				
					        if  cnd'  = =  cnd  &&  thn'  = =  thn  &&  els'  = =  els  then  c 
 
			
		
	
		
			
				
					        else  `Ite  ( cnd' ,  thn' ,  els' )  
 
			
		
	
		
			
				
					        else  _Ite  cnd'  thn'  els'  
 
			
		
	
		
			
				
					    |  ` Trm  t  -> 
 
			
		
	
		
			
				
					        let  t'  =  Trm . map_vars  ~ f  t  in 
 
			
		
	
		
			
				
					        if  t'  = =  t  then  c  else  ` Trm  t'