Definition p_subterm (qif : p_assignment_function) : Prop :=
forall (f : function) (l : list nat) (x : nat), x ∈ l ->
match qif f with
| None => True
| Some f0 => (x <= f0 l)
end.
Definition p_monotonicity (qif : p_assignment_function) : Prop :=
forall (f : function) (lx ly : list nat),
Forall2 le lx ly ->
match qif f with
| None => True
| Some f0 => f0 lx <= f0 ly
end.
Definition p_smc qic (qif : p_assignment_function) : Prop :=
p_subterm qif /\ p_monotonicity qif /\ p_compatible_QI qic qif.

(* Specifications: *)
Lemma p_smc_split f h qic:
{g | p_smc qic (f;;h;;g)} -> {g | p_smc qic (f;;g)}.
Lemma p_smc_smc qic :
{pqif | p_smc qic ((fun _ => None);; pqif)} ->
{qif | subterm qif /\ monotonicity_qif qif /\ compatible_QI qic qif}.