每当有任何服务对其进行操作时,我都想更改对象的服务代码。假设我有一个操作适用于一个对象,该对象的服务代码将为 1,当另一个操作执行时,服务代码将再次为 2。我想将最新的服务代码保存到每个对象。不幸的是,我不能很好地设计我的谓词,这就是为什么从合金中得到谓词不一致的消息。
我尝试了一些代码来为每个对象分配服务代码。如下所示的完整代码 -
open util/ordering[Environment]
abstract sig Object{
name: String,
serviceCode: Int,
}{
serviceCode >= 0 and serviceCode <= 3
}
// Events
enum Event {Event1, Event2, Event3}
abstract sig Condition{
name: Event,
object: Object
}
abstract sig BaseOperation{
name: Event,
object: Object
// it will have more attributes than Condition later
}
abstract sig Connector{
condition: Condition,
baseOperation: BaseOperation,
}
sig Environment{
ev : set Event
}
pred execute [u:Environment, u':Environment, r:Connector] {
some e: u.ev | {
e = r.condition.name =>
u'.ev = u.ev + r.baseOperation.name
else
u'.ev = u.ev
}
}
fact {
all u:Environment-last, u':u.next, r:Connector {
execute [u, u', r]
}
}
sig Object1 extends Object{
}{
name = "Object1 Object"
}
sig Object2 extends Object{
}{
name = "Object2 Object"
}
sig Condition1 extends Condition{
}{
name = Event1
object = Object2
object.serviceCode = 1
}
sig Operation1 extends BaseOperation{
}{
name = Event2
object = Object1
object.serviceCode = 1
}
sig Operation2 extends BaseOperation{
}{
name = Event3
object = Object1
object.serviceCode = 0
}
one sig Connector1 extends Connector{
}{
condition = Condition1
baseOperation = Operation1
}
one sig Connector2 extends Connector{
}{
condition = Condition1
baseOperation = Operation2
}
fact {
Event3 !in first.ev &&
Event2 !in first.ev
}
run {Event1 in last.ev} for 10
当我只有一个操作链接到一个对象时,上面的代码可以正常工作。我在这里附上了它的图表。每当有多个操作时,合金就无法找到一个实例。需要帮助设计合金代码以实现我的目标。
另一种可能的方法可能是——我们可能有一个服务代码列表,而不是一个服务代码。考虑时间戳以及每个服务代码。然后什么时候需要找出最新的服务代码。我们可以取最大时间戳的服务代码。但我不确定如何用合金设计这个。