openlang

partial def: #eval은 111이 나오는데 rfl이랑 decide는 실패해요. ofReduceBool 없이 검증할 수 있는 방법이 있을까요?

작은 감사 도구를 만들고 있고, 툴체인은 leanprover/lean4:v4.15.0이에요. 아무도 종료 증명을 못 해서 스텝 카운터는 partial def로 되어 있어요:

partial def collatzSteps (n : Nat) (acc : Nat := 0) : Nat :=
  if n ≤ 1 then acc
  else if n % 2 == 0 then collatzSteps (n / 2) (acc + 1)
  else collatzSteps (3 * n + 1) (acc + 1)

def withinBudget (n : Nat) : Bool :=
  decide (collatzSteps n ≤ budget)

lake build는 깨끗하게 통과하고 #eval Audit.collatzSteps 27은 111이 나와요. 그런데 별도 파일에서 이렇게 하면:

example : collatzSteps 6 = 8 := by rfl
theorem w27 : withinBudget 27 = true := by decide

둘 다 거부돼요. 메시지는 항이 기대한 값으로 reduce되지 않는다고 해요. 기본 인자랑 Inhabited 인스턴스가 원인인가 싶었어요. acc를 명시적으로 쓰고 인스턴스도 추가해 봤지만 달라진 게 없었어요.

native_decide는 둘 다 받아주는데, #print axioms를 하면 Lean.ofReduceBool이 나와서 그건 받아들일 수 없어요.

질문이 두 가지예요:

  1. 왜 컴파일된 코드는 이걸 평가할 수 있는데 kernel과 decide는 못 하나요?
  2. 함수를 다시 쓰지 않고, 예를 들어 fuel을 쓰는 것 말고, 이 함수에 대해 kernel이 검증한 사실을 얻을 방법이 있나요?
영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    제가 알기로 partial def는 opaque 상수로 컴파일돼서 kernel이 펼칠 게 없어요. 그래서 #eval은 컴파일된 코드를 실행하는데도 rfl과 decide는 실패해요. 레퍼런스 매뉴얼에 이것에 대한 내용이 있었던 것 같아요: https://lean-lang.org/doc/reference/latest/

    fuel 버전을 쓰고 그걸로 사실들을 증명한 다음, 컴파일된 코드에서는 빠른 버전을 쓰도록 거기에 @[extern]을 붙이면 어떨까요? 해 보셨어요?

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. ack가 unbuffered receive인데도 -race가 DATA RACE를 보고해요. time.After 때문일까요?

    race detector가 틀렸거나, 제가 ack가 보장해 주는 걸 잘못 이해하고 있는 걸까요? pushgate라는 작은 서비스인데, 제 모바일 앱의 푸시 알림용 디바이스 토큰에 붙은 HMAC 서명을 검사해요. 호출하는 쪽이…

    답글 4최근 활동 go
  2. webhook 하나에서만 HMAC 불일치가 나요 (이름에 악센트가 들어간 것)

    저장해 둔 webhook 전송분을 다시 재생해서, 하위 단계에서 신뢰하기 전에 HMAC-SHA256을 검증하는 작은 Node 체커를 만들었어요 (순수 JS, 빌드 단계 없음). 세 개 중 두 개는 통과해요. billing-p…

    답글 7최근 활동 typescriptjavascript
  3. free 전에 memset하면 기본 플래그에서는 통과하는데 OPT=-O2에서는 실패해요

    WSL에서 vault라는 작은 C 크리덴셜 홀더를 만들고 있어요. vault_release()는 시크릿을 지운 다음 free해야 해요: 테스트인 tests/wipe_check.c는 시크릿 포인터를 저장해 두고 vault_re…

    답글 6최근 활동 c