Alloy中的谓词问题

时间:2011-02-10 14:02:42

标签: formal-methods model-driven-development alloy

所以我在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
}

但输出相同。

我错过了什么吗?

1 个答案:

答案 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