Definition beta_delta_rule := union_basic_rule beta_rule delta_rule.Definition beta_delta := Rule beta_delta_rule.Fixpoint whnf_bd (e : env) (t : term) {struct t} : Prop :=
    match t with
    | Ref n =>
        match delta_reduce n e with
        | inleft _ => False
        | _ => True
        end
    | App u v => whnf_bd e u /\ (forall T t : term, u <> Abs T t)
    | _ => True
    end.

(* Specifications: *)
Lemma bd_red_whnf : forall (e : env) (t u : term), red beta_delta e t u -> whnf_bd e t -> whnf_bd e u.
Lemma whnf_bd_head_normal : forall (e : env) (t : term), whnf_bd e t -> head_normal beta_delta e t.
Lemma whnf_bd_app_list : forall (args : list term) (e : env) (t : term), whnf_bd e t -> (forall A M : term, t <> Abs A M) -> head_normal beta_delta e (app_list args t).