【问题标题】:Linked Data Structures: Restricting a link operation链接数据结构:限制链接操作
【发布时间】: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


    【解决方案1】:

    问题是您希望 Link 是一个 操作,它会更改 succ 的值。为了对 Alloy 中的更改进行建模,您需要添加一个有序签名,该签名代表系统的不同状态。所以你的签名看起来像这样:

    open util/ordering[time]
    
    sig Time {}
    sig Data {}
    
    sig Node {
        data: Data,
        succ: Node lone -> Time
    }
    

    但这也会改变你所有的谓词。不能说某个节点是孤立的或终结的,只能说是在T时某个节点是孤立的。

    如果您有软件抽象,这将在第 6.1 节中介绍。除了那本书之外,我不熟悉任何关于 Alloy 建模时间的好的指南。

    【讨论】:

    • 感谢您的回答:我相信它会很好地工作。我拥有一份Software Abstractions 的副本,但我还没有(清楚地)吸收它。我想知道是否可以以类似于第 2.4 节中的书籍排序的方式对节点进行排序。然后节点签名可能不需要更改。你认为这可能吗?
    • @Adam 我不这么认为。在 2.4 中使用了一种“双关语”:模型只有一本书,因此我们可以使用多本书来表示一本书的变化。这里有很多节点,所以我们不能用“更多节点”来表示那些多个节点发生变化。
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多