(* This program is free software; you can redistribute it and/or      *)
(* modify it under the terms of the GNU Lesser General Public License *)
(* as published by the Free Software Foundation; either version 2.1   *)
(* of the License, or (at your option) any later version.             *)
(*                                                                    *)
(* This program is distributed in the hope that it will be useful,    *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of     *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *)
(* GNU General Public License for more details.                       *)
(*                                                                    *)
(* You should have received a copy of the GNU Lesser General Public   *)
(* License along with this program; if not, write to the Free         *)
(* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *)
(* 02110-1301 USA                                                     *)
(* Contribution to the Coq Library   V6.3 (July 1999)                    *)
(****************************************************************************)
(*                 The Calculus of Inductive Constructions                  *)
(*                                                                          *)
(*                                Projet Coq                                *)
(*                                                                          *)
(*                     INRIA                        ENS-CNRS                *)
(*              Rocquencourt                        Lyon                    *)
(*                                                                          *)
(*                                Coq V5.10                                 *)
(*                                                                          *)
(****************************************************************************)
(*                                 Words.v                                  *)
(****************************************************************************)
(* G. Huet - V5.8  Nov. 1994 *)
(*    ported V5.10 June 1995 *)
(*****************)
(* Boolean words *)
(*****************)
Inductive word : Set :=
| empty : word
| bit : bool -> word -> word.
(* Remark : word ~ bool list *)
(* word concatenation : logical definition *)
Inductive conc : word -> word -> word -> Prop :=
| conc_empty : forall v : word, conc empty v v
| conc_bit :
forall (u v w : word) (b : bool),
conc u v w -> conc (bit b u) v (bit b w).
(* word concatenation : functional definition *)
Fixpoint append (u : word) : word -> word :=
fun v : word =>
match u with
| empty => v
| bit b w => bit b (append w v)
end.
(**************)
(* Singletons *)
(**************)
Definition single (b : bool) := bit b empty.
(*********************)
(* Parities of words *)
(*********************)
Inductive odd : word -> Prop :=
even_odd : forall w : word, even w -> forall b : bool, odd (bit b w)
with even : word -> Prop :=
| even_empty : even empty
| odd_even : forall w : word, odd w -> forall b : bool, even (bit b w).
Hint Resolve odd_even even_empty even_odd.
Hint Resolve not_odd_empty.
(**********************)
(* (odd w) + (even w) *)
(**********************)
(************************)
(* Parities of subwords *)
(************************)

Lemma odd_even_conc :
forall u v w : word,
conc u v w ->
odd w /\ (odd u /\ even v \/ even u /\ odd v) \/
even w /\ (odd u /\ odd v \/ even u /\ even v).