Definition: seq-single
seq-single(t) ==  λi.if i=0 then else ⊥

Lemma: seq-single_wf
[T:Type]. ∀[t:T].  (seq-single(t) ∈ ℕ1 ⟶ T)

Definition: seq-append
seq-append(n;m;s1;s2) ==  λi.if (i) < (n)  then s1 i  else if (i) < (n m)  then s2 (i n)  else ⊥

Lemma: seq-append_wf
[T:Type]. ∀[n,m:ℕ]. ∀[s1:ℕn ⟶ T]. ∀[s2:ℕm ⟶ T].  (seq-append(n;m;s1;s2) ∈ ℕm ⟶ T)

Definition: seq-add
s.x@n ==  λm.if m=n then else (s m)

Lemma: seq-add_wf
[T:Type]. ∀[n:ℕ]. ∀[s:ℕn ⟶ T]. ∀[x:T].  (s.x@n ∈ ℕ1 ⟶ T)

Definition: strictly-increasing-seq
strictly-increasing-seq(n;s) ==  ∀j:ℕn. ∀i:ℕj.  i < j

Lemma: strictly-increasing-seq_wf
[n:ℕ]. ∀[s:ℕn ⟶ ℤ].  (strictly-increasing-seq(n;s) ∈ ℙ)

Lemma: decidable__strictly-increasing-seq
n:ℕ. ∀s:ℕn ⟶ ℤ.  Dec(strictly-increasing-seq(n;s))

Lemma: implies-strictly-increasing-seq
[n:ℕ]. ∀[s:ℕn ⟶ ℤ].  ((∀i:ℕ1. i < (i 1))  strictly-increasing-seq(n;s))

Lemma: strictly-increasing-seq-add
[n:ℕ]. ∀[s:ℕn ⟶ ℤ].
  ∀x,y:ℕ.  (x <  strictly-increasing-seq(n 1;s.x@n)  strictly-increasing-seq(n 2;s.x@n.y@n 1))

Lemma: strictly-increasing-seq-add2-implies
n:ℕ. ∀s:ℕn ⟶ ℕ. ∀x,y:ℕ.
  (strictly-increasing-seq(n 2;s.x@n.y@n 1)
   {x < y ∧ strictly-increasing-seq(n 1;s.x@n) ∧ strictly-increasing-seq(n 1;s.y@n)})

Definition: consistent-seq
R-consistent-seq(n) ==  {s:ℕn ⟶ T| ∀x:ℕn. (R (s x))} 

Lemma: consistent-seq_wf
[T:Type]. ∀[R:n:ℕ ⟶ (ℕn ⟶ T) ⟶ T ⟶ ℙ]. ∀[n:ℕ].  (R-consistent-seq(n) ∈ Type)

Lemma: seq-append_wf_consistent
T:Type. ∀R:n:ℕ ⟶ (ℕn ⟶ T) ⟶ T ⟶ ℙ. ∀n:ℕ. ∀s:R-consistent-seq(n). ∀t:T.
  ((R t)  (seq-append(n;1;s;λi.t) ∈ R-consistent-seq(n 1)))

Lemma: seq-add_wf_consistent
T:Type. ∀R:n:ℕ ⟶ (ℕn ⟶ T) ⟶ T ⟶ ℙ. ∀n:ℕ. ∀s:R-consistent-seq(n). ∀t:T.
  ((R t)  (s.t@n ∈ R-consistent-seq(n 1)))

Lemma: seq-append-assoc
[n,m,k:ℕ]. ∀[s1,s2,s3:Top].
  (seq-append(n;m k;s1;seq-append(m;k;s2;s3)) seq-append(n m;k;seq-append(n;m;s1;s2);s3))

Definition: seq-normalize
seq-normalize(n;s) ==  λm.if (m) < (n)  then m  else ⊥

Lemma: seq-normalize_wf
[T:Type]. ∀[n:ℕ]. ∀[s:ℕn ⟶ T].  (seq-normalize(n;s) ∈ ℕn ⟶ T)

