adamc@620: (* Copyright (c) 2009, Adam Chlipala adamc@620: * All rights reserved. adamc@620: * adamc@620: * Redistribution and use in source and binary forms, with or without adamc@620: * modification, are permitted provided that the following conditions are met: adamc@620: * adamc@620: * - Redistributions of source code must retain the above copyright notice, adamc@620: * this list of conditions and the following disclaimer. adamc@620: * - Redistributions in binary form must reproduce the above copyright notice, adamc@620: * this list of conditions and the following disclaimer in the documentation adamc@620: * and/or other materials provided with the distribution. adamc@620: * - The names of contributors may not be used to endorse or promote products adamc@620: * derived from this software without specific prior written permission. adamc@620: * adamc@620: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" adamc@620: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE adamc@620: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE adamc@620: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE adamc@620: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR adamc@620: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF adamc@620: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS adamc@620: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN adamc@620: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) adamc@620: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE adamc@620: * POSSIBILITY OF SUCH DAMAGE. adamc@620: *) adamc@620: adamc@620: Set Implicit Arguments. adamc@620: adamc@620: adamc@620: Fixpoint name' (n : nat) : Type := adamc@620: match n with adamc@620: | O => Empty_set adamc@620: | S n' => option (name' n') adamc@620: end. adamc@620: adamc@620: Definition name'_eq_dec : forall n (x y : name' n), {x = y} + {x <> y}. adamc@620: Hint Extern 1 (_ = _ -> False) => congruence. adamc@620: adamc@620: induction n; simpl; intuition; adamc@620: repeat match goal with adamc@620: | [ x : Empty_set |- _ ] => destruct x adamc@620: | [ x : option _ |- _ ] => destruct x adamc@620: end; intuition; adamc@620: match goal with adamc@620: | [ IH : _, n1 : name' _, n2 : name' _ |- _ ] => adamc@620: destruct (IHn n1 n0); subst; intuition adamc@620: end. adamc@620: Qed. adamc@620: adamc@620: Definition badName' n (P : name' n -> bool) : adamc@620: {nm : _ | P nm = false} + {forall nm, P nm = true}. adamc@620: Hint Constructors sig. adamc@620: Hint Extern 1 (_ = true) => adamc@620: match goal with adamc@620: | [ nm : option _ |- _ ] => destruct nm adamc@620: end; auto. adamc@620: adamc@620: induction n; simpl; intuition; adamc@620: match goal with adamc@620: | [ IH : forall P : _ -> _,_ |- _ ] => adamc@620: case_eq (P None); adamc@620: destruct (IH (fun nm => P (Some nm))); firstorder eauto adamc@620: end. adamc@620: Qed. adamc@620: adamc@620: Parameter numNames : nat. adamc@620: Definition name := name' (S numNames). adamc@620: Definition name_eq_dec : forall (x y : name), {x = y} + {x <> y} := @name'_eq_dec _. adamc@620: Definition badName : forall P : name -> bool, {nm : _ | P nm = false} + {forall nm, P nm = true} := @badName' _. adamc@620: Definition defaultName : name := None.