@@ -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}
0 commit comments