Lemma: seq-normalize-equal
[T:Type]. ∀[n:ℕ]. ∀[s:ℕn ⟶ T].  (seq-normalize(n;s) s ∈ (ℕn ⟶ T))

Lemma: seq-normalize-normalize
[n,m:ℕ]. ∀[s:Top].  (seq-normalize(n;seq-normalize(m;s)) seq-normalize(if (n) < (m)  then n  else m;s))

Lemma: seq-normalize-append
[n,m:ℕ]. ∀[s1,s2:Top].  (seq-normalize(n m;seq-append(n;m;s1;s2)) seq-append(n;m;s1;s2))

Lemma: seq-append-normalize
[n,m:ℕ]. ∀[s1,s2:Top].  (seq-append(n;m;s1;seq-normalize(m;s2)) seq-append(n;m;s1;s2))

Lemma: seq-normalize0
seq-normalize(0;λm.⊥~ λm.eval in
                           ⊥

Definition: seq-adjoin
s++t ==  seq-append(n;1;s;λi.t)

Lemma: seq-adjoin_wf
[T:Type]. ∀[n:ℕ]. ∀[s:ℕn ⟶ T]. ∀[t:T].  (s++t ∈ ℕ1 ⟶ T)

Lemma: seq-append1
[n:ℕ]. ∀[s,t:Top].  (seq-append(n;1;s;λi.t) seq-normalize(n 1;λm.if m=n then else (s m)))

Lemma: seq-append1-assoc
[n,n1:ℕ]. ∀[s,s1,t:Top].
  m.if m=n n1 then else (seq-append(n;n1;s;s1) m) seq-append(n;n1 1;s;λm.if m=n1 then else (s1 m)))

Lemma: seq-append0
[n:ℕ]. ∀[s,t:Top].  (seq-append(n;0;s;t) seq-normalize(n;s))

Definition: bar_recursion
bar_recursion(d;
              b;
              i;
              n;s) ==
  fix((λbar_recursion,n,s. case s
                           of inl(r) =>
                           r
                           inr(r) =>
                           t.(bar_recursion (n 1) m.if m=n then else (s m)))))) 
  
  s

Lemma: bar_recursion_wf1
[T:Type]. ∀[R,A:n:ℕ ⟶ (ℕn ⟶ T) ⟶ ℙ]. ∀[d:∀n:ℕ. ∀s:ℕn ⟶ T.  Dec(R[n;s])].
[b:∀n:ℕ. ∀s:ℕn ⟶ T.  (R[n;s]  A[n;s])]. ∀[i:∀n:ℕ. ∀s:ℕn ⟶ T.  ((∀t:T. A[n 1;seq-append(n;1;s;λi.t)])  A[n;s])].
  ((∀alpha:ℕ ⟶ T. (↓∃m:ℕR[m;alpha]))  (∀c:Top. (bar_recursion(d;b;i;0;c) ∈ A[0;c])))

Lemma: bar_recursion_wf
[T:Type]. ∀[R,A:n:ℕ ⟶ (ℕn ⟶ T) ⟶ ℙ]. ∀[d:∀n:ℕ. ∀s:ℕn ⟶ T.  Dec(R[n;s])].
[b:∀n:ℕ. ∀s:ℕn ⟶ T.  (R[n;s]  A[n;s])]. ∀[i:∀n:ℕ. ∀s:ℕn ⟶ T.  ((∀t:T. A[n 1;seq-append(n;1;s;λi.t)])  A[n;s])].
[n:ℕ]. ∀[s:ℕn ⟶ T].
  ((∀alpha:ℕ ⟶ T. (↓∃m:ℕR[n m;seq-append(n;m;s;alpha)]))
   (bar_recursion(d;
                    b;
                    i;
                    n;seq-normalize(n;s)) ∈ A[n;seq-normalize(n;s)]))

Lemma: bar_recursion_wf_strong
[T:Type]. ∀[R:n:ℕ ⟶ (ℕn ⟶ T) ⟶ T ⟶ ℙ]. ∀[B:n:ℕ ⟶ {s:ℕn ⟶ T| ∀x:ℕn. (R (s x))}  ⟶ ℙ].
[A:n:ℕ ⟶ R-consistent-seq(n) ⟶ ℙ]. ∀[d:∀n:ℕ. ∀s:R-consistent-seq(n).  Dec(B[n;s])]. ∀[b:∀n:ℕ. ∀s:R-consistent-seq(n).
                                                                                             (B[n;s]  A[n;s])].
