diff --git a/theories/program_logic/language.v b/theories/program_logic/language.v
index 365b9f2216ea451793809b9972f4a6b8225207a9..b9d10beb85ddde0964e3f0810c7eada0284fd404 100644
--- a/theories/program_logic/language.v
+++ b/theories/program_logic/language.v
@@ -145,12 +145,11 @@ Section language.
     PureExec φ (K e1) (K e2).
   Proof.
     intros [Hred Hstep]. split.
-    - intros σ ?. destruct (Hred σ) as (? & ? & ? & ?); first done.
-      do 3 eexists. eapply fill_step. done.
-    - intros σ ???? Hpstep. edestruct fill_step_inv as (? & ? & ?); [|exact Hpstep|].
-      + destruct (Hred σ) as (? & ? & ? & ?); first done.
-        eapply val_stuck. done.
-      + edestruct Hstep as (? & ? & ?); [done..|]. by subst.
+    - unfold reducible in *. naive_solver eauto using fill_step.
+    - intros σ1 e2' σ2 efs ? Hpstep.
+      destruct (fill_step_inv e1 σ1 e2' σ2 efs) as (e2'' & -> & ?); [|exact Hpstep|].
+      + destruct (Hred σ1) as (? & ? & ? & ?); eauto using val_stuck.
+      + edestruct (Hstep σ1 e2'' σ2 efs) as (-> & -> & ->); auto.
   Qed.
 
   (* This is a family of frequent assumptions for PureExec *)