Wellfounded induction(2)
http://d.hatena.ne.jp/ehito/20111119/1321692292 のPVS版です.
lem00:lemma FORALL (p: pred [nat]): (FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n)) IMPLIES (FORALL (n: nat): p(n)) %|- lem00 : PROOF %|- (then (skeep*) (copy -1) (inst -2 "n") %|- (spread (split -2) %|- ((propax) %|- (then (generalize "n" "n" nat 1) %|- (spread (induct "n" 1) %|- ((ground) %|- (then (skeep*) (inst -3 "k") %|- (spread (case "k=j or k<j") ((grind) (grind)))))))))) %|- QED lem00 : |------- {1} FORALL (p: pred[nat]): (FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n)) IMPLIES (FORALL (n: nat): p(n)) Rerunning step: (skeep*) Iterating skeep in '*, this simplifies to: lem00 : {-1} FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- {1} p(n) Rerunning step: (copy -1) Copying formula number: -1 this simplifies to: lem00 : {-1} FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) [-2] FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- [1] p(n) Rerunning step: (inst -2 "n") Instantiating the top quantifier in -2 with the terms: n, this simplifies to: lem00 : [-1] FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) {-2} (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- [1] p(n) Rerunning step: (split -2) Splitting conjunctions, this yields 2 subgoals: lem00.1 : {-1} p(n) [-2] FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- [1] p(n) which is trivially true. This completes the proof of lem00.1. lem00.2 : [-1] FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- {1} FORALL (k: nat): k < n IMPLIES p(k) [2] p(n) Rerunning step: (generalize "n" "n" nat 1) Generalizing n by n, this simplifies to: lem00.2 : [-1] FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- {1} FORALL (n: nat), (k: nat): k < n IMPLIES p(k) [2] p(n) Rerunning step: (induct "n" 1) Inducting on n on formula 1, this yields 2 subgoals: lem00.2.1 : [-1] FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- {1} FORALL (k: nat): k < 0 IMPLIES p(k) [2] p(n) Rerunning step: (ground) Applying propositional simplification and decision procedures, This completes the proof of lem00.2.1. lem00.2.2 : [-1] FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- {1} FORALL j: (FORALL (k: nat): k < j IMPLIES p(k)) IMPLIES (FORALL (k: nat): k < j + 1 IMPLIES p(k)) [2] p(n) Rerunning step: (skeep*) Iterating skeep in '*, this simplifies to: lem00.2.2 : {-1} FORALL (k: nat): k < j IMPLIES p(k) {-2} k < j + 1 {-3} FORALL (n: nat): (FORALL (k: nat): k < n IMPLIES p(k)) IMPLIES p(n) |------- {1} p(k) {2} p(n) Rerunning step: (inst -3 "k") Instantiating the top quantifier in -3 with the terms: k, this simplifies to: lem00.2.2 : [-1] FORALL (k: nat): k < j IMPLIES p(k) [-2] k < j + 1 {-3} (FORALL (k_1: nat): k_1 < k IMPLIES p(k_1)) IMPLIES p(k) |------- [1] p(k) [2] p(n) Rerunning step: (case "k=j or k<j") Case splitting on k = j OR k < j, this yields 2 subgoals: lem00.2.2.1 : {-1} k = j OR k < j [-2] FORALL (k: nat): k < j IMPLIES p(k) [-3] k < j + 1 [-4] (FORALL (k_1: nat): k_1 < k IMPLIES p(k_1)) IMPLIES p(k) |------- [1] p(k) [2] p(n) Rerunning step: (grind) Trying repeated skolemization, instantiation, and if-lifting, This completes the proof of lem00.2.2.1. lem00.2.2.2 : [-1] FORALL (k: nat): k < j IMPLIES p(k) [-2] k < j + 1 [-3] (FORALL (k_1: nat): k_1 < k IMPLIES p(k_1)) IMPLIES p(k) |------- {1} k = j OR k < j [2] p(k) [3] p(n) Rerunning step: (grind) Trying repeated skolemization, instantiation, and if-lifting, This completes the proof of lem00.2.2.2. This completes the proof of lem00.2.2. This completes the proof of lem00.2. Q.E.D.