Skip to content

Commit feaf6f9

Browse files
committed
SequencesExt!SubSeqs
[Feature]
1 parent 254143f commit feaf6f9

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

modules/SequencesExt.tla

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,4 +280,12 @@ Zip(s, t) ==
280280
[] Len(s) = Len(t) /\ Len(s) = 0 -> << <<>>, <<>> >>
281281
\* error "Zip: sequences must have same length"
282282

283+
284+
SubSeqs(s) ==
285+
(**************************************************************************)
286+
(* The set of all subsequences of the sequence s . Note that the empty *)
287+
(* sequence <<>> is defined to be a subsequence of any sequence. *)
288+
(**************************************************************************)
289+
{ SubSeq(s, i+1, j) : i, j \in 0..Len(s) }
290+
283291
=============================================================================

tests/SequencesExtTests.tla

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
------------------------- MODULE SequencesExtTests -------------------------
2-
EXTENDS Sequences, SequencesExt, Integers, TLC, TLCExt, FiniteSets
2+
EXTENDS Sequences, SequencesExt, Integers, TLC, TLCExt, FiniteSets, FiniteSetsExt, Functions
33

44
ASSUME LET T == INSTANCE TLC IN T!PrintT("SequencesExtTests")
55

@@ -163,4 +163,33 @@ ASSUME AssertEq(FlattenSeq(Zip(<<1,3>>,<<2,4>>)), <<1, 2, 3, 4>>)
163163
ASSUME Zip(<<"a", "c">>, <<"b", "d">>) = <<<<"a">>, <<"b">>, <<"c">>, <<"d">>>>
164164
ASSUME AssertEq(FlattenSeq(Zip(<<"a", "c">>, <<"b", "d">>)), <<"a", "b", "c", "d">>)
165165

166+
-----------------------------------------------------------------------------
167+
168+
ASSUME SubSeqs(<<>>) = {<<>>}
169+
ASSUME SubSeqs(<<1>>) = {<<>>, <<1>>}
170+
ASSUME SubSeqs(<<1,1>>) = {<<>>, <<1>>, <<1,1>>}
171+
ASSUME SubSeqs(<<1,1,1>>) = {<<>>, <<1>>, <<1,1>>, <<1,1,1>>}
172+
ASSUME SubSeqs(<<1,2,3,2>>) = {<<>>, <<1>>, <<2>>, <<3>>, <<1, 2>>, <<2, 3>>, <<3, 2>>, <<1, 2, 3>>, <<2, 3, 2>>, <<1, 2, 3, 2>>}
173+
ASSUME SubSeqs([i \in 1..3 |-> i]) = {<<>>, <<1>>, <<2>>, <<3>>, <<1, 2>>, <<2, 3>>, <<1, 2, 3>>}
174+
175+
LOCAL ToSeq(fun) ==
176+
LET RECURSIVE toSeq(_,_)
177+
toSeq(f, d) ==
178+
IF d = {} THEN <<>> ELSE <<f[Min(d)]>> \o toSeq(f, d \ {Min(d)})
179+
IN toSeq(fun, DOMAIN fun)
180+
181+
LOCAL SubSeqsAlt(s) ==
182+
LET IsConsecutive(S) == S # {} => S = Min(S)..Max(S)
183+
DOMS == { sd \in SUBSET DOMAIN s : IsConsecutive(sd) }
184+
IN { ToSeq([ i \in d |-> s[i] ]) : d \in DOMS }
185+
186+
ASSUME \A seq \in BoundedSeq(1..5, 5) :
187+
/\ SubSeqs(seq) = SubSeqsAlt(seq)
188+
/\ LET ss == SubSeqs(seq)
189+
IN /\ <<>> \in ss
190+
/\ Cardinality(ss) \in 1..16
191+
/\ \A s \in ss :
192+
/\ Len(s) <= Len(seq)
193+
/\ Range(s) \subseteq Range(seq)
194+
166195
=============================================================================

0 commit comments

Comments
 (0)