auto.
Qed.

(* Specifications: *)
Lemma cx_t :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo),
cx (S t) di0 cx0 al0 mem0 =
match IsNull (cx t di0 cx0 al0 mem0) return BV with
| true => cx t di0 cx0 al0 mem0
| false => BV_decrement (cx t di0 cx0 al0 mem0)
end.
Lemma al_t :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo),
al (S t) di0 cx0 al0 mem0 =
match IsNull (cx t di0 cx0 al0 mem0) return BV with
| true => al t di0 cx0 al0 mem0
| false => al t di0 cx0 al0 mem0
end.
Lemma al_constant :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo),
al t di0 cx0 al0 mem0 = al0.
Lemma di2_constant :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo) (ad0 da0 : BV),
di2 t di0 cx0 al0 mem0 ad0 da0 = di0.
Lemma al2_t :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo) (ad0 da0 : BV),
al2 (S t) di0 cx0 al0 mem0 ad0 da0 =
match IsNull (cx2 t di0 cx0 al0 mem0 ad0 da0) return BV with
| true => al2 t di0 cx0 al0 mem0 ad0 da0
| false => al2 t di0 cx0 al0 mem0 ad0 da0
end.
Lemma al2_constant :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo) (ad0 da0 : BV),
al2 t di0 cx0 al0 mem0 ad0 da0 = al0.
Lemma ad2_t :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo) (ad0 da0 : BV),
ad2 (S t) di0 cx0 al0 mem0 ad0 da0 =
match IsNull (cx2 t di0 cx0 al0 mem0 ad0 da0) return BV with
| true => ad2 t di0 cx0 al0 mem0 ad0 da0
| false => BV_increment (ad2 t di0 cx0 al0 mem0 ad0 da0)
end.
Lemma da2_t :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo) (ad0 da0 : BV),
da2 (S t) di0 cx0 al0 mem0 ad0 da0 =
match IsNull (cx2 t di0 cx0 al0 mem0 ad0 da0) return BV with
| true => da2 t di0 cx0 al0 mem0 ad0 da0
| false => da2 t di0 cx0 al0 mem0 ad0 da0
end.
Lemma da2_constant :
forall (t : nat) (di0 cx0 al0 : BV) (mem0 : Memo) (ad0 da0 : BV),
da2 t di0 cx0 al0 mem0 ad0 da0 = da0.