diff --git a/iris/hoare_lifting.v b/iris/hoare_lifting.v
index dac04e964595b4081270c80e33c22dece7745958..53886aab2687164483c8d3d52300af421d651885 100644
--- a/iris/hoare_lifting.v
+++ b/iris/hoare_lifting.v
@@ -15,7 +15,7 @@ Import uPred.
 Lemma ht_lift_step E1 E2
     (φ : iexpr Σ → istate Σ → option (iexpr Σ) → Prop) P P' Q1 Q2 R e1 σ1 :
   E1 ⊆ E2 → to_val e1 = None →
-  (∃ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef) →
+  reducible e1 σ1 →
   (∀ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef → φ e2 σ2 ef) →
   (P >{E2,E1}> (ownP σ1 ★ ▷ P') ∧ ∀ e2 σ2 ef,
     (■ φ e2 σ2 ef ★ ownP σ2 ★ P') >{E1,E2}> (Q1 e2 σ2 ef ★ Q2 e2 σ2 ef) ∧
@@ -45,7 +45,7 @@ Qed.
 Lemma ht_lift_atomic E
     (φ : iexpr Σ → istate Σ → option (iexpr Σ) → Prop) P e1 σ1 :
   atomic e1 →
-  (∃ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef) →
+  reducible e1 σ1 →
   (∀ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef → φ e2 σ2 ef) →
   (∀ e2 σ2 ef, {{ ■ φ e2 σ2 ef ★ P }} ef ?@ coPset_all {{ λ _, True }}) ⊑
   {{ ownP σ1 ★ ▷ P }} e1 @ E {{ λ v, ∃ σ2 ef, ownP σ2 ★ ■ φ (of_val v) σ2 ef }}.
@@ -71,7 +71,7 @@ Proof.
 Qed.
 Lemma ht_lift_pure_step E (φ : iexpr Σ → option (iexpr Σ) → Prop) P P' Q e1 :
   to_val e1 = None →
-  (∀ σ1, ∃ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef) →
+  (∀ σ1, reducible e1 σ1) →
   (∀ σ1 e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef → σ1 = σ2 ∧ φ e2 ef) →
   (∀ e2 ef,
     {{ ■ φ e2 ef ★ P }} e2 @ E {{ Q }} ∧
@@ -97,7 +97,7 @@ Qed.
 Lemma ht_lift_pure_determistic_step E
     (φ : iexpr Σ → option (iexpr Σ) → Prop) P P' Q e1 e2 ef :
   to_val e1 = None →
-  (∀ σ1, prim_step e1 σ1 e2 σ1 ef) →
+  (∀ σ1, reducible e1 σ1) →
   (∀ σ1 e2' σ2 ef', prim_step e1 σ1 e2' σ2 ef' → σ1 = σ2 ∧ e2 = e2' ∧ ef = ef')→
   ({{ P }} e2 @ E {{ Q }} ∧ {{ P' }} ef ?@ coPset_all {{ λ _, True }})
   ⊑ {{ ▷(P ★ P') }} e1 @ E {{ Q }}.
diff --git a/iris/language.v b/iris/language.v
index 443340947a1dfffd59c259a98f0037cc8bcafc87..c92a7ebb9625d7879fa35e11a8f10ec7f1c91e74 100644
--- a/iris/language.v
+++ b/iris/language.v
@@ -18,6 +18,11 @@ Class Language (E V St : Type) := {
 Section language.
   Context `{Language E V St}.
 
+  Definition reducible (e : E) (σ : St) :=
+    ∃ e' σ' ef, prim_step e σ e' σ' ef.
+  Lemma reducible_not_val e σ : reducible e σ → to_val e = None.
+  Proof. intros (?&?&?&?); eauto using values_stuck. Qed.
+
   Lemma atomic_of_val v : ¬atomic (of_val v).
   Proof.
     by intros Hat; apply atomic_not_value in Hat; rewrite to_of_val in Hat.
diff --git a/iris/lifting.v b/iris/lifting.v
index 8526f16e4ed5c1f40b3be94613969edee30fa107..c94eda289e988da9ac0c8ea2dd2298a147a9437d 100644
--- a/iris/lifting.v
+++ b/iris/lifting.v
@@ -16,7 +16,7 @@ Transparent uPred_holds.
 Lemma wp_lift_step E1 E2
     (φ : iexpr Σ → istate Σ → option (iexpr Σ) → Prop) Q e1 σ1 :
   E1 ⊆ E2 → to_val e1 = None →
-  (∃ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef) →
+  reducible e1 σ1 →
   (∀ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef → φ e2 σ2 ef) →
   pvs E2 E1 (ownP σ1 ★ ▷ ∀ e2 σ2 ef, (■ φ e2 σ2 ef ∧ ownP σ2) -★
     pvs E1 E2 (wp E2 e2 Q ★ default True ef (flip (wp coPset_all) (λ _, True))))
@@ -37,7 +37,7 @@ Proof.
 Qed.
 Lemma wp_lift_pure_step E (φ : iexpr Σ → option (iexpr Σ) → Prop) Q e1 :
   to_val e1 = None →
-  (∀ σ1, ∃ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef) →
+  (∀ σ1, reducible e1 σ1) →
   (∀ σ1 e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef → σ1 = σ2 ∧ φ e2 ef) →
   (▷ ∀ e2 ef, ■ φ e2 ef →
     wp E e2 Q ★ default True ef (flip (wp coPset_all) (λ _, True)))
diff --git a/iris/weakestpre.v b/iris/weakestpre.v
index 3e34864facf61be6f6578060083622cb1563ce06..c4383ab18026056abd289437c87f7b736358ecda 100644
--- a/iris/weakestpre.v
+++ b/iris/weakestpre.v
@@ -9,7 +9,7 @@ Local Hint Extern 10 (✓{_} _) =>
 
 Record wp_go {Σ} (E : coPset) (Q Qfork : iexpr Σ → nat → res' Σ → Prop)
     (k : nat) (rf : res' Σ) (e1 : iexpr Σ) (σ1 : istate Σ) := {
-  wf_safe : ∃ e2 σ2 ef, prim_step e1 σ1 e2 σ2 ef;
+  wf_safe : reducible e1 σ1;
   wp_step e2 σ2 ef :
     prim_step e1 σ1 e2 σ2 ef →
     ∃ r2 r2',