Definition nminimal (work : nf_list) (ds : disjs) (ni : nested_imps)
  (ai : atomic_imps) (a : atoms) (context : flist) :=
  forall (c : form) (k : kripke_tree),
  Is_Monotone_kripke_tree k ->
  forces_ngamma work ds ni ai a k -> In c context -> forces_t k c.

(* Specifications: *)
Lemma nminimal_derivable_forces : forall (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist) (k : kripke_tree), Is_Monotone_kripke_tree k -> forces_ngamma work ds ni ai a k -> nminimal work ds ni ai a context -> forall c : form, Derivable context c -> forces_t k c.
Lemma nminimal_eqv : forall (work : nf_list) (ds : disjs) (ni1 ni2 : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), eqv_ni ni1 ni2 -> nminimal work ds ni1 ai a context -> nminimal work ds ni2 ai a context.
Lemma nminimal_shift_work_ds : forall (i j : Int) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), nminimal (NDisj i j :: work) ds ni ai a context -> nminimal work ((i, j) :: ds) ni ai a context.
Lemma nminimal_shift_work_ni : forall (x : nested_imp) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), nminimal (NImp_NF (nested_imp2nimp x) :: work) ds ni ai a context -> nminimal work ds (x :: ni) ai a context.
Lemma nminimal_shift_work_ai_new : forall (i : Int) (b : normal_form) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai ai' : atomic_imps) (a : atoms) (context : flist), (forall bs : nf_list, LOOKUP nf_list i ai bs -> False) -> EQUIV_INS nf_list i (cons b) nf_nil ai ai' -> nminimal (AImp i b :: work) ds ni ai a context -> nminimal work ds ni ai' a context.
Lemma nminimal_shift_work_ai_old : forall (i : Int) (b : normal_form) (work : nf_list) (ds : disjs) (ni : nested_imps) (bs : nf_list) (ai ai' : atomic_imps) (a : atoms) (context : flist), LOOKUP nf_list i ai bs -> EQUIV_INS nf_list i (cons b) nf_nil ai ai' -> nminimal (AImp i b :: work) ds ni ai a context -> nminimal work ds ni ai' a context.
Lemma nminimal_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' -> nminimal (NAtom i :: work) ds ni ai a context -> nminimal work ds ni ai a' context.
Lemma nminimal_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), nminimal (NImp_NF (nested_imp2nimp x) :: work) ds (ni1 ++ ni2) ai a context -> nminimal work ds (ni1 ++ x :: ni2) ai a context.
Lemma nminimal_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), nminimal work ds (ni1 ++ x :: ni2) ai a context -> nminimal (NImp_NF (nested_imp2nimp x) :: work) ds (ni1 ++ ni2) ai a context.
Lemma nminimal_cons_work_strength : forall (b c : normal_form) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), (forall k : kripke_tree, Is_Monotone_kripke_tree k -> forces_ngamma (c :: work) ds ni ai a k -> forces_t k (nf2form b)) -> nminimal (b :: work) ds ni ai a context -> nminimal (c :: work) ds ni ai a context.
Lemma nminimal_cons_work_weak : forall (b c : normal_form) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), (forall k : kripke_tree, Is_Monotone_kripke_tree k -> forces_t k (nf2form c) -> forces_t k (nf2form b)) -> nminimal (b :: work) ds ni ai a context -> nminimal (c :: work) ds ni ai a context.
Lemma nminimal_shift_work_ai_weak : forall (i : Int) (bs work : nf_list) (ds : disjs) (ni : nested_imps) (ai ai' : atomic_imps) (a : atoms) (context : flist), LOOKUP nf_list i ai bs -> EQUIV_DEL nf_list i ai ai' -> nminimal work ds ni ai a context -> nminimal (bs ++ work) ds ni ai' a context.
Lemma nminimal_shift_ds_work_context : forall (work : nf_list) (c : normal_form) (i j : Int) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), (forall k : kripke_tree, Is_Monotone_kripke_tree k -> forces_t k (nf2form c) -> forces_t k (OrF (Atom i) (Atom j))) -> nminimal work ((i, j) :: ds) ni ai a context -> nminimal (c :: work) ds ni ai a (nf2form c :: context).
Lemma nminimal_cons_work_cons_context : forall (c : normal_form) (work : nf_list) (ds : disjs) (ni : nested_imps) (ai : atomic_imps) (a : atoms) (context : flist), nminimal work ds ni ai a context -> nminimal (c :: work) ds ni ai a (nf2form c :: context).