Я узнал немного больше о TLA + / TLC с момента публикации вопроса, и вот мой ответ:
Чтобы просто выбрать элемент из набора симметрии в исходном предикате:
item \in Items
или в действии:
item' \in Items
Если вы хотите выбрать элемент, который соответствует предикату , как вы можете указать с помощью CHOOSE, то это альтернатива:
item \in {x \in Items: P(x)}
Это сформирует подмножество Items, которые соответствуют предикату, а затем выберет один из них.
Вот некоторые данные, которые показывают разницу между этим синтаксисом и CHOOSE.Рассмотрим этот модуль:
----------------------------- MODULE ChooseDemo -----------------------------
CONSTANT Items
VARIABLE item
TypeInvariant == item \in Items
Init == item = CHOOSE x \in Items: TRUE
Next == item' \in {x \in Items: x /= item}
=============================================================================
Когда Items
имеет три элемента:
- НЕ набор симметрии: TLC находит 1 начальное состояние и всего 7 (3 различных) состояний.
- набор симметрии: TLC находит 1 начальное состояние и всего 3 (1 различные) состояния.
Теперь рассмотрим этот модуль:
--------------------------- MODULE SetFormingDemo ---------------------------
CONSTANT Items
VARIABLE item
TypeInvariant == item \in Items
Init == item \in {x \in Items: TRUE}
Next == item' \in {x \in Items: x /= item}
=============================================================================
КогдаItems
имеет три элемента:
- НЕ набор симметрии: TLC находит 3 (3 различных) начальных состояния и всего 9 (3 различных) состояния.
- набор симметрии:TLC находит 3 (1 отдельное) начальное состояние и всего 5 (1 различное) состояние.
Следовательно, используя синтаксис формирования множеств, TLC находит больше состояний, чем это было с CHOOSE.