Предположим, мы хотели бы иметь "правильные" minus
на Nat
с, требующие m <= n
для n `minus` m
, чтобы иметь смысл:
%hide minus
minus : (n, m : Nat) -> { auto prf : m `LTE` n } -> Nat
minus { prf = LTEZero } n Z = n
minus { prf = LTESucc prevPrf } (S n) (S m) = minus n m
Теперь давайте попробуем доказатьследующая лемма о том, что (n + (1 + m)) - k = ((1 + n) + m) - k
, при условии, что обе стороны верны:
minusPlusTossS : (n, m, k : Nat) ->
{ auto prf1 : k `LTE` n + S m } ->
{ auto prf2 : k `LTE` S n + m } ->
minus (n + S m) k = minus (S n + m) k
Цель предполагает, что может помочь следующая сублемма:
plusTossS : (n, m : Nat) -> n + S m = S n + m
plusTossS Z m = Refl
plusTossS (S n) m = cong $ plusTossS n m
, поэтому мы пытаемся использовать ее:
minusPlusTossS n m k =
let tossPrf = plusTossS n m
in rewrite tossPrf in ?rhs
И здесь мы терпим неудачу:
When checking right hand side of minusPlusTossS with expected type
minus (n + S m) k = minus (S n + m) k
When checking argument prf to function Main.minus:
Type mismatch between
LTE k (S n + m) (Type of prf2)
and
LTE k replaced (Expected type)
Specifically:
Type mismatch between
S (plus n m)
and
replaced
Если я правильно понимаю эту ошибку, это просто означает, что она пытается переписать RHS целевого равенства (то есть minus { prf = prf2 } (S n + m) k
)до minus { prf = prf2 } (n + S m) k
и не удается.Правильно, конечно, поскольку prf
является доказательством другого неравенства!И хотя replace
может быть использовано для создания доказательства (S n + m) k
(или prf1
также сработает), не похоже, что можно одновременно перезаписать и изменить объект доказательства так, чтобы он соответствовал перезаписи.
Как мне обойти это?Или, в более общем смысле, как мне доказать эту лемму?