-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathCounting.scala
112 lines (78 loc) · 3.13 KB
/
Counting.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package distribution
import FifoNetwork._
import Networking._
import stainless.lang._
import stainless.collection._
import stainless.proof._
import stainless.annotation._
import scala.language.postfixOps
object Protocol {
import ProtocolProof._
case class Increment() extends Message
case class Deliver(i: BigInt) extends Message
case class CCounter(i: BigInt) extends State
case class VCounter(i: BigInt) extends State
case class BadState() extends State
case class ActorId1() extends ActorId
case class ActorId2() extends ActorId
// this protocol does not need a parameter
case class NoParam() extends Parameter
val actor1: ActorId = ActorId1()
val actor2: ActorId = ActorId2()
case class CountingActor(myId: ActorId) extends Actor {
require(myId == actor1)
def init()(implicit net: VerifiedNetwork) = {
require(
networkInvariant(net.param, net.states, net.messages, net.getActor) &&
appendIncrement(net.messages.getOrElse((actor1,actor1), Nil()))
)
!! (actor1,Increment())
} ensuring(_ => networkInvariant(net.param, net.states, net.messages, net.getActor))
def receivePre(sender: ActorId, m: Message)(implicit net: VerifiedNetwork) = {
networkInvariant(net.param, net.states, net.messages, net.getActor) &&
countingActorReceivePre(this, sender, m)
}
def receive(sender: ActorId, m: Message)(implicit net: VerifiedNetwork) = {
require(networkInvariant(net.param, net.states, net.messages, net.getActor) && receivePre(sender, m))
(sender, m, state) match {
case (id,Increment(),CCounter(i)) if (id == myId) =>
update (CCounter(i+1))
!! (actor2, Deliver(i+1))
!! (myId, Increment())
case _ => update(BadState())
}
} ensuring(_ => networkInvariant(net.param, net.states, net.messages, net.getActor))
}
case class CheckingActor(myId: ActorId) extends Actor {
require(myId == actor2)
def receivePre(sender: ActorId, m: Message)(implicit net: VerifiedNetwork) = {
networkInvariant(net.param, net.states, net.messages, net.getActor) &&
checkingActorReceivePre(this, sender, m)
}
def receive(sender: ActorId, m: Message)(implicit net: VerifiedNetwork) = {
require(networkInvariant(net.param, net.states, net.messages, net.getActor) && receivePre(sender, m))
check(sender == ActorId1())
(sender, m, state) match {
case (ActorId1(), Deliver(j), VCounter(k)) if (j > k) => update (VCounter(j))
case _ => update(BadState())
}
} ensuring(_ => networkInvariant(net.param, net.states, net.messages, net.getActor))
}
@ignore
def main(args: Array[String]) = {
val a1 = CountingActor(actor1)
val a2 = CheckingActor(actor2)
runActors(NoParam(), List(
(actor1, actor1, Increment()),
(actor1, actor1, Increment()),
(actor1, actor1, Increment()),
(actor1, actor1, Increment()),
(actor1, actor1, Increment()),
(actor1, actor2, Deliver(1)),
(actor1, actor2, Deliver(2)),
(actor1, actor2, Deliver(3)),
(actor1, actor2, Deliver(4)),
(actor1, actor2, Deliver(5))
))
}
}