summaryrefslogtreecommitdiff
path: root/Chalice/src/main/scala
diff options
context:
space:
mode:
authorGravatar stefanheule <unknown>2012-02-25 03:21:49 -0800
committerGravatar stefanheule <unknown>2012-02-25 03:21:49 -0800
commitdc8a86355f0d00e20ab13a5e2dcef0966b91d63f (patch)
tree32c6f05caf8a60325cf202ea839f5e067e6570fb /Chalice/src/main/scala
parent894fcf99e97bbe80b153e54e2d8723dedfa8a991 (diff)
Chalice: add axiom relating different triggers.
Diffstat (limited to 'Chalice/src/main/scala')
-rw-r--r--Chalice/src/main/scala/Translator.scala5
1 files changed, 4 insertions, 1 deletions
diff --git a/Chalice/src/main/scala/Translator.scala b/Chalice/src/main/scala/Translator.scala
index 6c7f3b50..be641169 100644
--- a/Chalice/src/main/scala/Translator.scala
+++ b/Chalice/src/main/scala/Translator.scala
@@ -207,8 +207,10 @@ class Translator {
val inArgs = (f.ins map {i => Boogie.VarExpr(i.UniqueName)});
val args = VarExpr("this") :: inArgs;
val formals = BVar(HeapName, theap) :: BVar(MaskName, tmask) :: BVar(SecMaskName, tmask) :: BVar("this", tref) :: (f.ins map Variable2BVar);
+ val formals2 = BVar(HeapName+"2", theap) :: BVar(MaskName+"2", tmask) :: BVar(SecMaskName+"2", tmask) :: Nil;
val applyF = FunctionApp(functionName(f), List(etran.Heap, etran.Mask, etran.SecMask) ::: args);
val trigger = FunctionApp(functionName(f)+"#trigger", List(etran.Heap, etran.Mask, etran.SecMask) ::: args);
+ val trigger2 = FunctionApp(functionName(f)+"#trigger", VarExpr(HeapName+"2") :: VarExpr(MaskName+"2") :: VarExpr(SecMaskName+"2") :: args);
val pre = Preconditions(f.spec).foldLeft(BoolLiteral(true): Expression)({ (a, b) => And(a, b) });
/** Limit application of the function by introducing a second (limited) function */
@@ -250,7 +252,8 @@ class Translator {
else
Nil) :::
Boogie.Function(functionName(f) + "#trigger", formals, BVar("$myresult", tbool)) ::
- Axiom(new Boogie.Forall(formals, new Trigger(trigger), trigger ==@ true)) :: Nil
+ Axiom(new Boogie.Forall(formals, new Trigger(trigger), trigger ==@ true)) ::
+ Axiom(new Boogie.Forall(formals ::: formals2, new Trigger(List(trigger,trigger2)), trigger ==@ trigger2)) :: Nil
}
def framingAxiom(f: Function): List[Decl] = {