I am using TLAPS from branch "updated_enabled_cdot".
If there is any temporal assumption in the context, ENABLEDrules fails. This is true even if that assumption is irrelevant to the current step (but was needed for previous steps). I have not found a way to hide an unnamed assumption from a step. I've attached various attempts I've made below.
which requires me to have a temporal assumption in context, because the statement is not true if the assumption is not true. I am not sure how to prove this lemma given this limitation.
I don't believe there is a way for me to restructure this without any assumptions, even by moving the lemma into the theorem, but even if I could it would be very unreadable.
Q == terminate' = FALSE
P == terminate' = terminate
\* Example 1 - works */
LEMMA ENABLED Q => ENABLED P
PROOF
<1>. Q => P
OMITTED
<1>. QED
BY ENABLEDrules
\* Example 2 - works */
LEMMA ASSUME TRUE PROVE ENABLED Q => ENABLED P
PROOF
<1>. Q => P
OMITTED
<1>. QED
BY ENABLEDrules
\* Example 3 - doesn't work */
LEMMA ASSUME []TRUE PROVE ENABLED Q => ENABLED P
PROOF
<1>. Q => P
OMITTED
<1>. QED
BY ENABLEDrules
\*ENABLEDrules depends on assumptions of level > 1
\*
\*
\*Obligation:
\*
\*ASSUME NEW VARIABLE x,
\* NEW VARIABLE terminate,
\* []TRUE ,
\* Q => P ,
\* TRUE
\*PROVE ENABLED Q => ENABLED P
\* Example 4 - doesn't work */
LEMMA ASSUME Q => P
PROVE ENABLED Q => ENABLED P
PROOF BY ENABLEDrules
\*ENABLEDrules depends on assumptions of level > 1
\*
\*
\*Obligation:
\*
\*ASSUME NEW VARIABLE x,
\* NEW VARIABLE terminate,
\* Q => P ,
\* TRUE
\*PROVE ENABLED Q => ENABLED P
\* Example 5 - doesn't work */
LEMMA ASSUME ((terminate = TRUE) => (terminate' = FALSE))
PROVE (ENABLED (terminate = TRUE) => ENABLED (terminate' = FALSE))
PROOF
<1>. QED
BY ENABLEDrules
\*ENABLEDrules depends on assumptions of level > 1
\*
\*
\*Obligation:
\*
\*ASSUME NEW VARIABLE x,
\* NEW VARIABLE terminate,
\* terminate = TRUE => terminate' = FALSE ,
\* TRUE
\*PROVE ENABLED (terminate = TRUE) => ENABLED (terminate' = FALSE)
\* Example 6 - doesn't work */
PROPOSITION ASSUME [](terminate = TRUE)
PROVE (ENABLED (terminate' = TRUE) => ENABLED (UNCHANGED terminate))
PROOF
<1>. (terminate = TRUE) /\ (terminate = TRUE)'
BY PTL
<1>. (terminate' = TRUE) => (UNCHANGED terminate)
OBVIOUS
<1>. QED \* fails, see status below
BY ENABLEDrules
\*ENABLEDrules depends on assumptions of level > 1
\*
\*
\*Obligation:
\*
\*ASSUME NEW VARIABLE x,
\* NEW VARIABLE terminate,
\* [](terminate = TRUE) ,
\* terminate = TRUE /\ (terminate = TRUE)' ,
\* terminate' = TRUE => UNCHANGED terminate ,
\* TRUE
\*PROVE ENABLED (terminate' = TRUE) => ENABLED UNCHANGED terminate