section‹‹Wlog_Examples› -- Examples how to use \texttt{wlog}›
theory Wlog_Examples imports Wlog Complex_Main begin
text‹The theorem @{thm [source] Complex.card_nth_roots} has the additional assumption term‹n > 0›.
We use exactly the same proof except for stating that w.l.o.g., term‹n > 0›.› lemma card_nth_roots_strengthened: assumes"c ≠ 0" shows"card {z::complex. z ^ n = c} = n" proof -
wlog n_pos: "n > 0" using negation by (simp add: infinite_UNIV_char_0) have"card {z. z ^ n = c} = card {z::complex. z ^ n = 1}" by (rule sym, rule bij_betw_same_card, rule bij_betw_nth_root_unity) fact+ alsohave"… = n"by (rule card_roots_unity_eq) fact+ finallyshow ?thesis . qed
text‹This example very roughly follows Harrison cite‹"harrison-wlog"›:› lemma schur_ineq: fixes a b c :: ‹'a :: linordered_idom›and k :: nat assumes a0: ‹a ≥ 0›and b0: ‹b ≥ 0›and c0: ‹c ≥ 0› shows‹a^k * (a - b) * (a - c) + b^k * (b - a) * (b - c) + c^k * (c - a) * (c - b) ≥ 0›
(is‹?lhs ≥ 0›) proof -
wlog ordered[simp]: ‹a ≤ b›‹b ≤ c› generalizing a b c keeping a0 b0 c0 apply (rule rev_mp[OF c0]; rule rev_mp[OF b0]; rule rev_mp[OF a0]) apply (rule linorder_wlog_3[of _ a b c]) apply (simp add: algebra_simps) by (simp add: hypothesis)
from ordered have [simp]: ‹a ≤ c› by linarith
have‹?lhs = (c - b) * (c^k * (c - a) - b^k * (b - a)) + a^k * (c - a) * (b - a)› by (simp add: algebra_simps) alsohave‹…≥ 0› by (auto intro!: add_nonneg_nonneg mult_nonneg_nonneg mult_mono power_mono zero_le_power simp: a0 b0 c0) finallyshow‹?lhs ≥ 0› by - qed
text‹The following illustrates how facts already proven before a @{command wlog} can be still be used after the wlog.
The example does not do anything useful.› lemma‹A ==> B ==> A ∧ B› proof - have test1: ‹1=1›by simp assume a: ‹A› thenhave test2: ‹A ∨ 1≠2›by simp
― ‹Isabelle marks this as being potentially based on assumption @{thm [source] a}.
(Note: this is not done by actual dependency tracking. Anything that is proven after the @{command assume} command can depend on the assumption.)› assume b: ‹B› with a have test3: ‹A ∧ B›by simp
― ‹Isabelle marks this as being potentially based on assumption @{thm [source] a}, @{thm [source] b}›
wlog true: ‹True› generalizing A B keeping b
― ‹A pointless wlog: we can wlog assume term‹True›.
Notice: we only keep the assumption @{thm [source] b} around.› using negation by blast text‹The already proven theorems cannot be accessed directly anymore (wlog starts a new proof block).
Recovered versions are available, however:› thm wlog_keep.test1
― ‹The fact is fully recovered since it did not depend on any assumptions.› thm wlog_keep.test2
― ‹This fact depended on assumption ‹a› which we did not keep. So the original fact might not hold anymore.
Therefore, @{thm [source] wlog_keep.test2} becomes term‹A ==> A ∨ 1 ≠ 2›. (Note the added term‹A› premise.)› thm wlog_keep.test3
― ‹This fact depended on assumptions ‹a› and ‹b›. But we kept @{thm [source] b}.
Therefore, @{thm [source] wlog_keep.test2} becomes term‹A ==> A ∧ B›. (Note that only term‹A› is added as a premise.)› oops
― ‹Aborting the proof here because we cannot prove term‹A ∧ B› anymore since we dropped assumption ‹a› for demonstration purposes.›
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.