Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

「index in target's type is not a variable」エラーはいつ起こるのか? #758

Closed
Seasawher opened this issue Sep 6, 2024 · 2 comments · Fixed by #1064
Closed
Assignees
Labels
タクティク メモ 解決済みにすることを目指さず、残しておくもの

Comments

@Seasawher
Copy link
Member

induction タクティクを使用したときにたまに起こるエラー。そもそも何を言っているのか?

theorem while_congr {B : State → Prop} {c c' : Stmt} {s t : State} (h : c ≈ c') (h_while : (whileDo B c, s) ==> t) :
    (whileDo B c', s) ==> t := by
  -- `whileDo B C` を `x` とおく
  -- TODO: この generalize がないと次の induction がエラーになるのはなぜか?
  -- generalize hx : whileDo B c = x at h_while

  -- `h_while` に関する帰納法を使う
  -- `h_while` は BigStep のコンストラクタのどこかから来るが、
  -- `hx` を使うと `while_true` または `while_false` から来ていることが結論できる
  induction h_while <;> cases hx

  -- 条件式が偽の場合
  case while_false s' hcond =>
    apply BigStep.while_false
    assumption

  -- 条件式が真の場合
  case while_true s' t' u' hcond' hbody' _ _hrest ih =>
    apply BigStep.while_true (t := t') (hcond := by assumption)

    case hbody =>
      -- `c ≈ c'` を使って rw することができる!(知らなかった)
      rw [← h]
      assumption

    -- 帰納法の仮定を使う
    case hrest => simpa using ih
@Seasawher Seasawher added メモ 解決済みにすることを目指さず、残しておくもの 宣言的コマンド labels Sep 6, 2024
@spinylobster
Copy link
Contributor

spinylobster commented Sep 6, 2024

"index in target's type" は型族についている添字(Natに限りません)ことなので、それが変数じゃない、ってことでしょうね。
以下のコードでも同じエラーが出ました。

inductive PNat : Nat → Prop where
  | zero : PNat 0
  | succ (h : PNat n) : PNat (n + 1)

example (h : PNat 0) : PNat 1 := by
  induction h
  sorry

@Seasawher
Copy link
Member Author

Seasawher commented Nov 3, 2024

このコードでも再現できる。(よく見たら当然だが…)

/--  偶数であることを表す帰納的述語 -/
inductive Even : Nat → Prop where
  | zero : Even 0
  | succ : Even n → Even (n + 2)

example (h : Even 0) : True := by
  /- 
  index in target's type is not a variable (consider using the `cases` tactic instead)
  0
  -/
  induction h

example (h : Even 0) : True := by
  generalize 0 = x at h  
  induction h
  · trivial
  · trivial  

example (n m : Nat) (h : Even (n + m)) : True := by
  /- 
  index in target's type is not a variable (consider using the `cases` tactic instead)
  n + m
  -/
  induction h

  case zero =>
    trivial

  case succ n ih =>
    
    trivial

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
タクティク メモ 解決済みにすることを目指さず、残しておくもの
Projects
None yet
2 participants