[i:∀n:ℕ. ∀s:R-consistent-seq(n).  ((∀t:{t:T| t} A[n 1;s.t@n])  A[n;s])].
  ((∀alpha:{f:ℕ ⟶ T| ∀x:ℕ(R (f x))} (↓∃m:ℕB[m;alpha]))  (∀x:Top. (bar_recursion(d;b;i;0;x) ∈ A[0;x])))

Lemma: bar_recursion_wf0
[T:Type]. ∀[R,A:n:ℕ ⟶ (ℕn ⟶ T) ⟶ ℙ]. ∀[d:∀n:ℕ. ∀s:ℕn ⟶ T.  Dec(R[n;s])].
[b:∀n:ℕ. ∀s:ℕn ⟶ T.  (R[n;s]  A[n;s])]. ∀[i:∀n:ℕ. ∀s:ℕn ⟶ T.  ((∀t:T. A[n 1;seq-append(n;1;s;λi.t)])  A[n;s])].
  ((∀alpha:ℕ ⟶ T. (↓∃m:ℕR[m;alpha]))  (bar_recursion(d;b;i;0;λm.eval in ⊥) ∈ A[0;λm.⊥]))

Lemma: bar_induction
[T:Type]. ∀[R,A:n:ℕ ⟶ (ℕn ⟶ T) ⟶ ℙ].
  ((∀n:ℕ. ∀s:ℕn ⟶ T.  Dec(R[n;s]))
   (∀n:ℕ. ∀s:ℕn ⟶ T.  (R[n;s]  A[n;s]))
   (∀n:ℕ. ∀s:ℕn ⟶ T.  ((∀t:T. A[n 1;s++t])  A[n;s]))
   (∀n:ℕ. ∀s:ℕn ⟶ T.  ((∀alpha:ℕ ⟶ T. (↓∃m:ℕR[n m;seq-append(n;m;s;alpha)]))  A[n;s])))

Lemma: basic_bar_induction
[T:Type]. ∀[R,A:n:ℕ ⟶ (ℕn ⟶ T) ⟶ ℙ].
  ((∀n:ℕ. ∀s:ℕn ⟶ T.  Dec(R[n;s]))
   (∀n:ℕ. ∀s:ℕn ⟶ T.  (R[n;s]  A[n;s]))
   (∀n:ℕ. ∀s:ℕn ⟶ T.  ((∀t:T. A[n 1;s++t])  A[n;s]))
   (∀alpha:ℕ ⟶ T. (↓∃m:ℕR[m;alpha]))
   (∀x:Top. A[0;x]))

Lemma: basic_strong_bar_induction
[T:Type]. ∀[R:n:ℕ ⟶ (ℕn ⟶ T) ⟶ T ⟶ ℙ]. ∀[B,A:n:ℕ ⟶ R-consistent-seq(n) ⟶ ℙ].
  ((∀n:ℕ. ∀s:R-consistent-seq(n).  Dec(B[n;s]))
   (∀n:ℕ. ∀s:R-consistent-seq(n).  (B[n;s]  A[n;s]))
   (∀n:ℕ. ∀s:R-consistent-seq(n).  ((∀t:{t:T| t} A[n 1;s.t@n])  A[n;s]))
   (∀alpha:{f:ℕ ⟶ T| ∀x:ℕ(R (f x))} (↓∃m:ℕB[m;alpha]))
   (∀x:Top. A[0;x]))

Definition: bounded-type
Bounded(T) ==  ∀K:T ⟶ ℕ(∃B:ℕ [(∀t:T. ((K t) ≤ B))])

Lemma: bounded-type_wf
[T:Type]. (Bounded(T) ∈ ℙ)

Definition: project-seq
project-seq(s) ==  λi.(snd((s i)))

