Skip to content

Commit 2af1a00

Browse files
authored
Marking HasDomain terms as global to fix issue #954 (#955)
1 parent 3e24b7a commit 2af1a00

File tree

7 files changed

+22
-20
lines changed

7 files changed

+22
-20
lines changed

silver

src/main/scala/decider/PathConditions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -679,6 +679,8 @@ object PathConditions {
679679
assumption match {
680680
case quantification: Quantification => quantification.isGlobal
681681
case _: IsReadPermVar => true
682+
case hd: HasDomain => hd.isGlobal
683+
case hd: HasPredicateDomain => hd.isGlobal
682684
case _ => false
683685
}
684686
}

src/main/scala/decider/TermToSMTLib2Converter.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ class TermToSMTLib2Converter
263263

264264
case Domain(id, fvf) => parens(text("$FVF.domain_") <> id <+> render(fvf))
265265

266-
case HasDomain(id, fvf) => parens(text("$FVF.has_domain_") <> id <+> render(fvf))
266+
case HasDomain(id, fvf, _) => parens(text("$FVF.has_domain_") <> id <+> render(fvf))
267267

268268
case Lookup(field, fvf, at) => //fvf.sort match {
269269
// case _: sorts.PartialFieldValueFunction =>
@@ -284,7 +284,7 @@ class TermToSMTLib2Converter
284284

285285
case PredicateDomain(id, psf) => parens(text("$PSF.domain_") <> id <+> render(psf))
286286

287-
case HasPredicateDomain(id, psf) => parens(text("$PSF.has_domain_") <> id <+> render(psf))
287+
case HasPredicateDomain(id, psf, _) => parens(text("$PSF.has_domain_") <> id <+> render(psf))
288288

289289
case PredicateLookup(id, psf, args) =>
290290
val snap: Term = toSnapTree(args)

src/main/scala/decider/TermToZ3APIConverter.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ class TermToZ3APIConverter
406406

407407
case Domain(id, fvf) => createApp("$FVF.domain_" + id, Seq(fvf), term.sort)
408408

409-
case HasDomain(id, fvf) => createApp("$FVF.has_domain_" + id, Seq(fvf), term.sort)
409+
case HasDomain(id, fvf, _) => createApp("$FVF.has_domain_" + id, Seq(fvf), term.sort)
410410

411411
case Lookup(field, fvf, at) =>
412412
createApp("$FVF.lookup_" + field, Seq(fvf, at), term.sort)
@@ -420,7 +420,7 @@ class TermToZ3APIConverter
420420

421421
case PredicateDomain(id, psf) => createApp("$PSF.domain_" + id, Seq(psf), term.sort)
422422

423-
case HasPredicateDomain(id, psf) => createApp("$PSF.has_domain_" + id, Seq(psf), term.sort)
423+
case HasPredicateDomain(id, psf, _) => createApp("$PSF.has_domain_" + id, Seq(psf), term.sort)
424424

425425
case PredicateLookup(id, psf, args) =>
426426
val snap: Term = toSnapTree(args)

