diff --git a/modules/SequencesExt.tla b/modules/SequencesExt.tla index 2183f30..b828acb 100644 --- a/modules/SequencesExt.tla +++ b/modules/SequencesExt.tla @@ -167,7 +167,8 @@ SelectInSeq(seq, Test(_)) == (* FALSE for all elements. *) (*************************************************************************) SelectInSubSeq(seq, from, to, Test(_)) == - SelectInSeq(SubSeq(seq, from, to), Test) + LET I == { i \in from..to : Test(seq[i]) } + IN IF I # {} THEN Min(I) ELSE 0 (*************************************************************************) (* Selects the index of the last element such that Test(seq[i]) is true *) @@ -183,7 +184,8 @@ SelectLastInSeq(seq, Test(_)) == (* FALSE for all elements. *) (*************************************************************************) SelectLastInSubSeq(seq, from, to, Test(_)) == - SelectLastInSeq(SubSeq(seq, from, to), Test) + LET I == { i \in from..to : Test(seq[i]) } + IN IF I # {} THEN Max(I) ELSE 0 ----------------------------------------------------------------------------- diff --git a/tests/SequencesExtTests.tla b/tests/SequencesExtTests.tla index 7ac3f94..3ab2732 100644 --- a/tests/SequencesExtTests.tla +++ b/tests/SequencesExtTests.tla @@ -447,6 +447,26 @@ ASSUME AssertEq(SelectLastInSubSeq(<<>>, 1, Len(<<>>), Op), 0) ASSUME AssertEq(SelectLastInSubSeq(<<1,1,2>> , 1, 3, LAMBDA e : e = 1), 2) ASSUME AssertEq(SelectLastInSubSeq(<<1,1,2,2>>, 2, 4, LAMBDA e : e = 2), 4) +SelectInSubSeqPure(seq, from, to, Test(_)) == + LET I == { i \in from..to : Test(seq[i]) } + IN IF I # {} THEN CHOOSE i \in I : \A j \in I : i <= j ELSE 0 + +SelectLastInSubSeqPure(seq, from, to, Test(_)) == + LET I == { i \in from..to : Test(seq[i]) } + IN IF I # {} THEN CHOOSE i \in I : \A j \in I : i >= j ELSE 0 + +ASSUME AssertEq(SelectInSubSeq(<<1,1,2>>, 2, 3, LAMBDA e : e = 1), SelectInSubSeqPure(<<1,1,2>>, 2, 3, LAMBDA e : e = 1)) +ASSUME AssertEq(SelectInSubSeq(<<1,1,2,2>>, 2, 4, LAMBDA e : e = 2), SelectInSubSeqPure(<<1,1,2,2>>, 2, 4, LAMBDA e : e = 2)) +ASSUME AssertEq(SelectLastInSubSeq(<<1,1,2,2>>, 2, 4, LAMBDA e : e = 2), SelectLastInSubSeqPure(<<1,1,2,2>>, 2, 4, LAMBDA e : e = 2)) + +ASSUME \A seq \in BoundedSeq(1..3, 4): + \A from \in 1..Len(seq) + 1, to \in 0..Len(seq): + \A v \in 1..3: + /\ AssertEq(SelectInSubSeq(seq, from, to, LAMBDA e : e = v), + SelectInSubSeqPure(seq, from, to, LAMBDA e : e = v)) + /\ AssertEq(SelectLastInSubSeq(seq, from, to, LAMBDA e : e = v), + SelectLastInSubSeqPure(seq, from, to, LAMBDA e : e = v)) + ----------------------------------------------------------------------------- ASSUME AssertEq(Suffixes(<<>>), {<<>>})