Lemma: project-seq_wf
[T:ℕ ⟶ Type]. ∀[n:ℕ]. ∀[s:ℕn ⟶ (i:ℕ × T[i])].  project-seq(s) ∈ i:ℕn ⟶ T[i] supposing ∀i:ℕn. ((fst((s i))) i ∈ ℤ)

Lemma: simple_more_general_fan_theorem
[T:ℕ ⟶ Type]
  (∀i:ℕBounded(T[i]))
   (∀[X:n:ℕ ⟶ (i:ℕn ⟶ T[i]) ⟶ ℙ]
        (∀n:ℕ. ∀s:i:ℕn ⟶ T[i].  Dec(X[n;s]))  (∃k:ℕ [(∀f:i:ℕ ⟶ T[i]. ∃n:ℕk. X[n;f])]) 
        supposing ∀f:i:ℕ ⟶ T[i]. (↓∃n:ℕX[n;f])) 
  supposing ∀i:ℕT[i]

Definition: genFAN
genFAN(max;d) ==
  bar_recursion(λn,s. eval in
                      if int_seg_decide(λk.if fst((s k))=k then inr _.Ax)  else (inl _.Ax));0;x)
                      then inl Ax
                      else case i.(snd((s i)))) of inl(z) => inl inr(_) => inr _.Ax) 
                      fi ;
                λn,s,f. 1;
                λn,s,f. ((max t.(f <n, t>))) 1);
                0;λm.eval in
                     ⊥)

Lemma: simple_more_general_fan_theorem-ext
[T:ℕ ⟶ Type]
  (∀i:ℕBounded(T[i]))
   (∀[X:n:ℕ ⟶ (i:ℕn ⟶ T[i]) ⟶ ℙ]
        (∀n:ℕ. ∀s:i:ℕn ⟶ T[i].  Dec(X[n;s]))  (∃k:ℕ [(∀f:i:ℕ ⟶ T[i]. ∃n:ℕk. X[n;f])]) 
        supposing ∀f:i:ℕ ⟶ T[i]. (↓∃n:ℕX[n;f])) 
  supposing ∀i:ℕT[i]

Lemma: genFAN_wf
[T:ℕ ⟶ Type]
  ∀[max:∀i:ℕBounded(T[i])]. ∀[X:n:ℕ ⟶ (i:ℕn ⟶ T[i]) ⟶ ℙ].
    ∀[d:∀n:ℕ. ∀s:i:ℕn ⟶ T[i].  Dec(X[n;s])]. (genFAN(max;d) ∈ {k:ℕ| ∀f:i:ℕ ⟶ T[i]. ∃n:ℕk. X[n;f]} 
    supposing ∀f:i:ℕ ⟶ T[i]. (↓∃n:ℕX[n;f]) 
  supposing ∀i:ℕT[i]

Lemma: simple_general_fan_theorem
[T:Type]
  (Bounded(T)
   (∀[X:n:ℕ ⟶ (ℕn ⟶ T) ⟶ ℙ]
        (∀n:ℕ. ∀s:ℕn ⟶ T.  Dec(X[n;s]))  (∃k:ℕ [(∀f:ℕ ⟶ T. ∃n:ℕk. X[n;f])]) supposing ∀f:ℕ ⟶ T. (↓∃n:ℕX[n;f])))

Lemma: simple_general_fan_theorem-ext
[T:Type]
  (Bounded(T)
   (∀[X:n:ℕ ⟶ (ℕn ⟶ T) ⟶ ℙ]
        (∀n:ℕ. ∀s:ℕn ⟶ T.  Dec(X[n;s]))  (∃k:ℕ [(∀f:ℕ ⟶ T. ∃n:ℕk. X[n;f])]) supposing ∀f:ℕ ⟶ T. (↓∃n:ℕX[n;f])))

Definition: weakly-infinite
w∃∞p.S[p] ==  ∀p:ℕ(¬¬(∃q:ℕ(p < q ∧ S[q])))

Lemma: weakly-infinite_wf
[S:ℕ ⟶ ℙ]. (w∃∞x.S[x] ∈ ℙ)

Lemma: weakly-infinite-cases
[S:ℕ ⟶ ℙ]. (w∃∞x.S[x]  (∀[A:ℕ ⟶ ℙ]. ((∀n:ℕ(A[n]  S[n]))  (¬¬(w∃∞n.A[n] ∨ w∃∞n.S[n] ∧ A[n]))))))

