【发布时间】:2019-09-29 19:56:55
【问题描述】:
我有一个带有两个签名的模型(见下文):Data 和 Node。我已经定义了一些表征 Node 居民的谓词,即:Orphan、Terminal 和 Isolated。
我想要做的——但还没有实现——定义一个谓词Link,它模拟两个节点的链接,使得一个节点成为另一个节点的后继者(succ)。此外,我想限制操作,使得只能链接到Isolated 节点。此外,我希望限制(如果可能的话)以某种方式在Link 谓词的内部。
这是我最近的尝试:
sig Data {}
sig Node {
data: Data,
succ: lone Node
}
// Node characterisation
pred Isolated (n: Node) { Orphan[n] and Terminal[n] }
pred Orphan (n: Node) { no m: Node | m.succ = n }
pred Terminal (n: Node) { no n.succ }
/*
* Link
*
* May only Link n to an m, when:
* - n differs from m
* - m is an Isolated Node (DOES NOT WORK)
*
* After the operation:
* - m is the succcessor of n
*/
pred Link (n,m: Node) {
n != m
Isolated[m] /* Not satisfiable */
m = succ[n]
}
pred LinkFeasible { some n,m: Node | Link[n,m] }
run LinkFeasible
包含连词Isolated[m] 会使模型无法满足。我想我明白为什么:不可能有Node 既是Isolated 和另一个的继任者。我只是希望它可以揭示我的意图。
我的问题:我如何定义 Link 谓词来链接两个节点,以便只有 Isolated 节点可以链接到?
【问题讨论】:
标签: alloy