Fixpoint freeVarFormula (A : fol.Formula L) : list nat :=
  match A with
  | fol.equal t s => freeVarTerm t ++ freeVarTerm s
  | fol.atomic r ts => freeVarTerms _ ts
  | fol.impH A B => freeVarFormula A ++ freeVarFormula B
  | fol.notH A => freeVarFormula A
  | fol.forallH v A => list_remove _ eq_nat_dec v (freeVarFormula A)
  end.Definition ClosedSystem (T : fol.System L) :=
  forall (v : nat) (f : fol.Formula L),
  mem _ T f -> ~ In v (freeVarFormula f).Definition closeList (l : list nat) (x : fol.Formula L) : 
  fol.Formula L :=
  list_rec (fun _ => fol.Formula L) x
    (fun (a : nat) _ (rec : fol.Formula L) => forallH a rec) l.Definition close (x : fol.Formula L) : fol.Formula L :=
  closeList (no_dup _ eq_nat_dec (freeVarFormula x)) x.

(* Specifications: *)
Lemma freeVarClosedList1 : forall (l : list nat) (v : nat) (x : fol.Formula L), In v l -> ~ In v (freeVarFormula (closeList l x)).
Lemma freeVarClosedList2 : forall (l : list nat) (v : nat) (x : fol.Formula L), In v (freeVarFormula (closeList l x)) -> In v (freeVarFormula x).
Lemma freeVarClosed : forall (x : fol.Formula L) (v : nat), ~ In v (freeVarFormula (close x)).