(*Recursive Definition BV_full_adder_carry: (list bool)->(list bool)->bool->bool := (nil bool) (nil bool) b => b | (nil bool) (cons vh vt) b => (BV_full_adder_carry (nil bool) vt (half_adder_carry vh b)) | (cons vh vt) (nil bool) b => (BV_full_adder_carry vt (nil bool) (half_adder_carry vh b)) | (cons vh vt) (cons wh wt) b => (BV_full_adder_carry vt wt (full_adder_carry vh wh b)). *)
Definition BV_full_adder_carry :=
(fix F (l : list bool) : list bool -> bool -> bool :=
match l with
| nil =>
(fix F0 (l0 : list bool) : bool -> bool :=
match l0 with
| nil => fun z : bool => z
| b :: l1 => fun z : bool => F0 l1 (half_adder_carry b z)
end)
| b :: l0 =>
fun x2 : list bool =>
match x2 with
| nil => fun y z : bool => F l0 nil (half_adder_carry y z)
| b0 :: l1 => fun y z : bool => F l0 l1 (full_adder_carry y b0 z)
end b
end).

(* Specifications: *)
Lemma BV_full_adder_carry_eq1 :
forall b : bool, BV_full_adder_carry nil nil b = b.
Lemma BV_full_adder_carry_eq2 :
forall (vh : bool) (vt : list bool) (b : bool),
BV_full_adder_carry nil (vh :: vt) b =
BV_full_adder_carry nil vt (half_adder_carry vh b).
Lemma BV_full_adder_carry_eq3 :
forall (vh : bool) (vt : list bool) (b : bool),
BV_full_adder_carry (vh :: vt) nil b =
BV_full_adder_carry vt nil (half_adder_carry vh b).
Lemma BV_full_adder_carry_eq4 :
forall (vh : bool) (vt : list bool) (wh : bool) (wt : list bool) (b : bool),
BV_full_adder_carry (vh :: vt) (wh :: wt) b =
BV_full_adder_carry vt wt (full_adder_carry vh wh b).