PO.Bridge
Bridges into the potential-outcome framework: the PO system induced by a structural causal model and by finite-coordinate restriction.
FromSCM 8 core · 16 supporting This file constructs the potential-outcome system induced by a generalized structural causal model and a background assignment of fixed variables. ★ ofSCM_consistency
Potential Outcome Systems from Structural Models
This file constructs the potential-outcome system induced by a generalized structural causal model and a background assignment of fixed variables. The construction keeps one potential-outcome variable for every observed random node, translates structurally eligible regime targets into interventions, evaluates the intervened model at latent draws, and projects back to the observed variables.
The construction is organized around ObsIdx, regimeTargetN,
combinedFixed, inducedEval, and POSystem.ofSCM. The theorem
POSystem.ofSCM_consistency proves that the induced potential-outcome system
satisfies factual and composition consistency by reducing those clauses to the
SCM counterfactual consistency lemmas.
The observed-node index set of the induced potential-outcome system consists of all random observed nodes of the structural model.
Every observed random node is an index of the potential-outcome system induced by an SCM.
Definition (Lean source)
The value space of an observed-node index in the induced potential-outcome system is the structural-model value space attached to that observed node.
The structural variable names targeted by a potential-outcome regime are the underlying names of the regime targets whose fixed counterparts are not already fixed in the structural model.
Definition (Lean source)
The combined fixed-variable assignment feeds the original background values and the regime's intervention values into the intervened structural model.
Definition (Lean source)
The induced joint evaluation map assigns values to all observed-node indices by evaluating the intervened structural model at a background assignment, a potential-outcome regime, and a latent draw.
Definition (Lean source)
A structural model and a background assignment induce a potential-outcome system whose variables are all observed random nodes of the model.
Definition (Lean source)
For a structural causal model M and an assignment of values to its fixed background variables s, the potential-outcome system induced by M and s satisfies the consistency assumption.
Formal statement
Proof (Lean source)
16 supporting declarations (lemmas, instances)
-
instFintypeObsIdxinstance — The observed-node indices of an induced potential-outcome system form a finite type. -
instDecidableEqObsIdxinstance — Observed-node indices of an induced potential-outcome system have decidable equality. -
instMeasurableObsValueinstance — The value space attached to each observed-node index has the measurable structure inherited from the structural model.instance instMeasurableObsValue (M : SCM N Ω) (v : ObsIdx M) : MeasurableSpace (obsValue M v) := inferInstanceAs (MeasurableSpace (swigΩ Ω v.val)) -
regimeTargetN_obslemma — fixSet-obligation for regimeTargetN: every target D has .random D ∈ M.observed.hypothesesconclusion∀ D ∈ regimeTargetN M r, SWIGNode.random D ∈ M.observedProof (Lean source)
lemma regimeTargetN_obs (M : SCM N Ω) (r : Regime (ObsIdx M) (obsValue M)) : ∀ D ∈ regimeTargetN M r, SWIGNode.random D ∈ M.observed := by intro D hD simp only [regimeTargetN, mem_image] at hD rcases hD with ⟨v, _, rfl⟩ have hspec := Classical.choose_spec (M.observed_is_random v.val v.property) rw [← hspec] exact v.property -
regimeTargetN_notFixedlemma — fixSet-obligation: .fixed D ∉ M.fixed for every structurally eligible regime target D. The target-name translation filters out observed variables whose fixed counterpart is already in M.fixed.hypothesesconclusion∀ D ∈ regimeTargetN M r, SWIGNode.fixed D ∉ M.fixedProof (Lean source)
lemma regimeTargetN_notFixed (M : SCM N Ω) (r : Regime (ObsIdx M) (obsValue M)) : ∀ D ∈ regimeTargetN M r, SWIGNode.fixed D ∉ M.fixed := by intro D hD simp only [regimeTargetN, mem_image] at hD rcases hD with ⟨v, hv, rfl⟩ exact (Finset.mem_filter.mp hv).2 -
inducedEval_measurablelemma — The induced joint evaluation map of a structural model is measurable in the latent draw.hypothesesconclusionMeasurable (inducedEval M s r)Proof (Lean source)
lemma inducedEval_measurable (M : SCM N Ω) (s : SCM.FixedValues M) (r : Regime (ObsIdx M) (obsValue M)) : Measurable (inducedEval M s r) := by let M' := M.fixSet (regimeTargetN M r) (regimeTargetN_obs M r) (regimeTargetN_notFixed M r) refine measurable_pi_lambda _ (fun v => ?_) have h : Measurable (fun ℓ : SCM.LatentValues M => M'.evalMap (combinedFixed M s r) ℓ) := by have hmeas := M'.evalMap_measurable have : Measurable (fun ℓ : SCM.LatentValues M => uncurry M'.evalMap (combinedFixed M s r, ℓ)) := hmeas.comp (Measurable.prod measurable_const measurable_id') simpa [uncurry] using this exact (measurable_pi_apply ⟨v.val, by change v.val ∈ M.observed ∪ M.unobserved exact mem_union_left _ v.property⟩).comp h -
combinedFixed_oldlemma — On original fixed coordinates, combinedFixed agrees with s.hypothesesconclusioncombinedFixed M s r ⟨v, mem_union_left _ hv⟩ = s ⟨v, hv⟩Proof (Lean source)
lemma combinedFixed_old (M : SCM N Ω) (s : SCM.FixedValues M) (r : Regime (ObsIdx M) (obsValue M)) (v : SWIGNode N) (hv : v ∈ M.fixed) : combinedFixed M s r ⟨v, mem_union_left _ hv⟩ = s ⟨v, hv⟩ := by simp only [combinedFixed, dif_pos hv] -
regimeTargetN_eq_image_obsNamelemma — regimeTargetN M r is the image of the structurally eligible regime targets under obsName M.hypothesesconclusionregimeTargetN M r= (r.target.filter (fun v => SWIGNode.fixed (obsName M v) ∉ M.fixed)).image (obsName M)Proof (Lean source)
lemma regimeTargetN_eq_image_obsName (M : SCM N Ω) (r : Regime (ObsIdx M) (obsValue M)) : regimeTargetN M r = (r.target.filter (fun v => SWIGNode.fixed (obsName M v) ∉ M.fixed)).image (obsName M) := rfl -
regimeTargetN_mem_vallemma — Every structural variable name targeted by a translated regime comes from an observed-node index whose observed node is the corresponding random node.hypothesesconclusion∃ v' : ObsIdx M, v' ∈ r.target ∧ v'.val = SWIGNode.random DProof (Lean source)
lemma regimeTargetN_mem_val (M : SCM N Ω) (r : Regime (ObsIdx M) (obsValue M)) (D : N) (hD : D ∈ regimeTargetN M r) : ∃ v' : ObsIdx M, v' ∈ r.target ∧ v'.val = SWIGNode.random D := by simp only [regimeTargetN, mem_image] at hD rcases hD with ⟨v', hv'tgt, hDeq⟩ exact ⟨v', (Finset.mem_filter.mp hv'tgt).1, hDeq ▸ obsName_spec M v'⟩ -
obsIdx_val_injectivelemma — Two elements of ObsIdx M with the same .val are equal (injectivity of the coercion).Proof (Lean source)
lemma obsIdx_val_injective {M : SCM N Ω} {v w : ObsIdx M} (h : v.val = w.val) : v = w := Subtype.ext h -
obsName_injectivelemma — obsName M is injective: obsName v = obsName w → v = w.Proof (Lean source)
lemma obsName_injective (M : SCM N Ω) : Injective (obsName M) := fun v w hvw => obsIdx_val_injective (by rw [obsName_spec M v, obsName_spec M w, hvw]) -
sqcup_assign_leftlemma — Regime.sqcup agrees with r₁ on r₁.target.hypothesesconclusion(r₁.sqcup r₂ h).assign v (mem_union_left _ hv) = r₁.assign v hvProof (Lean source)
lemma sqcup_assign_left {V : Type*} [DecidableEq V] {X : V → Type*} [∀ v, MeasurableSpace (X v)] (r₁ r₂ : Regime V X) (h : r₁.Disjoint r₂) (v : V) (hv : v ∈ r₁.target) : (r₁.sqcup r₂ h).assign v (mem_union_left _ hv) = r₁.assign v hv := by simp [Regime.sqcup, Regime.leftBiasedUnion, hv] -
sqcup_assign_rightlemma — Regime.sqcup agrees with r₂ on r₂.target.hypothesesconclusion(r₁.sqcup r₂ h).assign v (mem_union_right _ hv) = r₂.assign v hvProof (Lean source)
lemma sqcup_assign_right {V : Type*} [DecidableEq V] {X : V → Type*} [∀ v, MeasurableSpace (X v)] (r₁ r₂ : Regime V X) (h : r₁.Disjoint r₂) (v : V) (hv : v ∈ r₂.target) : (r₁.sqcup r₂ h).assign v (mem_union_right _ hv) = r₂.assign v hv := by have h1 : v ∉ r₁.target := fun hv₁ => Finset.disjoint_left.mp h hv₁ hv simp [Regime.sqcup, Regime.leftBiasedUnion, h1] -
combinedFixed_newlemma — On new intervention coordinates, combinedFixed at ⟨.fixed D, _⟩ equals r.assign v' hv'tgt, both at type Ω D. The internal Classical.choose witness is identified with v' by uniqueness (both have .val = .random D); the cast chain collapses via cast_heq + proof_irrel_heq.hypothesesM :SCM N Ωs :SCM.FixedValues Mv' :ObsIdx Mhv'tgt :v' ∈ r.targetD :NhD :D ∈ regimeTargetN M rhDval :v'.val = SWIGNode.random Dconclusion(combinedFixed M s r ⟨SWIGNode.fixed D, mem_union_right _ (Finset.mem_image.mpr ⟨D, hD, rfl⟩)⟩ : Ω D)Proof (Lean source)
lemma combinedFixed_new (M : SCM N Ω) (s : SCM.FixedValues M) (r : Regime (ObsIdx M) (obsValue M)) (v' : ObsIdx M) (hv'tgt : v' ∈ r.target) (D : N) (hD : D ∈ regimeTargetN M r) (hDval : v'.val = SWIGNode.random D) : (combinedFixed M s r ⟨SWIGNode.fixed D, mem_union_right _ (Finset.mem_image.mpr ⟨D, hD, rfl⟩)⟩ : Ω D) = cast (congrArg (swigΩ Ω) hDval) (r.assign v' hv'tgt) := by have hFD_notFix : SWIGNode.fixed D ∉ M.fixed := regimeTargetN_notFixed M r D hD unfold combinedFixed rw [dif_neg hFD_notFix] set hExist := combinedFixed_exists M r ⟨SWIGNode.fixed D, _⟩ hFD_notFix with hE_def have hChosen : choose hExist = v' := by have hspec := Classical.choose_spec hExist apply obsIdx_val_injective have h_obsname : obsName M (choose hExist) = D := by have := hspec.2; injection this rw [obsName_spec M (choose hExist), h_obsname, hDval] apply eq_of_heq refine HEq.trans (cast_heq _ _) ?_ refine HEq.trans ?_ (cast_heq _ _).symm congr 1 exact proof_irrel_heq _ _ -
regimeTargetN_emptylemma — regimeTargetN M Regime.empty = ∅.Proof (Lean source)
@[simp] lemma regimeTargetN_empty (M : SCM N Ω) : regimeTargetN M (Regime.empty (V := ObsIdx M) (X := obsValue M)) = ∅ := by simp [regimeTargetN, Regime.empty] -
inducedEval_empty_eq_evalMaplemma — inducedEval at Regime.empty equals M.evalMap s at the same latent.hypothesesconclusioninducedEval M s Regime.empty ℓ v= M.evalMap s ℓ ⟨v.val, mem_union_left _ v.property⟩Proof (Lean source)
lemma inducedEval_empty_eq_evalMap (M : SCM N Ω) (s : SCM.FixedValues M) (ℓ : SCM.LatentValues M) (v : ObsIdx M) : inducedEval M s Regime.empty ℓ v = M.evalMap s ℓ ⟨v.val, mem_union_left _ v.property⟩ := by -- `inducedEval M s Regime.empty ℓ v = (M.fixSet ∅ ...).evalMap -- (combinedFixed M s Regime.empty) ℓ ⟨v.val, _⟩` -- Use `evalMap_eq_of_equiv (fixSet_empty_equiv M ...)`. unfold inducedEval -- RHS of inducedEval: `(M.fixSet ∅ ...).evalMap (combinedFixed M s Regime.empty) ℓ ⟨v.val, _⟩` let hObs : ∀ D ∈ (∅ : Finset N), SWIGNode.random D ∈ M.observed := by simp let hFix : ∀ D ∈ (∅ : Finset N), SWIGNode.fixed D ∉ M.fixed := by simp let hEq := SCM.fixSet_empty_equiv M apply SCM.evalMap_eq_of_equiv hEq.1 hEq.2.2.1 · -- Fixed coords agree: combinedFixed at M.fixed = s intro d hd₁ hd₂ -- `(M.fixSet ∅).fixed = M.fixed ∪ ∅ = M.fixed` (by rfl since ∅.image = ∅) simp only [SCM.fixSet_fixed, Finset.image_empty, union_empty] at hd₁ exact combinedFixed_old M s Regime.empty d hd₁ · -- Latent coords: `(M.fixSet ∅).unobserved = M.unobserved` (by rfl) intro u hu₁ hu₂ rfl
FromSCMCondIndep 1 core · 0 supporting This file connects graphical conditional independence in an SCM to counterfactual conditional independence in the potential-outcome system induced by that SCM. ★ ofSCM_condIndepCF_of_dSep
Conditional-Independence Bridge from SCMs to Induced PO Systems
This file connects graphical conditional independence in an SCM to
counterfactual conditional independence in the potential-outcome system induced
by that SCM. The bridge is stated with explicit value-correspondence
hypotheses: consumers identify the PO regimed values with measurable functions
of the SWIG coordinate projections whose d-separation they can prove. The main
theorem, POSystem.ofSCM_condIndepCF_of_dSep, pulls a global-Markov
CondIndepFun statement through the induced-system evaluation map and optional
measurable post-processing of the X- and Y-side values.
SCM-to-PO conditional-independence bridge under d-separation. Fix a structural causal model M with a fixed-value assignment s, and SWIG node sets that are each contained in the model's random variables and pairwise disjoint from one another. Suppose the first node set is d-separated from the second by the third in the model's DAG. Suppose further that there is a measurable value-space map aMap for the first node set and a measurable value-space map BMap for the second node set such that, under the latent draw, the potential-outcome value of a regimed variable a equals aMap applied to the projection of the evaluated model state onto the first node set, the joint value of a counterfactual bundle B equals BMap applied to the projection onto the second node set, and the conditioning value of a regimed variable c equals the projection onto the third node set. Then, in the potential-outcome system induced by M at s, a and B are conditionally independent given c.
Formal statement
Proof (Lean source)
Induce 3 core · 12 supporting This file builds the potential-outcome system induced by restricting attention to a finite set of variables. ★ restrict_consistency
Restricted Potential-Outcome Systems
This file builds the potential-outcome system induced by restricting attention
to a finite set of variables. POSystem.liftRegime embeds regimes on the
restricted variable set back into the ambient system, POSystem.restrict builds
the sub-system itself, and the lift lemmas show that targets, assignments,
empty regimes, disjointness, and Regime.sqcup are preserved. The theorem
POSystem.restrict_consistency proves that consistency of the original system
transfers to the restricted system.
For a potential-outcome system, a finite set of variables, and an intervention regime whose variables all lie in that finite set, this construction returns the corresponding intervention regime on the original system by viewing each restricted variable as a variable of the original system.
Definition (Lean source)
For a potential-outcome system and a finite set of variables, the restricted potential-outcome system has that finite set as its variable collection, keeps the same sample space and probability measure, and evaluates restricted intervention regimes by first lifting them back to intervention regimes of the original system.
Definition (Lean source)
Restriction preserves consistency. If the ambient potential-outcome system P is consistent (SUTVA holds), then the system P restricted to R is consistent as well.
Formal statement
Proof (Lean source)
12 supporting declarations (lemmas, instances)
-
liftRegime_targetlemma — The target of a lifted restricted regime is the image of the restricted target in the original variable set.hypothesesr' :Regime (↥R) (fun v : ↥R => P.X v.val)conclusion(P.liftRegime R r').target = r'.target.map ⟨Subtype.val, Subtype.val_injective⟩Proof (Lean source)
@[simp] lemma liftRegime_target (r' : Regime (↥R) (fun v : ↥R => P.X v.val)) : (P.liftRegime R r').target = r'.target.map ⟨Subtype.val, Subtype.val_injective⟩ := rfl -
liftRegime_assignlemma — Reading the lifted assignment at a known sub-regime member returns the original sub-assignment. Membership proofs are propositional, so the ambient hv is irrelevant.hypothesesr' :Regime (↥R) (fun v : ↥R => P.X v.val)w :↥Rhw :w ∈ r'.targethv :(w.val : P.V) ∈ (P.liftRegime R r').targetconclusion(P.liftRegime R r').assign w.val hv = r'.assign w hwProof (Lean source)
lemma liftRegime_assign (r' : Regime (↥R) (fun v : ↥R => P.X v.val)) (w : ↥R) (hw : w ∈ r'.target) (hv : (w.val : P.V) ∈ (P.liftRegime R r').target) : (P.liftRegime R r').assign w.val hv = r'.assign w hw := by change r'.assign ⟨w.val, w.property⟩ _ = r'.assign w hw congr 1 -
liftRegime_emptylemma — Lifting the empty restricted regime gives the empty regime on the original system.Proof (Lean source)
@[simp] lemma liftRegime_empty : P.liftRegime R (Regime.empty : Regime (↥R) (fun v : ↥R => P.X v.val)) = (Regime.empty : Regime P.V P.X) := by apply Regime.ext · simp [liftRegime_target, Regime.empty] · intro v hv _ simp [liftRegime_target, Regime.empty] at hv -
restrict_Vlemma — The variable type of the restricted potential-outcome system is the chosen finite set of variables.conclusion(P.restrict R).V = ↥RProof (Lean source)
@[simp] lemma restrict_V : (P.restrict R).V = ↥R := rfl -
restrict_Xlemma — The value space in the restricted system is the original value space at the underlying variable.hypothesesv :↥Rconclusion(P.restrict R).X v = P.X v.valProof (Lean source)
@[simp] lemma restrict_X (v : ↥R) : (P.restrict R).X v = P.X v.val := rfl -
restrict_Ωlemma — The restricted potential-outcome system uses the same sample space as the original system.conclusion(P.restrict R).Ω = P.ΩProof (Lean source)
@[simp] lemma restrict_Ω : (P.restrict R).Ω = P.Ω := rfl -
restrict_μlemma — The restricted potential-outcome system uses the same probability measure as the original system.conclusion(P.restrict R).μ = P.μProof (Lean source)
@[simp] lemma restrict_μ : (P.restrict R).μ = P.μ := rfl -
restrict_evallemma — Evaluation in the restricted system is evaluation in the original system after lifting the restricted regime.hypothesesconclusion(P.restrict R).eval r' ω v = P.eval (P.liftRegime R r') ω v.valProof (Lean source)
@[simp] lemma restrict_eval (r' : Regime (↥R) (fun v : ↥R => P.X v.val)) (ω : P.Ω) (v : ↥R) : (P.restrict R).eval r' ω v = P.eval (P.liftRegime R r') ω v.val := rfl -
restrict_componentlemma — A coordinate potential outcome in the restricted system agrees with the original coordinate after lifting the regime.hypothesesr' :Regime (↥R) (fun v : ↥R => P.X v.val)v :↥Rconclusion(P.restrict R).component r' v = P.component (P.liftRegime R r') v.valProof (Lean source)
@[simp] lemma restrict_component (r' : Regime (↥R) (fun v : ↥R => P.X v.val)) (v : ↥R) : (P.restrict R).component r' v = P.component (P.liftRegime R r') v.val := rfl -
liftRegime_disjointlemma — Disjoint restricted regimes remain disjoint after lifting them to the original system.hypothesesr₁' r₂' :Regime (↥R) (fun v : ↥R => P.X v.val)h :r₁'.Disjoint r₂'conclusion(P.liftRegime R r₁').Disjoint (P.liftRegime R r₂')Proof (Lean source)
lemma liftRegime_disjoint {r₁' r₂' : Regime (↥R) (fun v : ↥R => P.X v.val)} (h : r₁'.Disjoint r₂') : (P.liftRegime R r₁').Disjoint (P.liftRegime R r₂') := by rw [Regime.Disjoint, liftRegime_target, liftRegime_target, Finset.disjoint_left] intro v hv₁ hv₂ rcases Finset.mem_map.mp hv₁ with ⟨w₁, hw₁, rfl⟩ rcases Finset.mem_map.mp hv₂ with ⟨w₂, hw₂, hw₂eq⟩ have : w₁ = w₂ := val_injective hw₂eq.symm subst this exact (Finset.disjoint_left.mp h hw₁) hw₂ -
liftRegime_sqcup_targetlemma — The lift commutes with Regime.sqcup (target equality).hypothesesr₁' r₂' :Regime (↥R) (fun v : ↥R => P.X v.val)h :r₁'.Disjoint r₂'Proof (Lean source)
lemma liftRegime_sqcup_target {r₁' r₂' : Regime (↥R) (fun v : ↥R => P.X v.val)} (h : r₁'.Disjoint r₂') : (P.liftRegime R (r₁'.sqcup r₂' h)).target = (P.liftRegime R r₁').target ∪ (P.liftRegime R r₂').target := by simp [liftRegime_target, Finset.map_union] -
liftRegime_sqcuplemma — The lift commutes with Regime.sqcup (full equality).hypothesesr₁' r₂' :Regime (↥R) (fun v : ↥R => P.X v.val)h :r₁'.Disjoint r₂'conclusionP.liftRegime R (r₁'.sqcup r₂' h)= (P.liftRegime R r₁').sqcup (P.liftRegime R r₂') (P.liftRegime_disjoint R h)Proof (Lean source)
lemma liftRegime_sqcup {r₁' r₂' : Regime (↥R) (fun v : ↥R => P.X v.val)} (h : r₁'.Disjoint r₂') : P.liftRegime R (r₁'.sqcup r₂' h) = (P.liftRegime R r₁').sqcup (P.liftRegime R r₂') (P.liftRegime_disjoint R h) := by apply Regime.ext (P.liftRegime_sqcup_target R h) intro v hv hv2 -- v lies in the lifted union, so v = w.val for some w in r₁' ∪ r₂'. rw [liftRegime_target] at hv rcases Finset.mem_map.mp hv with ⟨w, hwU, rfl⟩ -- Normalize both membership proofs to talk about w.val instead of the -- raw embedding application. have hv1' : (w.val : P.V) ∈ (P.liftRegime R (r₁'.sqcup r₂' h)).target := by rw [liftRegime_target]; exact Finset.mem_map.mpr ⟨w, hwU, rfl⟩ have hv2' : (w.val : P.V) ∈ ((P.liftRegime R r₁').sqcup (P.liftRegime R r₂') (P.liftRegime_disjoint R h)).target := by rw [Regime.sqcup_target] rcases Finset.mem_union.mp hwU with hw | hw · exact mem_union_left _ (Finset.mem_map.mpr ⟨w, hw, rfl⟩) · exact mem_union_right _ (Finset.mem_map.mpr ⟨w, hw, rfl⟩) change (P.liftRegime R (r₁'.sqcup r₂' h)).assign w.val hv1' = ((P.liftRegime R r₁').sqcup (P.liftRegime R r₂') (P.liftRegime_disjoint R h)).assign w.val hv2' rw [P.liftRegime_assign R (r₁'.sqcup r₂' h) w hwU] -- Now goal: (r₁'.sqcup r₂' h).assign w hwU = (sqcup of lifts).assign w.val hv2' by_cases hw1 : w ∈ r₁'.target · have hv_in_lift1 : (w.val : P.V) ∈ (P.liftRegime R r₁').target := Finset.mem_map.mpr ⟨w, hw1, rfl⟩ rw [Regime.sqcup_assign_pos _ _ _ _ hw1, Regime.sqcup_assign_pos _ _ _ _ hv_in_lift1, P.liftRegime_assign R r₁' w hw1] · have hw2 : w ∈ r₂'.target := by rcases Finset.mem_union.mp hwU with hw | hw · exact (hw1 hw).elim · exact hw have hv_not_in_lift1 : (w.val : P.V) ∉ (P.liftRegime R r₁').target := by rw [liftRegime_target] intro hv1 rcases Finset.mem_map.mp hv1 with ⟨w', hw', heq⟩ have : w = w' := Subtype.val_injective heq.symm subst this exact hw1 hw' have hv_in_lift2 : (w.val : P.V) ∈ (P.liftRegime R r₂').target := Finset.mem_map.mpr ⟨w, hw2, rfl⟩ rw [Regime.sqcup_assign_neg _ _ _ _ hw1 hw2, Regime.sqcup_assign_neg _ _ _ _ hv_not_in_lift1 hv_in_lift2, P.liftRegime_assign R r₂' w hw2]