理解合金中的谓词

时间:2012-11-14 09:19:24

标签: alloy

有人可以使用以下示例帮助我理解谓词:

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)有人可以向我展示一些使用上述代码的合金代码,并通过代码阐明谓词的含义。

我只是想了解我们如何使用上述谓词。

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(如我所假设)之间的差异后进行评估,以确保最多返回一个红色原子。我希望我的解释很有帮助。我会欢迎积极的批评。谢谢