构建合金关系

时间:2017-12-19 09:23:35

标签: alloy

在餐饮哲学家的问题上,我们有一张哲学家和福克斯的桌子。

sig P {}
sig F {}

对于这个问题,我想要以下表示表格的关系:

P1 -> F1
F1 -> P2
P2 -> F2
F2 -> P3
P3 -> F3
F3 -> P1

即。每个P指向F,每个F指向P,这将形成一个圆。我想调用一个函数来获得这种关系:

fun table : (P+F) one -> one (P+F) { ... }         

我一直在努力做这项工作,但感觉我错过了一些与我遇到的其他问题相关的基本内容。不知怎的,我想念一个'构造函数'。

任何指针?

其他

@Hovercouch提供了一个有助手sig的工作解决方案。但是,这需要对P和F进行非自然扩展,并引入了新的sig。这也可以通过以下方式解决:

sig P, F {}
one sig Table {
    setting : (P+F) one -> one (P+F)
} {
    # P = # F
    all p : P, f : F | P in p.^setting and F in f.^setting
}
run {} for 6

解决了非自然继承问题。

然而,对于一个非常简单的问题,它似乎仍然非常全球化并且有很多工作要做。仍然保持问题,看看是否还有其他解决方案。

2 个答案:

答案 0 :(得分:2)

如果您愿意添加辅助对象,我们可以通过制作abstract sig Thing,然后制作Thing的P和F实例来实现此目的:

abstract sig Thing {
    next: Thing
} {
    Thing = this.^@next
}

sig F extends Thing {} {
    next in P
}

sig P extends Thing {} {
    next in F
}

fact SameNumberOfThings {
    #P = #F
}

run {} for 6

What it looks like

答案 1 :(得分:2)

这里可能涉及设计权衡,表达能力和易处理性之间。

当然存在一个干净或直观的问题;你说P和F的下一个' -ness是"表格设置的一个方面"而不是P或F"的一个方面。我想我理解你的想法,但我认为你不可能有更多的成功来定义一种原则性的方法来区分"方面" P和F以及它们出现在其领域或范围内的关系,比任何在过去的几千年中尝试过可靠地区分本质和事实的哲学家一样。

如果我们接受这种区分是不可靠的,但我们发现它有用,那么问题就变成了这样一个规则,即定义为签名一部分的关系必须与(内在)方面有关。涉及的个人,而不是一个不是个人方面的外在关系?"答案是:你做了,而不是[合金的创造者]。如果一个人过于强烈地坚持关于人们想要用来表达某种东西的结构的直觉,那么就存在一种风险,即不仅要坚持这个东西应该是可表达的,而是我们应该能够用特定的东西来表达它。构造。这种坚持可以教会我们很多关于符号的内容,但有时接受符号的设计者也有直觉可以更容易接受。

这个一般性主题在Daniel Jackson的软件抽象中讨论合金是否允许独立声明?(在关于更高版本的第3.5.3节的讨论中) - 顺序量化)和必须将所有关系声明为字段吗?(在关于基本字段声明的第4.2.2节讨论中)。讨论的核心是#34;如果你想声明一些不属于任何现有签名的关系,你可以简单地将它们声明为单一签名的字段。"经过必要的修改后,给出的例子在您的附录中看到了很多表格。

TL; DR是的,您可能会发现它有点麻烦,但是包含您不希望在其第一个成员上定义的关系的单身符号确实与已建立的惯用语一样接近,因为这种事情。