Ответ 1
Эти трубы показывают, что сокращение приостанавливается в ожидании результатов соответствующих выражений, и это, как правило, сводится к тому, что у вас есть блок with
, результат которого вам нужно знать для продолжения. Это связано с тем, что конструкция rewrite
просто расширяется до with
рассматриваемого выражения вместе с любыми вспомогательными значениями, которые могут потребоваться для его работы, после чего следует соответствие на refl
.
В этом случае это просто означает, что вам нужно ввести +-comm n m
в with
соответствие шаблона и шаблона на refl
(и вам, вероятно, придется добавить n + m
в область видимости, так как это предполагает, что о равенстве есть о чем поговорить). Модель оценки Agda довольно проста, и если вы сопоставляете шаблон с чем-то (кроме совпадений с искусственным шаблоном в записях), это не будет уменьшаться, пока вы не сравните шаблон с тем же самым. Возможно, вы даже сможете уйти с переписыванием по тому же выражению в своем доказательстве, поскольку оно просто делает то, что я изложил для вас.
Точнее, если вы определяете:
f : ...
f with a | b | c
... | someDataConstructor | boundButNonConstructorVariable | someRecordConstructor = ...
а затем вы ссылаетесь на f
в качестве выражения, вы получите только те трубы, которые вы наблюдаете только для выражения a
, потому что он соответствует someDataConstructor
, поэтому, по крайней мере, чтобы получить f
, чтобы уменьшить вас необходимо ввести a
, а затем сопоставить его с someDataConstructor
. С другой стороны, b
и c
, хотя они были введены в том же блоке, не останавливайте оценку, потому что b
не соответствует шаблону, а c
someRecordConstructor
известен статически единственный возможный конструктор, потому что это тип записи с eta.