(* File: Forms.v  (last edited on 27/10/2000) (c) Klaus Weich  *)
Require Export ML_Int.
Require Export My_Nth.
(*******   forms    ***********************************************)
Inductive form : Set :=
| Falsum : form
| Atom : Int -> form
| AndF : form -> form -> form
| OrF : form -> form -> form
| Imp : form -> form -> form.
Definition flist := list form.
Definition fnil := nil (A:=form).
(* vimp qs a := vec(qs) imp a *)
Fixpoint vimp (qs : list Int) : form -> form :=
match qs with
| nil => fun a : form => a
| q :: qs => fun a : form => vimp qs (Imp (Atom q) a)
end.
(*********************************************************************)
(* Substitute (Atom i) by a in b:                                    *)
Fixpoint subst_form (i : Int) (a b : form) {struct b} : form :=
match b with
| Falsum => Falsum
| Atom j => match equal_dec i j with
| left _ => a
| right _ => Atom j
end
| OrF b0 b1 => OrF (subst_form i a b0) (subst_form i a b1)
| AndF b0 b1 => AndF (subst_form i a b0) (subst_form i a b1)
| Imp b0 b1 => Imp (subst_form i a b0) (subst_form i a b1)
end.
Definition subst_list (i : Int) (a : form) (l : flist) :=
map (subst_form i a) l.

(* Specifications: *)
Lemma subst_nth :
forall (i : Int) (g : form) (n : nat) (l : flist) (a : form),
my_nth form n l a -> my_nth form n (subst_list i g l) (subst_form i g a).