Skip to content

Commit c470a83

Browse files
committed
Remove forall quantifiers in List library
1 parent e85383e commit c470a83

File tree

2 files changed

+11
-57
lines changed

2 files changed

+11
-57
lines changed

frontends/library/stainless/collection/List.scala

Lines changed: 5 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,7 @@ object ListSpecs {
10061006
case _ => false
10071007
}
10081008

1009+
@opaque
10091010
def subseqTail[T](l1: List[T], l2: List[T]): Unit = {
10101011
require(!l1.isEmpty && subseq(l1, l2))
10111012

@@ -1171,16 +1172,10 @@ object ListSpecs {
11711172
case Nil() => ()
11721173
case Cons(h, t) =>
11731174
selfContainment(t)
1174-
expandPredicate(t, t.contains, list.contains)
11751175
prependMaintainsCondition(h, t, list.contains)
11761176
}
11771177
}.ensuring(_ => list.forall(list.contains))
11781178

1179-
@opaque
1180-
def expandPredicate[T](@induct list: List[T], p1: T => Boolean, p2: T => Boolean): Unit = {
1181-
require(forall((elem: T) => p1(elem) ==> p2(elem)) && list.forall(p1))
1182-
}.ensuring(_ => list.forall(p2))
1183-
11841179
@opaque
11851180
def prependMaintainsCondition[T](elem: T, @induct list: List[T], p: T => Boolean): Unit = {
11861181
require(list.forall(p) && p(elem))
@@ -1192,10 +1187,11 @@ object ListSpecs {
11921187
}.ensuring(_ => second -- first == second -- (first - elem))
11931188

11941189
@opaque
1195-
def prependSubset[T](elem: T, @induct list: List[T]): Unit = {}.ensuring { _
1190+
def prependSubset[T](elem: T, @induct list: List[T]): Unit = {
1191+
()
1192+
}.ensuring { _
11961193
selfContainment(list)
11971194
val appended = elem :: list
1198-
expandPredicate(list, list.contains, appended.contains)
11991195
list.forall((elem :: list).contains)
12001196
}
12011197

@@ -1206,10 +1202,8 @@ object ListSpecs {
12061202
case Nil() => assert(diff.isEmpty)
12071203
case Cons(h, t) if second.contains(h) =>
12081204
restOfSetIsSubset(t, second)
1209-
expandPredicate(diff, t.contains, first.contains)
12101205
case Cons(h, t) =>
12111206
restOfSetIsSubset(t, second)
1212-
expandPredicate(t -- second, t.contains, first.contains)
12131207
prependMaintainsCondition(h, t -- second, first.contains)
12141208
}
12151209
}.ensuring(_ => (first -- second).forall(first.contains))
@@ -1304,30 +1298,20 @@ object ListSpecs {
13041298
}.ensuring { _ =>
13051299
val intersection = first & second
13061300
intersection.forall(first.contains) &&
1307-
intersection.forall(second.contains) &&
1308-
forall((elem: T) => intersection.contains(elem) == (first.contains(elem) && second.contains(elem)))
1301+
intersection.forall(second.contains)
13091302
}
13101303

1311-
@opaque
1312-
def listSubsetContainmentLemma[T](original: List[T], @induct first: List[T], second: List[T]): Unit = {
1313-
require(first.forall(second.contains))
1314-
}.ensuring(_ =>
1315-
forall((elem: T) =>
1316-
(original.contains(elem) && first.contains(elem)) ==> (original.contains(elem) && second.contains(elem))))
1317-
13181304
@opaque
13191305
def listSubsetIntersectionLemma[T](original: List[T], first: List[T], second: List[T]): Unit = {
13201306
require(first.forall(second.contains))
13211307
}.ensuring { _ =>
13221308
listIntersectionLemma(original, first)
13231309
listIntersectionLemma(original, second)
1324-
listSubsetContainmentLemma(original, first, second)
13251310

13261311
val firstIntersection = original & first
13271312
val secondIntersection = original & second
13281313

13291314
selfContainment(firstIntersection)
1330-
expandPredicate(firstIntersection, firstIntersection.contains, secondIntersection.contains)
13311315
firstIntersection.forall(secondIntersection.contains)
13321316
}
13331317

@@ -1351,32 +1335,4 @@ object ListSpecs {
13511335
}
13521336
}.ensuring(_ => list.forall(list.contains))
13531337

