MAYBE
Time: 0.176345
TRS:
 {                active and(X1, X2) -> and(X1, active X2),
                  active and(X1, X2) -> and(active X1, X2),
                 active and(tt(), T) -> mark T,
         active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
              active isNatList nil() -> mark tt(),
        active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                active isNatIList IL -> mark isNatList IL,
           active isNatIList zeros() -> mark tt(),
       active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                    active isNat 0() -> mark tt(),
                    active isNat s N -> mark isNat N,
               active isNat length L -> mark isNatList L,
                          active s X -> s active X,
                     active length X -> length active X,
            active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                      active zeros() -> mark cons(0(), zeros()),
                 active cons(X1, X2) -> cons(active X1, X2),
                 active take(X1, X2) -> take(X1, active X2),
                 active take(X1, X2) -> take(active X1, X2),
                active take(0(), IL) -> mark uTake1 isNatIList IL,
       active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                     active uTake1 X -> uTake1 active X,
                  active uTake1 tt() -> mark nil(),
       active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
       active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
              active uLength(X1, X2) -> uLength(active X1, X2),
             active uLength(tt(), L) -> mark s length L,
                    and(X1, mark X2) -> mark and(X1, X2),
                    and(mark X1, X2) -> mark and(X1, X2),
                   and(ok X1, ok X2) -> ok and(X1, X2),
                      isNatList ok X -> ok isNatList X,
                     isNatIList ok X -> ok isNatIList X,
                          isNat ok X -> ok isNat X,
                            s mark X -> mark s X,
                              s ok X -> ok s X,
                       length mark X -> mark length X,
                         length ok X -> ok length X,
                   cons(mark X1, X2) -> mark cons(X1, X2),
                  cons(ok X1, ok X2) -> ok cons(X1, X2),
                   take(X1, mark X2) -> mark take(X1, X2),
                   take(mark X1, X2) -> mark take(X1, X2),
                  take(ok X1, ok X2) -> ok take(X1, X2),
                       uTake1 mark X -> mark uTake1 X,
                         uTake1 ok X -> ok uTake1 X,
         uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
  uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                uLength(mark X1, X2) -> mark uLength(X1, X2),
               uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                  proper and(X1, X2) -> and(proper X1, proper X2),
                         proper tt() -> ok tt(),
                  proper isNatList X -> isNatList proper X,
                 proper isNatIList X -> isNatIList proper X,
                      proper isNat X -> isNat proper X,
                          proper 0() -> ok 0(),
                          proper s X -> s proper X,
                     proper length X -> length proper X,
                      proper zeros() -> ok zeros(),
                 proper cons(X1, X2) -> cons(proper X1, proper X2),
                        proper nil() -> ok nil(),
                 proper take(X1, X2) -> take(proper X1, proper X2),
                     proper uTake1 X -> uTake1 proper X,
       proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
              proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                          top mark X -> top proper X,
                            top ok X -> top active X}
 DP:
  DP:
   {                active# and(X1, X2) -> active# X1,
                    active# and(X1, X2) -> active# X2,
                    active# and(X1, X2) -> and#(X1, active X2),
                    active# and(X1, X2) -> and#(active X1, X2),
           active# isNatList cons(N, L) -> and#(isNat N, isNatList L),
           active# isNatList cons(N, L) -> isNatList# L,
           active# isNatList cons(N, L) -> isNat# N,
          active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL),
          active# isNatList take(N, IL) -> isNatIList# IL,
          active# isNatList take(N, IL) -> isNat# N,
                  active# isNatIList IL -> isNatList# IL,
         active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL),
         active# isNatIList cons(N, IL) -> isNatIList# IL,
         active# isNatIList cons(N, IL) -> isNat# N,
                      active# isNat s N -> isNat# N,
                 active# isNat length L -> isNatList# L,
                            active# s X -> active# X,
                            active# s X -> s# active X,
                       active# length X -> active# X,
                       active# length X -> length# active X,
              active# length cons(N, L) -> and#(isNat N, isNatList L),
              active# length cons(N, L) -> isNatList# L,
              active# length cons(N, L) -> isNat# N,
              active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L),
                        active# zeros() -> cons#(0(), zeros()),
                   active# cons(X1, X2) -> active# X1,
                   active# cons(X1, X2) -> cons#(active X1, X2),
                   active# take(X1, X2) -> active# X1,
                   active# take(X1, X2) -> active# X2,
                   active# take(X1, X2) -> take#(X1, active X2),
                   active# take(X1, X2) -> take#(active X1, X2),
                  active# take(0(), IL) -> isNatIList# IL,
                  active# take(0(), IL) -> uTake1# isNatIList IL,
         active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL),
         active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)),
         active# take(s M, cons(N, IL)) -> isNatIList# IL,
         active# take(s M, cons(N, IL)) -> isNat# N,
         active# take(s M, cons(N, IL)) -> isNat# M,
         active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                       active# uTake1 X -> active# X,
                       active# uTake1 X -> uTake1# active X,
         active# uTake2(X1, X2, X3, X4) -> active# X1,
         active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4),
         active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)),
         active# uTake2(tt(), M, N, IL) -> take#(M, IL),
                active# uLength(X1, X2) -> active# X1,
                active# uLength(X1, X2) -> uLength#(active X1, X2),
               active# uLength(tt(), L) -> s# length L,
               active# uLength(tt(), L) -> length# L,
                      and#(X1, mark X2) -> and#(X1, X2),
                      and#(mark X1, X2) -> and#(X1, X2),
                     and#(ok X1, ok X2) -> and#(X1, X2),
                        isNatList# ok X -> isNatList# X,
                       isNatIList# ok X -> isNatIList# X,
                            isNat# ok X -> isNat# X,
                              s# mark X -> s# X,
                                s# ok X -> s# X,
                         length# mark X -> length# X,
                           length# ok X -> length# X,
                     cons#(mark X1, X2) -> cons#(X1, X2),
                    cons#(ok X1, ok X2) -> cons#(X1, X2),
                     take#(X1, mark X2) -> take#(X1, X2),
                     take#(mark X1, X2) -> take#(X1, X2),
                    take#(ok X1, ok X2) -> take#(X1, X2),
                         uTake1# mark X -> uTake1# X,
                           uTake1# ok X -> uTake1# X,
           uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4),
    uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4),
                  uLength#(mark X1, X2) -> uLength#(X1, X2),
                 uLength#(ok X1, ok X2) -> uLength#(X1, X2),
                    proper# and(X1, X2) -> and#(proper X1, proper X2),
                    proper# and(X1, X2) -> proper# X1,
                    proper# and(X1, X2) -> proper# X2,
                    proper# isNatList X -> isNatList# proper X,
                    proper# isNatList X -> proper# X,
                   proper# isNatIList X -> isNatIList# proper X,
                   proper# isNatIList X -> proper# X,
                        proper# isNat X -> isNat# proper X,
                        proper# isNat X -> proper# X,
                            proper# s X -> s# proper X,
                            proper# s X -> proper# X,
                       proper# length X -> length# proper X,
                       proper# length X -> proper# X,
                   proper# cons(X1, X2) -> cons#(proper X1, proper X2),
                   proper# cons(X1, X2) -> proper# X1,
                   proper# cons(X1, X2) -> proper# X2,
                   proper# take(X1, X2) -> take#(proper X1, proper X2),
                   proper# take(X1, X2) -> proper# X1,
                   proper# take(X1, X2) -> proper# X2,
                       proper# uTake1 X -> uTake1# proper X,
                       proper# uTake1 X -> proper# X,
         proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4),
         proper# uTake2(X1, X2, X3, X4) -> proper# X1,
         proper# uTake2(X1, X2, X3, X4) -> proper# X2,
         proper# uTake2(X1, X2, X3, X4) -> proper# X3,
         proper# uTake2(X1, X2, X3, X4) -> proper# X4,
                proper# uLength(X1, X2) -> uLength#(proper X1, proper X2),
                proper# uLength(X1, X2) -> proper# X1,
                proper# uLength(X1, X2) -> proper# X2,
                            top# mark X -> proper# X,
                            top# mark X -> top# proper X,
                              top# ok X -> active# X,
                              top# ok X -> top# active X}
  TRS:
  {                active and(X1, X2) -> and(X1, active X2),
                   active and(X1, X2) -> and(active X1, X2),
                  active and(tt(), T) -> mark T,
          active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
               active isNatList nil() -> mark tt(),
         active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                 active isNatIList IL -> mark isNatList IL,
            active isNatIList zeros() -> mark tt(),
        active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNat 0() -> mark tt(),
                     active isNat s N -> mark isNat N,
                active isNat length L -> mark isNatList L,
                           active s X -> s active X,
                      active length X -> length active X,
             active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                       active zeros() -> mark cons(0(), zeros()),
                  active cons(X1, X2) -> cons(active X1, X2),
                  active take(X1, X2) -> take(X1, active X2),
                  active take(X1, X2) -> take(active X1, X2),
                 active take(0(), IL) -> mark uTake1 isNatIList IL,
        active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                      active uTake1 X -> uTake1 active X,
                   active uTake1 tt() -> mark nil(),
        active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
        active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
               active uLength(X1, X2) -> uLength(active X1, X2),
              active uLength(tt(), L) -> mark s length L,
                     and(X1, mark X2) -> mark and(X1, X2),
                     and(mark X1, X2) -> mark and(X1, X2),
                    and(ok X1, ok X2) -> ok and(X1, X2),
                       isNatList ok X -> ok isNatList X,
                      isNatIList ok X -> ok isNatIList X,
                           isNat ok X -> ok isNat X,
                             s mark X -> mark s X,
                               s ok X -> ok s X,
                        length mark X -> mark length X,
                          length ok X -> ok length X,
                    cons(mark X1, X2) -> mark cons(X1, X2),
                   cons(ok X1, ok X2) -> ok cons(X1, X2),
                    take(X1, mark X2) -> mark take(X1, X2),
                    take(mark X1, X2) -> mark take(X1, X2),
                   take(ok X1, ok X2) -> ok take(X1, X2),
                        uTake1 mark X -> mark uTake1 X,
                          uTake1 ok X -> ok uTake1 X,
          uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
   uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                 uLength(mark X1, X2) -> mark uLength(X1, X2),
                uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                   proper and(X1, X2) -> and(proper X1, proper X2),
                          proper tt() -> ok tt(),
                   proper isNatList X -> isNatList proper X,
                  proper isNatIList X -> isNatIList proper X,
                       proper isNat X -> isNat proper X,
                           proper 0() -> ok 0(),
                           proper s X -> s proper X,
                      proper length X -> length proper X,
                       proper zeros() -> ok zeros(),
                  proper cons(X1, X2) -> cons(proper X1, proper X2),
                         proper nil() -> ok nil(),
                  proper take(X1, X2) -> take(proper X1, proper X2),
                      proper uTake1 X -> uTake1 proper X,
        proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
               proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                           top mark X -> top proper X,
                             top ok X -> top active X}
  EDG:
   {
    (active# cons(X1, X2) -> cons#(active X1, X2), cons#(ok X1, ok X2) -> cons#(X1, X2))
    (active# cons(X1, X2) -> cons#(active X1, X2), cons#(mark X1, X2) -> cons#(X1, X2))
    (active# uLength(X1, X2) -> uLength#(active X1, X2), uLength#(ok X1, ok X2) -> uLength#(X1, X2))
    (active# uLength(X1, X2) -> uLength#(active X1, X2), uLength#(mark X1, X2) -> uLength#(X1, X2))
    (and#(mark X1, X2) -> and#(X1, X2), and#(ok X1, ok X2) -> and#(X1, X2))
    (and#(mark X1, X2) -> and#(X1, X2), and#(mark X1, X2) -> and#(X1, X2))
    (and#(mark X1, X2) -> and#(X1, X2), and#(X1, mark X2) -> and#(X1, X2))
    (cons#(mark X1, X2) -> cons#(X1, X2), cons#(ok X1, ok X2) -> cons#(X1, X2))
    (cons#(mark X1, X2) -> cons#(X1, X2), cons#(mark X1, X2) -> cons#(X1, X2))
    (take#(X1, mark X2) -> take#(X1, X2), take#(ok X1, ok X2) -> take#(X1, X2))
    (take#(X1, mark X2) -> take#(X1, X2), take#(mark X1, X2) -> take#(X1, X2))
    (take#(X1, mark X2) -> take#(X1, X2), take#(X1, mark X2) -> take#(X1, X2))
    (take#(ok X1, ok X2) -> take#(X1, X2), take#(ok X1, ok X2) -> take#(X1, X2))
    (take#(ok X1, ok X2) -> take#(X1, X2), take#(mark X1, X2) -> take#(X1, X2))
    (take#(ok X1, ok X2) -> take#(X1, X2), take#(X1, mark X2) -> take#(X1, X2))
    (uLength#(ok X1, ok X2) -> uLength#(X1, X2), uLength#(ok X1, ok X2) -> uLength#(X1, X2))
    (uLength#(ok X1, ok X2) -> uLength#(X1, X2), uLength#(mark X1, X2) -> uLength#(X1, X2))
    (active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)), and#(ok X1, ok X2) -> and#(X1, X2))
    (active# isNatList take(N, IL) -> isNat# N, isNat# ok X -> isNat# X)
    (active# isNat s N -> isNat# N, isNat# ok X -> isNat# X)
    (active# take(s M, cons(N, IL)) -> isNat# N, isNat# ok X -> isNat# X)
    (active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)), cons#(ok X1, ok X2) -> cons#(X1, X2))
    (active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)), cons#(mark X1, X2) -> cons#(X1, X2))
    (active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4), uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4))
    (active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4), uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4))
    (uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4), uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4))
    (uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4), uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4))
    (active# and(X1, X2) -> active# X2, active# uLength(tt(), L) -> length# L)
    (active# and(X1, X2) -> active# X2, active# uLength(tt(), L) -> s# length L)
    (active# and(X1, X2) -> active# X2, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# and(X1, X2) -> active# X2, active# uLength(X1, X2) -> active# X1)
    (active# and(X1, X2) -> active# X2, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# and(X1, X2) -> active# X2, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# and(X1, X2) -> active# X2, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# and(X1, X2) -> active# X2, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# and(X1, X2) -> active# X2, active# uTake1 X -> uTake1# active X)
    (active# and(X1, X2) -> active# X2, active# uTake1 X -> active# X)
    (active# and(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# and(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# and(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# and(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# and(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# and(X1, X2) -> active# X2, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# and(X1, X2) -> active# X2, active# take(0(), IL) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X2, active# take(X1, X2) -> take#(active X1, X2))
    (active# and(X1, X2) -> active# X2, active# take(X1, X2) -> take#(X1, active X2))
    (active# and(X1, X2) -> active# X2, active# take(X1, X2) -> active# X2)
    (active# and(X1, X2) -> active# X2, active# take(X1, X2) -> active# X1)
    (active# and(X1, X2) -> active# X2, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# and(X1, X2) -> active# X2, active# cons(X1, X2) -> active# X1)
    (active# and(X1, X2) -> active# X2, active# zeros() -> cons#(0(), zeros()))
    (active# and(X1, X2) -> active# X2, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# and(X1, X2) -> active# X2, active# length cons(N, L) -> isNat# N)
    (active# and(X1, X2) -> active# X2, active# length cons(N, L) -> isNatList# L)
    (active# and(X1, X2) -> active# X2, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# and(X1, X2) -> active# X2, active# length X -> length# active X)
    (active# and(X1, X2) -> active# X2, active# length X -> active# X)
    (active# and(X1, X2) -> active# X2, active# s X -> s# active X)
    (active# and(X1, X2) -> active# X2, active# s X -> active# X)
    (active# and(X1, X2) -> active# X2, active# isNat length L -> isNatList# L)
    (active# and(X1, X2) -> active# X2, active# isNat s N -> isNat# N)
    (active# and(X1, X2) -> active# X2, active# isNatIList cons(N, IL) -> isNat# N)
    (active# and(X1, X2) -> active# X2, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X2, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# and(X1, X2) -> active# X2, active# isNatIList IL -> isNatList# IL)
    (active# and(X1, X2) -> active# X2, active# isNatList take(N, IL) -> isNat# N)
    (active# and(X1, X2) -> active# X2, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X2, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# and(X1, X2) -> active# X2, active# isNatList cons(N, L) -> isNat# N)
    (active# and(X1, X2) -> active# X2, active# isNatList cons(N, L) -> isNatList# L)
    (active# and(X1, X2) -> active# X2, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# and(X1, X2) -> active# X2, active# and(X1, X2) -> and#(active X1, X2))
    (active# and(X1, X2) -> active# X2, active# and(X1, X2) -> and#(X1, active X2))
    (active# and(X1, X2) -> active# X2, active# and(X1, X2) -> active# X2)
    (active# and(X1, X2) -> active# X2, active# and(X1, X2) -> active# X1)
    (proper# and(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# and(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# and(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# and(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# and(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# and(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# and(X1, X2) -> proper# X2, proper# uTake1 X -> proper# X)
    (proper# and(X1, X2) -> proper# X2, proper# uTake1 X -> uTake1# proper X)
    (proper# and(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X2, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# and(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X2, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# and(X1, X2) -> proper# X2, proper# length X -> proper# X)
    (proper# and(X1, X2) -> proper# X2, proper# length X -> length# proper X)
    (proper# and(X1, X2) -> proper# X2, proper# s X -> proper# X)
    (proper# and(X1, X2) -> proper# X2, proper# s X -> s# proper X)
    (proper# and(X1, X2) -> proper# X2, proper# isNat X -> proper# X)
    (proper# and(X1, X2) -> proper# X2, proper# isNat X -> isNat# proper X)
    (proper# and(X1, X2) -> proper# X2, proper# isNatIList X -> proper# X)
    (proper# and(X1, X2) -> proper# X2, proper# isNatIList X -> isNatIList# proper X)
    (proper# and(X1, X2) -> proper# X2, proper# isNatList X -> proper# X)
    (proper# and(X1, X2) -> proper# X2, proper# isNatList X -> isNatList# proper X)
    (proper# and(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X2, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# take(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# take(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# take(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# take(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# take(X1, X2) -> proper# X2, proper# uTake1 X -> proper# X)
    (proper# take(X1, X2) -> proper# X2, proper# uTake1 X -> uTake1# proper X)
    (proper# take(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X2, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X2, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X2, proper# length X -> proper# X)
    (proper# take(X1, X2) -> proper# X2, proper# length X -> length# proper X)
    (proper# take(X1, X2) -> proper# X2, proper# s X -> proper# X)
    (proper# take(X1, X2) -> proper# X2, proper# s X -> s# proper X)
    (proper# take(X1, X2) -> proper# X2, proper# isNat X -> proper# X)
    (proper# take(X1, X2) -> proper# X2, proper# isNat X -> isNat# proper X)
    (proper# take(X1, X2) -> proper# X2, proper# isNatIList X -> proper# X)
    (proper# take(X1, X2) -> proper# X2, proper# isNatIList X -> isNatIList# proper X)
    (proper# take(X1, X2) -> proper# X2, proper# isNatList X -> proper# X)
    (proper# take(X1, X2) -> proper# X2, proper# isNatList X -> isNatList# proper X)
    (proper# take(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X2, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# uLength(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# uLength(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# uLength(X1, X2) -> proper# X2, proper# uTake1 X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X2, proper# uTake1 X -> uTake1# proper X)
    (proper# uLength(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X2, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X2, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X2, proper# length X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X2, proper# length X -> length# proper X)
    (proper# uLength(X1, X2) -> proper# X2, proper# s X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X2, proper# s X -> s# proper X)
    (proper# uLength(X1, X2) -> proper# X2, proper# isNat X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X2, proper# isNat X -> isNat# proper X)
    (proper# uLength(X1, X2) -> proper# X2, proper# isNatIList X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X2, proper# isNatIList X -> isNatIList# proper X)
    (proper# uLength(X1, X2) -> proper# X2, proper# isNatList X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X2, proper# isNatList X -> isNatList# proper X)
    (proper# uLength(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X2, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (active# s X -> s# active X, s# ok X -> s# X)
    (active# s X -> s# active X, s# mark X -> s# X)
    (active# uTake1 X -> uTake1# active X, uTake1# ok X -> uTake1# X)
    (active# uTake1 X -> uTake1# active X, uTake1# mark X -> uTake1# X)
    (proper# isNatIList X -> isNatIList# proper X, isNatIList# ok X -> isNatIList# X)
    (proper# s X -> s# proper X, s# ok X -> s# X)
    (proper# s X -> s# proper X, s# mark X -> s# X)
    (proper# uTake1 X -> uTake1# proper X, uTake1# ok X -> uTake1# X)
    (proper# uTake1 X -> uTake1# proper X, uTake1# mark X -> uTake1# X)
    (top# ok X -> top# active X, top# ok X -> top# active X)
    (top# ok X -> top# active X, top# ok X -> active# X)
    (top# ok X -> top# active X, top# mark X -> top# proper X)
    (top# ok X -> top# active X, top# mark X -> proper# X)
    (active# take(0(), IL) -> uTake1# isNatIList IL, uTake1# ok X -> uTake1# X)
    (active# isNatList take(N, IL) -> isNatIList# IL, isNatIList# ok X -> isNatIList# X)
    (active# isNatIList cons(N, IL) -> isNatIList# IL, isNatIList# ok X -> isNatIList# X)
    (active# take(s M, cons(N, IL)) -> isNatIList# IL, isNatIList# ok X -> isNatIList# X)
    (active# isNat length L -> isNatList# L, isNatList# ok X -> isNatList# X)
    (active# uLength(tt(), L) -> length# L, length# ok X -> length# X)
    (active# uLength(tt(), L) -> length# L, length# mark X -> length# X)
    (active# cons(X1, X2) -> active# X1, active# uLength(tt(), L) -> length# L)
    (active# cons(X1, X2) -> active# X1, active# uLength(tt(), L) -> s# length L)
    (active# cons(X1, X2) -> active# X1, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# cons(X1, X2) -> active# X1, active# uLength(X1, X2) -> active# X1)
    (active# cons(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# cons(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# cons(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# cons(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# cons(X1, X2) -> active# X1, active# uTake1 X -> uTake1# active X)
    (active# cons(X1, X2) -> active# X1, active# uTake1 X -> active# X)
    (active# cons(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# cons(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# cons(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# cons(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# cons(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# cons(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# cons(X1, X2) -> active# X1, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# cons(X1, X2) -> active# X1, active# take(0(), IL) -> isNatIList# IL)
    (active# cons(X1, X2) -> active# X1, active# take(X1, X2) -> take#(active X1, X2))
    (active# cons(X1, X2) -> active# X1, active# take(X1, X2) -> take#(X1, active X2))
    (active# cons(X1, X2) -> active# X1, active# take(X1, X2) -> active# X2)
    (active# cons(X1, X2) -> active# X1, active# take(X1, X2) -> active# X1)
    (active# cons(X1, X2) -> active# X1, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# cons(X1, X2) -> active# X1, active# cons(X1, X2) -> active# X1)
    (active# cons(X1, X2) -> active# X1, active# zeros() -> cons#(0(), zeros()))
    (active# cons(X1, X2) -> active# X1, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# cons(X1, X2) -> active# X1, active# length cons(N, L) -> isNat# N)
    (active# cons(X1, X2) -> active# X1, active# length cons(N, L) -> isNatList# L)
    (active# cons(X1, X2) -> active# X1, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# cons(X1, X2) -> active# X1, active# length X -> length# active X)
    (active# cons(X1, X2) -> active# X1, active# length X -> active# X)
    (active# cons(X1, X2) -> active# X1, active# s X -> s# active X)
    (active# cons(X1, X2) -> active# X1, active# s X -> active# X)
    (active# cons(X1, X2) -> active# X1, active# isNat length L -> isNatList# L)
    (active# cons(X1, X2) -> active# X1, active# isNat s N -> isNat# N)
    (active# cons(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNat# N)
    (active# cons(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# cons(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# cons(X1, X2) -> active# X1, active# isNatIList IL -> isNatList# IL)
    (active# cons(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNat# N)
    (active# cons(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# cons(X1, X2) -> active# X1, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# cons(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNat# N)
    (active# cons(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNatList# L)
    (active# cons(X1, X2) -> active# X1, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# cons(X1, X2) -> active# X1, active# and(X1, X2) -> and#(active X1, X2))
    (active# cons(X1, X2) -> active# X1, active# and(X1, X2) -> and#(X1, active X2))
    (active# cons(X1, X2) -> active# X1, active# and(X1, X2) -> active# X2)
    (active# cons(X1, X2) -> active# X1, active# and(X1, X2) -> active# X1)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uLength(tt(), L) -> length# L)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uLength(tt(), L) -> s# length L)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uLength(X1, X2) -> active# X1)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uTake1 X -> uTake1# active X)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# uTake1 X -> active# X)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(0(), IL) -> isNatIList# IL)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(X1, X2) -> take#(active X1, X2))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(X1, X2) -> take#(X1, active X2))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(X1, X2) -> active# X2)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# take(X1, X2) -> active# X1)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# cons(X1, X2) -> active# X1)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# zeros() -> cons#(0(), zeros()))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# length cons(N, L) -> isNat# N)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# length cons(N, L) -> isNatList# L)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# length X -> length# active X)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# length X -> active# X)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# s X -> s# active X)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# s X -> active# X)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNat length L -> isNatList# L)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNat s N -> isNat# N)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatIList cons(N, IL) -> isNat# N)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatIList IL -> isNatList# IL)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatList take(N, IL) -> isNat# N)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatList cons(N, L) -> isNat# N)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatList cons(N, L) -> isNatList# L)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# and(X1, X2) -> and#(active X1, X2))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# and(X1, X2) -> and#(X1, active X2))
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# and(X1, X2) -> active# X2)
    (active# uTake2(X1, X2, X3, X4) -> active# X1, active# and(X1, X2) -> active# X1)
    (proper# and(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# and(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# and(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# and(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# and(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# and(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# and(X1, X2) -> proper# X1, proper# uTake1 X -> proper# X)
    (proper# and(X1, X2) -> proper# X1, proper# uTake1 X -> uTake1# proper X)
    (proper# and(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X1, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# and(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X1, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# and(X1, X2) -> proper# X1, proper# length X -> proper# X)
    (proper# and(X1, X2) -> proper# X1, proper# length X -> length# proper X)
    (proper# and(X1, X2) -> proper# X1, proper# s X -> proper# X)
    (proper# and(X1, X2) -> proper# X1, proper# s X -> s# proper X)
    (proper# and(X1, X2) -> proper# X1, proper# isNat X -> proper# X)
    (proper# and(X1, X2) -> proper# X1, proper# isNat X -> isNat# proper X)
    (proper# and(X1, X2) -> proper# X1, proper# isNatIList X -> proper# X)
    (proper# and(X1, X2) -> proper# X1, proper# isNatIList X -> isNatIList# proper X)
    (proper# and(X1, X2) -> proper# X1, proper# isNatList X -> proper# X)
    (proper# and(X1, X2) -> proper# X1, proper# isNatList X -> isNatList# proper X)
    (proper# and(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X2)
    (proper# and(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X1)
    (proper# and(X1, X2) -> proper# X1, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# take(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# take(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# take(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# take(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# take(X1, X2) -> proper# X1, proper# uTake1 X -> proper# X)
    (proper# take(X1, X2) -> proper# X1, proper# uTake1 X -> uTake1# proper X)
    (proper# take(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X1, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X1, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# take(X1, X2) -> proper# X1, proper# length X -> proper# X)
    (proper# take(X1, X2) -> proper# X1, proper# length X -> length# proper X)
    (proper# take(X1, X2) -> proper# X1, proper# s X -> proper# X)
    (proper# take(X1, X2) -> proper# X1, proper# s X -> s# proper X)
    (proper# take(X1, X2) -> proper# X1, proper# isNat X -> proper# X)
    (proper# take(X1, X2) -> proper# X1, proper# isNat X -> isNat# proper X)
    (proper# take(X1, X2) -> proper# X1, proper# isNatIList X -> proper# X)
    (proper# take(X1, X2) -> proper# X1, proper# isNatIList X -> isNatIList# proper X)
    (proper# take(X1, X2) -> proper# X1, proper# isNatList X -> proper# X)
    (proper# take(X1, X2) -> proper# X1, proper# isNatList X -> isNatList# proper X)
    (proper# take(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X2)
    (proper# take(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X1)
    (proper# take(X1, X2) -> proper# X1, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# uLength(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# uLength(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# uLength(X1, X2) -> proper# X1, proper# uTake1 X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X1, proper# uTake1 X -> uTake1# proper X)
    (proper# uLength(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X1, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X1, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# uLength(X1, X2) -> proper# X1, proper# length X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X1, proper# length X -> length# proper X)
    (proper# uLength(X1, X2) -> proper# X1, proper# s X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X1, proper# s X -> s# proper X)
    (proper# uLength(X1, X2) -> proper# X1, proper# isNat X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X1, proper# isNat X -> isNat# proper X)
    (proper# uLength(X1, X2) -> proper# X1, proper# isNatIList X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X1, proper# isNatIList X -> isNatIList# proper X)
    (proper# uLength(X1, X2) -> proper# X1, proper# isNatList X -> proper# X)
    (proper# uLength(X1, X2) -> proper# X1, proper# isNatList X -> isNatList# proper X)
    (proper# uLength(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X2)
    (proper# uLength(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X1)
    (proper# uLength(X1, X2) -> proper# X1, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (active# isNatList cons(N, L) -> and#(isNat N, isNatList L), and#(ok X1, ok X2) -> and#(X1, X2))
    (active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL), and#(ok X1, ok X2) -> and#(X1, X2))
    (active# take(X1, X2) -> take#(X1, active X2), take#(ok X1, ok X2) -> take#(X1, X2))
    (active# take(X1, X2) -> take#(X1, active X2), take#(mark X1, X2) -> take#(X1, X2))
    (active# take(X1, X2) -> take#(X1, active X2), take#(X1, mark X2) -> take#(X1, X2))
    (proper# and(X1, X2) -> and#(proper X1, proper X2), and#(ok X1, ok X2) -> and#(X1, X2))
    (proper# and(X1, X2) -> and#(proper X1, proper X2), and#(mark X1, X2) -> and#(X1, X2))
    (proper# and(X1, X2) -> and#(proper X1, proper X2), and#(X1, mark X2) -> and#(X1, X2))
    (proper# take(X1, X2) -> take#(proper X1, proper X2), take#(ok X1, ok X2) -> take#(X1, X2))
    (proper# take(X1, X2) -> take#(proper X1, proper X2), take#(mark X1, X2) -> take#(X1, X2))
    (proper# take(X1, X2) -> take#(proper X1, proper X2), take#(X1, mark X2) -> take#(X1, X2))
    (active# uTake2(tt(), M, N, IL) -> take#(M, IL), take#(ok X1, ok X2) -> take#(X1, X2))
    (active# uTake2(tt(), M, N, IL) -> take#(M, IL), take#(mark X1, X2) -> take#(X1, X2))
    (active# uTake2(tt(), M, N, IL) -> take#(M, IL), take#(X1, mark X2) -> take#(X1, X2))
    (active# length X -> active# X, active# uLength(tt(), L) -> length# L)
    (active# length X -> active# X, active# uLength(tt(), L) -> s# length L)
    (active# length X -> active# X, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# length X -> active# X, active# uLength(X1, X2) -> active# X1)
    (active# length X -> active# X, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# length X -> active# X, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# length X -> active# X, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# length X -> active# X, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# length X -> active# X, active# uTake1 X -> uTake1# active X)
    (active# length X -> active# X, active# uTake1 X -> active# X)
    (active# length X -> active# X, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# length X -> active# X, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# length X -> active# X, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# length X -> active# X, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# length X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# length X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# length X -> active# X, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# length X -> active# X, active# take(0(), IL) -> isNatIList# IL)
    (active# length X -> active# X, active# take(X1, X2) -> take#(active X1, X2))
    (active# length X -> active# X, active# take(X1, X2) -> take#(X1, active X2))
    (active# length X -> active# X, active# take(X1, X2) -> active# X2)
    (active# length X -> active# X, active# take(X1, X2) -> active# X1)
    (active# length X -> active# X, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# length X -> active# X, active# cons(X1, X2) -> active# X1)
    (active# length X -> active# X, active# zeros() -> cons#(0(), zeros()))
    (active# length X -> active# X, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# length X -> active# X, active# length cons(N, L) -> isNat# N)
    (active# length X -> active# X, active# length cons(N, L) -> isNatList# L)
    (active# length X -> active# X, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# length X -> active# X, active# length X -> length# active X)
    (active# length X -> active# X, active# length X -> active# X)
    (active# length X -> active# X, active# s X -> s# active X)
    (active# length X -> active# X, active# s X -> active# X)
    (active# length X -> active# X, active# isNat length L -> isNatList# L)
    (active# length X -> active# X, active# isNat s N -> isNat# N)
    (active# length X -> active# X, active# isNatIList cons(N, IL) -> isNat# N)
    (active# length X -> active# X, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# length X -> active# X, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# length X -> active# X, active# isNatIList IL -> isNatList# IL)
    (active# length X -> active# X, active# isNatList take(N, IL) -> isNat# N)
    (active# length X -> active# X, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# length X -> active# X, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# length X -> active# X, active# isNatList cons(N, L) -> isNat# N)
    (active# length X -> active# X, active# isNatList cons(N, L) -> isNatList# L)
    (active# length X -> active# X, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# length X -> active# X, active# and(X1, X2) -> and#(active X1, X2))
    (active# length X -> active# X, active# and(X1, X2) -> and#(X1, active X2))
    (active# length X -> active# X, active# and(X1, X2) -> active# X2)
    (active# length X -> active# X, active# and(X1, X2) -> active# X1)
    (isNatList# ok X -> isNatList# X, isNatList# ok X -> isNatList# X)
    (isNat# ok X -> isNat# X, isNat# ok X -> isNat# X)
    (s# ok X -> s# X, s# ok X -> s# X)
    (s# ok X -> s# X, s# mark X -> s# X)
    (length# ok X -> length# X, length# ok X -> length# X)
    (length# ok X -> length# X, length# mark X -> length# X)
    (uTake1# ok X -> uTake1# X, uTake1# ok X -> uTake1# X)
    (uTake1# ok X -> uTake1# X, uTake1# mark X -> uTake1# X)
    (proper# isNatIList X -> proper# X, proper# uLength(X1, X2) -> proper# X2)
    (proper# isNatIList X -> proper# X, proper# uLength(X1, X2) -> proper# X1)
    (proper# isNatIList X -> proper# X, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# isNatIList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# isNatIList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# isNatIList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# isNatIList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# isNatIList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# isNatIList X -> proper# X, proper# uTake1 X -> proper# X)
    (proper# isNatIList X -> proper# X, proper# uTake1 X -> uTake1# proper X)
    (proper# isNatIList X -> proper# X, proper# take(X1, X2) -> proper# X2)
    (proper# isNatIList X -> proper# X, proper# take(X1, X2) -> proper# X1)
    (proper# isNatIList X -> proper# X, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# isNatIList X -> proper# X, proper# cons(X1, X2) -> proper# X2)
    (proper# isNatIList X -> proper# X, proper# cons(X1, X2) -> proper# X1)
    (proper# isNatIList X -> proper# X, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# isNatIList X -> proper# X, proper# length X -> proper# X)
    (proper# isNatIList X -> proper# X, proper# length X -> length# proper X)
    (proper# isNatIList X -> proper# X, proper# s X -> proper# X)
    (proper# isNatIList X -> proper# X, proper# s X -> s# proper X)
    (proper# isNatIList X -> proper# X, proper# isNat X -> proper# X)
    (proper# isNatIList X -> proper# X, proper# isNat X -> isNat# proper X)
    (proper# isNatIList X -> proper# X, proper# isNatIList X -> proper# X)
    (proper# isNatIList X -> proper# X, proper# isNatIList X -> isNatIList# proper X)
    (proper# isNatIList X -> proper# X, proper# isNatList X -> proper# X)
    (proper# isNatIList X -> proper# X, proper# isNatList X -> isNatList# proper X)
    (proper# isNatIList X -> proper# X, proper# and(X1, X2) -> proper# X2)
    (proper# isNatIList X -> proper# X, proper# and(X1, X2) -> proper# X1)
    (proper# isNatIList X -> proper# X, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# s X -> proper# X, proper# uLength(X1, X2) -> proper# X2)
    (proper# s X -> proper# X, proper# uLength(X1, X2) -> proper# X1)
    (proper# s X -> proper# X, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# s X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# s X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# s X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# s X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# s X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# s X -> proper# X, proper# uTake1 X -> proper# X)
    (proper# s X -> proper# X, proper# uTake1 X -> uTake1# proper X)
    (proper# s X -> proper# X, proper# take(X1, X2) -> proper# X2)
    (proper# s X -> proper# X, proper# take(X1, X2) -> proper# X1)
    (proper# s X -> proper# X, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# s X -> proper# X, proper# cons(X1, X2) -> proper# X2)
    (proper# s X -> proper# X, proper# cons(X1, X2) -> proper# X1)
    (proper# s X -> proper# X, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# s X -> proper# X, proper# length X -> proper# X)
    (proper# s X -> proper# X, proper# length X -> length# proper X)
    (proper# s X -> proper# X, proper# s X -> proper# X)
    (proper# s X -> proper# X, proper# s X -> s# proper X)
    (proper# s X -> proper# X, proper# isNat X -> proper# X)
    (proper# s X -> proper# X, proper# isNat X -> isNat# proper X)
    (proper# s X -> proper# X, proper# isNatIList X -> proper# X)
    (proper# s X -> proper# X, proper# isNatIList X -> isNatIList# proper X)
    (proper# s X -> proper# X, proper# isNatList X -> proper# X)
    (proper# s X -> proper# X, proper# isNatList X -> isNatList# proper X)
    (proper# s X -> proper# X, proper# and(X1, X2) -> proper# X2)
    (proper# s X -> proper# X, proper# and(X1, X2) -> proper# X1)
    (proper# s X -> proper# X, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# uTake1 X -> proper# X, proper# uLength(X1, X2) -> proper# X2)
    (proper# uTake1 X -> proper# X, proper# uLength(X1, X2) -> proper# X1)
    (proper# uTake1 X -> proper# X, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# uTake1 X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# uTake1 X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# uTake1 X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# uTake1 X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# uTake1 X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# uTake1 X -> proper# X, proper# uTake1 X -> proper# X)
    (proper# uTake1 X -> proper# X, proper# uTake1 X -> uTake1# proper X)
    (proper# uTake1 X -> proper# X, proper# take(X1, X2) -> proper# X2)
    (proper# uTake1 X -> proper# X, proper# take(X1, X2) -> proper# X1)
    (proper# uTake1 X -> proper# X, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# uTake1 X -> proper# X, proper# cons(X1, X2) -> proper# X2)
    (proper# uTake1 X -> proper# X, proper# cons(X1, X2) -> proper# X1)
    (proper# uTake1 X -> proper# X, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# uTake1 X -> proper# X, proper# length X -> proper# X)
    (proper# uTake1 X -> proper# X, proper# length X -> length# proper X)
    (proper# uTake1 X -> proper# X, proper# s X -> proper# X)
    (proper# uTake1 X -> proper# X, proper# s X -> s# proper X)
    (proper# uTake1 X -> proper# X, proper# isNat X -> proper# X)
    (proper# uTake1 X -> proper# X, proper# isNat X -> isNat# proper X)
    (proper# uTake1 X -> proper# X, proper# isNatIList X -> proper# X)
    (proper# uTake1 X -> proper# X, proper# isNatIList X -> isNatIList# proper X)
    (proper# uTake1 X -> proper# X, proper# isNatList X -> proper# X)
    (proper# uTake1 X -> proper# X, proper# isNatList X -> isNatList# proper X)
    (proper# uTake1 X -> proper# X, proper# and(X1, X2) -> proper# X2)
    (proper# uTake1 X -> proper# X, proper# and(X1, X2) -> proper# X1)
    (proper# uTake1 X -> proper# X, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (top# ok X -> active# X, active# uLength(tt(), L) -> length# L)
    (top# ok X -> active# X, active# uLength(tt(), L) -> s# length L)
    (top# ok X -> active# X, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (top# ok X -> active# X, active# uLength(X1, X2) -> active# X1)
    (top# ok X -> active# X, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (top# ok X -> active# X, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (top# ok X -> active# X, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (top# ok X -> active# X, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (top# ok X -> active# X, active# uTake1 X -> uTake1# active X)
    (top# ok X -> active# X, active# uTake1 X -> active# X)
    (top# ok X -> active# X, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (top# ok X -> active# X, active# take(s M, cons(N, IL)) -> isNat# M)
    (top# ok X -> active# X, active# take(s M, cons(N, IL)) -> isNat# N)
    (top# ok X -> active# X, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (top# ok X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (top# ok X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (top# ok X -> active# X, active# take(0(), IL) -> uTake1# isNatIList IL)
    (top# ok X -> active# X, active# take(0(), IL) -> isNatIList# IL)
    (top# ok X -> active# X, active# take(X1, X2) -> take#(active X1, X2))
    (top# ok X -> active# X, active# take(X1, X2) -> take#(X1, active X2))
    (top# ok X -> active# X, active# take(X1, X2) -> active# X2)
    (top# ok X -> active# X, active# take(X1, X2) -> active# X1)
    (top# ok X -> active# X, active# cons(X1, X2) -> cons#(active X1, X2))
    (top# ok X -> active# X, active# cons(X1, X2) -> active# X1)
    (top# ok X -> active# X, active# zeros() -> cons#(0(), zeros()))
    (top# ok X -> active# X, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (top# ok X -> active# X, active# length cons(N, L) -> isNat# N)
    (top# ok X -> active# X, active# length cons(N, L) -> isNatList# L)
    (top# ok X -> active# X, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (top# ok X -> active# X, active# length X -> length# active X)
    (top# ok X -> active# X, active# length X -> active# X)
    (top# ok X -> active# X, active# s X -> s# active X)
    (top# ok X -> active# X, active# s X -> active# X)
    (top# ok X -> active# X, active# isNat length L -> isNatList# L)
    (top# ok X -> active# X, active# isNat s N -> isNat# N)
    (top# ok X -> active# X, active# isNatIList cons(N, IL) -> isNat# N)
    (top# ok X -> active# X, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (top# ok X -> active# X, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (top# ok X -> active# X, active# isNatIList IL -> isNatList# IL)
    (top# ok X -> active# X, active# isNatList take(N, IL) -> isNat# N)
    (top# ok X -> active# X, active# isNatList take(N, IL) -> isNatIList# IL)
    (top# ok X -> active# X, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (top# ok X -> active# X, active# isNatList cons(N, L) -> isNat# N)
    (top# ok X -> active# X, active# isNatList cons(N, L) -> isNatList# L)
    (top# ok X -> active# X, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (top# ok X -> active# X, active# and(X1, X2) -> and#(active X1, X2))
    (top# ok X -> active# X, active# and(X1, X2) -> and#(X1, active X2))
    (top# ok X -> active# X, active# and(X1, X2) -> active# X2)
    (top# ok X -> active# X, active# and(X1, X2) -> active# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# and(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# and(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# isNatList X -> isNatList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# isNatList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# isNatIList X -> isNatIList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# isNatIList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# isNat X -> isNat# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# isNat X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# s X -> s# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# s X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# length X -> length# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# length X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# cons(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# cons(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# take(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# take(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uTake1 X -> uTake1# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uTake1 X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uLength(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X4, proper# uLength(X1, X2) -> proper# X2)
    (top# mark X -> proper# X, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (top# mark X -> proper# X, proper# and(X1, X2) -> proper# X1)
    (top# mark X -> proper# X, proper# and(X1, X2) -> proper# X2)
    (top# mark X -> proper# X, proper# isNatList X -> isNatList# proper X)
    (top# mark X -> proper# X, proper# isNatList X -> proper# X)
    (top# mark X -> proper# X, proper# isNatIList X -> isNatIList# proper X)
    (top# mark X -> proper# X, proper# isNatIList X -> proper# X)
    (top# mark X -> proper# X, proper# isNat X -> isNat# proper X)
    (top# mark X -> proper# X, proper# isNat X -> proper# X)
    (top# mark X -> proper# X, proper# s X -> s# proper X)
    (top# mark X -> proper# X, proper# s X -> proper# X)
    (top# mark X -> proper# X, proper# length X -> length# proper X)
    (top# mark X -> proper# X, proper# length X -> proper# X)
    (top# mark X -> proper# X, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (top# mark X -> proper# X, proper# cons(X1, X2) -> proper# X1)
    (top# mark X -> proper# X, proper# cons(X1, X2) -> proper# X2)
    (top# mark X -> proper# X, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (top# mark X -> proper# X, proper# take(X1, X2) -> proper# X1)
    (top# mark X -> proper# X, proper# take(X1, X2) -> proper# X2)
    (top# mark X -> proper# X, proper# uTake1 X -> uTake1# proper X)
    (top# mark X -> proper# X, proper# uTake1 X -> proper# X)
    (top# mark X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (top# mark X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (top# mark X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (top# mark X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (top# mark X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (top# mark X -> proper# X, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (top# mark X -> proper# X, proper# uLength(X1, X2) -> proper# X1)
    (top# mark X -> proper# X, proper# uLength(X1, X2) -> proper# X2)
    (proper# length X -> proper# X, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# length X -> proper# X, proper# and(X1, X2) -> proper# X1)
    (proper# length X -> proper# X, proper# and(X1, X2) -> proper# X2)
    (proper# length X -> proper# X, proper# isNatList X -> isNatList# proper X)
    (proper# length X -> proper# X, proper# isNatList X -> proper# X)
    (proper# length X -> proper# X, proper# isNatIList X -> isNatIList# proper X)
    (proper# length X -> proper# X, proper# isNatIList X -> proper# X)
    (proper# length X -> proper# X, proper# isNat X -> isNat# proper X)
    (proper# length X -> proper# X, proper# isNat X -> proper# X)
    (proper# length X -> proper# X, proper# s X -> s# proper X)
    (proper# length X -> proper# X, proper# s X -> proper# X)
    (proper# length X -> proper# X, proper# length X -> length# proper X)
    (proper# length X -> proper# X, proper# length X -> proper# X)
    (proper# length X -> proper# X, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# length X -> proper# X, proper# cons(X1, X2) -> proper# X1)
    (proper# length X -> proper# X, proper# cons(X1, X2) -> proper# X2)
    (proper# length X -> proper# X, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# length X -> proper# X, proper# take(X1, X2) -> proper# X1)
    (proper# length X -> proper# X, proper# take(X1, X2) -> proper# X2)
    (proper# length X -> proper# X, proper# uTake1 X -> uTake1# proper X)
    (proper# length X -> proper# X, proper# uTake1 X -> proper# X)
    (proper# length X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# length X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# length X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# length X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# length X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# length X -> proper# X, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# length X -> proper# X, proper# uLength(X1, X2) -> proper# X1)
    (proper# length X -> proper# X, proper# uLength(X1, X2) -> proper# X2)
    (proper# isNat X -> proper# X, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# isNat X -> proper# X, proper# and(X1, X2) -> proper# X1)
    (proper# isNat X -> proper# X, proper# and(X1, X2) -> proper# X2)
    (proper# isNat X -> proper# X, proper# isNatList X -> isNatList# proper X)
    (proper# isNat X -> proper# X, proper# isNatList X -> proper# X)
    (proper# isNat X -> proper# X, proper# isNatIList X -> isNatIList# proper X)
    (proper# isNat X -> proper# X, proper# isNatIList X -> proper# X)
    (proper# isNat X -> proper# X, proper# isNat X -> isNat# proper X)
    (proper# isNat X -> proper# X, proper# isNat X -> proper# X)
    (proper# isNat X -> proper# X, proper# s X -> s# proper X)
    (proper# isNat X -> proper# X, proper# s X -> proper# X)
    (proper# isNat X -> proper# X, proper# length X -> length# proper X)
    (proper# isNat X -> proper# X, proper# length X -> proper# X)
    (proper# isNat X -> proper# X, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# isNat X -> proper# X, proper# cons(X1, X2) -> proper# X1)
    (proper# isNat X -> proper# X, proper# cons(X1, X2) -> proper# X2)
    (proper# isNat X -> proper# X, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# isNat X -> proper# X, proper# take(X1, X2) -> proper# X1)
    (proper# isNat X -> proper# X, proper# take(X1, X2) -> proper# X2)
    (proper# isNat X -> proper# X, proper# uTake1 X -> uTake1# proper X)
    (proper# isNat X -> proper# X, proper# uTake1 X -> proper# X)
    (proper# isNat X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# isNat X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# isNat X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# isNat X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# isNat X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# isNat X -> proper# X, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# isNat X -> proper# X, proper# uLength(X1, X2) -> proper# X1)
    (proper# isNat X -> proper# X, proper# uLength(X1, X2) -> proper# X2)
    (proper# isNatList X -> proper# X, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# isNatList X -> proper# X, proper# and(X1, X2) -> proper# X1)
    (proper# isNatList X -> proper# X, proper# and(X1, X2) -> proper# X2)
    (proper# isNatList X -> proper# X, proper# isNatList X -> isNatList# proper X)
    (proper# isNatList X -> proper# X, proper# isNatList X -> proper# X)
    (proper# isNatList X -> proper# X, proper# isNatIList X -> isNatIList# proper X)
    (proper# isNatList X -> proper# X, proper# isNatIList X -> proper# X)
    (proper# isNatList X -> proper# X, proper# isNat X -> isNat# proper X)
    (proper# isNatList X -> proper# X, proper# isNat X -> proper# X)
    (proper# isNatList X -> proper# X, proper# s X -> s# proper X)
    (proper# isNatList X -> proper# X, proper# s X -> proper# X)
    (proper# isNatList X -> proper# X, proper# length X -> length# proper X)
    (proper# isNatList X -> proper# X, proper# length X -> proper# X)
    (proper# isNatList X -> proper# X, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# isNatList X -> proper# X, proper# cons(X1, X2) -> proper# X1)
    (proper# isNatList X -> proper# X, proper# cons(X1, X2) -> proper# X2)
    (proper# isNatList X -> proper# X, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# isNatList X -> proper# X, proper# take(X1, X2) -> proper# X1)
    (proper# isNatList X -> proper# X, proper# take(X1, X2) -> proper# X2)
    (proper# isNatList X -> proper# X, proper# uTake1 X -> uTake1# proper X)
    (proper# isNatList X -> proper# X, proper# uTake1 X -> proper# X)
    (proper# isNatList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# isNatList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# isNatList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# isNatList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# isNatList X -> proper# X, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# isNatList X -> proper# X, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# isNatList X -> proper# X, proper# uLength(X1, X2) -> proper# X1)
    (proper# isNatList X -> proper# X, proper# uLength(X1, X2) -> proper# X2)
    (uTake1# mark X -> uTake1# X, uTake1# mark X -> uTake1# X)
    (uTake1# mark X -> uTake1# X, uTake1# ok X -> uTake1# X)
    (length# mark X -> length# X, length# mark X -> length# X)
    (length# mark X -> length# X, length# ok X -> length# X)
    (s# mark X -> s# X, s# mark X -> s# X)
    (s# mark X -> s# X, s# ok X -> s# X)
    (isNatIList# ok X -> isNatIList# X, isNatIList# ok X -> isNatIList# X)
    (active# uTake1 X -> active# X, active# and(X1, X2) -> active# X1)
    (active# uTake1 X -> active# X, active# and(X1, X2) -> active# X2)
    (active# uTake1 X -> active# X, active# and(X1, X2) -> and#(X1, active X2))
    (active# uTake1 X -> active# X, active# and(X1, X2) -> and#(active X1, X2))
    (active# uTake1 X -> active# X, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# uTake1 X -> active# X, active# isNatList cons(N, L) -> isNatList# L)
    (active# uTake1 X -> active# X, active# isNatList cons(N, L) -> isNat# N)
    (active# uTake1 X -> active# X, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# uTake1 X -> active# X, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# uTake1 X -> active# X, active# isNatList take(N, IL) -> isNat# N)
    (active# uTake1 X -> active# X, active# isNatIList IL -> isNatList# IL)
    (active# uTake1 X -> active# X, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# uTake1 X -> active# X, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# uTake1 X -> active# X, active# isNatIList cons(N, IL) -> isNat# N)
    (active# uTake1 X -> active# X, active# isNat s N -> isNat# N)
    (active# uTake1 X -> active# X, active# isNat length L -> isNatList# L)
    (active# uTake1 X -> active# X, active# s X -> active# X)
    (active# uTake1 X -> active# X, active# s X -> s# active X)
    (active# uTake1 X -> active# X, active# length X -> active# X)
    (active# uTake1 X -> active# X, active# length X -> length# active X)
    (active# uTake1 X -> active# X, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# uTake1 X -> active# X, active# length cons(N, L) -> isNatList# L)
    (active# uTake1 X -> active# X, active# length cons(N, L) -> isNat# N)
    (active# uTake1 X -> active# X, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# uTake1 X -> active# X, active# zeros() -> cons#(0(), zeros()))
    (active# uTake1 X -> active# X, active# cons(X1, X2) -> active# X1)
    (active# uTake1 X -> active# X, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# uTake1 X -> active# X, active# take(X1, X2) -> active# X1)
    (active# uTake1 X -> active# X, active# take(X1, X2) -> active# X2)
    (active# uTake1 X -> active# X, active# take(X1, X2) -> take#(X1, active X2))
    (active# uTake1 X -> active# X, active# take(X1, X2) -> take#(active X1, X2))
    (active# uTake1 X -> active# X, active# take(0(), IL) -> isNatIList# IL)
    (active# uTake1 X -> active# X, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# uTake1 X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# uTake1 X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# uTake1 X -> active# X, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# uTake1 X -> active# X, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# uTake1 X -> active# X, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# uTake1 X -> active# X, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# uTake1 X -> active# X, active# uTake1 X -> active# X)
    (active# uTake1 X -> active# X, active# uTake1 X -> uTake1# active X)
    (active# uTake1 X -> active# X, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# uTake1 X -> active# X, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# uTake1 X -> active# X, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# uTake1 X -> active# X, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# uTake1 X -> active# X, active# uLength(X1, X2) -> active# X1)
    (active# uTake1 X -> active# X, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# uTake1 X -> active# X, active# uLength(tt(), L) -> s# length L)
    (active# uTake1 X -> active# X, active# uLength(tt(), L) -> length# L)
    (active# s X -> active# X, active# and(X1, X2) -> active# X1)
    (active# s X -> active# X, active# and(X1, X2) -> active# X2)
    (active# s X -> active# X, active# and(X1, X2) -> and#(X1, active X2))
    (active# s X -> active# X, active# and(X1, X2) -> and#(active X1, X2))
    (active# s X -> active# X, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# s X -> active# X, active# isNatList cons(N, L) -> isNatList# L)
    (active# s X -> active# X, active# isNatList cons(N, L) -> isNat# N)
    (active# s X -> active# X, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# s X -> active# X, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# s X -> active# X, active# isNatList take(N, IL) -> isNat# N)
    (active# s X -> active# X, active# isNatIList IL -> isNatList# IL)
    (active# s X -> active# X, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# s X -> active# X, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# s X -> active# X, active# isNatIList cons(N, IL) -> isNat# N)
    (active# s X -> active# X, active# isNat s N -> isNat# N)
    (active# s X -> active# X, active# isNat length L -> isNatList# L)
    (active# s X -> active# X, active# s X -> active# X)
    (active# s X -> active# X, active# s X -> s# active X)
    (active# s X -> active# X, active# length X -> active# X)
    (active# s X -> active# X, active# length X -> length# active X)
    (active# s X -> active# X, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# s X -> active# X, active# length cons(N, L) -> isNatList# L)
    (active# s X -> active# X, active# length cons(N, L) -> isNat# N)
    (active# s X -> active# X, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# s X -> active# X, active# zeros() -> cons#(0(), zeros()))
    (active# s X -> active# X, active# cons(X1, X2) -> active# X1)
    (active# s X -> active# X, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# s X -> active# X, active# take(X1, X2) -> active# X1)
    (active# s X -> active# X, active# take(X1, X2) -> active# X2)
    (active# s X -> active# X, active# take(X1, X2) -> take#(X1, active X2))
    (active# s X -> active# X, active# take(X1, X2) -> take#(active X1, X2))
    (active# s X -> active# X, active# take(0(), IL) -> isNatIList# IL)
    (active# s X -> active# X, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# s X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# s X -> active# X, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# s X -> active# X, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# s X -> active# X, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# s X -> active# X, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# s X -> active# X, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# s X -> active# X, active# uTake1 X -> active# X)
    (active# s X -> active# X, active# uTake1 X -> uTake1# active X)
    (active# s X -> active# X, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# s X -> active# X, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# s X -> active# X, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# s X -> active# X, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# s X -> active# X, active# uLength(X1, X2) -> active# X1)
    (active# s X -> active# X, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# s X -> active# X, active# uLength(tt(), L) -> s# length L)
    (active# s X -> active# X, active# uLength(tt(), L) -> length# L)
    (proper# uLength(X1, X2) -> uLength#(proper X1, proper X2), uLength#(mark X1, X2) -> uLength#(X1, X2))
    (proper# uLength(X1, X2) -> uLength#(proper X1, proper X2), uLength#(ok X1, ok X2) -> uLength#(X1, X2))
    (proper# cons(X1, X2) -> cons#(proper X1, proper X2), cons#(mark X1, X2) -> cons#(X1, X2))
    (proper# cons(X1, X2) -> cons#(proper X1, proper X2), cons#(ok X1, ok X2) -> cons#(X1, X2))
    (active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL), and#(ok X1, ok X2) -> and#(X1, X2))
    (active# length cons(N, L) -> and#(isNat N, isNatList L), and#(ok X1, ok X2) -> and#(X1, X2))
    (active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL), and#(ok X1, ok X2) -> and#(X1, X2))
    (active# and(X1, X2) -> and#(X1, active X2), and#(X1, mark X2) -> and#(X1, X2))
    (active# and(X1, X2) -> and#(X1, active X2), and#(mark X1, X2) -> and#(X1, X2))
    (active# and(X1, X2) -> and#(X1, active X2), and#(ok X1, ok X2) -> and#(X1, X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# and(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# and(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# isNatList X -> isNatList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# isNatList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# isNatIList X -> isNatIList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# isNatIList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# isNat X -> isNat# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# isNat X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# s X -> s# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# s X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# length X -> length# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# length X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# cons(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# cons(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# take(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# take(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uTake1 X -> uTake1# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uTake1 X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uLength(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X1, proper# uLength(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X1, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X1, proper# and(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X1, proper# isNatList X -> isNatList# proper X)
    (proper# cons(X1, X2) -> proper# X1, proper# isNatList X -> proper# X)
    (proper# cons(X1, X2) -> proper# X1, proper# isNatIList X -> isNatIList# proper X)
    (proper# cons(X1, X2) -> proper# X1, proper# isNatIList X -> proper# X)
    (proper# cons(X1, X2) -> proper# X1, proper# isNat X -> isNat# proper X)
    (proper# cons(X1, X2) -> proper# X1, proper# isNat X -> proper# X)
    (proper# cons(X1, X2) -> proper# X1, proper# s X -> s# proper X)
    (proper# cons(X1, X2) -> proper# X1, proper# s X -> proper# X)
    (proper# cons(X1, X2) -> proper# X1, proper# length X -> length# proper X)
    (proper# cons(X1, X2) -> proper# X1, proper# length X -> proper# X)
    (proper# cons(X1, X2) -> proper# X1, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X1, proper# cons(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X1, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X1, proper# take(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X1, proper# uTake1 X -> uTake1# proper X)
    (proper# cons(X1, X2) -> proper# X1, proper# uTake1 X -> proper# X)
    (proper# cons(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# cons(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# cons(X1, X2) -> proper# X1, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# cons(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X1, proper# uLength(X1, X2) -> proper# X2)
    (active# uLength(X1, X2) -> active# X1, active# and(X1, X2) -> active# X1)
    (active# uLength(X1, X2) -> active# X1, active# and(X1, X2) -> active# X2)
    (active# uLength(X1, X2) -> active# X1, active# and(X1, X2) -> and#(X1, active X2))
    (active# uLength(X1, X2) -> active# X1, active# and(X1, X2) -> and#(active X1, X2))
    (active# uLength(X1, X2) -> active# X1, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# uLength(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNatList# L)
    (active# uLength(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNat# N)
    (active# uLength(X1, X2) -> active# X1, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# uLength(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# uLength(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNat# N)
    (active# uLength(X1, X2) -> active# X1, active# isNatIList IL -> isNatList# IL)
    (active# uLength(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# uLength(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# uLength(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNat# N)
    (active# uLength(X1, X2) -> active# X1, active# isNat s N -> isNat# N)
    (active# uLength(X1, X2) -> active# X1, active# isNat length L -> isNatList# L)
    (active# uLength(X1, X2) -> active# X1, active# s X -> active# X)
    (active# uLength(X1, X2) -> active# X1, active# s X -> s# active X)
    (active# uLength(X1, X2) -> active# X1, active# length X -> active# X)
    (active# uLength(X1, X2) -> active# X1, active# length X -> length# active X)
    (active# uLength(X1, X2) -> active# X1, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# uLength(X1, X2) -> active# X1, active# length cons(N, L) -> isNatList# L)
    (active# uLength(X1, X2) -> active# X1, active# length cons(N, L) -> isNat# N)
    (active# uLength(X1, X2) -> active# X1, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# uLength(X1, X2) -> active# X1, active# zeros() -> cons#(0(), zeros()))
    (active# uLength(X1, X2) -> active# X1, active# cons(X1, X2) -> active# X1)
    (active# uLength(X1, X2) -> active# X1, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# uLength(X1, X2) -> active# X1, active# take(X1, X2) -> active# X1)
    (active# uLength(X1, X2) -> active# X1, active# take(X1, X2) -> active# X2)
    (active# uLength(X1, X2) -> active# X1, active# take(X1, X2) -> take#(X1, active X2))
    (active# uLength(X1, X2) -> active# X1, active# take(X1, X2) -> take#(active X1, X2))
    (active# uLength(X1, X2) -> active# X1, active# take(0(), IL) -> isNatIList# IL)
    (active# uLength(X1, X2) -> active# X1, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# uLength(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# uLength(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# uLength(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# uLength(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# uLength(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# uLength(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# uLength(X1, X2) -> active# X1, active# uTake1 X -> active# X)
    (active# uLength(X1, X2) -> active# X1, active# uTake1 X -> uTake1# active X)
    (active# uLength(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# uLength(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# uLength(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# uLength(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# uLength(X1, X2) -> active# X1, active# uLength(X1, X2) -> active# X1)
    (active# uLength(X1, X2) -> active# X1, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# uLength(X1, X2) -> active# X1, active# uLength(tt(), L) -> s# length L)
    (active# uLength(X1, X2) -> active# X1, active# uLength(tt(), L) -> length# L)
    (active# take(X1, X2) -> active# X1, active# and(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X1, active# and(X1, X2) -> active# X2)
    (active# take(X1, X2) -> active# X1, active# and(X1, X2) -> and#(X1, active X2))
    (active# take(X1, X2) -> active# X1, active# and(X1, X2) -> and#(active X1, X2))
    (active# take(X1, X2) -> active# X1, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# take(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNatList# L)
    (active# take(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNat# N)
    (active# take(X1, X2) -> active# X1, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# take(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNat# N)
    (active# take(X1, X2) -> active# X1, active# isNatIList IL -> isNatList# IL)
    (active# take(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# take(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNat# N)
    (active# take(X1, X2) -> active# X1, active# isNat s N -> isNat# N)
    (active# take(X1, X2) -> active# X1, active# isNat length L -> isNatList# L)
    (active# take(X1, X2) -> active# X1, active# s X -> active# X)
    (active# take(X1, X2) -> active# X1, active# s X -> s# active X)
    (active# take(X1, X2) -> active# X1, active# length X -> active# X)
    (active# take(X1, X2) -> active# X1, active# length X -> length# active X)
    (active# take(X1, X2) -> active# X1, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# take(X1, X2) -> active# X1, active# length cons(N, L) -> isNatList# L)
    (active# take(X1, X2) -> active# X1, active# length cons(N, L) -> isNat# N)
    (active# take(X1, X2) -> active# X1, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# take(X1, X2) -> active# X1, active# zeros() -> cons#(0(), zeros()))
    (active# take(X1, X2) -> active# X1, active# cons(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X1, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# take(X1, X2) -> active# X1, active# take(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X1, active# take(X1, X2) -> active# X2)
    (active# take(X1, X2) -> active# X1, active# take(X1, X2) -> take#(X1, active X2))
    (active# take(X1, X2) -> active# X1, active# take(X1, X2) -> take#(active X1, X2))
    (active# take(X1, X2) -> active# X1, active# take(0(), IL) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X1, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# take(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# take(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# take(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# take(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# take(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# take(X1, X2) -> active# X1, active# uTake1 X -> active# X)
    (active# take(X1, X2) -> active# X1, active# uTake1 X -> uTake1# active X)
    (active# take(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# take(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# take(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# take(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# take(X1, X2) -> active# X1, active# uLength(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X1, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# take(X1, X2) -> active# X1, active# uLength(tt(), L) -> s# length L)
    (active# take(X1, X2) -> active# X1, active# uLength(tt(), L) -> length# L)
    (active# and(X1, X2) -> active# X1, active# and(X1, X2) -> active# X1)
    (active# and(X1, X2) -> active# X1, active# and(X1, X2) -> active# X2)
    (active# and(X1, X2) -> active# X1, active# and(X1, X2) -> and#(X1, active X2))
    (active# and(X1, X2) -> active# X1, active# and(X1, X2) -> and#(active X1, X2))
    (active# and(X1, X2) -> active# X1, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# and(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNatList# L)
    (active# and(X1, X2) -> active# X1, active# isNatList cons(N, L) -> isNat# N)
    (active# and(X1, X2) -> active# X1, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# and(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X1, active# isNatList take(N, IL) -> isNat# N)
    (active# and(X1, X2) -> active# X1, active# isNatIList IL -> isNatList# IL)
    (active# and(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# and(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X1, active# isNatIList cons(N, IL) -> isNat# N)
    (active# and(X1, X2) -> active# X1, active# isNat s N -> isNat# N)
    (active# and(X1, X2) -> active# X1, active# isNat length L -> isNatList# L)
    (active# and(X1, X2) -> active# X1, active# s X -> active# X)
    (active# and(X1, X2) -> active# X1, active# s X -> s# active X)
    (active# and(X1, X2) -> active# X1, active# length X -> active# X)
    (active# and(X1, X2) -> active# X1, active# length X -> length# active X)
    (active# and(X1, X2) -> active# X1, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# and(X1, X2) -> active# X1, active# length cons(N, L) -> isNatList# L)
    (active# and(X1, X2) -> active# X1, active# length cons(N, L) -> isNat# N)
    (active# and(X1, X2) -> active# X1, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# and(X1, X2) -> active# X1, active# zeros() -> cons#(0(), zeros()))
    (active# and(X1, X2) -> active# X1, active# cons(X1, X2) -> active# X1)
    (active# and(X1, X2) -> active# X1, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# and(X1, X2) -> active# X1, active# take(X1, X2) -> active# X1)
    (active# and(X1, X2) -> active# X1, active# take(X1, X2) -> active# X2)
    (active# and(X1, X2) -> active# X1, active# take(X1, X2) -> take#(X1, active X2))
    (active# and(X1, X2) -> active# X1, active# take(X1, X2) -> take#(active X1, X2))
    (active# and(X1, X2) -> active# X1, active# take(0(), IL) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X1, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# and(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# and(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# and(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# and(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# and(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# and(X1, X2) -> active# X1, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# and(X1, X2) -> active# X1, active# uTake1 X -> active# X)
    (active# and(X1, X2) -> active# X1, active# uTake1 X -> uTake1# active X)
    (active# and(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# and(X1, X2) -> active# X1, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# and(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# and(X1, X2) -> active# X1, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# and(X1, X2) -> active# X1, active# uLength(X1, X2) -> active# X1)
    (active# and(X1, X2) -> active# X1, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# and(X1, X2) -> active# X1, active# uLength(tt(), L) -> s# length L)
    (active# and(X1, X2) -> active# X1, active# uLength(tt(), L) -> length# L)
    (active# length cons(N, L) -> isNatList# L, isNatList# ok X -> isNatList# X)
    (active# isNatList cons(N, L) -> isNatList# L, isNatList# ok X -> isNatList# X)
    (active# take(0(), IL) -> isNatIList# IL, isNatIList# ok X -> isNatIList# X)
    (active# isNatIList IL -> isNatList# IL, isNatList# ok X -> isNatList# X)
    (active# uLength(tt(), L) -> s# length L, s# mark X -> s# X)
    (active# uLength(tt(), L) -> s# length L, s# ok X -> s# X)
    (top# mark X -> top# proper X, top# mark X -> proper# X)
    (top# mark X -> top# proper X, top# mark X -> top# proper X)
    (top# mark X -> top# proper X, top# ok X -> active# X)
    (top# mark X -> top# proper X, top# ok X -> top# active X)
    (proper# length X -> length# proper X, length# mark X -> length# X)
    (proper# length X -> length# proper X, length# ok X -> length# X)
    (proper# isNat X -> isNat# proper X, isNat# ok X -> isNat# X)
    (proper# isNatList X -> isNatList# proper X, isNatList# ok X -> isNatList# X)
    (active# length X -> length# active X, length# mark X -> length# X)
    (active# length X -> length# active X, length# ok X -> length# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# and(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# and(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# isNatList X -> isNatList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# isNatList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# isNatIList X -> isNatIList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# isNatIList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# isNat X -> isNat# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# isNat X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# s X -> s# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# s X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# length X -> length# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# length X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# cons(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# cons(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# take(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# take(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uTake1 X -> uTake1# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uTake1 X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uLength(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X3, proper# uLength(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# and(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# and(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# isNatList X -> isNatList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# isNatList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# isNatIList X -> isNatIList# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# isNatIList X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# isNat X -> isNat# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# isNat X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# s X -> s# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# s X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# length X -> length# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# length X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# cons(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# cons(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# take(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# take(X1, X2) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uTake1 X -> uTake1# proper X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uTake1 X -> proper# X)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uLength(X1, X2) -> proper# X1)
    (proper# uTake2(X1, X2, X3, X4) -> proper# X2, proper# uLength(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X2, proper# and(X1, X2) -> and#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X2, proper# and(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X2, proper# isNatList X -> isNatList# proper X)
    (proper# cons(X1, X2) -> proper# X2, proper# isNatList X -> proper# X)
    (proper# cons(X1, X2) -> proper# X2, proper# isNatIList X -> isNatIList# proper X)
    (proper# cons(X1, X2) -> proper# X2, proper# isNatIList X -> proper# X)
    (proper# cons(X1, X2) -> proper# X2, proper# isNat X -> isNat# proper X)
    (proper# cons(X1, X2) -> proper# X2, proper# isNat X -> proper# X)
    (proper# cons(X1, X2) -> proper# X2, proper# s X -> s# proper X)
    (proper# cons(X1, X2) -> proper# X2, proper# s X -> proper# X)
    (proper# cons(X1, X2) -> proper# X2, proper# length X -> length# proper X)
    (proper# cons(X1, X2) -> proper# X2, proper# length X -> proper# X)
    (proper# cons(X1, X2) -> proper# X2, proper# cons(X1, X2) -> cons#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X2, proper# cons(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X2, proper# take(X1, X2) -> take#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X2, proper# take(X1, X2) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X2, proper# uTake1 X -> uTake1# proper X)
    (proper# cons(X1, X2) -> proper# X2, proper# uTake1 X -> proper# X)
    (proper# cons(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4))
    (proper# cons(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X2)
    (proper# cons(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X3)
    (proper# cons(X1, X2) -> proper# X2, proper# uTake2(X1, X2, X3, X4) -> proper# X4)
    (proper# cons(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> uLength#(proper X1, proper X2))
    (proper# cons(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X1)
    (proper# cons(X1, X2) -> proper# X2, proper# uLength(X1, X2) -> proper# X2)
    (active# take(X1, X2) -> active# X2, active# and(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X2, active# and(X1, X2) -> active# X2)
    (active# take(X1, X2) -> active# X2, active# and(X1, X2) -> and#(X1, active X2))
    (active# take(X1, X2) -> active# X2, active# and(X1, X2) -> and#(active X1, X2))
    (active# take(X1, X2) -> active# X2, active# isNatList cons(N, L) -> and#(isNat N, isNatList L))
    (active# take(X1, X2) -> active# X2, active# isNatList cons(N, L) -> isNatList# L)
    (active# take(X1, X2) -> active# X2, active# isNatList cons(N, L) -> isNat# N)
    (active# take(X1, X2) -> active# X2, active# isNatList take(N, IL) -> and#(isNat N, isNatIList IL))
    (active# take(X1, X2) -> active# X2, active# isNatList take(N, IL) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X2, active# isNatList take(N, IL) -> isNat# N)
    (active# take(X1, X2) -> active# X2, active# isNatIList IL -> isNatList# IL)
    (active# take(X1, X2) -> active# X2, active# isNatIList cons(N, IL) -> and#(isNat N, isNatIList IL))
    (active# take(X1, X2) -> active# X2, active# isNatIList cons(N, IL) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X2, active# isNatIList cons(N, IL) -> isNat# N)
    (active# take(X1, X2) -> active# X2, active# isNat s N -> isNat# N)
    (active# take(X1, X2) -> active# X2, active# isNat length L -> isNatList# L)
    (active# take(X1, X2) -> active# X2, active# s X -> active# X)
    (active# take(X1, X2) -> active# X2, active# s X -> s# active X)
    (active# take(X1, X2) -> active# X2, active# length X -> active# X)
    (active# take(X1, X2) -> active# X2, active# length X -> length# active X)
    (active# take(X1, X2) -> active# X2, active# length cons(N, L) -> and#(isNat N, isNatList L))
    (active# take(X1, X2) -> active# X2, active# length cons(N, L) -> isNatList# L)
    (active# take(X1, X2) -> active# X2, active# length cons(N, L) -> isNat# N)
    (active# take(X1, X2) -> active# X2, active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L))
    (active# take(X1, X2) -> active# X2, active# zeros() -> cons#(0(), zeros()))
    (active# take(X1, X2) -> active# X2, active# cons(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X2, active# cons(X1, X2) -> cons#(active X1, X2))
    (active# take(X1, X2) -> active# X2, active# take(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X2, active# take(X1, X2) -> active# X2)
    (active# take(X1, X2) -> active# X2, active# take(X1, X2) -> take#(X1, active X2))
    (active# take(X1, X2) -> active# X2, active# take(X1, X2) -> take#(active X1, X2))
    (active# take(X1, X2) -> active# X2, active# take(0(), IL) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X2, active# take(0(), IL) -> uTake1# isNatIList IL)
    (active# take(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> and#(isNat N, isNatIList IL))
    (active# take(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> and#(isNat M, and(isNat N, isNatIList IL)))
    (active# take(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> isNatIList# IL)
    (active# take(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> isNat# N)
    (active# take(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> isNat# M)
    (active# take(X1, X2) -> active# X2, active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL))
    (active# take(X1, X2) -> active# X2, active# uTake1 X -> active# X)
    (active# take(X1, X2) -> active# X2, active# uTake1 X -> uTake1# active X)
    (active# take(X1, X2) -> active# X2, active# uTake2(X1, X2, X3, X4) -> active# X1)
    (active# take(X1, X2) -> active# X2, active# uTake2(X1, X2, X3, X4) -> uTake2#(active X1, X2, X3, X4))
    (active# take(X1, X2) -> active# X2, active# uTake2(tt(), M, N, IL) -> cons#(N, take(M, IL)))
    (active# take(X1, X2) -> active# X2, active# uTake2(tt(), M, N, IL) -> take#(M, IL))
    (active# take(X1, X2) -> active# X2, active# uLength(X1, X2) -> active# X1)
    (active# take(X1, X2) -> active# X2, active# uLength(X1, X2) -> uLength#(active X1, X2))
    (active# take(X1, X2) -> active# X2, active# uLength(tt(), L) -> s# length L)
    (active# take(X1, X2) -> active# X2, active# uLength(tt(), L) -> length# L)
    (active# take(s M, cons(N, IL)) -> uTake2#(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL), uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4))
    (uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4), uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4))
    (uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4), uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4))
    (active# take(s M, cons(N, IL)) -> isNat# M, isNat# ok X -> isNat# X)
    (active# length cons(N, L) -> uLength#(and(isNat N, isNatList L), L), uLength#(ok X1, ok X2) -> uLength#(X1, X2))
    (active# length cons(N, L) -> isNat# N, isNat# ok X -> isNat# X)
    (active# isNatIList cons(N, IL) -> isNat# N, isNat# ok X -> isNat# X)
    (active# isNatList cons(N, L) -> isNat# N, isNat# ok X -> isNat# X)
    (proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4), uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4))
    (proper# uTake2(X1, X2, X3, X4) -> uTake2#(proper X1, proper X2, proper X3, proper X4), uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4))
    (uLength#(mark X1, X2) -> uLength#(X1, X2), uLength#(mark X1, X2) -> uLength#(X1, X2))
    (uLength#(mark X1, X2) -> uLength#(X1, X2), uLength#(ok X1, ok X2) -> uLength#(X1, X2))
    (take#(mark X1, X2) -> take#(X1, X2), take#(X1, mark X2) -> take#(X1, X2))
    (take#(mark X1, X2) -> take#(X1, X2), take#(mark X1, X2) -> take#(X1, X2))
    (take#(mark X1, X2) -> take#(X1, X2), take#(ok X1, ok X2) -> take#(X1, X2))
    (cons#(ok X1, ok X2) -> cons#(X1, X2), cons#(mark X1, X2) -> cons#(X1, X2))
    (cons#(ok X1, ok X2) -> cons#(X1, X2), cons#(ok X1, ok X2) -> cons#(X1, X2))
    (and#(ok X1, ok X2) -> and#(X1, X2), and#(X1, mark X2) -> and#(X1, X2))
    (and#(ok X1, ok X2) -> and#(X1, X2), and#(mark X1, X2) -> and#(X1, X2))
    (and#(ok X1, ok X2) -> and#(X1, X2), and#(ok X1, ok X2) -> and#(X1, X2))
    (and#(X1, mark X2) -> and#(X1, X2), and#(X1, mark X2) -> and#(X1, X2))
    (and#(X1, mark X2) -> and#(X1, X2), and#(mark X1, X2) -> and#(X1, X2))
    (and#(X1, mark X2) -> and#(X1, X2), and#(ok X1, ok X2) -> and#(X1, X2))
    (active# take(X1, X2) -> take#(active X1, X2), take#(X1, mark X2) -> take#(X1, X2))
    (active# take(X1, X2) -> take#(active X1, X2), take#(mark X1, X2) -> take#(X1, X2))
    (active# take(X1, X2) -> take#(active X1, X2), take#(ok X1, ok X2) -> take#(X1, X2))
    (active# and(X1, X2) -> and#(active X1, X2), and#(X1, mark X2) -> and#(X1, X2))
    (active# and(X1, X2) -> and#(active X1, X2), and#(mark X1, X2) -> and#(X1, X2))
    (active# and(X1, X2) -> and#(active X1, X2), and#(ok X1, ok X2) -> and#(X1, X2))
   }
   STATUS:
    arrows: 0.884909
    SCCS (14):
     Scc:
      {top# mark X -> top# proper X,
         top# ok X -> top# active X}
     Scc:
      {           proper# and(X1, X2) -> proper# X1,
                  proper# and(X1, X2) -> proper# X2,
                  proper# isNatList X -> proper# X,
                 proper# isNatIList X -> proper# X,
                      proper# isNat X -> proper# X,
                          proper# s X -> proper# X,
                     proper# length X -> proper# X,
                 proper# cons(X1, X2) -> proper# X1,
                 proper# cons(X1, X2) -> proper# X2,
                 proper# take(X1, X2) -> proper# X1,
                 proper# take(X1, X2) -> proper# X2,
                     proper# uTake1 X -> proper# X,
       proper# uTake2(X1, X2, X3, X4) -> proper# X1,
       proper# uTake2(X1, X2, X3, X4) -> proper# X2,
       proper# uTake2(X1, X2, X3, X4) -> proper# X3,
       proper# uTake2(X1, X2, X3, X4) -> proper# X4,
              proper# uLength(X1, X2) -> proper# X1,
              proper# uLength(X1, X2) -> proper# X2}
     Scc:
      {           active# and(X1, X2) -> active# X1,
                  active# and(X1, X2) -> active# X2,
                          active# s X -> active# X,
                     active# length X -> active# X,
                 active# cons(X1, X2) -> active# X1,
                 active# take(X1, X2) -> active# X1,
                 active# take(X1, X2) -> active# X2,
                     active# uTake1 X -> active# X,
       active# uTake2(X1, X2, X3, X4) -> active# X1,
              active# uLength(X1, X2) -> active# X1}
     Scc:
      {uTake1# mark X -> uTake1# X,
         uTake1# ok X -> uTake1# X}
     Scc:
      {length# mark X -> length# X,
         length# ok X -> length# X}
     Scc:
      {s# mark X -> s# X,
         s# ok X -> s# X}
     Scc:
      {isNatIList# ok X -> isNatIList# X}
     Scc:
      {isNatList# ok X -> isNatList# X}
     Scc:
      {isNat# ok X -> isNat# X}
     Scc:
      {       uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4),
       uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4)}
     Scc:
      { uLength#(mark X1, X2) -> uLength#(X1, X2),
       uLength#(ok X1, ok X2) -> uLength#(X1, X2)}
     Scc:
      { take#(X1, mark X2) -> take#(X1, X2),
        take#(mark X1, X2) -> take#(X1, X2),
       take#(ok X1, ok X2) -> take#(X1, X2)}
     Scc:
      { cons#(mark X1, X2) -> cons#(X1, X2),
       cons#(ok X1, ok X2) -> cons#(X1, X2)}
     Scc:
      { and#(X1, mark X2) -> and#(X1, X2),
        and#(mark X1, X2) -> and#(X1, X2),
       and#(ok X1, ok X2) -> and#(X1, X2)}
     
     SCC (2):
      Strict:
       {top# mark X -> top# proper X,
          top# ok X -> top# active X}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     SCC (18):
      Strict:
       {           proper# and(X1, X2) -> proper# X1,
                   proper# and(X1, X2) -> proper# X2,
                   proper# isNatList X -> proper# X,
                  proper# isNatIList X -> proper# X,
                       proper# isNat X -> proper# X,
                           proper# s X -> proper# X,
                      proper# length X -> proper# X,
                  proper# cons(X1, X2) -> proper# X1,
                  proper# cons(X1, X2) -> proper# X2,
                  proper# take(X1, X2) -> proper# X1,
                  proper# take(X1, X2) -> proper# X2,
                      proper# uTake1 X -> proper# X,
        proper# uTake2(X1, X2, X3, X4) -> proper# X1,
        proper# uTake2(X1, X2, X3, X4) -> proper# X2,
        proper# uTake2(X1, X2, X3, X4) -> proper# X3,
        proper# uTake2(X1, X2, X3, X4) -> proper# X4,
               proper# uLength(X1, X2) -> proper# X1,
               proper# uLength(X1, X2) -> proper# X2}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     
     
     
     
     
     
     
     
     SCC (10):
      Strict:
       {           active# and(X1, X2) -> active# X1,
                   active# and(X1, X2) -> active# X2,
                           active# s X -> active# X,
                      active# length X -> active# X,
                  active# cons(X1, X2) -> active# X1,
                  active# take(X1, X2) -> active# X1,
                  active# take(X1, X2) -> active# X2,
                      active# uTake1 X -> active# X,
        active# uTake2(X1, X2, X3, X4) -> active# X1,
               active# uLength(X1, X2) -> active# X1}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     
     
     
     
     
     SCC (2):
      Strict:
       {uTake1# mark X -> uTake1# X,
          uTake1# ok X -> uTake1# X}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     
     
     
     
     SCC (2):
      Strict:
       {length# mark X -> length# X,
          length# ok X -> length# X}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     SCC (2):
      Strict:
       {s# mark X -> s# X,
          s# ok X -> s# X}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     
     
     
     SCC (1):
      Strict:
       {isNatIList# ok X -> isNatIList# X}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     SCC (1):
      Strict:
       {isNatList# ok X -> isNatList# X}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     
     
     
     
     
     
     
     
     
     
     
     SCC (1):
      Strict:
       {isNat# ok X -> isNat# X}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     
     SCC (2):
      Strict:
       {       uTake2#(mark X1, X2, X3, X4) -> uTake2#(X1, X2, X3, X4),
        uTake2#(ok X1, ok X2, ok X3, ok X4) -> uTake2#(X1, X2, X3, X4)}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     SCC (2):
      Strict:
       { uLength#(mark X1, X2) -> uLength#(X1, X2),
        uLength#(ok X1, ok X2) -> uLength#(X1, X2)}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     SCC (3):
      Strict:
       { take#(X1, mark X2) -> take#(X1, X2),
         take#(mark X1, X2) -> take#(X1, X2),
        take#(ok X1, ok X2) -> take#(X1, X2)}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     SCC (2):
      Strict:
       { cons#(mark X1, X2) -> cons#(X1, X2),
        cons#(ok X1, ok X2) -> cons#(X1, X2)}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open
     
     SCC (3):
      Strict:
       { and#(X1, mark X2) -> and#(X1, X2),
         and#(mark X1, X2) -> and#(X1, X2),
        and#(ok X1, ok X2) -> and#(X1, X2)}
      Weak:
      {                active and(X1, X2) -> and(X1, active X2),
                       active and(X1, X2) -> and(active X1, X2),
                      active and(tt(), T) -> mark T,
              active isNatList cons(N, L) -> mark and(isNat N, isNatList L),
                   active isNatList nil() -> mark tt(),
             active isNatList take(N, IL) -> mark and(isNat N, isNatIList IL),
                     active isNatIList IL -> mark isNatList IL,
                active isNatIList zeros() -> mark tt(),
            active isNatIList cons(N, IL) -> mark and(isNat N, isNatIList IL),
                         active isNat 0() -> mark tt(),
                         active isNat s N -> mark isNat N,
                    active isNat length L -> mark isNatList L,
                               active s X -> s active X,
                          active length X -> length active X,
                 active length cons(N, L) -> mark uLength(and(isNat N, isNatList L), L),
                           active zeros() -> mark cons(0(), zeros()),
                      active cons(X1, X2) -> cons(active X1, X2),
                      active take(X1, X2) -> take(X1, active X2),
                      active take(X1, X2) -> take(active X1, X2),
                     active take(0(), IL) -> mark uTake1 isNatIList IL,
            active take(s M, cons(N, IL)) -> mark uTake2(and(isNat M, and(isNat N, isNatIList IL)), M, N, IL),
                          active uTake1 X -> uTake1 active X,
                       active uTake1 tt() -> mark nil(),
            active uTake2(X1, X2, X3, X4) -> uTake2(active X1, X2, X3, X4),
            active uTake2(tt(), M, N, IL) -> mark cons(N, take(M, IL)),
                   active uLength(X1, X2) -> uLength(active X1, X2),
                  active uLength(tt(), L) -> mark s length L,
                         and(X1, mark X2) -> mark and(X1, X2),
                         and(mark X1, X2) -> mark and(X1, X2),
                        and(ok X1, ok X2) -> ok and(X1, X2),
                           isNatList ok X -> ok isNatList X,
                          isNatIList ok X -> ok isNatIList X,
                               isNat ok X -> ok isNat X,
                                 s mark X -> mark s X,
                                   s ok X -> ok s X,
                            length mark X -> mark length X,
                              length ok X -> ok length X,
                        cons(mark X1, X2) -> mark cons(X1, X2),
                       cons(ok X1, ok X2) -> ok cons(X1, X2),
                        take(X1, mark X2) -> mark take(X1, X2),
                        take(mark X1, X2) -> mark take(X1, X2),
                       take(ok X1, ok X2) -> ok take(X1, X2),
                            uTake1 mark X -> mark uTake1 X,
                              uTake1 ok X -> ok uTake1 X,
              uTake2(mark X1, X2, X3, X4) -> mark uTake2(X1, X2, X3, X4),
       uTake2(ok X1, ok X2, ok X3, ok X4) -> ok uTake2(X1, X2, X3, X4),
                     uLength(mark X1, X2) -> mark uLength(X1, X2),
                    uLength(ok X1, ok X2) -> ok uLength(X1, X2),
                       proper and(X1, X2) -> and(proper X1, proper X2),
                              proper tt() -> ok tt(),
                       proper isNatList X -> isNatList proper X,
                      proper isNatIList X -> isNatIList proper X,
                           proper isNat X -> isNat proper X,
                               proper 0() -> ok 0(),
                               proper s X -> s proper X,
                          proper length X -> length proper X,
                           proper zeros() -> ok zeros(),
                      proper cons(X1, X2) -> cons(proper X1, proper X2),
                             proper nil() -> ok nil(),
                      proper take(X1, X2) -> take(proper X1, proper X2),
                          proper uTake1 X -> uTake1 proper X,
            proper uTake2(X1, X2, X3, X4) -> uTake2(proper X1, proper X2, proper X3, proper X4),
                   proper uLength(X1, X2) -> uLength(proper X1, proper X2),
                               top mark X -> top proper X,
                                 top ok X -> top active X}
      Open