Построение отношения в 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

Что решает проблемы ненатурального наследования.

Тем не менее, это все еще кажется очень глобальным и требует много работы для очень простой проблемы imho. По-прежнему оставляем вопрос открытым, чтобы увидеть, есть ли другие решения.


person Peter Kriens    schedule 19.12.2017    source источник


Ответы (2)


Если вы хотите добавить вспомогательный объект, мы можем сделать это, создав abstract sig Thing, а затем создав экземпляры P и F для Thing:

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

Как это выглядит

person Hovercouch    schedule 20.12.2017
comment
Спасибо, хорошее решение. Однако, похоже, в моем коде требуется много недвижимости? Это также требует ненатурального расширения на P и F. Т.е. их «следующее» - это аспект сервировки стола, а не аспект P или F. (В OO это плохой запах кода). - person Peter Kriens; 20.12.2017

Здесь может быть заключен компромисс между выразительной силой и управляемостью.

Безусловно, существует вопрос о том, что считать чистым или интуитивным; вы говорите, что «следующее» для P и F - это «аспект сервировки стола», а не «аспект P или F». Я думаю, что понимаю ваше мышление, но я не думаю, что вы, вероятно, добьетесь большего успеха в определении принципиального способа различения «аспектов» P и F и отношений, в области или диапазоне которых они появляются, не больше, чем любое из философы, которые в течение последних двух тысяч лет пытались надежно отличить сущность от случайности.

И если мы признаем, что различие ненадежно, но, тем не менее, считаем его полезным, тогда возникает вопрос: «Кто ввел правило, согласно которому отношение, определенное как часть подписи, должно относиться к (внутреннему) аспекту вовлеченных индивидов, а не к внешнему отношению, которое не является аспектом индивидуумов? " Ответ: вы сделали, а не [создатели] Alloy. Если кто-то слишком сильно настаивает на своей интуиции относительно конструкций, которые он хочет использовать для выражения чего-либо, существует определенный риск настаивать не только на том, чтобы вещь была выразимой, но и на том, что мы должны иметь возможность выразить это с помощью определенной конструкции. Такая настойчивость может научить нас многому в отношении обозначений, но иногда легче согласиться с тем, что разработчики обозначений также обладали интуицией.

Эта общая тема обсуждается в разделе Software Abstractions Дэниела Джексона под вопросами Разрешает ли Alloy автономные объявления? (в обсуждении после раздела 3.5.3 о количественной оценке более высокого порядка) и Все отношения должны быть объявлены как поля? (обсуждается в разделе 4.2.2, посвященном объявлениям основных полей). Ключевым моментом обсуждения является «Если вы хотите объявить некоторые отношения, которые не принадлежат естественным образом никаким существующим подписям, вы можете просто объявить их как поля одноэлементной подписи». Mutatis mutandis, приведенный пример очень похож на Таблицу в вашем дополнении.

TL; DR. Да, это может показаться вам немного громоздким, но одноэлементный знак, содержащий отношение, которое вы не хотите определять для его первого члена, действительно настолько близок к установленной идиоме, как и есть, для такого рода вещей.

person C. M. Sperberg-McQueen    schedule 22.12.2017
comment
Я думаю, вы говорите: «Не борись с инструментом»? Я согласен с этим мнением и часто использую его в качестве аргумента, если люди пытаются превратить инструмент, за который я несу ответственность, во что-то другое. Однако я работал с Дэниелом над созданием Alloytools на Github. Моя цель - посмотреть, сможем ли мы сделать Alloy полезным для Java-разработчиков и, возможно, в общем объектно-ориентированном дизайне. Ключ есть читабельность. Хотя Alloy - лучшее, что я нашел до сих пор, я еще не склонен верить, что он идеален. Кстати, спасибо за обширный ответ, я благодарен. - person Peter Kriens; 24.12.2017
comment
Я думаю, что инструмент «Не сражайся с инструментом» достаточно хорошо резюмирует, да. Конечно, бывают ситуации, когда это правило не применяется; вы можете быть в одном. - person C. M. Sperberg-McQueen; 29.12.2017