alloy - 链接数据结构:限制链接操作
问题描述
我有一个带有两个签名的模型(见下文):Data
和Node
. 我已经定义了一些表征 Node 居民的谓词,即:Orphan
、Terminal
和Isolated
。
我想要做的(但尚未实现)是定义一个谓词,该谓词Link
对两个节点的链接进行建模,使得一个节点成为另一个节点的后继者(succ
)。此外,我想限制操作,以便只能对Isolated
节点进行链接。此外,我希望限制(如果可能的话)以某种方式在predicate内部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
节点可以链接到?
解决方案
问题是你希望 Link 是一个改变succ
. 为了对 Alloy 中的更改进行建模,您需要添加一个有序签名,该签名代表系统的不同状态。所以你的签名看起来像这样:
open util/ordering[time]
sig Time {}
sig Data {}
sig Node {
data: Data,
succ: Node lone -> Time
}
但这也会改变你所有的谓词。你不能说一个节点是孤立的或终端的,你只能说一个节点在 time 是孤立的T
。
如果你有软件抽象,这一切都在第 6.1 节中介绍。除了那本书之外,我不熟悉任何关于 Alloy 建模时间的好的指南。
推荐阅读
- flask - 如何将 html 添加到 SubmitField 文本参数?
- python - 我该如何解决这个问题。我正在尝试使用 len 功能,但它没有按预期工作
- java - 带计数排序的基数排序
- android - 应用程序在后台时自定义通知音不起作用
- clojurescript - 页面加载时未触发 defroute
- python - 构建饼图
- typescript - 如何使用传播作为函数的参数
- python-3.x - 矩阵N x N x 3,获取内部3数组的第一个元素
- c# - 如何在 XAF WinForms 应用程序中使用 Oid 在 DetailView 中打开记录?
- algorithm - 执行矩阵链乘法期间的分段错误