Definition: TI
TI is the principle of "transfinite induction" for the 
given relation on type T.
Unfortunately, it is well-formed only when Q[t] is proposition
on type T, so it can't be used to prove that some Q' is proposition.⋅

TI(T;x,y.R[x; y];t.Q[t]) ==  (∀t:T. ((∀s:{s:T| R[t; s]} Q[s])  Q[t]))  (∀t:T. Q[t])

Lemma: TI_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ]. ∀[Q:T ⟶ ℙ].  (TI(T;x,y.R[x;y];t.Q[t]) ∈ ℙ)

Definition: uniform-TI
uniform-TI(T;x,y.R[x; y];t.Q[t]) ==  (∀[t:T]. ((∀[s:{s:T| R[t; s]} ]. Q[s])  Q[t]))  (∀[t:T]. Q[t])

Lemma: uniform-TI_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ]. ∀[Q:T ⟶ ℙ].  (uniform-TI(T;x,y.R[x;y];t.Q[t]) ∈ ℙ)

Definition: weak-TI
weak-TI(T;x,y.R[x; y];t.Q[t]) ==  (∀t:T. ((∀s:T. (R[t; s]  Q[s]))  Q[t]))  (∀t:T. Q[t])

Lemma: weak-TI_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ]. ∀[Q:T ⟶ ℙ].  (weak-TI(T;x,y.R[x;y];t.Q[t]) ∈ ℙ)

Lemma: TI-weak-TI
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ]. ∀[Q:T ⟶ ℙ].  (TI(T;x,y.R[x;y];t.Q[t])  weak-TI(T;x,y.R[x;y];t.Q[t]))

Definition: homogeneous
homogeneous(R;n;s) ==
  strictly-increasing-seq(n;s) ∧ (∀m,i,j:ℕn.  (m <  m <  (R (s m) (s i) ⇐⇒ (s m) (s j))))

Lemma: homogeneous_wf
[R:ℕ ⟶ ℕ ⟶ ℙ]. ∀[n:ℕ]. ∀[s:ℕn ⟶ ℕ].  (homogeneous(R;n;s) ∈ ℙ)

Lemma: homogeneous-extension-implies
R:ℕ ⟶ ℕ ⟶ ℙ. ∀n:ℕ. ∀s:ℕn ⟶ ℕ. ∀m:ℕ.  (homogeneous(R;n 1;s.m@n)  homogeneous(R;n;s))

Lemma: le2-homogeneous
[R:ℕ ⟶ ℕ ⟶ ℙ]. ∀[n:ℕ]. ∀[s:ℕn ⟶ ℕ].  ((n ≤ 2)  strictly-increasing-seq(n;s)  homogeneous(R;n;s))

Lemma: non-homogeneous-add
[R:ℕ ⟶ ℕ ⟶ ℙ]
  ∀n:ℕ. ∀s:ℕn ⟶ ℕ. ∀p,q:ℕ.
    (p < q
     homogeneous(R;n 1;s.p@n)
     homogeneous(R;n 1;s.q@n)
     homogeneous(R;n 2;s.p@n.q@n 1))
     {0 < n ∧ (R (s (n 1)) ⇐⇒ (s (n 1)) q))})

Definition: weakly-safe-seq
weakly-safe-seq(R;n;s) ==  w∃∞q.homogeneous(R;n 1;s.q@n)

Lemma: weakly-safe-seq_wf
[R:ℕ ⟶ ℕ ⟶ ℙ]. ∀[n:ℕ]. ∀[s:ℕn ⟶ ℕ].  (weakly-safe-seq(R;n;s) ∈ ℙ)

Lemma: weakly-safe-extension
[R:ℕ ⟶ ℕ ⟶ ℙ]. ∀[n:ℕ]. ∀[s:ℕn ⟶ ℕ].  (weakly-safe-seq(R;n;s)  (¬¬(∃p:ℕweakly-safe-seq(R;n 1;s.p@n))))

