Простой конечный автомат в сплаве

Я новичок в сплаве и его функциях. Недавно у меня было задание о простой машине состояний: begin_state->normal_state->end_state. Есть только одно begin_state, но несколько normal_state и несколько end_state. Тогда я не могу заставить представление экземпляра работать правильно с приведенным ниже кодом сплава:

abstract sig state
{
    prev : some state,
    next : some state
}

one sig begin extends state{}
some sig end extends state{}
sig mid extends state{}

//There is no state after end state, and there is no state before begin state

pred dosomething
{
    no s : state | s in begin.prev and s in end.next
}

run{dosomething}

Итак, в основном я просто не хочу состояния перед начальным состоянием, никакого состояния после конечного состояния, и примеры экземпляров могут выглядеть примерно так:

начало->нормальное->конец

or

начало-> нормальный -> конец
|
обычный->нормальный->конец
|
нормальный --- нормальный
| |
конец ‹--------

... что-то такое. Спасибо


person Red Baron    schedule 25.10.2014    source источник


Ответы (2)


Рассмотрим следующие предложения:

  • Каждое состояние указывает на предыдущее состояние.
  • Начальное состояние — это состояние.
  • Начальное состояние не указывает на предшествующее состояние.

Если (на что я надеюсь) вы считаете, что эти три утверждения противоречат друг другу, то спросите себя: а) напоминают ли эти утверждения правила, данные в вашей модели сплава? б) как бы вы перефразировали их, чтобы они имели смысл и не противоречили друг другу? (c) как ваша перефразировка может быть переведена на Alloy?

Надеюсь, это поможет.

person C. M. Sperberg-McQueen    schedule 28.10.2014

Следите за своими квантификаторами! Формула

no s : state | s in begin.prev and s in end.next

говорит, что нет состояния, которое является ОБА предшественником начала и преемником конца.

person Daniel Jackson    schedule 25.11.2014