0

I'm trying to prove that the frontier, interior and exterior of a set are disjoint in isabelle. On the line I have marked '***', the fact that c \<inter> d = {} clearly follows from the previous line given the assumption at the start of the block, so how would I get isabelle to understand this?

theory Scratch
imports
  "~~/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space"
  "~~/src/HOL/Probability/Sigma_Algebra"
begin

lemma boundary_disjoint: "disjoint {frontier S, interior S, interior (-S)}"
proof (rule disjointI)
  fix c d assume sets:
    "c \<in> {frontier S, interior S, interior (-S)}"
    "d \<in> {frontier S, interior S, interior (-S)}"
    and "c \<noteq> d"
  show "c \<inter> d = {}"
  proof cases
    assume "c = frontier S \<and> d = interior S"
    then show ?thesis using frontier_def by auto
  next
    assume "c = frontier S \<and> d = interior (-S)"
    have "closure S \<inter> interior (-S) = {}" by (simp add: closure_interior)
    hence "frontier S \<inter> interior (-S) = {}" using frontier_def by auto
    *** then show ?thesis by auto
  next

  qed
qed

end
simonzack
  • 19,729
  • 13
  • 73
  • 118

1 Answers1

2

In Isar, you have to explicitly reference the facts you want to use. If you say that your goal follows from the previous line and the local assumption you made, you should give the assumption a name by writing assume A: "c = frontier S ∧ d = interior (-S)", and then you can prove your goal by with A have ?thesis by auto.

Why did I write have and not show? Well, there is another problem. You did a proof cases, but that uses the rule (P ⟹ Q) ⟹ (¬P ⟹ Q) ⟹ Q, i.e. it does a case distinction of the kind ‘Is P true or false?’. That is not what you want here.

One way to do your case distiction is by something like this:

from sets show "c ∩ d = {}"
  proof (elim singletonE insertE)

insertE is an elimination rule for facts of the form x ∈ insert y A, and since {a,b,c} is just syntactic sugar for insert a (insert b (insert c A)), this is what you want. singletonE is similar, but specifically for x ∈ {y}; using singletonE instead of insertE means you do not get trivial cases with assumptions like x ∈ {}.

This gives you 9 cases, of which 3 are trivially solved by simp_all. The rest you have to prove yourself in Isar if you want to, but they can be solved quite easily by auto as well:

from sets and `c ≠ d` show "c ∩ d = {}"
  by (auto simp: frontier_def closure_def interior_closure)
Manuel Eberl
  • 7,858
  • 15
  • 24