1354-
@opaque
1355-
def filteringWithExpandingPredicateCreatesSubsets[T](first: T Boolean, second: T Boolean, list: List[T]): Unit = {
1356-
require(forall((elem: T) first(elem) ==> second(elem)))
1357-
list match {
1358-
case Nil() =>
1359-
case Cons(h, t) =>
1360-
filteringWithExpandingPredicateCreatesSubsets(first, second, t)
1361-
val secondTailFiltered = t.filter(node => second(node))
1362-
val secondFiltered = list.filter(node => second(node))
1363-
reflexivity(secondFiltered)
1364-
assert(secondTailFiltered.forall(secondFiltered.contains))
1365-
1366-
val firstTailFiltered = t.filter(node => first(node))
1367-
assert(firstTailFiltered.forall(secondTailFiltered.contains))
1368-
1369-
if (!first(h)) {
1370-
transitivityLemma(firstTailFiltered, secondTailFiltered, secondFiltered)
1371-
} else {
1372-
transitivePredicate(h, first, second)
1373-
transitivityLemma(firstTailFiltered, secondTailFiltered, secondFiltered)
1374-
}
1375-
}
1376-
}.ensuring { _ =>
1377-
val secondFiltered = list.filter(node => second(node))
1378-
val firstFiltered = list.filter(node => first(node))
1379-
firstFiltered.forall(secondFiltered.contains)
1380-
}
1381-
13821338
}

frontends/library/stainless/collection/ListSet.scala

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ case class ListSet[T](toList: List[T]) {
2020
def ++(other: ListSet[T]): ListSet[T] = {
2121
val union = ListSetSpec.removeDuplicates(this.toList ++ other.toList)
2222
ListSet(union)
23-
}.ensuring(res forall((elem: T) (this.contains(elem) || other.contains(elem)) == res.contains(elem)))
23+
}
2424

2525
def -(elem: T): ListSet[T] = {
2626
ListSetSpec.removingFromASetResultsInASet(elem, toList)
@@ -32,18 +32,16 @@ case class ListSet[T](toList: List[T]) {
3232
ListSpecs.restOfSetIsSubset(toList, other.toList)
3333
ListSet(toList -- other.toList)
3434
}.ensuring(res
35-
forall((elem: T) (this.contains(elem) && !other.contains(elem)) == res.contains(elem)) &&
36-
(res & other).isEmpty &&
37-
res.subsetOf(this))
35+
(res & other).isEmpty &&
36+
res.subsetOf(this))
3837

3938
def &(other: ListSet[T]): ListSet[T] = {
4039
ListSetSpec.listSetIntersection(toList, other.toList)
4140
ListSpecs.listIntersectionLemma(toList, other.toList)
4241
ListSet(toList & other.toList)
4342
}.ensuring(res
44-
forall((elem: T) (this.contains(elem) && other.contains(elem)) == res.contains(elem)) &&
45-
res.subsetOf(this) &&
46-
res.subsetOf(other))
43+
res.subsetOf(this) &&
44+
res.subsetOf(other))
4745

4846
def filter(predicate: T Boolean): ListSet[T] = {
4947
ListSetSpec.filteringPreservesPredicate(toList, predicate)
@@ -184,7 +182,7 @@ object ListSetSpec {
184182
case Cons(h, t) if (t.contains(h)) removeDuplicates(t) else h :: removeDuplicates(t)
185183
case Nil() Nil[T]()
186184
}
187-
}.ensuring(res ListOps.noDuplicate(res) && forall((elem: T) list.contains(elem) == res.contains(elem)))
185+
}.ensuring(res ListOps.noDuplicate(res))
188186

189187
@opaque
190188
def listSetDiff[T](@induct first: List[T], second: List[T]): Unit = {

0 commit comments

Comments
 (0)