首先,使用正确的术语,当谓词为真时,什么都不会发生;相反,它更像是一个实例(将原子分配给集合)满足(或不满足)某些条件,从而使谓词为真(或假)。
此外,您的模型不完整,因为没有sig
声明Color
(应该包括一个名为 的属性Red
)。
我假设您想模拟一个包含交通信号灯的十字路口的世界,如果是这样,我将使用以下模型:
abstract sig Color {}
one sig Red,Yellow,Green extends Color {}
sig Light {
color: Color
}
sig Junction {
lights : set Light
}
// This is just for realism, make sure each light belongs to exactly one junction
fact {
Light = Junction.lights
no x,y:Junction | x!=y and some x.lights & y.lights
}
fun count[j:Junction, c:Color] : Int {
#{x:Light | x in j.lights and x.color=c}
}
pred mostly[j:Junction, c:Color] {
no cc:Color | cc!=c and count[j,cc]>=count[j,c]
}
run{
some j:Junction | mostly[j,Red]
} for 10 Light, 2 Junction, 10 int
查看上面的内容,我使用 # 运算符来计算集合中的原子数,并且我将 10 的位宽指定为整数,这样我在使用 # 运算符时不会偶然发现溢出大套。
当您执行此操作时,您将获得一个实例,其中至少有一个路口大部分为红灯,它将$j
在可视化工具中标记为。
希望这可以帮助。