diff --git a/testcases/stringrender/Example-Stack.scala b/testcases/stringrender/Example-Stack.scala index 532a9a5cc8633af6b5893c468762a008d8fd60f5..05943c72e59fade4c78a3788c17ae031a286f92d 100644 --- a/testcases/stringrender/Example-Stack.scala +++ b/testcases/stringrender/Example-Stack.scala @@ -1,4 +1,5 @@ import leon.collection._ +import leon.collection.List import leon.lang._ import leon.proof.check import leon.lang.synthesis._ @@ -87,76 +88,10 @@ object Concurrency { case class Configuration[Tid,MethodName,ArgData,LocalState,GlobalState]( gs: GlobalState, - control: Map[Tid,Option[(MethodName,ArgData,LocalState)]] + control: List[(Tid,Option[(MethodName,ArgData,LocalState)])] ) - - /** Describes valid executions of the library. - - * This function takes as input: a library `lib', an initial configuration - * `cfg', a sequence of configuration `cfgs', and a sequence of events - * `events'. - - * It returns true if `lib' can produce the sequence of events `events', - * starting from the initial configuration `cfg', and going through the - * configurations `cfgs'. A consequence is that the lists `events' and - * `cfgs' must have the same length. - */ - - def isLibraryExecution[Tid,MethodName,ArgData,RetData,LocalState,GlobalState]( - lib: Library[MethodName,ArgData,RetData,LocalState,GlobalState], - cfg: Configuration[Tid,MethodName,ArgData,LocalState,GlobalState], - cfgs: List[Configuration[Tid,MethodName,ArgData,LocalState,GlobalState]], - events: List[Event[Tid,MethodName,ArgData,RetData]] - ): Boolean = { - - val Library(methods) = lib - val Configuration(gs,control) = cfg - - - (cfgs,events) match { - case (Nil(),Nil()) => true - - // call action (doesn't change the global state) - case (Cons(Configuration(next_gs,next_control), tail_cfg), Cons(CallEvent(tid,m,arg), evs)) => - val Method(initials,_,_) = methods(m) - control.getOrElse(tid,None()) == None[(MethodName,ArgData,LocalState)]() && - next_control == control.updated(tid, Some((m,arg,initials(arg)))) && - next_gs == gs && - isLibraryExecution(lib,Configuration(next_gs,next_control),tail_cfg,evs) - - - // return action (doesn't change the global state) - case (Cons(Configuration(next_gs,next_control), tail_cfg), Cons(RetEvent(tid,m,arg,rv), evs)) => - val Method(_,_,finals) = methods(m) - control.getOrElse(tid,None()) match { - case None() => false - case Some((m2,arg2,q)) => - m == m2 && arg2 == arg && - finals(q) == Some(rv) && - next_control == control.updated(tid, None()) && - next_gs == gs && - isLibraryExecution(lib,Configuration(next_gs,next_control),tail_cfg,evs) - } - - - // internal action - case (Cons(Configuration(next_gs,next_control), tail_cfg), Cons(InternalEvent(tid), evs)) => - control.getOrElse(tid,None()) match { - case None() => false - case Some((m,arg,q)) => - val Method(_,transitions,_) = methods(m) - val (next_q, next_gs2) = transitions(q,gs) - next_gs2 == next_gs && - next_control == control.updated(tid, Some((m,arg,next_q))) && - isLibraryExecution(lib,Configuration(next_gs,next_control),tail_cfg,evs) - } - - case _ => false - } - } - /** This class describes client's of a library. * * A client can be composed of multiple thread. It specifies for each @@ -165,53 +100,6 @@ object Concurrency { */ case class Client[Tid,MethodName,ArgData,RetData](threads: Tid => List[Event[Tid,MethodName,ArgData,RetData]]) - - - - /** Helper method to define valid client executions. - * - * Takes as input a sequence of a thread `tid', and a sequence of events - * `evs', and returns the list of tuples in (MethodName,ArgData,RetData) - * corresponding to the return events of `tid'. - */ - - - def isTidExecution[Tid,MethodName,ArgData,RetData]( - check_tid: Tid, - evs: List[Event[Tid,MethodName,ArgData,RetData]], - clievs: List[Event[Tid,MethodName,ArgData,RetData]] - ): Boolean = { - (evs,clievs) match { - case (Nil(),Nil()) => true - case (Cons(CallEvent(tid,_,_), xs),_) if (tid != check_tid) => isTidExecution(check_tid,xs,clievs) - case (Cons(RetEvent(tid,_,_,_), xs),_) if (tid != check_tid) => isTidExecution(check_tid,xs,clievs) - case (Cons(InternalEvent(_), xs),_) => isTidExecution(check_tid,xs,clievs) - case (Cons(CallEvent(tid,m,arg), xs), Cons(CallEvent(tid2,m2,arg2), ys)) - if (tid == check_tid && tid == tid2 && arg == arg2) => isTidExecution(check_tid,xs,ys) - case (Cons(RetEvent(tid,m,arg,rv), xs), Cons(RetEvent(tid2,m2,arg2,rv2), ys)) - if (tid == check_tid && tid == tid2 && arg == arg2 && rv == rv2) => isTidExecution(check_tid,xs,ys) - case _ => false - } - } - - /** Describes executions which correspond to a particular client. - * - * Takes as input a list of threads `tids', a client `cli', and a sequence - * of events `events', and checks for every thread in `tid', whether the - * sequence expected by the client `cli' for thread `tid' corresponds to the - * one given by `events'. - */ - - def isClientExecution[Tid,MethodName,ArgData,RetData]( - tids: List[Tid], - cli: Client[Tid,MethodName,ArgData,RetData], - events: List[Event[Tid,MethodName,ArgData,RetData]]) = { - - val Client(threads) = cli - - tids.forall{ (tid: Tid) => isTidExecution(tid, events, threads(tid)) } - } - } object AtomicStack { @@ -296,8 +184,6 @@ object AtomicStack { } val libAtomicStack = Library[StackMethodName,Option[BigInt],Option[BigInt],StackState,List[BigInt]](methods) - - val initCfg: Configuration[StackTid,StackMethodName,Option[BigInt],StackState,List[BigInt]] = Configuration(List(), Map()) def threads(tid: StackTid): List[Event[StackTid,StackMethodName,Option[BigInt],Option[BigInt]]] = tid match { @@ -315,17 +201,6 @@ object AtomicStack { val client: Client[StackTid,StackMethodName,Option[BigInt],Option[BigInt]] = Client(threads) - - def isBadExecution( - cfgs: List[Configuration[StackTid,StackMethodName,Option[BigInt],StackState,List[BigInt]]], - events: List[Event[StackTid,StackMethodName,Option[BigInt],Option[BigInt]]] - ): Boolean = { - - !isLibraryExecution(libAtomicStack,initCfg,cfgs,events) || - !isClientExecution(List[StackTid](T1(),T2()), client, events) - - } holds - def threadToStringSimplest(p: StackTid): String = { ???[String] } ensuring { @@ -388,16 +263,16 @@ object AtomicStack { // Warning: Spacing differs from records to records. // Warning: The displaying of a tuple might depend on its operands. - /*def configurationToString(p: List[Configuration[StackTid, StackMethodName, Option[BigInt], StackState, List[BigInt]]]): String = { + def configurationToString(p: List[Configuration[StackTid, StackMethodName, Option[BigInt], StackState, List[BigInt]]]): String = { ???[String] } ensuring { res => (p, res) passes { - case Cons(Configuration(Nil(), Map(T1() -> Some((Push(), Some(BigInt(5)), ValueState(BigInt(5)))))), - Cons(Configuration(Cons(5, Nil()), Map(T1() -> Some((Push(), Some(BigInt(5)), FinalState())))), - Cons(Configuration(Cons(5, Nil()), Map(T2() -> Some((Pop(), None(), InitState())), T1() -> Some((Push(), Some(BigInt(5)), FinalState())))), - Cons(Configuration(Cons(5, Nil()), Map(T2() -> Some((Pop(), None(), InitState())), T1() -> None())), - Cons(Configuration(Nil(), Map(T2() -> Some((Pop(), None(), ValueState(BigInt(5)))), T1() -> None())), - Cons(Configuration(Nil(), Map(T2() -> None(), T1() -> None())), Nil())))))) => + case Cons(Configuration(Nil(), Cons((T1(), Some((Push(), Some(BigInt(5)), ValueState(BigInt(5))))), Nil())), + Cons(Configuration(Cons(BigInt(5), Nil()), Cons((T1(), Some((Push(), Some(BigInt(5)), FinalState()))), Nil())), + Cons(Configuration(Cons(BigInt(5), Nil()), Cons((T2(), Some((Pop(), None(), InitState()))), Cons((T1(), Some((Push(), Some(BigInt(5)), FinalState()))), Nil()))), + Cons(Configuration(Cons(BigInt(5), Nil()), Cons((T2(), Some((Pop(), None(), InitState()))), Cons((T1(), None()), Nil()))), + Cons(Configuration(Nil(), Cons((T2(), Some((Pop(), None(), ValueState(BigInt(5))))), Cons((T1(), None()), Nil()))), + Cons(Configuration(Nil(), Cons((T2(), None()), Cons((T1(), None()), Nil()))), Nil())))))) => """([], { T1 -> Push(5): ValueState(5) }) @@ -433,7 +308,7 @@ object AtomicStack { } } - + /* /// Out of order configurationToString def configurationToStringOOO(p: List[Configuration[StackTid, StackMethodName, Option[BigInt], StackState, List[BigInt]]]): String = { ???[String]