Я пытаюсь понять, как комбинированные тактики ssreflect должны быть «декомпозированы» (или как они складываются в первую очередь). Одна из моих проблем - понять порядок и ассоциативность татикалов.
Иногда мне кажется, что порядок идет справа налево. Например
apply : AiB.
кажется эквивалентным
move : AiB; apply.
Игнорируя бездействие move
, мы как бы применяем функции к AiB
по порядку, а apply : AiB.
можно рассматривать как apply (: AiB).
. То есть мы сначала перемещаем AiB в цель, а затем вызываем apply
для цели с AiB
в ней.
Однако в других случаях меня сбивают с толку:
case: (EM (P y)) => // notPy.
Согласно учебнику, здесь проводится анализ случая на (EM (P y))
, а затем //
пытается решить тривиальные подзадачи. Потом?? move =>
ввести остальные в контекст? Какой здесь порядок действий?
Пусть EM_
будет (EM (P y))
, это (move=> notPy (// ( case (:EM_) ) ) )
?? Правильно ли я прочитал, каков «правильный порядок» применения тактики?
Порядок искажен рядом с notPy
и в целом непоследователен. Есть ли способ записать указанное выше справа налево в допустимом ssreflect?