@ -669,25 +669,22 @@ let exec_spec pre {xs; foot; sub; ms; post} =
 
			
		
	
		
			
				
					  ; 
 
			
		
	
		
			
				
					  let  foot  =  Sh . extend_us  xs  foot  in 
 
			
		
	
		
			
				
					  let  zs ,  pre  =  Sh . bind_exists  pre  ~ wrt : xs  in 
 
			
		
	
		
			
				
					  (  match  Solver . infer_frame  pre  xs  foot  with 
 
			
		
	
		
			
				
					  |  Some  frame  -> 
 
			
		
	
		
			
				
					      Ok 
 
			
		
	
		
			
				
					        ( Sh . exists  ( Set . union  zs  xs ) 
 
			
		
	
		
			
				
					           ( Sh . star  post  ( Sh . exists  ms  ( Sh . rename  sub  frame ) ) ) ) 
 
			
		
	
		
			
				
					  |  None  ->  Error  ()  ) 
 
			
		
	
		
			
				
					  (  Solver . infer_frame  pre  xs  foot 
 
			
		
	
		
			
				
					  > > |  fun  frame  -> 
 
			
		
	
		
			
				
					  Sh . exists  ( Set . union  zs  xs ) 
 
			
		
	
		
			
				
					    ( Sh . star  post  ( Sh . exists  ms  ( Sh . rename  sub  frame ) ) )  ) 
 
			
		
	
		
			
				
					  | > 
 
			
		
	
		
			
				
					  [ % Trace . retn  fun  { pf }  r  ->  pf  " %a "  ( Result . pp  " %a "  Sh . pp )  r ] 
 
			
		
	
		
			
				
					  [ % Trace . retn  fun  { pf }  r  ->  pf  " %a "  ( Option . pp  " %a "  Sh . pp )  r ] 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					(*  execute a multiple-spec command, where the disjunction of the specs  
			
		
	
		
			
				
					   preconditions  are  known  to  be  tautologous  * ) 
 
			
		
	
		
			
				
					let  rec  exec_specs  pre  =  function  
			
		
	
		
			
				
					  |  ( { xs ;  foot ;  _ }  as  spec )  ::  specs  -> 
 
			
		
	
		
			
				
					      let  open  Result . Monad_infix  in 
 
			
		
	
		
			
				
					      let  pre_pure  =  Sh . star  ( Sh . exists  xs  ( Sh . pure_approx  foot ) )  pre  in 
 
			
		
	
		
			
				
					      exec_spec  pre_pure  spec 
 
			
		
	
		
			
				
					      > > =  fun  post  -> 
 
			
		
	
		
			
				
					      exec_specs  pre  specs  > > |  fun  posts  ->  Sh . or_  post  posts 
 
			
		
	
		
			
				
					  |  []  ->  Ok  ( Sh . false_  pre . us ) 
 
			
		
	
		
			
				
					  |  []  ->  Some  ( Sh . false_  pre . us ) 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					(*  
			
		
	
		
			
				
					 *  Exposed  interface 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -701,7 +698,7 @@ let kill pre reg = Sh.exists (Set.add Var.Set.empty reg) pre
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					let  move  pre  reg_exps  =  
			
		
	
		
			
				
					  exec_spec  pre  ( move_spec  pre . us  reg_exps ) 
 
			
		
	
		
			
				
					  | >  function  Ok post  ->  post  |  _  ->  assert  false  
 
			
		
	
		
			
				
					  | >  function  Some post  ->  post  |  _  ->  fail  " Exec.move failed "  
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					let  load  pre  ~ reg  ~ ptr  ~ len  =  exec_spec  pre  ( load_spec  pre . us  reg  ptr  len )  
			
		
	
		
			
				
					let  store  pre  ~ ptr  ~ exp  ~ len  =  exec_spec  pre  ( store_spec  pre . us  ptr  exp  len )  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -718,14 +715,10 @@ let memmov pre ~dst ~src ~len =
 
			
		
	
		
			
				
					let  alloc  pre  ~ reg  ~ num  ~ len  =  exec_spec  pre  ( alloc_spec  pre . us  reg  num  len )  
			
		
	
		
			
				
					let  free  pre  ~ ptr  =  exec_spec  pre  ( free_spec  pre . us  ptr )  
			
		
	
		
			
				
					let  nondet  pre  =  function  Some  reg  ->  kill  pre  reg  |  None  ->  pre  
			
		
	
		
			
				
					let  abort  _  =  Error ()   
			
		
	
		
			
				
					let  abort  _  =  None  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					let  intrinsic  ~ skip_throw  :  
			
		
	
		
			
				
					       Sh . t 
 
			
		
	
		
			
				
					    ->  Var . t  option 
 
			
		
	
		
			
				
					    ->  Var . t 
 
			
		
	
		
			
				
					    ->  Term . t  list 
 
			
		
	
		
			
				
					    ->  ( Sh . t ,  unit )  result  option  = 
 
			
		
	
		
			
				
					    Sh . t  ->  Var . t  option  ->  Var . t  ->  Term . t  list  ->  Sh . t  option  option  = 
 
			
		
	
		
			
				
					 fun  pre  areturn  intrinsic  actuals  -> 
 
			
		
	
		
			
				
					  [ % Trace . info 
 
			
		
	
		
			
				
					    " @[<2>exec intrinsic@ @[%a%a(@[%a@])@] from@ @[{ %a@ }@]@] " 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -737,7 +730,7 @@ let intrinsic ~skip_throw :
 
			
		
	
		
			
				
					    let  n  =  Var . name  intrinsic  in 
 
			
		
	
		
			
				
					    match  String . index  n  '.'  with  None  ->  n  |  Some  i  ->  String . prefix  n  i 
 
			
		
	
		
			
				
					  in 
 
			
		
	
		
			
				
					  let  skip  pre  =  Some  ( Ok  pre )  in 
 
			
		
	
		
			
				
					  let  skip  pre  =  Some  ( Some  pre )  in 
 
			
		
	
		
			
				
					  match  ( areturn ,  name ,  actuals )  with 
 
			
		
	
		
			
				
					  (* 
 
			
		
	
		
			
				
					   *  cstdlib  -  memory  management