Lemma: no-weakly-safe-extensions
[R:ℕ ⟶ ℕ ⟶ ℙ]. ∀[n:ℕ]. ∀[s:ℕn ⟶ ℕ].  ((∀p:ℕweakly-safe-seq(R;n 1;s.p@n)))  weakly-safe-seq(R;n;s)))

Definition: almost-full
AFx,y:T.R[x; y] ==  ∀f:ℕ ⟶ T. (↓∃i,j:ℕ(i < j ∧ R[f i; j]))

Lemma: almost-full_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (AFx,y:T.R[x;y] ∈ ℙ)

Definition: AF-spread-law
AF-spread-law(x,y.R[x; y]) ==  λn,s,x. ((↑isl(x))  (∀i:ℕn. ((↑isl(s i)) ∧ R[outl(s i); outl(x)]))))

Lemma: AF-spread-law_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (AF-spread-law(x,y.R[x;y]) ∈ n:ℕ ⟶ (ℕn ⟶ (T?)) ⟶ (T?) ⟶ ℙ)

Definition: AFbar
AFbar() ==  λn,s. (0 < n ∧ (↑isr(s (n 1))))

Lemma: AFbar_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (AFbar() ∈ n:ℕ ⟶ AF-spread-law(x,y.R[x;y])-consistent-seq(n) ⟶ ℙ)

Lemma: decidable__AFbar
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  ∀n:ℕ. ∀s:AF-spread-law(x,y.R[x;y])-consistent-seq(n).  Dec(AFbar() s)

Lemma: at_AFbar
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  ∀n:ℕ. ∀s:AF-spread-law(x,y.R[x;y])-consistent-seq(n).
    ((AFbar() s)  {a:T| AF-spread-law(x,y.R[x;y]) (inl a)} ))

Lemma: AF-path-barred
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  (AFx,y:T.R[x;y]  (∀alpha:{f:ℕ ⟶ (T?)| ∀x:ℕ(AF-spread-law(x,y.R[x;y]) (f x))} (↓∃m:ℕ(AFbar() alpha))))

Lemma: AF-induction
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  (∀[Q:T ⟶ ℙ]. TI(T;x,y.¬R[x;y];t.Q[t])) supposing 
     (AFx,y:T.R[x;y] and 
     (∀x,y,z:T.  ((¬R[x;y])  R[y;z])  R[x;z]))))

Lemma: AF-uniform-induction
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  (∀[Q:T ⟶ ℙ]. uniform-TI(T;x,y.¬R[x;y];t.Q[t])) supposing 
     (AFx,y:T.R[x;y] and 
     (∀x,y,z:T.  ((¬R[x;y])  R[y;z])  R[x;z]))))

Lemma: AF-induction2
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  (∀[Q:T ⟶ ℙ]. TI(T;x,y.R[x;y];t.Q[t])) supposing (AFx,y:T.¬R[x;y] and (∀x,y,z:T.  (R[x;y]  R[y;z]  R[x;z])))

Lemma: AF-uniform-induction2
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  (∀[Q:T ⟶ ℙ]. uniform-TI(T;x,y.R[x;y];t.Q[t])) supposing 
     (AFx,y:T.¬R[x;y] and 
     (∀x,y,z:T.  (R[x;y]  R[y;z]  R[x;z])))

