@@ -1146,6 +1146,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
11461146 relevantChunks,
11471147 formalQVars,
11481148 And (condOfInvOfLoc, And (imagesOfFormalQVars)),
1149+ None ,
11491150 resource,
11501151 rPerm,
11511152 chunkOrderHeuristics,
@@ -1192,6 +1193,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
11921193 relevantChunks,
11931194 formalQVars,
11941195 And (condOfInvOfLoc, And (imagesOfFormalQVars)),
1196+ None ,
11951197 resource,
11961198 lossOfInvOfLoc,
11971199 chunkOrderHeuristics,
@@ -1259,6 +1261,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
12591261 relevantChunks,
12601262 codomainQVars,
12611263 And (codomainQVars.zip(arguments).map { case (r, e) => r === e }),
1264+ Some (arguments),
12621265 resource,
12631266 rPerm,
12641267 chunkOrderHeuristics,
@@ -1302,6 +1305,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
13021305 relevantChunks,
13031306 codomainQVars,
13041307 And (codomainQVars.zip(arguments).map { case (r, e) => r === e }),
1308+ Some (arguments),
13051309 resource,
13061310 permissions,
13071311 chunkOrderHeuristics,
@@ -1339,6 +1343,9 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
13391343 relevantChunks : Seq [QuantifiedBasicChunk ],
13401344 codomainQVars : Seq [Var ], /* rs := r_1, ..., r_m */
13411345 condition : Term , // c(rs)
1346+ optQVarValues : Option [Seq [Term ]], /* optionally actual known values vs := v_1, ..., v_m for all codomainQVars
1347+ (if we're consuming a single location), i.e., if condition is
1348+ forall i :: r_i == v_i */
13421349 resource : ast.Resource , // field f: e_1(rs).f; or predicate P: P(es); or magic wand
13431350 perms : Term , // p(rs)
13441351 chunkOrderHeuristic : Seq [QuantifiedBasicChunk ] => Seq [QuantifiedBasicChunk ],
@@ -1409,7 +1416,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
14091416 else {
14101417 val (permissionConstraint, depletedCheck) =
14111418 createPermissionConstraintAndDepletedCheck(
1412- codomainQVars, condition, perms,constrainPermissions, ithChunk, ithPTaken, v)
1419+ codomainQVars, condition, optQVarValues, perms, constrainPermissions, ithChunk, ithPTaken, v)
14131420
14141421 if (constrainPermissions) {
14151422 v.decider.prover.comment(s " Constrain original permissions $perms" )
@@ -1459,6 +1466,7 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
14591466
14601467 private def createPermissionConstraintAndDepletedCheck (codomainQVars : Seq [Var ], /* rs := r_1, ..., r_m */
14611468 condition : Term , // c(rs)
1469+ optQVarValues : Option [Seq [Term ]], /* vs := v_1, ..., v_m if c is r_1 == v_1 && ... */
14621470 perms : Term , // p(rs)
14631471 constrainPermissions : Boolean ,
14641472 ithChunk : QuantifiedBasicChunk ,
@@ -1499,8 +1507,14 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
14991507 (quantifiedPermissionConstraint.map(_.instantiate(args)),
15001508 quantifiedDepletedCheck.instantiate(args))
15011509 case None =>
1502- (quantifiedPermissionConstraint,
1503- quantifiedDepletedCheck)
1510+ optQVarValues match {
1511+ case Some (values) =>
1512+ (quantifiedPermissionConstraint.map(_.instantiate(values)),
1513+ quantifiedDepletedCheck)
1514+ case _ =>
1515+ (quantifiedPermissionConstraint,
1516+ quantifiedDepletedCheck)
1517+ }
15041518 }
15051519
15061520 (permissionConstraint.getOrElse(True ), depletedCheck)
0 commit comments