我试图了解如何结合ssreflect策略"分解" (或者它们如何组成首先)。我遇到的一个问题是要理解这些问题的顺序和相关性。
有时,我觉得订单是从右到左。例如
apply : AiB.
似乎相当于
move : AiB; apply.
忽略无操作move
,就像我们按顺序将功能应用于AiB
一样,apply : AiB.
可以被视为apply (: AiB).
。也就是说,我们首先将AiB移动到目标中,然后使用apply
在目标上调用AiB
。
然而,我在其他场合感到困惑:
case: (EM (P y)) => // notPy.
根据tutorial,此问题对(EM (P y))
进行了案例分析,然后//
尝试解决琐碎的子目标。然后?? move =>
将其余的内容介绍到上下文中?这里的运营顺序是什么?
让EM_
为(EM (P y))
,是(move=> notPy (// ( case (:EM_) ) ) )
??
我是否正确地阅读了这个"正确的顺序"策略应用?
订单在notPy
附近有点扭曲,一般不一致。有没有办法在合法的ssreflect中从右到左编写 ?
答案 0 :(得分:2)
我建议您阅读手册以获取更多详细信息。 https://hal.inria.fr/inria-00258384
在你的例子中,回想一下移动总是一个无操作,所以它“融合”。因此,对于冒号,它会在左侧融合。
move: H; case <=> case: H
和=>
融合在右边:
case: H; move => U <=> case: H => U.
因此,对于您的特定示例,
case: (EM (P y)) => // notPy.
可以被视为
move: (EM (P y)); case; move=> // notPy.
问候!