有人可以使用以下示例帮助我理解谓词:
sig Light{}
sig LightState { color: Light -> one Color}
sig Junction {lights: set Light}
fun redLigths(s:LightState) : set Light{ s.color.Red}
pred mostlyRed(s:LightState, j:Junction){
lone j.lights - redLigths(s)
}
我对以上代码有以下问题:
1)如果上述谓词为真,会发生什么?
2)如果是假的,会发生什么?
3)有人可以向我展示一些使用上述代码的合金代码,并通过代码阐明谓词的含义。
我只是想了解我们如何使用上述谓词。
答案 0 :(得分:3)
在您对命令中的谓词或函数进行调用以查找示例或反例之前,没有任何“发生”。
答案 1 :(得分:1)
首先,使用正确的术语,当谓词为真时,没有“发生”;它更像是另一种方式,一个实例(原子到集合的分配)满足(或没有)一些条件,使谓词成为真(或假)。
此外,您的模型不完整,因为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,这样我就不会在使用时遇到溢出大型集合的#manrator。
执行此操作时,您将获得一个实例,其中至少有一个交叉点主要是红灯,它将在可视化工具中标记为$j
。
希望这有帮助。
答案 2 :(得分:0)
sig Light{}
sig LightState { color: Light -> one Color}
sig Junction {lights: set Light}
fun redLigths(s:LightState) : set Light{ s.color.Red}
pred mostlyRed(s:LightState, j:Junction){
lone j.lights - redLigths(s)
}
谓词在你给出的例子中只是意味着什么;
集合A之间的差异,在这种情况下是关系(j.lights)和另一个集合说B,从函数redligths返回,其中Predicate将始终约束约束分析器,以便在运行时仅返回红灯谓词“多为红”。
请注意,您添加到谓词主体的多重性“孤立”仅在评估了集合A和B(如我所假设)之间的差异后进行评估,以确保最多返回一个红色原子。我希望我的解释很有帮助。我会欢迎积极的批评。谢谢