나는 이드리스에서 다음과 같은 제안을 쓴 다음 Prelude.Nat
소스 코드에서 영감을 사용Idris에서 정확히 다시 쓰기가 어떻게 작동합니까?
total
plusOneCommutes : (n : Nat) -> (m : Nat) -> (n + S m = S n + m)
plusOneCommutes Z k = Refl
plusOneCommutes (S k) j =
let inductiveHypothesis = plusOneCommutes k j in
rewrite inductiveHypothesis in Refl
, 그것을 증명하기 위해 유도 가설로 (두 번째 경우에) 재귀 호출을 사용하는 의미가 왜 이해 경우. 그러나 구멍을 다시 긋는 작업의 세부 사항을 거치면서, 나는 실제로 일어나고있는 일과 왜 이것이 작동하는지에 대해 정말 몰두하지 않습니다.
내가 작성하는 경우 : 나는 컴파일러에서 다음을 얻을
plusOneCommutes (S k) j = ?hole
:
정말하지 않습니다- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
잘 보인다. plusOneCommutes
의 서명에 따라이 구멍의 유형은 (plus (S k) (S j)) = (plus (S (S k)) j)
이어야합니다.
plusOneCommutes (S k) j =
let inductiveHypothesis = plusOneCommutes k j in
?hole
다음 hole
타입이된다 :
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
inductiveHypothesis : k + S j = S k + j
-------------------------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
다음
inductiveHypothesis
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
inductiveHypothesis : k + S j = S k + j
_rewrite_rule : k + S j = S k + j
-------------------------------------------------------------------------
HolyGrail.hole : (\replaced => S replaced = S (S (plus k j))) (S k + j)
주어진 재기록 룰을 이용하여 I 쓰는 경우
한 단계 더 나아가 유도 가설 도입
S (plus (S k) j) = S (S (plus k j))
whi ch는 예상 유형이며, Idris는 ?hole
을 Refl
으로 자동 대체하는 증거를 완료 할 수 있습니다.
내가 당황한 것은 내가 서명에서 추론 한 것과 컴파일러가 구멍에서 유추하는 것 사이에 예상치 못한 차이가 있다는 것입니다. 내가 자발적으로 오류가 소개하는 경우 :
을 나는 다음과 같은 메시지가 :
- + Errors (1)
`-- HolyGrail.idr line 121 col 16:
When checking right hand side of plusOneCommutes with expected type
S k + S j = S (S k) + j
Type mismatch between
S (S (plus k j)) = S (S (plus k j)) (Type of Refl)
and
S (plus k (S j)) = S (S (plus k j)) (Expected type)
Specifically:
Type mismatch between
S (plus k j)
and
plus k (S j)
Type mismatch...
부분은 위의 단계가 아니라 내가 기대하는 유형을 제공하는 When checking ...
부분과 일치한다.
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
당신이 n + S m
이 유형 =
의 왼쪽에서 :
고마워, 나는 플러스의 정의에 관한 부분을 놓치고 있었다! 모든게 의미가 있습니다 :) – insitu