Lemma: AF-induction3
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  (∀[Q:T ⟶ ℙ]. TI(T;x,y.R[x;y];t.Q[t])) supposing 
     ((∃R':T ⟶ T ⟶ ℙ(AFx,y:T.R'[x;y] ∧ (∀x,y:T.  (R[x;y]  R'[x;y]))))) and 
     (∀x,y,z:T.  (R[x;y]  R[y;z]  R[x;z])))

Lemma: AF-uniform-induction3
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  (∀[Q:T ⟶ ℙ]. uniform-TI(T;x,y.R[x;y];t.Q[t])) supposing 
     ((∃R':T ⟶ T ⟶ ℙ(AFx,y:T.R'[x;y] ∧ (∀x,y:T.  (R[x;y]  R'[x;y]))))) and 
     (∀x,y,z:T.  (R[x;y]  R[y;z]  R[x;z])))

Definition: power-set
P(T) ==  I:Type × (I ⟶ T)

Lemma: power-set_wf
[T:𝕌']. (P(T) ∈ 𝕌')

Definition: set-member
(x ∈ s) ==  let I,f in ∃i:I. (x (f i) ∈ T)

Lemma: set-member_wf
[T:Type]. ∀[s:P(T)]. ∀[x:T].  ((x ∈ s) ∈ ℙ)

Definition: power-set-lift
power-set-lift(T;R) ==  λA,B. ∀x:T. ((x ∈ A)  (∃y:T. ((y ∈ B) ∧ (R y))))

Lemma: power-set-lift_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (power-set-lift(T;R) ∈ P(T) ⟶ P(T) ⟶ ℙ)

Lemma: power-set-lift-well-founded-implies
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  ((∀x:T. (R x))
   (∀f:ℕ ⟶ P(T). (↓∃n:ℕ((power-set-lift(T;R) (f (n 1)) (f n))  (power-set-lift(T;R) (f n) (f (n 1))))))
   AFx,y:T.R[x;y])

Definition: cWO
cWO(T;x,y.R[x; y]) ==  ∀f:ℕ ⟶ T. (↓∃n:ℕR[f n; (n 1)]))

Lemma: cWO_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (cWO(T;x,y.R[x;y]) ∈ ℙ)

Definition: tcWO
The relation x > is transitive, and for any infinite sequence f
there exists i < for which it is not the case that f(i) > f(j).
Thus there are no infinite descending sequences f(0) > f(1) > f(2) ...

This seems to be weaker condition than the condition for well-quasi-order.
If > is total order, then ⌜¬(x > y) ⇐⇒ (x y) ∨ (y > x)⌝.
In that case, letting ⌜x ≤ y⌝ be ⌜(x y) ∨ (y > x)⌝we have
that there exists i < for which  ⌜(f i) ≤ (f j)⌝(and ⌜x ≤ y⌝ is transitive)
so, ⌜x ≤ y⌝ is well-quasi-order.

But, if > is not total order, then this definition does not rule out
and infinite antichain 
(for which for all i<j,  ⌜((f i) > (f j))) ∧ ((f i) (f j))) ∧ ((f j) > (f i)))⌝.
Nevertheless, we can prove, using strong bar induction, that there is an
induction principle for any tcWO relation 
(i.e. transitive, constructively well-ordered relation).

We have the lemma tcWO-induction 
(which can be used to prove by induction
  things that are already known to be propositions)
and there is tactic, woInduction R, that can be used to prove
by induction things that have trivial witness. ⋅

tcWO(T;x,y.>[x; y]) ==  (∀x,y,z:T.  (>[x; y]  >[y; z]  >[x; z])) ∧ (∀f:ℕ ⟶ T. (↓∃i,j:ℕ(i < j ∧ (¬>[f i; j]))))

Lemma: tcWO_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (tcWO(T;x,y.R[x;y]) ∈ ℙ)

Lemma: descending-chain-barred-implies-wellfounded
[T:Type]. ∀[<,B:T ⟶ T ⟶ ℙ].
  ((∀x,y,z:T.  ((x < y)  (y < z)  (x < z)))
   (∀x,y:T.  Dec(x y))
   (∀x,y:T.  ((x y)  (x < y))))
   (∀f:ℕ ⟶ T. (↓∃j:ℕ. ∃i:ℕj. ((f j) (f i))))
   WellFnd{i}(T;x,y.x < y))

Definition: no-descending-chain
no-descending-chain(T;<==  ∀f:ℕ ⟶ T. ∃j:ℕ. ∃i:ℕj. ((f j) < (f i)))

Lemma: no-descending-chain_wf
[T:Type]. ∀[<:T ⟶ T ⟶ ℙ].  (no-descending-chain(T;<) ∈ ℙ)

Lemma: no-descending-chain-implies-wellfounded
[T:Type]. ∀[<:T ⟶ T ⟶ ℙ].
  ((∀x,y,z:T.  ((x < y)  (y < z)  (x < z)))
   (∀x,y:T.  Dec(x < y))
   no-descending-chain(T;<)
   WellFnd{i}(T;x,y.x < y))

Definition: cWO-rel
cWO-rel(R) ==  λn,s,x. ((0 < n ∧ (↑isl(x)))  ((↑isl(s (n 1))) ∧ (R outl(s (n 1)) outl(x))))

Lemma: cWO-rel_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (cWO-rel(R) ∈ n:ℕ ⟶ (ℕn ⟶ (T?)) ⟶ (T?) ⟶ ℙ)

Definition: cWObar
cWObar() ==  λn,s. (0 < n ∧ (↑isr(s (n 1))))

Lemma: cWObar_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (cWObar() ∈ n:ℕ ⟶ cWO-rel(R)-consistent-seq(n) ⟶ ℙ)

Lemma: decidable__cWObar
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  ∀n:ℕ. ∀s:cWO-rel(R)-consistent-seq(n).  Dec(cWObar() s)

Lemma: at_cWObar
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].
  ∀n:ℕ. ∀s:cWO-rel(R)-consistent-seq(n).  ((cWObar() s)  {a:T| cWO-rel(R) (inl a)} ))

