Closed binghe closed 4 months ago
By the way, it's confirmed that even the new LET_ELIM_TAC
cannot deal with LETs hidden inside existential quantifiers, which can be handled by UNBETA_TAC
.
Some examples are broken, I will fix them.
In examples/algebra/lib/helperScript.sml
, I meet the following proof goal:
val it =
Proof manager status: 1 proof.
1. Incomplete goalstack:
Initial goal:
!s. FINITE s ==>
!P. (let
u = {x | x IN s /\ P x};
v = {x | x IN s /\ ~P x}
in
FINITE u /\ FINITE v /\ s =|= u # v)
: proofs
> val it = (): unit
And after rw_tac std_ss[]
, the conjunctions FINITE u /\ FINITE v /\ s =|= u # v
inside let
is not stripped:
1 subgoal:
val it =
FINITE u /\ FINITE v /\ s =|= u # v
------------------------------------
0. FINITE s
1. Abbrev (u = {x | x IN s /\ P x})
2. Abbrev (v = {x | x IN s /\ ~P x})
: proof
It seems that the other STRIP_TAC
inside RW_TAC
does not touch conjunctions inside let
, and the CONJ_TAC
I removed, has caused the present issue.
I'm going to close this PR. (My other proofs do not rely on the changed LET_ELIM_TAC
)
Hi,
Per our (offline) discussion, this PR makes
LET_ELIM_TAC
(part ofRW_TAC
, no documentation) more useful by not breaking the current conjuncted goal. The behavior of RW_TAC, which contains LET_ELIM_TAC, is not changed, because RW_TAC will do STRIP_TAC (which contains CONJ_TAC) after calling LET_ELIM_TAC.For example, suppose I have the following theorem in the middle of its proof:
I want to have all LET variables converted to abbreviations, while still keeping the single conjuncted goal not broken into subgoals (because there are still shared tactics to execute). But either
RW_TAC
orLET_ELIM_TAC
cannot do this job, as they both doSTRIP_TAC
internally.Now the new
LET_ELIM_TAC
produces what I needed:The core library can still be built. Let's see how the docker CI build goes.
--Chun