src/main/scala/rules/QuantifiedChunkSupport.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -526,12 +526,12 @@ object quantifiedChunkSupporter extends QuantifiedChunkSupport {
526526

527527
val (domainTerm, hasDomain) = resource match {
528528
case field: ast.Field =>
529-
(Domain(field.name, sm), HasDomain(field.name, sm))
529+
(Domain(field.name, sm), HasDomain(field.name, sm, relevantQvars.isEmpty))
530530
case predicate: ast.Predicate =>
531-
(PredicateDomain(predicate.name, sm), HasPredicateDomain(predicate.name, sm))
531+
(PredicateDomain(predicate.name, sm), HasPredicateDomain(predicate.name, sm, relevantQvars.isEmpty))
532532
case wand: ast.MagicWand =>
533533
val mwi = MagicWandIdentifier(wand, s.program).toString
534-
(PredicateDomain(mwi, sm), HasPredicateDomain(mwi, sm))
534+
(PredicateDomain(mwi, sm), HasPredicateDomain(mwi, sm, relevantQvars.isEmpty))
535535
}
536536

537537
val qvarInDomainOfSummarisingSm = SetIn(qvar, domainTerm)

src/main/scala/state/Terms.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,15 +2200,15 @@ object Domain extends CondFlyweightTermFactory[(String, Term), Domain] {
22002200

22012201
/** Marks FVFs that have a defined domain (i.e. for which some information is available about Domain(field, fvf)).
22022202
* Only for these FVFs is it useful to trigger the extensionality axiom. */
2203-
class HasDomain(val field: String, val fvf: Term) extends Term with ConditionalFlyweight[(String, Term), HasDomain] {
2203+
class HasDomain(val field: String, val fvf: Term, val isGlobal: Boolean) extends Term with ConditionalFlyweight[(String, Term, Boolean), HasDomain] {
22042204
utils.assertSort(fvf, "field value function", "FieldValueFunction", _.isInstanceOf[sorts.FieldValueFunction])
22052205

22062206
val sort = sorts.Bool
2207-
override val equalityDefiningMembers: (String, Term) = (field, fvf)
2207+
override val equalityDefiningMembers: (String, Term, Boolean) = (field, fvf, isGlobal)
22082208
}
22092209

2210-
object HasDomain extends CondFlyweightTermFactory[(String, Term), HasDomain] {
2211-
override def actualCreate(args: (String, Term)): HasDomain = new HasDomain(args._1, args._2)
2210+
object HasDomain extends CondFlyweightTermFactory[(String, Term, Boolean), HasDomain] {
2211+
override def actualCreate(args: (String, Term, Boolean)): HasDomain = new HasDomain(args._1, args._2, args._3)
22122212
}
22132213

22142214
class FieldTrigger(val field: String, val fvf: Term, val at: Term) extends Term with ConditionalFlyweight[(String, Term, Term), FieldTrigger] {
@@ -2259,14 +2259,14 @@ object PredicateDomain extends CondFlyweightTermFactory[(String, Term), Predicat
22592259
}
22602260

22612261
/** Like HasDomain, but for predicate snap functions; see comment above. */
2262-
class HasPredicateDomain(val predname: String, val psf: Term) extends Term with ConditionalFlyweight[(String, Term), HasPredicateDomain] {
2262+
class HasPredicateDomain(val predname: String, val psf: Term, val isGlobal: Boolean) extends Term with ConditionalFlyweight[(String, Term, Boolean), HasPredicateDomain] {
22632263
utils.assertSort(psf, "predicate snap function", "PredicateSnapFunction", _.isInstanceOf[sorts.PredicateSnapFunction])
22642264
val sort = sorts.Bool
2265-
override val equalityDefiningMembers: (String, Term) = (predname, psf)
2265+
override val equalityDefiningMembers: (String, Term, Boolean) = (predname, psf, isGlobal)
22662266
}
22672267

2268-
object HasPredicateDomain extends CondFlyweightTermFactory[(String, Term), HasPredicateDomain] {
2269-
override def actualCreate(args: (String, Term)): HasPredicateDomain = new HasPredicateDomain(args._1, args._2)
2268+
object HasPredicateDomain extends CondFlyweightTermFactory[(String, Term, Boolean), HasPredicateDomain] {
2269+
override def actualCreate(args: (String, Term, Boolean)): HasPredicateDomain = new HasPredicateDomain(args._1, args._2, args._3)
22702270
}
22712271

22722272
class PredicateTrigger(val predname: String, val psf: Term, val args: Seq[Term]) extends Term with ConditionalFlyweight[(String, Term, Seq[Term]), PredicateTrigger] {

src/main/scala/state/Utils.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ package object utils {
124124
val (vs, ts) = l.bindings.toSeq.unzip
125125
vs ++ ts :+ l.body
126126
case Domain(_, fvf) => fvf :: Nil
127-
case HasDomain(_, fvf) => fvf :: Nil
127+
case HasDomain(_, fvf, _) => fvf :: Nil
128128
case Lookup(_, fvf, at) => fvf :: at :: Nil
129129
case PermLookup(_, pm, at) => pm :: at :: Nil
130130
case PredicateDomain(_, psf) => psf :: Nil
131-
case HasPredicateDomain(_, psf) => psf :: Nil
131+
case HasPredicateDomain(_, psf, _) => psf :: Nil
132132
case PredicateLookup(_, psf, args) => Seq(psf) ++ args
133133
case PredicatePermLookup(_, pm, args) => Seq(pm) ++ args
134134
case FieldTrigger(_, fvf, at) => fvf :: at :: Nil
@@ -247,13 +247,13 @@ package object utils {
247247
// case Distinct(ts) => Distinct(ts map go)
248248
case Let(bindings, body) => Let(bindings map (p => go(p._1) -> go(p._2)), go(body))
249249
case Domain(f, fvf) => Domain(f, go(fvf))
250-
case HasDomain(f, fvf) => HasDomain(f, go(fvf))
250+
case HasDomain(f, fvf, g) => HasDomain(f, go(fvf), g)
251251
case Lookup(f, fvf, at) => Lookup(f, go(fvf), go(at))
252252
case PermLookup(field, pm, at) => PermLookup(field, go(pm), go(at))
253253
case FieldTrigger(f, fvf, at) => FieldTrigger(f, go(fvf), go(at))
254254

255255
case PredicateDomain(p, psf) => PredicateDomain(p, go(psf))
256-
case HasPredicateDomain(p, psf) => HasPredicateDomain(p, go(psf))
256+
case HasPredicateDomain(p, psf, g) => HasPredicateDomain(p, go(psf), g)
257257
case PredicateLookup(p, psf, args) => PredicateLookup(p, go(psf), args map go)
258258
case PredicatePermLookup(predname, pm, args) => PredicatePermLookup(predname, go(pm), args map go)
259259
case PredicateTrigger(p, psf, args) => PredicateTrigger(p, go(psf), args map go)

0 commit comments

Comments
 (0)