В (* 1) можно прочитать следующее
rewrite prf in expr
Если у нас есть prf : x = y
, а требуемый тип для expr - это какое-то свойство x
, синтаксис rewrite ... in
будет искать x
в требуемом типе expr
и заменять его на y
.
Теперь у меня есть следующий фрагмент кода (вы можете скопировать егов редактор и попробуйте ctrl-l)
module Test
plusCommZ : y = plus y 0
plusCommZ {y = Z} = Refl
plusCommZ {y = (S k)} = cong $ plusCommZ {y = k}
plusCommS : S (plus y k) = plus y (S k)
plusCommS {y = Z} = Refl
plusCommS {y = (S j)} {k} = let ih = plusCommS {y=j} {k=k} in cong ih
plusComm : (x, y : Nat) -> plus x y = plus y x
plusComm Z y = plusCommZ
plusComm (S k) y =
let
ih = plusComm k y
prfXeqY = sym ih
expr = plusCommS {k=k} {y=y}
-- res = rewrite prfXeqY in expr
in ?hole
ниже показано, как отверстие выглядит как
- + Test.hole [P]
`-- k : Nat
y : Nat
ih : plus k y = plus y k
prfXeqY : plus y k = plus k y
expr : S (plus y k) = plus y (S k)
-----------------------------------------
Test.hole : S (plus k y) = plus y (S k)
Вопрос. Это выглядит как expr
(от * 1) в прокомментированной строке равно S (plus y k) = plus y (S k)
.И prf
равно plus y k = plus k y
, где x
равно plus y k
, а y
равно plus k y
.И переписать следует искать x
(а именно plus y k
) в expr
(а именно S (plus y k) = plus y (S k)
и заменить x
на y
(а именно plus k y
). И результат (res
) долженбыть S (plus k y) = plus y (S k)
.
Но это не работает.
У меня есть следующий ответ от idris
переписывание с плюса yk на плюс ky не изменило тип letty
Я могу предположить, что перезапись предназначена только для изменения типа полученного выражения, поэтому она не работает в теле выражения let
, а только в части «in». Это правильно?
(* 1) http://docs.idris -lang.org / ru / latest / proofs / patterns.html
PS. Пример из учебного пособия работает отлично. Япросто любопытно узнать, почему способ, которым я пытался использовать перезапись, не сработал.