Open lemmy opened 2 months ago
Adding the following to SequencesExt.java
causes TLC to treat BoundedSeq
/SeqOf
strictly symbolically. However, there is no infrastructure for a hybrid value. We would have to implement a BoundedSeqValue that extends TLC's Value
class.
@TLAPlusOperator(identifier = "SeqOf", module = "SequencesExt", warn = false)
public static Value SeqOf(final Value range, final IntValue size) {
UserObj obj = new Sequences(range, size.val);
return new UserValue(obj);
}
The module
Foo
models a system where -at every step- the log is extended by a subsequence of up to lengthC
from the setS
. It is straightforward to see that the moduleBar
refinesFoo
. However, TLC fails to verify the refinement because it cannot enumerate the set of all subsequencesSeqOf(S, 42)
.Clearly, when verifying refinement, it's conceptually unnecessary for TLC to enumerate
SeqOf(S, 42)
. Instead, it would be sufficient to check something likeNextRefine
, which TLC will check if we redefineNext
withNextRefine
:However,
SeqOf
could be enhanced to symbolically check... \in SeqOf(S, C)
, similar to how TLC checksSeq(S)
:https://github.com/tlaplus/tlaplus/blob/475477653f01447f60603288a2785df1447bdbeb/tlatools/org.lamport.tlatools/src/tlc2/module/Sequences.java#L391-L411
Additionally, this new
tlc2.value.impl.Value
implementation should properly implementtlc2.value.impl.Enumerable#elements
to lazily enumerate the elements ofSeqOf
when evaluating the existential quantification\E s \in SeqOf(S,C): log' = ...
.