Как именно работает сопоставление с шаблоном? - PullRequest
0 голосов
/ 02 октября 2018

Зависимое сопоставление с образцом на x позволяет нам, учитывая реализацию P(...) для каждого возможного значения x в соответствующем случае, доказать P(x).Например:

λ (P : *)
λ (T : P True)
λ (F : P False)
λ (b : Bool)
case b as x returns P(x)
    True => T
    False => F

Здесь компилятор ожидает P(True) в первой ветви, P(False) во второй, и тогда все выражение будет иметь тип P(b).Таким образом, мое case b as x returns P ... выражение теоретически должно заменить сопоставление с образцом Агды.Но это не так: соответствие Агды также дает вам информацию о предыдущих аргументах.

foo : (b : Bool) -> IsTrue b -> ...
foo .true ItIsTrue = ...

Здесь сопоставление с образцом на IsTrue b сгенерировало информацию, которую b = true, что позволяет нам пропустить образец b = false.Это не было включено в мой синтаксис. Как именно Агда справляется с этой дополнительной информацией, и когда она знает, что из-за этого мы можем избежать паттерна?Возможно ли расширить мой атомарный синтаксис case of таким образом, чтобы это выполнялось так же, как это делает зависимое сопоставление с образцом Агды?

...