В задаче обедающих философов у нас есть стол с философами и вилками.
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
Что решает проблемы ненатурального наследования.
Тем не менее, это все еще кажется очень глобальным и требует много работы для очень простой проблемы imho. По-прежнему оставляем вопрос открытым, чтобы увидеть, есть ли другие решения.