所以我在Alloy中有以下代码:
sig Node { }
sig Queue { root : Node }
pred SomePred {
no q, q' : Queue | q.root = q'.root
}
run SomePred for 3
但这不会产生任何包含Queue的实例,我想知道为什么。它只显示带有节点的实例。我尝试过等效的谓词
pred SomePred' {
all q, q' : Queue | q.root != q'.root
}
但输出相同。
我错过了什么吗?
答案 0 :(得分:0)
那里存在一个逻辑缺陷:
fact SomeFact {
no q, q' : Queue | q.root = q'.root
}
假设存在一个具有给定根Q
的单个队列R
的实例。运行SomeFact
时,它会测试唯一可用的队列Q
,并且它会找到Q.root = Q.root
,因此,不会将给定的实例排除在生命之外。
对于具有任意数量队列的实例,可以进行相同的推理。
这是一个工作版本:
sig Node {
}
sig Queue {
root : Node
}
fact sss {
all disj q, q' : Queue | q.root != q'.root
}
pred abc() {
}
run abc for 3