src/HOL/Isar_Examples/Structured_Statements.thy
author wenzelm
Sat, 05 Jan 2019 17:24:33 +0100
changeset 69597 ff784d5a5bfb
parent 63583 a39baba12732
permissions -rw-r--r--
isabelle update -u control_cartouches;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
60450
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOL/Isar_Examples/Structured_Statements.thy
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     3
*)
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     4
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     5
section \<open>Structured statements within Isar proofs\<close>
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     6
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     7
theory Structured_Statements
63583
wenzelm
parents: 62314
diff changeset
     8
  imports Main
60450
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
     9
begin
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    10
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    11
subsection \<open>Introduction steps\<close>
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    12
60450
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    13
notepad
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    14
begin
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    15
  fix A B :: bool
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    16
  fix P :: "'a \<Rightarrow> bool"
60450
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    17
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    18
  have "A \<longrightarrow> B"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    19
  proof
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    20
    show B if A using that \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    21
  qed
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    22
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    23
  have "\<not> A"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    24
  proof
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    25
    show False if A using that \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    26
  qed
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    27
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    28
  have "\<forall>x. P x"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    29
  proof
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    30
    show "P x" for x \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    31
  qed
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    32
end
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    33
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    34
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    35
subsection \<open>If-and-only-if\<close>
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    36
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    37
notepad
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    38
begin
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    39
  fix A B :: bool
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    40
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    41
  have "A \<longleftrightarrow> B"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    42
  proof
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    43
    show B if A \<proof>
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    44
    show A if B \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    45
  qed
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    46
next
60450
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    47
  fix A B :: bool
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    48
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    49
  have iff_comm: "(A \<and> B) \<longleftrightarrow> (B \<and> A)"
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    50
  proof
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    51
    show "B \<and> A" if "A \<and> B"
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    52
    proof
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    53
      show B using that ..
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    54
      show A using that ..
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    55
    qed
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    56
    show "A \<and> B" if "B \<and> A"
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    57
    proof
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    58
      show A using that ..
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    59
      show B using that ..
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    60
    qed
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    61
  qed
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    62
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    63
  text \<open>Alternative proof, avoiding redundant copy of symmetric argument.\<close>
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    64
  have iff_comm: "(A \<and> B) \<longleftrightarrow> (B \<and> A)"
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    65
  proof
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    66
    show "B \<and> A" if "A \<and> B" for A B
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    67
    proof
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    68
      show B using that ..
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    69
      show A using that ..
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    70
    qed
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    71
    then show "A \<and> B" if "B \<and> A"
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    72
      by this (rule that)
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    73
  qed
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    74
end
60450
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
    75
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    76
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    77
subsection \<open>Elimination and cases\<close>
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    78
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    79
notepad
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    80
begin
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    81
  fix A B C D :: bool
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    82
  assume *: "A \<or> B \<or> C \<or> D"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    83
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    84
  consider (a) A | (b) B | (c) C | (d) D
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    85
    using * by blast
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    86
  then have something
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    87
  proof cases
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    88
    case a  thm \<open>A\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    89
    then show ?thesis \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    90
  next
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    91
    case b  thm \<open>B\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    92
    then show ?thesis \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    93
  next
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    94
    case c  thm \<open>C\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    95
    then show ?thesis \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    96
  next
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    97
    case d  thm \<open>D\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
    98
    then show ?thesis \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
    99
  qed
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   100
next
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   101
  fix A :: "'a \<Rightarrow> bool"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   102
  fix B :: "'b \<Rightarrow> 'c \<Rightarrow> bool"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   103
  assume *: "(\<exists>x. A x) \<or> (\<exists>y z. B y z)"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   104
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   105
  consider (a) x where "A x" | (b) y z where "B y z"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   106
    using * by blast
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   107
  then have something
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   108
  proof cases
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   109
    case a  thm \<open>A x\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   110
    then show ?thesis \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   111
  next
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   112
    case b  thm \<open>B y z\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   113
    then show ?thesis \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   114
  qed
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   115
end
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   116
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   117
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   118
subsection \<open>Induction\<close>
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   119
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   120
notepad
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   121
begin
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   122
  fix P :: "nat \<Rightarrow> bool"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   123
  fix n :: nat
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   124
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   125
  have "P n"
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   126
  proof (induct n)
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   127
    show "P 0" \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   128
    show "P (Suc n)" if "P n" for n  thm \<open>P n\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   129
      using that \<proof>
60470
d0f8ff38e389 more examples;
wenzelm
parents: 60450
diff changeset
   130
  qed
60450
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
   131
end
b54b913dfa6a more examples;
wenzelm
parents:
diff changeset
   132
60555
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   133
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   134
subsection \<open>Suffices-to-show\<close>
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   135
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   136
notepad
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   137
begin
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   138
  fix A B C
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   139
  assume r: "A \<Longrightarrow> B \<Longrightarrow> C"
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   140
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   141
  have C
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   142
  proof -
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   143
    show ?thesis when A (is ?A) and B (is ?B)
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   144
      using that by (rule r)
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   145
    show ?A \<proof>
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   146
    show ?B \<proof>
60555
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   147
  qed
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   148
next
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   149
  fix a :: 'a
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   150
  fix A :: "'a \<Rightarrow> bool"
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   151
  fix C
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   152
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   153
  have C
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   154
  proof -
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 63583
diff changeset
   155
    show ?thesis when "A x" (is ?A) for x :: 'a  \<comment> \<open>abstract \<^term>\<open>x\<close>\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   156
      using that \<proof>
69597
ff784d5a5bfb isabelle update -u control_cartouches;
wenzelm
parents: 63583
diff changeset
   157
    show "?A a"  \<comment> \<open>concrete \<^term>\<open>a\<close>\<close>
62314
ec0fbd1a852b more explicit dummy proofs;
wenzelm
parents: 61799
diff changeset
   158
      \<proof>
60555
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   159
  qed
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   160
end
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   161
51a6997b1384 support 'when' statement, which corresponds to 'presume';
wenzelm
parents: 60470
diff changeset
   162
end