
theorem
  for p be Prime, k, n be Nat, m be non zero Nat st k + m < p holds
    ((n*p + k) choose (m + k)) mod p = 0
  proof
    let p be Prime;
    defpred P[Nat] means
    for k be Nat, m be non zero Nat st k + m < p holds
      (($1*p + k) choose (m + k)) mod p = 0;
    A1: P[0]
    proof
      let k be Nat, m be non zero Nat;
      ((0 + k) choose (k + m)) mod p = 0 mod p;
      hence thesis;
    end;
    A2: for q be Nat holds P[q] implies P[q+1]
    proof
      let q be Nat;
      assume
      P[q];
      P[q + 1]
      proof
        defpred Q[Nat] means
          for m be non zero Nat st $1 + m < p holds
            (((q+1)*p + $1) choose (m + $1)) mod p = 0;
        C1: Q[0]
        proof
          let m be non zero Nat such that
          D1: 0 + m < p;
          (((q+1)*p + 0) choose (m + 0)) mod p =
            ((((q+1)*p + 0) mod p) choose m) mod p by D1,MOC
          .= 0 mod p;
          hence thesis;
        end;
        C2: for a be Nat st Q[a] holds Q[a + 1]
        proof
          let a be Nat;
          Q[a + 1]
          proof
            let m be non zero Nat such that
            E1: (a + 1) + m < p;
            (a + 1) + 0 < (a + 1) + m by XREAL_1:6; then
            E3: (a + 1) < p by E1,XXREAL_0:2;
            (((q+1)*p + (a + 1)) choose (m + (a + 1))) mod p =
            ((((q+1)*p + (a + 1)) mod p) choose (m + (a + 1))) mod p by E1,MOC
            .= (((a + 1) mod p) choose (a + m + 1)) mod p by NAT_D:61
            .= ((a + 1) choose ((a + 1)+ m)) mod p by E3,NAT_D:24
            .= 0 mod p;
            hence thesis;
          end;
          hence thesis;
        end;
        for b be Nat holds Q[b] from NAT_1:sch 2(C1,C2);
        hence thesis;
      end;
      hence thesis;
    end;
    for c be Nat holds P[c] from NAT_1:sch 2(A1,A2);
    hence thesis;
  end;
