【发布时间】:2017-12-19 09:23:34
【问题描述】:
在哲学家就餐问题中,我们有一张哲学家和叉子的桌子。
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
解决了非自然继承问题。
但是,对于一个非常简单的问题,它似乎仍然非常全球性和大量工作。仍然保持问题开放,看看是否有其他解决方案。
【问题讨论】:
标签: alloy