I have
"csatis sig M w (cDIAM m fl) =
(m ∈ mops sig ∧
marity sig m = length fl ∧
w ∈ world M ∧
(∃vl. length vl = length fl ∧ rel M m (w # vl) ∧
(∀i<length vl. csatis sig M (vl ! i) (fl ! i))))"
If I unfold it, it will give:
proof (prove)
using this:
m ∈ mops sig ∧
marity sig m = length fl ∧
w ∈ world M ∧
(∃vl. length vl = length fl ∧
rel M m (w # vl) ∧
(∀i<length vl. csatis sig M (vl ! i) (fl ! i)))
Is there any thing I can do to let "unfold" automatically give me, instead of a conjunction, a list of assumptions instead, like:
using this:
m ∈ mops sig
marity sig m = length fl
w ∈ world M
(∃vl. length vl = length fl ∧
rel M m (w # vl) ∧
(∀i<length vl. csatis sig M (vl ! i) (fl ! i)))
?
I don't fully get the question, but I think you are looking for apply(intro conjI)
This is about intro but about elim, sorry for my poor presentation of the question.
If we have a definition like:
sth a b c \equiv A /\ B
and there is an assumption (assumption, not the target) sth a b c. Say, we are proving:
sth a b c ==> D
Then if we unfold sth_def, it will turn it into
A /\ B ==> D
But I do not like this, I want the goal to look like
assumptions:
- A
- B
target:
D
However, it seems not possible without opening another proof-qed block. There is "elim conjE', but it only applies to a separate proof-read block.
If it is tricky or even impossible then that is also understandable. I think it might be tricks to state definitions with conjunctions such that an "unfold" will not give a conjunction, but give a list of conjuncts that build up to the definition.
I don't understand what elim conjE is not doing but you want
Just because I do not want to open a proof-qed block. Otherwise it is what I want.
Since sometimes if I can take the conjuncts out, then I can finish it off by using (some_thm[OF some_conjunct]) with a dot. So a proof-qed block can be bulky in this case.
OF conjI
Full example:
context
fixes A B :: bool
begin
definition t where
‹t ≡ (A ∧ B)›
lemma H: ‹t ⟹ A›
sorry
thm H[unfolded t_def, OF conjI]
Thanks! My original question is actually asking, if we start the proof using t_def, then is there any method to write the definition of "t" such that
lemma H: "t ⟹ A"
unfolding t_def
does not give
proof (prove)
goal (1 subgoal):
1. A ∧ B ⟹ A
but instead, to give:
proof (prove)
goal (1 subgoal):
assumptions
-A
- B
target A
Knowing the "conjI" still makes me very happy. It is very useful!
Maybe some technology can be developed using induction principle of t I guess.
A/\ B ==> C ==> t ==> C
And use conjI to curry the A/\B maybe?
Seems to me that OF conjI strips only the first conjunct. Any thing to do to repeat the conjI until it cannot go any further?
I often start proofs with
proof (intro conjI impI allI)
And/or this thing:
method normalize_goal =
(match premises in
J[thin]: \<open>\<exists>x. _\<close> \<Rightarrow> \<open>rule exE[OF J]\<close>
\<bar> J[thin]: \<open>_ \<and> _\<close> \<Rightarrow> \<open>rule conjE[OF J]\<close>
)
....
proof normalize_goal+
Mathias Fleury said:
And/or this thing:
method normalize_goal = (match premises in J[thin]: \<open>\<exists>x. _\<close> \<Rightarrow> \<open>rule exE[OF J]\<close> \<bar> J[thin]: \<open>_ \<and> _\<close> \<Rightarrow> \<open>rule conjE[OF J]\<close> ) .... proof normalize_goal+
Isabelle does not accept this code. the method seems not recognised as a keyword.
image.png
If opening a proof block then I can just use elim. Nevertheless I have not seen the method thing and now I am curious what it is.
You need Eisabach for that
HOL-Eisbach.Eisbach_Tools (see https://isabelle.in.tum.de/website-Isabelle2024/dist/library/HOL/HOL-Eisbach/Example_Metric.html for an example)
Mathias Fleury said:
I often start proofs with
proof (intro conjI impI allI)
Aha I have it, it is in front of my office (Joking, I have heard that this is a thing for tactic writing. :-) .)
Mathias Fleury said:
HOL-Eisbach.Eisbach_Tools(see https://isabelle.in.tum.de/website-Isabelle2024/dist/library/HOL/HOL-Eisbach/Example_Metric.html for an example)
Thanks a lot and I will check it!
Mathias Fleury said:
I often start proofs with
proof (intro conjI impI allI)
why not proof (standard)?
standard can do too much
lemma "A⇧*⇧* x y"
proof standard
(*
proof (state)
goal (2 subgoals):
1. A⇧*⇧* x ?b
2. A ?b y
*)
and too little
lemma "∃x. A x ⟹ (∀x. B x ⟶ Q x)"
proof standard
(*⋀x. ∃x. A x ⟹ B x ⟶ Q x*)
so you want standard+ actually
which is also doing too much:
lemma "∃x. A x ⟹ (∀x. B x ⟶ rtranclp Q x y)"
proof standard+
(*
⋀x. ∃x. A x ⟹ B x ⟹ Q x y
*)
and it is sometimes unintuitive:
lemma "A⇧*⇧* x y"
proof standard+
(*
A⇧*⇧* x y
*)
(first example again with a +)
I have not encountered "standard". I see! The behavior onA^** indeed looks confusing.
I sometimes use safe.
But it does not do the elimination.
thanks for the examples!
Yiming Xu said:
I have not encountered "standard". I see! The behavior on
A^**indeed looks confusing.I sometimes use
safe.
proof is the same as proof standard. So it is usually not spelled out explicitly unless you really want to apply it several times
Mathias Fleury said:
Yiming Xu said:
I have not encountered "standard". I see! The behavior on
A^**indeed looks confusing.I sometimes use
safe.
proofis the same asproof standard. So it is usually not spelled out explicitly unless you really want to apply it several times
I see. That is the "proof -" is getting rid of.
Last updated: Oct 26 2025 at 08:25 UTC