Definition nsound (work : nf_list) (ds : disjs) (ni : nested_imps)
  (ai : atomic_imps) (a : atoms) (context : flist) :=
  forall c : normal_form,
  in_ngamma work ds ni ai a c -> Derivable context (nf2form c).

(* Specifications: *)
Lemma nsound_eqv : forall (work : nf_list) (ds : disjs) (ni1 ni2 : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), eqv_ni ni1 ni2 -> nsound work ds ni1 ai a context -> nsound work ds ni2 ai a context.
Lemma nsound_le : forall (work : nf_list) (ds : disjs) (ni1 ni2 : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), le_ni ni1 ni2 -> nsound work ds ni1 ai a context -> nsound work ds ni2 ai a context.
Lemma nsound_ge : forall (work : nf_list) (ds : disjs) (ni1 ni2 : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), le_ni ni2 ni1 -> nsound work ds ni1 ai a context -> nsound work ds ni2 ai a context.
Lemma nsound_shift_work_ds : forall (i j : Int) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), nsound (NDisj i j :: work) ds ni ai a context -> nsound work ((i, j) :: ds) ni ai a context.
Lemma nsound_shift_work_ni : forall (x : nested_imp) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), nsound (NImp_NF (nested_imp2nimp x) :: work) ds ni ai a context -> nsound work ds (x :: ni) ai a context.
Lemma nsound_shift_work_ai : forall (i : Int) (b : normal_form) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai ai' : atomic_imps) (a : atoms) (context : flist), EQUIV_INS nf_list i (cons b) nf_nil ai ai' -> nsound (AImp i b :: work) ds ni ai a context -> nsound work ds ni ai' a context.
Lemma nsound_shift_work_a : forall (i : Int) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a a' : atoms) (context : flist), EQUIV_INS unit i (fun _ : unit => tt) tt a a' -> nsound (NAtom i :: work) ds ni ai a context -> nsound work ds ni ai a' context.
Lemma nsound_shift_work_ni_x_ni : forall (x : nested_imp) (work : nf_list) (ds : disjs) (ni1 ni2 : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), nsound (NImp_NF (nested_imp2nimp x) :: work) ds (ni1 ++ ni2) ai a context -> nsound work ds (ni1 ++ x :: ni2) ai a context.
Lemma nsound_shift_ni_x_ni_work : forall (x : nested_imp) (work : nf_list) (ds : disjs) (ni1 ni2 : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), nsound work ds (ni1 ++ x :: ni2) ai a context -> nsound (NImp_NF (nested_imp2nimp x) :: work) ds (ni1 ++ ni2) ai a context.