Alloy 中的谓词问题
所以我在合金中有以下代码:
sig Node { }
sig Queue { root : Node }
pred SomePred {
no q, q' : Queue | q.root = q'.root
}
run SomePred for 3
但这不会产生任何包含队列的实例,我想知道为什么。它只显示带有节点的实例。我已经尝试了等效的谓词
pred SomePred' {
all q, q' : Queue | q.root != q'.root
}
,但输出是相同的。
我错过了什么吗?
So I have the following bit of code in Alloy:
sig Node { }
sig Queue { root : Node }
pred SomePred {
no q, q' : Queue | q.root = q'.root
}
run SomePred for 3
but this won't yield any instance containing a Queue, I wonder why. It only shows up instances with Nodes. I've tried the equivalent predicate
pred SomePred' {
all q, q' : Queue | q.root != q'.root
}
but the output is the same.
Am I missing something?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
其中存在一个逻辑缺陷:
假设有一个实例,该实例具有单个队列
Q
,该队列具有给定的根R
。运行SomeFact
时,它会测试唯一可用的队列Q
,并且会发现Q.root = Q.root
,从而排除给定实例的出现。对于具有任意数量的队列的实例可以进行相同的推理。
这是一个工作版本:
There's a logic flaw in there:
Assume there is an instance with a single queue
Q
that has a given rootR
. When runningSomeFact
, it'd test the only queue available,Q
, and it'd find it thatQ.root = Q.root
, thus, excluding the given instance from coming to life.The same reasoning can be made for instances with an arbitrary number of queues.
Here is a working version: