Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus.
(************************************************************************) (* * The Coq Proof Assistant / The Coq Development Team *) (* v * INRIA, CNRS and contributors - Copyright 1999-2018 *) (* <O___,, * (see CREDITS file for the list of authors) *) (* \VV/ **************************************************************) (* // * This file is distributed under the terms of the *) (* * GNU Lesser General Public License Version 2.1 *) (* * (see LICENSE file for the text of the license) *) (************************************************************************) Require Import Arith. Require Import Min. Require Import BinPos. Require Import BinNat. Require Import Ndigits.
An ultrametric distance over N numbers
Inductive natinf : Set := | infty : natinf | ni : nat -> natinf. Fixpoint Pplength (p:positive) : nat := match p with | xH => 0 | xI _ => 0 | xO p' => S (Pplength p') end. Definition Nplength (a:N) := match a with | N0 => infty | Npos p => ni (Pplength p) end.forall a : N, Nplength a = infty -> a = 0%Nforall a : N, Nplength a = infty -> a = 0%Nunfold Nplength; intros; discriminate H. Qed.a:Nforall p : positive, Nplength (N.pos p) = infty -> N.pos p = 0%Nforall (a : N) (n : nat), Nplength a = ni n -> forall k : nat, k < n -> N.testbit_nat a k = falseforall (a : N) (n : nat), Nplength a = ni n -> forall k : nat, k < n -> N.testbit_nat a k = falsea:Nforall (p : positive) (n : nat), Nplength (N.pos p) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~1) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = falsen:natNplength (N.pos p0~1) = ni 0 -> forall k : nat, k < 0 -> N.testbit_nat (N.pos p0~1) k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = falsen:natforall n0 : nat, (Nplength (N.pos p0~1) = ni n0 -> forall k : nat, k < n0 -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni (S n0) -> forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~1) = ni 0k:natH1:k < 0N.testbit_nat (N.pos p0~1) k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = falsen:natforall n0 : nat, (Nplength (N.pos p0~1) = ni n0 -> forall k : nat, k < n0 -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni (S n0) -> forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = falsen:natforall n0 : nat, (Nplength (N.pos p0~1) = ni n0 -> forall k : nat, k < n0 -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni (S n0) -> forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n1 : nat, Nplength (N.pos p0) = ni n1 -> forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = falsen, n0:natH0:Nplength (N.pos p0~1) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0~1) k0 = falseH1:Nplength (N.pos p0~1) = ni (S n0)k:nat0 < S n0 -> N.testbit_nat (N.pos p0~1) 0 = falsea:Np, p0:positiveH:forall n1 : nat, Nplength (N.pos p0) = ni n1 -> forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = falsen, n0:natH0:Nplength (N.pos p0~1) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0~1) k0 = falseH1:Nplength (N.pos p0~1) = ni (S n0)k:natforall n1 : nat, (n1 < S n0 -> N.testbit_nat (N.pos p0~1) n1 = false) -> S n1 < S n0 -> N.testbit_nat (N.pos p0~1) (S n1) = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n1 : nat, Nplength (N.pos p0) = ni n1 -> forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = falsen, n0:natH0:Nplength (N.pos p0~1) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0~1) k0 = falseH1:ni 0 = ni (S n0)k:nat0 < S n0 -> N.testbit_nat (N.pos p0~1) 0 = falsea:Np, p0:positiveH:forall n1 : nat, Nplength (N.pos p0) = ni n1 -> forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = falsen, n0:natH0:Nplength (N.pos p0~1) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0~1) k0 = falseH1:Nplength (N.pos p0~1) = ni (S n0)k:natforall n1 : nat, (n1 < S n0 -> N.testbit_nat (N.pos p0~1) n1 = false) -> S n1 < S n0 -> N.testbit_nat (N.pos p0~1) (S n1) = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n1 : nat, Nplength (N.pos p0) = ni n1 -> forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = falsen, n0:natH0:Nplength (N.pos p0~1) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0~1) k0 = falseH1:Nplength (N.pos p0~1) = ni (S n0)k:natforall n1 : nat, (n1 < S n0 -> N.testbit_nat (N.pos p0~1) n1 = false) -> S n1 < S n0 -> N.testbit_nat (N.pos p0~1) (S n1) = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> N.testbit_nat (N.pos p0) k0 = falsen, n0:natH0:Nplength (N.pos p0~1) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0~1) k0 = falseH1:Nplength (N.pos p0~1) = ni (S n0)k, n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~1) n1 = falseH3:S n1 < S n0N.testbit_nat (N.pos p0~1) (S n1) = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> N.testbit_nat (N.pos p0) k0 = falsen, n0:natH0:Nplength (N.pos p0~1) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0~1) k0 = falseH1:ni 0 = ni (S n0)k, n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~1) n1 = falseH3:S n1 < S n0N.testbit_nat (N.pos p0~1) (S n1) = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:nat0 < n -> N.testbit_nat (N.pos p0~0) 0 = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natforall n0 : nat, (n0 < n -> N.testbit_nat (N.pos p0~0) n0 = false) -> S n0 < n -> N.testbit_nat (N.pos p0~0) (S n0) = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natforall n0 : nat, (n0 < n -> N.testbit_nat (N.pos p0~0) n0 = false) -> S n0 < n -> N.testbit_nat (N.pos p0~0) (S n0) = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natNplength (N.pos p0~0) = ni n -> forall n0 : nat, (n0 < n -> N.testbit_nat (N.pos p0~0) n0 = false) -> S n0 < n -> N.testbit_nat (N.pos p0~0) (S n0) = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natNplength (N.pos p0~0) = ni 0 -> forall n0 : nat, (n0 < 0 -> N.testbit_nat (N.pos p0~0) n0 = false) -> S n0 < 0 -> N.testbit_nat (N.pos p0~0) (S n0) = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natforall n0 : nat, Nplength (N.pos p0~0) = ni (S n0) -> forall n1 : nat, (n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = false) -> S n1 < S n0 -> N.testbit_nat (N.pos p0~0) (S n1) = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n1 : nat, Nplength (N.pos p0) = ni n1 -> forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natH1:Nplength (N.pos p0~0) = ni 0n0:natH2:n0 < 0 -> N.testbit_nat (N.pos p0~0) n0 = falseH3:S n0 < 0N.testbit_nat (N.pos p0~0) (S n0) = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natforall n0 : nat, Nplength (N.pos p0~0) = ni (S n0) -> forall n1 : nat, (n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = false) -> S n1 < S n0 -> N.testbit_nat (N.pos p0~0) (S n1) = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> forall k0 : nat, k0 < n0 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk:natforall n0 : nat, Nplength (N.pos p0~0) = ni (S n0) -> forall n1 : nat, (n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = false) -> S n1 < S n0 -> N.testbit_nat (N.pos p0~0) (S n1) = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0N.testbit_nat (N.pos p0~0) (S n1) = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> N.testbit_nat (N.pos p0) k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0Pos.testbit_nat p0 n1 = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0Pos.testbit_nat p0 n1 = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0Nplength (N.pos p0) = ni n0a:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0n1 < n0a:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:ni (S (Pplength p0)) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0Nplength (N.pos p0) = ni n0a:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0n1 < n0a:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:ni (S (Pplength p0)) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0H5:Pplength p0 = n0Nplength (N.pos p0) = ni (Pplength p0)a:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0n1 < n0a:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np, p0:positiveH:forall n2 : nat, Nplength (N.pos p0) = ni n2 -> forall k0 : nat, k0 < n2 -> Pos.testbit_nat p0 k0 = falsen:natH0:Nplength (N.pos p0~0) = ni nk, n0:natH1:Nplength (N.pos p0~0) = ni (S n0)n1:natH2:n1 < S n0 -> N.testbit_nat (N.pos p0~0) n1 = falseH3:S n1 < S n0n1 < n0a:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np:positiveforall n : nat, Nplength 1 = ni n -> forall k : nat, k < n -> N.testbit_nat 1 k = falsea:Np:positiveforall n : nat, ni 0 = ni n -> forall k : nat, k < n -> match k with | 0 => true | S _ => false end = falsea:Np:positiven:natH:ni 0 = ni nforall k : nat, k < n -> match k with | 0 => true | S _ => false end = falsea:Np:positiven:natH:ni 0 = ni nH1:0 = nforall k : nat, k < 0 -> match k with | 0 => true | S _ => false end = falseinversion H0. Qed.a:Np:positiven:natH:ni 0 = ni nH1:0 = nk:natH0:k < 0match k with | 0 => true | S _ => false end = falseforall (a : N) (n : nat), Nplength a = ni n -> N.testbit_nat a n = trueforall (a : N) (n : nat), Nplength a = ni n -> N.testbit_nat a n = truea:Nforall n : nat, Nplength 0 = ni n -> N.testbit_nat 0 n = truea:Nforall (p : positive) (n : nat), Nplength (N.pos p) = ni n -> N.testbit_nat (N.pos p) n = truea:Nn:natH:Nplength 0 = ni nN.testbit_nat 0 n = truea:Nforall (p : positive) (n : nat), Nplength (N.pos p) = ni n -> N.testbit_nat (N.pos p) n = truea:Nforall (p : positive) (n : nat), Nplength (N.pos p) = ni n -> N.testbit_nat (N.pos p) n = truea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> N.testbit_nat (N.pos p0) n = true) -> forall n : nat, Nplength (N.pos p0~1) = ni n -> N.testbit_nat (N.pos p0~1) n = truea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> N.testbit_nat (N.pos p0) n = true) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> N.testbit_nat (N.pos p0~0) n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> N.testbit_nat (N.pos p0) n0 = truen:natH0:Nplength (N.pos p0~1) = ni nN.testbit_nat (N.pos p0~1) n = truea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> N.testbit_nat (N.pos p0) n = true) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> N.testbit_nat (N.pos p0~0) n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> N.testbit_nat (N.pos p0) n0 = truen:natH0:ni 0 = ni nN.testbit_nat (N.pos p0~1) n = truea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> N.testbit_nat (N.pos p0) n = true) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> N.testbit_nat (N.pos p0~0) n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> N.testbit_nat (N.pos p0) n0 = truen:natH0:ni 0 = ni nH2:0 = nN.testbit_nat (N.pos p0~1) 0 = truea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> N.testbit_nat (N.pos p0) n = true) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> N.testbit_nat (N.pos p0~0) n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np:positiveforall p0 : positive, (forall n : nat, Nplength (N.pos p0) = ni n -> N.testbit_nat (N.pos p0) n = true) -> forall n : nat, Nplength (N.pos p0~0) = ni n -> N.testbit_nat (N.pos p0~0) n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> N.testbit_nat (N.pos p0) n0 = truen:natH0:Nplength (N.pos p0~0) = ni nN.testbit_nat (N.pos p0~0) n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> N.testbit_nat (N.pos p0) n0 = truen:natH0:ni (S (Pplength p0)) = ni nN.testbit_nat (N.pos p0~0) n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> N.testbit_nat (N.pos p0) n0 = truen:natH0:ni (S (Pplength p0)) = ni nH2:S (Pplength p0) = nN.testbit_nat (N.pos p0~0) (S (Pplength p0)) = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> N.testbit_nat (N.pos p0) n0 = truen:natH0:ni (S (Pplength p0)) = ni nH2:S (Pplength p0) = nPos.testbit_nat p0 (Pplength p0) = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> Pos.testbit_nat p0 n0 = truen:natH0:ni (S (Pplength p0)) = ni nH2:S (Pplength p0) = nPos.testbit_nat p0 (Pplength p0) = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np, p0:positiveH:forall n0 : nat, Nplength (N.pos p0) = ni n0 -> Pos.testbit_nat p0 n0 = truen:natH0:ni (S (Pplength p0)) = ni nH2:S (Pplength p0) = nNplength (N.pos p0) = ni (Pplength p0)a:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np:positiveforall n : nat, Nplength 1 = ni n -> N.testbit_nat 1 n = truea:Np:positiven:natH:Nplength 1 = ni nN.testbit_nat 1 n = truea:Np:positiven:natH:ni 0 = ni nN.testbit_nat 1 n = truereflexivity. Qed.a:Np:positiven:natH:ni 0 = ni nH1:0 = nN.testbit_nat 1 0 = trueforall (a : N) (n : nat), (forall k : nat, k < n -> N.testbit_nat a k = false) -> N.testbit_nat a n = true -> Nplength a = ni nforall (a : N) (n : nat), (forall k : nat, k < n -> N.testbit_nat a k = false) -> N.testbit_nat a n = true -> Nplength a = ni na:Nforall n : nat, (forall k : nat, k < n -> N.testbit_nat 0 k = false) -> N.testbit_nat 0 n = true -> Nplength 0 = ni na:Nforall (p : positive) (n : nat), (forall k : nat, k < n -> N.testbit_nat (N.pos p) k = false) -> N.testbit_nat (N.pos p) n = true -> Nplength (N.pos p) = ni na:Nn:natH:forall k : nat, k < n -> N.testbit_nat 0 k = falseH0:N.testbit_nat 0 n = trueNplength 0 = ni na:Nforall (p : positive) (n : nat), (forall k : nat, k < n -> N.testbit_nat (N.pos p) k = false) -> N.testbit_nat (N.pos p) n = true -> Nplength (N.pos p) = ni na:Nn:natH:forall k : nat, k < n -> N.testbit_nat 0 k = falseH0:false = trueNplength 0 = ni na:Nforall (p : positive) (n : nat), (forall k : nat, k < n -> N.testbit_nat (N.pos p) k = false) -> N.testbit_nat (N.pos p) n = true -> Nplength (N.pos p) = ni na:Nforall (p : positive) (n : nat), (forall k : nat, k < n -> N.testbit_nat (N.pos p) k = false) -> N.testbit_nat (N.pos p) n = true -> Nplength (N.pos p) = ni na:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = false) -> N.testbit_nat (N.pos p0~1) n = true -> Nplength (N.pos p0~1) = ni na:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = trueNplength (N.pos p0~1) = ni na:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = true(forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni na:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = true(forall k : nat, k < 0 -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni 0a:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = trueforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni (S n0)a:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = trueH2:forall k : nat, k < 0 -> N.testbit_nat (N.pos p0~1) k = falseNplength (N.pos p0~1) = ni 0a:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = trueforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni (S n0)a:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = trueforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = false) -> Nplength (N.pos p0~1) = ni (S n0)a:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> Nplength (N.pos p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = falseNplength (N.pos p0~1) = ni (S n0)a:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> Nplength (N.pos p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = falseN.testbit_nat (N.pos p0~1) 0 <> falsea:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> Nplength (N.pos p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = falseN.testbit_nat (N.pos p0~1) 0 = falsea:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> Nplength (N.pos p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~1) k = falseH1:N.testbit_nat (N.pos p0~1) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~1) k = falseN.testbit_nat (N.pos p0~1) 0 = falsea:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np:positiveforall p0 : positive, (forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n = true -> Nplength (N.pos p0) = ni n) -> forall n : nat, (forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = trueNplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = true(forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) n = true -> Nplength (N.pos p0~0) = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = true(forall k : nat, k < 0 -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) 0 = true -> Nplength (N.pos p0~0) = ni 0a:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = trueforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) (S n0) = true -> Nplength (N.pos p0~0) = ni (S n0)a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = trueH2:forall k : nat, k < 0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) 0 = trueNplength (N.pos p0~0) = ni 0a:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = trueforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) (S n0) = true -> Nplength (N.pos p0~0) = ni (S n0)a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = trueH2:forall k : nat, k < 0 -> N.testbit_nat (N.pos p0~0) k = falseH3:false = trueNplength (N.pos p0~0) = ni 0a:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = trueforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) (S n0) = true -> Nplength (N.pos p0~0) = ni (S n0)a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n0 : nat, (forall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n0 = true -> Nplength (N.pos p0) = ni n0n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = trueforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = false) -> N.testbit_nat (N.pos p0~0) (S n0) = true -> Nplength (N.pos p0~0) = ni (S n0)a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> Nplength (N.pos p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueNplength (N.pos p0~0) = ni (S n0)a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> Nplength (N.pos p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueni (S (Pplength p0)) = ni (S n0)a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueni (S (Pplength p0)) = ni (S n0)a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueni (Pplength p0) = ni n0a:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueforall k : nat, k < n0 -> N.testbit_nat (N.pos p0) k = falsea:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueN.testbit_nat (N.pos p0) n0 = truea:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k0 : nat, k0 < n -> N.testbit_nat (N.pos p0~0) k0 = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k0 : nat, k0 < S n0 -> N.testbit_nat (N.pos p0~0) k0 = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = truek:natH4:k < n0N.testbit_nat (N.pos p0) k = falsea:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueN.testbit_nat (N.pos p0) n0 = truea:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k0 : nat, k0 < n -> N.testbit_nat (N.pos p0~0) k0 = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k0 : nat, k0 < S n0 -> N.testbit_nat (N.pos p0~0) k0 = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = truek:natH4:k < n0N.testbit_nat (N.pos p0~0) (S k) = falsea:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueN.testbit_nat (N.pos p0) n0 = truea:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k0 : nat, k0 < n -> N.testbit_nat (N.pos p0~0) k0 = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k0 : nat, k0 < S n0 -> N.testbit_nat (N.pos p0~0) k0 = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = truek:natH4:k < n0S k < S n0a:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueN.testbit_nat (N.pos p0) n0 = truea:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k0 : nat, k0 < n1 -> N.testbit_nat (N.pos p0) k0 = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k0 : nat, k0 < n -> N.testbit_nat (N.pos p0~0) k0 = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k0 : nat, k0 < S n0 -> N.testbit_nat (N.pos p0~0) k0 = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = truek:natH4:k < n0k < n0a:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueN.testbit_nat (N.pos p0) n0 = truea:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np, p0:positiveH:forall n1 : nat, (forall k : nat, k < n1 -> N.testbit_nat (N.pos p0) k = false) -> N.testbit_nat (N.pos p0) n1 = true -> ni (Pplength p0) = ni n1n:natH0:forall k : nat, k < n -> N.testbit_nat (N.pos p0~0) k = falseH1:N.testbit_nat (N.pos p0~0) n = truen0:natH2:forall k : nat, k < S n0 -> N.testbit_nat (N.pos p0~0) k = falseH3:N.testbit_nat (N.pos p0~0) (S n0) = trueN.testbit_nat (N.pos p0) n0 = truea:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np:positiveforall n : nat, (forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np:positiven:nat(forall k : nat, k < n -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 n = true -> Nplength 1 = ni na:Np:positiven:nat(forall k : nat, k < 0 -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 0 = true -> Nplength 1 = ni 0a:Np:positiven:natforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 (S n0) = true -> Nplength 1 = ni (S n0)a:Np:positiven:natforall n0 : nat, (forall k : nat, k < S n0 -> N.testbit_nat 1 k = false) -> N.testbit_nat 1 (S n0) = true -> Nplength 1 = ni (S n0)a:Np:positiven, n0:natH:forall k : nat, k < S n0 -> N.testbit_nat 1 k = falseH0:N.testbit_nat 1 (S n0) = trueNplength 1 = ni (S n0)discriminate H0. Qed. Definition ni_min (d d':natinf) := match d with | infty => d' | ni n => match d' with | infty => d | ni n' => ni (min n n') end end.a:Np:positiven, n0:natH:forall k : nat, k < S n0 -> N.testbit_nat 1 k = falseH0:false = trueNplength 1 = ni (S n0)forall d : natinf, ni_min d d = dforall d : natinf, ni_min d d = dd:natinfforall n : nat, ni_min (ni n) (ni n) = ni nd:natinfforall n : nat, ni (Nat.min n n) = ni nd:natinfn:natforall n0 : nat, ni (Nat.min n0 n0) = ni n0 -> ni (Nat.min (S n0) (S n0)) = ni (S n0)d:natinfn, n0:natH:ni (Nat.min n0 n0) = ni n0ni (Nat.min (S n0) (S n0)) = ni (S n0)d:natinfn, n0:natH:ni (Nat.min n0 n0) = ni n0ni (S (Nat.min n0 n0)) = ni (S n0)d:natinfn, n0:natH:ni (Nat.min n0 n0) = ni n0H1:Nat.min n0 n0 = n0ni (S (Nat.min (Nat.min n0 n0) (Nat.min n0 n0))) = ni (S (Nat.min n0 n0))d:natinfn, n0:natH:ni (Nat.min n0 n0) = ni n0H1:Nat.min n0 n0 = n0ni (S (Nat.min n0 n0)) = ni (S n0)reflexivity. Qed.d:natinfn, n0:natH:ni (Nat.min n0 n0) = ni n0H1:Nat.min n0 n0 = n0ni (S n0) = ni (S n0)forall d d' : natinf, ni_min d d' = ni_min d' dforall d d' : natinf, ni_min d d' = ni_min d' dd:natinfforall d' : natinf, ni_min infty d' = ni_min d' inftyd:natinfforall (n : nat) (d' : natinf), ni_min (ni n) d' = ni_min d' (ni n)d:natinfforall (n : nat) (d' : natinf), ni_min (ni n) d' = ni_min d' (ni n)d:natinfn:natd':natinfforall n0 : nat, ni_min (ni n) (ni n0) = ni_min (ni n0) (ni n)d:natinfn:natd':natinfforall n0 : nat, ni_min (ni 0) (ni n0) = ni_min (ni n0) (ni 0)d:natinfn:natd':natinfforall n0 : nat, (forall n1 : nat, ni_min (ni n0) (ni n1) = ni_min (ni n1) (ni n0)) -> forall n1 : nat, ni_min (ni (S n0)) (ni n1) = ni_min (ni n1) (ni (S n0))d:natinfn:natd':natinfforall n0 : nat, (forall n1 : nat, ni_min (ni n0) (ni n1) = ni_min (ni n1) (ni n0)) -> forall n1 : nat, ni_min (ni (S n0)) (ni n1) = ni_min (ni n1) (ni (S n0))d:natinfn:natd':natinfn0:natH:forall n2 : nat, ni_min (ni n0) (ni n2) = ni_min (ni n2) (ni n0)n1:natni_min (ni (S n0)) (ni n1) = ni_min (ni n1) (ni (S n0))d:natinfn:natd':natinfn0:natH:forall n2 : nat, ni_min (ni n0) (ni n2) = ni_min (ni n2) (ni n0)n1:natforall n2 : nat, ni_min (ni (S n0)) (ni n2) = ni_min (ni n2) (ni (S n0)) -> ni_min (ni (S n0)) (ni (S n2)) = ni_min (ni (S n2)) (ni (S n0))d:natinfn:natd':natinfn0:natH:forall n3 : nat, ni_min (ni n0) (ni n3) = ni_min (ni n3) (ni n0)n1, n2:natH0:ni_min (ni (S n0)) (ni n2) = ni_min (ni n2) (ni (S n0))ni_min (ni (S n0)) (ni (S n2)) = ni_min (ni (S n2)) (ni (S n0))d:natinfn:natd':natinfn0:natH:forall n3 : nat, ni (Nat.min n0 n3) = ni (Nat.min n3 n0)n1, n2:natH0:ni_min (ni (S n0)) (ni n2) = ni_min (ni n2) (ni (S n0))ni_min (ni (S n0)) (ni (S n2)) = ni_min (ni (S n2)) (ni (S n0))d:natinfn:natd':natinfn0:natH:forall n3 : nat, ni (Nat.min n0 n3) = ni (Nat.min n3 n0)n1, n2:natH0:ni_min (ni (S n0)) (ni n2) = ni_min (ni n2) (ni (S n0))Nat.min n0 n2 = Nat.min n2 n0exact (H n2). Qed.d:natinfn:natd':natinfn0:natH:forall n3 : nat, ni (Nat.min n0 n3) = ni (Nat.min n3 n0)n1, n2:natH0:ni_min (ni (S n0)) (ni n2) = ni_min (ni n2) (ni (S n0))ni (Nat.min n0 n2) = ni (Nat.min n2 n0)forall d d' d'' : natinf, ni_min (ni_min d d') d'' = ni_min d (ni_min d' d'')forall d d' d'' : natinf, ni_min (ni_min d d') d'' = ni_min d (ni_min d' d'')d:natinfforall (n : nat) (d' d'' : natinf), ni_min (ni_min (ni n) d') d'' = ni_min (ni n) (ni_min d' d'')d:natinfn:natd':natinfforall (n0 : nat) (d'' : natinf), ni_min (ni_min (ni n) (ni n0)) d'' = ni_min (ni n) (ni_min (ni n0) d'')d:natinfn:natd':natinfn0:natd'':natinfforall n1 : nat, ni_min (ni_min (ni n) (ni n0)) (ni n1) = ni_min (ni n) (ni_min (ni n0) (ni n1))d:natinfn:natd':natinfn0:natd'':natinfforall n1 : nat, ni (Nat.min (Nat.min n n0) n1) = ni (Nat.min n (Nat.min n0 n1))d:natinfn:natd':natinfn0:natd'':natinfn1:natni (Nat.min (Nat.min n n0) n1) = ni (Nat.min n (Nat.min n0 n1))d:natinfn:natd':natinfn0:natd'':natinfn1:natNat.min (Nat.min n n0) n1 = Nat.min n (Nat.min n0 n1)d:natinfn:natd':natinfn0:natd'':natinfn1:natIHn:forall n2 n3 : nat, Nat.min (Nat.min n n2) n3 = Nat.min n (Nat.min n2 n3)Nat.min (Nat.min (S n) n0) n1 = Nat.min (S n) (Nat.min n0 n1)d:natinfn:natd':natinfn0:natd'':natinfn1:natIHn:forall n2 n3 : nat, Nat.min (Nat.min n n2) n3 = Nat.min n (Nat.min n2 n3)Nat.min (Nat.min (S n) (S n0)) n1 = Nat.min (S n) (Nat.min (S n0) n1)d:natinfn:natd':natinfn0:natd'':natinfn1:natIHn:forall n2 n3 : nat, Nat.min (Nat.min n n2) n3 = Nat.min n (Nat.min n2 n3)Nat.min (Nat.min (S n) (S n0)) (S n1) = Nat.min (S n) (Nat.min (S n0) (S n1))d:natinfn:natd':natinfn0:natd'':natinfn1:natIHn:forall n2 n3 : nat, Nat.min (Nat.min n n2) n3 = Nat.min n (Nat.min n2 n3)Nat.min (Nat.min (S n) (S n0)) (S n1) = Nat.min (S n) (Nat.min (S n0) (S n1))auto. Qed.d:natinfn:natd':natinfn0:natd'':natinfn1:natIHn:forall n2 n3 : nat, Nat.min (Nat.min n n2) n3 = Nat.min n (Nat.min n2 n3)S (Nat.min (Nat.min n n0) n1) = S (Nat.min n (Nat.min n0 n1))forall d : natinf, ni_min (ni 0) d = ni 0simple induction d; trivial. Qed.forall d : natinf, ni_min (ni 0) d = ni 0forall d : natinf, ni_min d (ni 0) = ni 0forall d : natinf, ni_min d (ni 0) = ni 0d:natinfni_min d (ni 0) = ni 0apply ni_min_O_l. Qed.d:natinfni_min (ni 0) d = ni 0forall d : natinf, ni_min infty d = dtrivial. Qed.forall d : natinf, ni_min infty d = dforall d : natinf, ni_min d infty = dsimple induction d; trivial. Qed. Definition ni_le (d d':natinf) := ni_min d d' = d.forall d : natinf, ni_min d infty = dforall d : natinf, ni_le d dexact ni_min_idemp. Qed.forall d : natinf, ni_le d dforall d d' : natinf, ni_le d d' -> ni_le d' d -> d = d'forall d d' : natinf, ni_le d d' -> ni_le d' d -> d = d'forall d d' : natinf, ni_min d d' = d -> ni_min d' d = d' -> d = d'd, d':natinfni_min d d' = d -> ni_min d' d = d' -> d = d'd, d':natinfni_min d' d = d -> ni_min d' d = d' -> d = d'd, d':natinfH:ni_min d' d = dni_min d' d = d' -> d = d'trivial. Qed.d, d':natinfH:ni_min d' d = dd = d' -> d = d'forall d d' d'' : natinf, ni_le d d' -> ni_le d' d'' -> ni_le d d''forall d d' d'' : natinf, ni_le d d' -> ni_le d' d'' -> ni_le d d''forall d d' d'' : natinf, ni_min d d' = d -> ni_min d' d'' = d' -> ni_min d d'' = dd, d', d'':natinfH:ni_min d d' = dH0:ni_min d' d'' = d'ni_min d d'' = dd, d', d'':natinfH:ni_min d d' = dH0:ni_min d' d'' = d'ni_min (ni_min d d') d'' = ni_min d d'd, d', d'':natinfH:ni_min d d' = dH0:ni_min d' d'' = d'ni_min d (ni_min d' d'') = ni_min d d'reflexivity. Qed.d, d', d'':natinfH:ni_min d d' = dH0:ni_min d' d'' = d'ni_min d d' = ni_min d d'forall d d' : natinf, ni_le (ni_min d d') dforall d d' : natinf, ni_le (ni_min d d') dforall d d' : natinf, ni_min (ni_min d d') d = ni_min d d'd, d':natinfni_min (ni_min d d') d = ni_min d d'd, d':natinfni_min (ni_min d' d) d = ni_min d' dd, d':natinfni_min d' (ni_min d d) = ni_min d' dreflexivity. Qed.d, d':natinfni_min d' d = ni_min d' dforall d d' : natinf, ni_le (ni_min d d') d'forall d d' : natinf, ni_le (ni_min d d') d'forall d d' : natinf, ni_min (ni_min d d') d' = ni_min d d'd, d':natinfni_min (ni_min d d') d' = ni_min d d'd, d':natinfni_min d (ni_min d' d') = ni_min d d'reflexivity. Qed.d, d':natinfni_min d d' = ni_min d d'forall d d' : natinf, ni_min d d' = d \/ ni_min d d' = d'forall d d' : natinf, ni_min d d' = d \/ ni_min d d' = d'forall d' : natinf, ni_min infty d' = infty \/ ni_min infty d' = d'n:natforall d' : natinf, ni_min (ni n) d' = ni n \/ ni_min (ni n) d' = d'd':natinfni_min infty d' = d'n:natforall d' : natinf, ni_min (ni n) d' = ni n \/ ni_min (ni n) d' = d'n:natforall d' : natinf, ni_min (ni n) d' = ni n \/ ni_min (ni n) d' = d'n:natni_min (ni n) infty = ni n \/ ni_min (ni n) infty = inftyn, n0:natni_min (ni n) (ni n0) = ni n \/ ni_min (ni n) (ni n0) = ni n0n:natni_min (ni n) infty = ni nn, n0:natni_min (ni n) (ni n0) = ni n \/ ni_min (ni n) (ni n0) = ni n0n, n0:natni_min (ni n) (ni n0) = ni n \/ ni_min (ni n) (ni n0) = ni n0n, n0:natni (Nat.min n n0) = ni n \/ ni (Nat.min n n0) = ni n0n, n0:natni n = ni n \/ ni n = ni n0n, n0:natni n0 = ni n \/ ni n0 = ni n0n, n0:natNat.min n n0 = n \/ Nat.min n n0 = n0n, n0:natni n = ni nn, n0:natni n0 = ni n \/ ni n0 = ni n0n, n0:natNat.min n n0 = n \/ Nat.min n n0 = n0n, n0:natni n0 = ni n \/ ni n0 = ni n0n, n0:natNat.min n n0 = n \/ Nat.min n n0 = n0n, n0:natni n0 = ni n0n, n0:natNat.min n n0 = n \/ Nat.min n n0 = n0destruct (Nat.min_dec n n0); [left|right]; assumption. Qed.n, n0:natNat.min n n0 = n \/ Nat.min n n0 = n0forall d d' : natinf, ni_le d d' \/ ni_le d' dforall d d' : natinf, ni_le d d' \/ ni_le d' dforall d d' : natinf, ni_min d d' = d \/ ni_min d' d = d'd, d':natinfni_min d d' = d \/ ni_min d' d = d'apply ni_min_case. Qed.d, d':natinfni_min d d' = d \/ ni_min d d' = d'forall d d' dm : natinf, ni_le dm d -> ni_le dm d' -> (forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dm) -> ni_min d d' = dmforall d d' dm : natinf, ni_le dm d -> ni_le dm d' -> (forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dm) -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dd = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le d dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le dm dd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le d dd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le d d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le dm dd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le d d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le dm dd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = dni_le dm dd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmni_min d d' = d' -> ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_min d d' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'd' = dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le d' dmd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le dm d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le d' dd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le d' d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le dm d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_min d' d = d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le d' d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le dm d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_min d d' = d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le d' d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le dm d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le d' d'd, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le dm d'exact H0. Qed.d, d', dm:natinfH:ni_le dm dH0:ni_le dm d'H1:forall d'' : natinf, ni_le d'' d -> ni_le d'' d' -> ni_le d'' dmH2:ni_min d d' = d'ni_le dm d'forall m n : nat, m <= n -> ni_le (ni m) (ni n)forall m n : nat, m <= n -> ni_le (ni m) (ni n)m, n:natH:m <= nni_le (ni m) (ni n)m, n:natH:m <= nni (Nat.min m n) = ni mreflexivity. Qed.m, n:natH:m <= nni m = ni mforall m n : nat, ni_le (ni m) (ni n) -> m <= nforall m n : nat, ni_le (ni m) (ni n) -> m <= nforall m n : nat, ni_min (ni m) (ni n) = ni m -> m <= nforall m n : nat, ni (Nat.min m n) = ni m -> m <= nm, n:natH:ni (Nat.min m n) = ni mm <= napply le_min_r. Qed.m, n:natH:ni (Nat.min m n) = ni mH1:Nat.min m n = mNat.min m n <= nforall (a : N) (n : nat), (forall k : nat, k < n -> N.testbit_nat a k = false) -> ni_le (ni n) (Nplength a)forall (a : N) (n : nat), (forall k : nat, k < n -> N.testbit_nat a k = false) -> ni_le (ni n) (Nplength a)a:Nforall n : nat, (forall k : nat, k < n -> N.testbit_nat 0 k = false) -> ni_le (ni n) (Nplength 0)a:Nforall (p : positive) (n : nat), (forall k : nat, k < n -> N.testbit_nat (N.pos p) k = false) -> ni_le (ni n) (Nplength (N.pos p))a:Nn:natH:forall k : nat, k < n -> N.testbit_nat 0 k = falseni_le (ni n) (Nplength 0)a:Nforall (p : positive) (n : nat), (forall k : nat, k < n -> N.testbit_nat (N.pos p) k = false) -> ni_le (ni n) (Nplength (N.pos p))a:Nforall (p : positive) (n : nat), (forall k : nat, k < n -> N.testbit_nat (N.pos p) k = false) -> ni_le (ni n) (Nplength (N.pos p))a:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseni_le (ni n) (Nplength (N.pos p))a:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseni_le (ni n) (ni (Pplength p))a:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falsen <= Pplength pa:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falsen <= Pplength p -> n <= Pplength pa:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falsePplength p < n -> n <= Pplength pa:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falsePplength p < n -> n <= Pplength pa:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseH0:Pplength p < nn <= Pplength pa:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseH0:Pplength p < nN.testbit_nat (N.pos p) (Pplength p) <> falsea:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseH0:Pplength p < nN.testbit_nat (N.pos p) (Pplength p) = falsea:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseH0:Pplength p < ntrue <> falsea:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseH0:Pplength p < nN.testbit_nat (N.pos p) (Pplength p) = falsea:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseH0:Pplength p < nN.testbit_nat (N.pos p) (Pplength p) = falseexact H0. Qed.a:Np:positiven:natH:forall k : nat, k < n -> N.testbit_nat (N.pos p) k = falseH0:Pplength p < nPplength p < nforall (a : N) (n : nat), N.testbit_nat a n = true -> ni_le (Nplength a) (ni n)forall (a : N) (n : nat), N.testbit_nat a n = true -> ni_le (Nplength a) (ni n)a:Nforall n : nat, N.testbit_nat 0 n = true -> ni_le (Nplength 0) (ni n)a:Nforall (p : positive) (n : nat), N.testbit_nat (N.pos p) n = true -> ni_le (Nplength (N.pos p)) (ni n)a:Nn:natH:N.testbit_nat 0 n = trueni_le (Nplength 0) (ni n)a:Nforall (p : positive) (n : nat), N.testbit_nat (N.pos p) n = true -> ni_le (Nplength (N.pos p)) (ni n)a:Nforall (p : positive) (n : nat), N.testbit_nat (N.pos p) n = true -> ni_le (Nplength (N.pos p)) (ni n)a:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueni_le (Nplength (N.pos p)) (ni n)a:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueni_le (ni (Pplength p)) (ni n)a:Np:positiven:natH:N.testbit_nat (N.pos p) n = truePplength p <= na:Np:positiven:natH:N.testbit_nat (N.pos p) n = truePplength p <= n -> Pplength p <= na:Np:positiven:natH:N.testbit_nat (N.pos p) n = truen < Pplength p -> Pplength p <= na:Np:positiven:natH:N.testbit_nat (N.pos p) n = truen < Pplength p -> Pplength p <= na:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueH0:n < Pplength pPplength p <= na:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueH0:n < Pplength pN.testbit_nat (N.pos p) n <> truea:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueH0:n < Pplength pN.testbit_nat (N.pos p) n = truea:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueH0:n < Pplength pfalse <> truea:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueH0:n < Pplength pN.testbit_nat (N.pos p) n = trueexact H. Qed.a:Np:positiven:natH:N.testbit_nat (N.pos p) n = trueH0:n < Pplength pN.testbit_nat (N.pos p) n = true
We define an ultrametric distance between N numbers:
,
where is the number of identical bits at the beginning
of and (infinity if ).
Instead of working with , we work with , namely
Npdist:
Definition Npdist (a a':N) := Nplength (N.lxor a a').
d is a distance, so iff ; this means that
iff :
forall a : N, Npdist a a = inftyforall a : N, Npdist a a = inftya:NNpdist a a = inftya:NNplength (N.lxor a a) = inftyreflexivity. Qed.a:NNplength 0 = inftyforall a a' : N, Npdist a a' = infty -> a = a'forall a a' : N, Npdist a a' = infty -> a = a'a, a':NH:Npdist a a' = inftya = a'a, a':NH:Npdist a a' = inftyN.lxor a a' = 0%Nexact H. Qed.a, a':NH:Npdist a a' = inftyNplength (N.lxor a a') = infty
is a distance, so :
forall a a' : N, Npdist a a' = Npdist a' aforall a a' : N, Npdist a a' = Npdist a' aforall a a' : N, Nplength (N.lxor a a') = Nplength (N.lxor a' a)a, a':NNplength (N.lxor a a') = Nplength (N.lxor a' a)reflexivity. Qed.a, a':NNplength (N.lxor a' a) = Nplength (N.lxor a' a)
is an ultrametric distance, that is, not only ,
but in fact .
This means that (lemma Npdist_ultra below).
This follows from the fact that
is an ultrametric norm, i.e. that ,
or equivalently that , i.e. that
min
(lemma Nplength_ultra).
forall a a' : N, ni_le (Nplength a) (Nplength a') -> ni_le (Nplength a) (Nplength (N.lxor a a'))forall a a' : N, ni_le (Nplength a) (Nplength a') -> ni_le (Nplength a) (Nplength (N.lxor a a'))a:Nforall a' : N, ni_le (Nplength 0) (Nplength a') -> ni_le (Nplength 0) (Nplength (N.lxor 0 a'))a:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a, a':NH:ni_le (Nplength 0) (Nplength a')ni_le (Nplength 0) (Nplength (N.lxor 0 a'))a:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a, a':NH:ni_min (Nplength 0) (Nplength a') = Nplength 0ni_le (Nplength 0) (Nplength (N.lxor 0 a'))a:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a, a':NH:ni_min infty (Nplength a') = inftyni_le (Nplength 0) (Nplength (N.lxor 0 a'))a:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a, a':NH:Nplength a' = inftyni_le (Nplength 0) (Nplength (N.lxor 0 a'))a:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a, a':NH:Nplength a' = inftyni_le (Nplength 0) (Nplength (N.lxor 0 0))a:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a, a':NH:Nplength a' = inftyni_le infty inftya:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a:Nforall (p : positive) (a' : N), ni_le (Nplength (N.pos p)) (Nplength a') -> ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')ni_le (Nplength (N.pos p)) (Nplength (N.lxor (N.pos p) a'))a:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')ni_le (ni (Pplength p)) (Nplength (N.lxor (N.pos p) a'))a:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')forall k : nat, k < Pplength p -> N.testbit_nat (N.lxor (N.pos p) a') k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pN.testbit_nat (N.lxor (N.pos p) a') k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pH1:forall a'' : N, N.lxor (N.pos p) a' = a'' -> N.testbit_nat a'' k = falseN.testbit_nat (N.lxor (N.pos p) a') k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pforall a'' : N, N.lxor (N.pos p) a' = a'' -> N.testbit_nat a'' k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pH1:forall a'' : N, N.lxor (N.pos p) a' = a'' -> N.testbit_nat a'' k = falseN.testbit_nat (N.lxor (N.pos p) a') k = falsereflexivity.a:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pH1:forall a'' : N, N.lxor (N.pos p) a' = a'' -> N.testbit_nat a'' k = falseN.lxor (N.pos p) a' = N.lxor (N.pos p) a'a:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pforall a'' : N, N.lxor (N.pos p) a' = a'' -> N.testbit_nat a'' k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':NN.lxor (N.pos p) a' = a'' -> N.testbit_nat a'' k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':NN.lxor (N.pos p) a' = 0%N -> N.testbit_nat 0 k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':Nforall p0 : positive, N.lxor (N.pos p) a' = N.pos p0 -> N.testbit_nat (N.pos p0) k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':NH1:N.lxor (N.pos p) a' = 0%NN.testbit_nat 0 k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':Nforall p0 : positive, N.lxor (N.pos p) a' = N.pos p0 -> N.testbit_nat (N.pos p0) k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':Nforall p0 : positive, N.lxor (N.pos p) a' = N.pos p0 -> N.testbit_nat (N.pos p0) k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) a' = N.pos p0N.testbit_nat (N.pos p0) k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) a' = N.pos p0N.testbit_nat (N.lxor (N.pos p) a') k = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) a' = N.pos p0xorb (N.testbit_nat (N.pos p) k) (N.testbit_nat a' k) = falsea:Np:positivea':NH:ni_le (Nplength (N.pos p)) (Nplength a')k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) a' = N.pos p0xorb false (N.testbit_nat a' k) = falsea:Np:positiveH:ni_le (Nplength (N.pos p)) (Nplength 0)k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) 0 = N.pos p0xorb false (N.testbit_nat 0 k) = falsea:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0xorb false (N.testbit_nat (N.pos p1) k) = falsea:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0xorb false (N.testbit_nat (N.pos p1) k) = falsea:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0N.testbit_nat (N.pos p1) k = falsea:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0Nplength (N.pos p1) = ni (Pplength p1)a:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0k < Pplength p1a:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0k < Pplength p1a:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0k < Pplength pa:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0Pplength p <= Pplength p1a:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0Pplength p <= Pplength p1exact H. Qed.a:Np, p1:positiveH:ni_le (Nplength (N.pos p)) (Nplength (N.pos p1))k:natH0:k < Pplength pa'':Np0:positiveH1:N.lxor (N.pos p) (N.pos p1) = N.pos p0ni_le (ni (Pplength p)) (ni (Pplength p1))forall a a' : N, ni_le (ni_min (Nplength a) (Nplength a')) (Nplength (N.lxor a a'))forall a a' : N, ni_le (ni_min (Nplength a) (Nplength a')) (Nplength (N.lxor a a'))a, a':Nni_le (ni_min (Nplength a) (Nplength a')) (Nplength (N.lxor a a'))a, a':NH:ni_le (Nplength a) (Nplength a')ni_le (ni_min (Nplength a) (Nplength a')) (Nplength (N.lxor a a'))a, a':NH:ni_le (Nplength a') (Nplength a)ni_le (ni_min (Nplength a) (Nplength a')) (Nplength (N.lxor a a'))a, a':NH:ni_le (Nplength a) (Nplength a')ni_min (Nplength a) (Nplength a') = Nplength aa, a':NH:ni_le (Nplength a') (Nplength a)ni_le (ni_min (Nplength a) (Nplength a')) (Nplength (N.lxor a a'))a, a':NH:ni_le (Nplength a') (Nplength a)ni_le (ni_min (Nplength a) (Nplength a')) (Nplength (N.lxor a a'))a, a':NH:ni_le (Nplength a') (Nplength a)ni_min (Nplength a) (Nplength a') = Nplength a'exact H. Qed.a, a':NH:ni_le (Nplength a') (Nplength a)ni_min (Nplength a') (Nplength a) = Nplength a'forall a a' a'' : N, ni_le (ni_min (Npdist a a'') (Npdist a'' a')) (Npdist a a')forall a a' a'' : N, ni_le (ni_min (Npdist a a'') (Npdist a'' a')) (Npdist a a')a, a', a'':Nni_le (ni_min (Npdist a a'') (Npdist a'' a')) (Npdist a a')a, a', a'':Nni_le (ni_min (Nplength (N.lxor a a'')) (Nplength (N.lxor a'' a'))) (Nplength (N.lxor a a'))a, a', a'':NN.lxor (N.lxor a a'') (N.lxor a'' a') = N.lxor a a' -> ni_le (ni_min (Nplength (N.lxor a a'')) (Nplength (N.lxor a'' a'))) (Nplength (N.lxor a a'))a, a', a'':NN.lxor (N.lxor a a'') (N.lxor a'' a') = N.lxor a a'a, a', a'':NH:N.lxor (N.lxor a a'') (N.lxor a'' a') = N.lxor a a'ni_le (ni_min (Nplength (N.lxor a a'')) (Nplength (N.lxor a'' a'))) (Nplength (N.lxor a a'))a, a', a'':NN.lxor (N.lxor a a'') (N.lxor a'' a') = N.lxor a a'a, a', a'':NH:N.lxor (N.lxor a a'') (N.lxor a'' a') = N.lxor a a'ni_le (ni_min (Nplength (N.lxor a a'')) (Nplength (N.lxor a'' a'))) (Nplength (N.lxor (N.lxor a a'') (N.lxor a'' a')))a, a', a'':NN.lxor (N.lxor a a'') (N.lxor a'' a') = N.lxor a a'a, a', a'':NN.lxor (N.lxor a a'') (N.lxor a'' a') = N.lxor a a'a, a', a'':NN.lxor a (N.lxor a'' (N.lxor a'' a')) = N.lxor a a'a, a', a'':NN.lxor a (N.lxor (N.lxor a'' a'') a') = N.lxor a a'a, a', a'':NN.lxor a (N.lxor 0 a') = N.lxor a a'reflexivity. Qed.a, a', a'':NN.lxor a a' = N.lxor a a'