Lemma: cWO-rel-path-barred
[T:Type]
  ∀[R:T ⟶ T ⟶ ℙ]
    (∀f:ℕ ⟶ T. (↓∃m:ℕ. ∃n:ℕm. R[f n;f m])))
     (∀alpha:{f:ℕ ⟶ (T?)| ∀x:ℕ(cWO-rel(R) (f x))} (↓∃m:ℕ(cWObar() alpha))) 
    supposing ∀a,b,c:T.  (R[a;b]  R[b;c]  R[a;c]) 
  supposing T

Lemma: cWO-induction_1
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  ∀[Q:T ⟶ ℙ]. TI(T;x,y.R[x;y];t.Q[t]) supposing cWO(T;x,y.R[x;y])

Lemma: cWO-induction_1-ext
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  ∀[Q:T ⟶ ℙ]. TI(T;x,y.R[x;y];t.Q[t]) supposing cWO(T;x,y.R[x;y])

Lemma: tcWO-induction
[T:Type]. ∀[>:T ⟶ T ⟶ ℙ].  ∀[Q:T ⟶ ℙ]. TI(T;x,y.>[x;y];t.Q[t]) supposing tcWO(T;x,y.>[x;y])

Lemma: tcWO-induction-ext
[T:Type]. ∀[>:T ⟶ T ⟶ ℙ].  ∀[Q:T ⟶ ℙ]. TI(T;x,y.>[x;y];t.Q[t]) supposing tcWO(T;x,y.>[x;y])

Definition: Wqo
Wqo(T;x,y.R[x; y]) ==
  (∀f:ℕ ⟶ T. (↓∃i,j:ℕ(i < j ∧ R[f i; j]))) ∧ (∀x:T. R[x; x]) ∧ (∀x,y,z:T.  (R[x; y]  R[y; z]  R[x; z]))

Lemma: Wqo_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ].  (Wqo(T;x,y.R[x;y]) ∈ ℙ)

Definition: wqo-less
wqo-less(T;x,y.R[x; y];bs;as) ==
  ∃a:T. let m,s' bs in let n,s as in (m (n 1) ∈ ℤ) ∧ (s' s.s' n@n ∈ (ℕm ⟶ T)) ∧ (∀i:ℕn. R[s i; s' n]))

Lemma: wqo-less_wf
[T:Type]. ∀[R:T ⟶ T ⟶ ℙ]. ∀[bs,as:n:ℕ × (ℕn ⟶ T)].  (wqo-less(T;x,y.R[x;y];bs;as) ∈ ℙ)

Definition: ccomb
==  λf,x,y. (f x)

Lemma: ccomb_wf
[P,A,B:Type].  (C ∈ (A ⟶ B ⟶ P) ⟶ B ⟶ A ⟶ P)



Home Index