20 lemma less_add: "(N, M0 + {#a#}) : mult1 r ==> |
20 lemma less_add: "(N, M0 + {#a#}) : mult1 r ==> |
21 (EX M. (M, M0) : mult1 r & N = M + {#a#}) | |
21 (EX M. (M, M0) : mult1 r & N = M + {#a#}) | |
22 (EX K. (ALL b. elem K b --> (b, a) : r) & N = M0 + K)" |
22 (EX K. (ALL b. elem K b --> (b, a) : r) & N = M0 + K)" |
23 (concl is "?case1 (mult1 r) | ?case2"); |
23 (concl is "?case1 (mult1 r) | ?case2"); |
24 proof (unfold mult1_def); |
24 proof (unfold mult1_def); |
25 let ?r = "\<lambda>K a. ALL b. elem K b --> (b, a) : r"; |
25 let ?r = "\\<lambda>K a. ALL b. elem K b --> (b, a) : r"; |
26 let ?R = "\<lambda>N M. EX a M0 K. M = M0 + {#a#} & N = M0 + K & ?r K a"; |
26 let ?R = "\\<lambda>N M. EX a M0 K. M = M0 + {#a#} & N = M0 + K & ?r K a"; |
27 let ?case1 = "?case1 {(N, M). ?R N M}"; |
27 let ?case1 = "?case1 {(N, M). ?R N M}"; |
28 |
28 |
29 assume "(N, M0 + {#a#}) : {(N, M). ?R N M}"; |
29 assume "(N, M0 + {#a#}) : {(N, M). ?R N M}"; |
30 hence "EX a' M0' K. |
30 hence "EX a' M0' K. |
31 M0 + {#a#} = M0' + {#a'#} & N = M0' + K & ?r K a'"; by simp; |
31 M0 + {#a#} = M0' + {#a'#} & N = M0' + K & ?r K a'"; by simp; |
82 next; |
82 next; |
83 fix K; |
83 fix K; |
84 assume N: "N = M0 + K"; |
84 assume N: "N = M0 + K"; |
85 assume "ALL b. elem K b --> (b, a) : r"; |
85 assume "ALL b. elem K b --> (b, a) : r"; |
86 have "?this --> M0 + K : ?W" (is "?P K"); |
86 have "?this --> M0 + K : ?W" (is "?P K"); |
87 proof (induct K rule: multiset_induct); |
87 proof (induct K in rule: multiset_induct); |
88 from M0; have "M0 + {#} : ?W"; by simp; |
88 from M0; have "M0 + {#} : ?W"; by simp; |
89 thus "?P {#}"; ..; |
89 thus "?P {#}"; ..; |
90 |
90 |
91 fix K x; assume hyp: "?P K"; |
91 fix K x; assume hyp: "?P K"; |
92 show "?P (K + {#x#})"; |
92 show "?P (K + {#x#})"; |