Library hydras.Ackermann.extEqualNat

extEqualNat:
Original script by Russel O'Connor

From Coq Require Import Arith.


Fixpoint naryFunc (n : nat) : Set :=
  match n with
  | Onat
  | S nnat naryFunc n
  end.


Fixpoint naryRel (n : nat) : Set :=
  match n with
  | Obool
  | S nnat naryRel n
  end.


Fixpoint extEqual (n : nat) : (a b : naryFunc n), Prop :=
  match n with
    0 ⇒ fun a ba = b
  | S pfun a b c, extEqual p (a c) (b c)
  end.


Fixpoint charFunction (n : nat) : naryRel n naryFunc n :=
  match n return (naryRel n naryFunc n) with
  | Ofun R : boolmatch R with
                         | true ⇒ 1
                         | false ⇒ 0
                         end
  | S mfun (R : naryRel (S m)) (a : nat) ⇒ charFunction m (R a)
  end.

Lemma extEqualRefl n a: extEqual n a a.

Lemma extEqualSym :
   (n : nat) (a b : naryFunc n), extEqual n a b extEqual n b a.

Lemma extEqualTrans :
  (n : nat) (a b c : naryFunc n),
 extEqual n a b extEqual n b c extEqual n a c.