Zulip Chat Archive
Stream: new members
Topic: Inductive definition with "less than" requirement
MrQubo (Jan 23 2025 at 17:24):
Hello!
I want to create inductive type for lambda terms. I want to ensure in the type that bounded variables are indeed bounded by lambda term.
Here are my two attempts:
inductive LamB : Nat -> Type
| bvar : ∀ {n}, (m : Nat) -> {_ : m < n} -> LamB n
| fvar : ∀ {n}, String -> LamB n
| app : ∀ {n}, LamB n -> LamB n -> LamB n
| lam : ∀ {n}, LamB (n.succ) -> LamB n
deriving Repr
open LamB
#eval @app 0 (lam (@bvar _ 0 (by simp))) (fvar "x")
This one requires explicitly passing proof of m < n
.
inductive LamB : Nat -> Type
| bvar : (m : Nat) -> ∀ {n}, LamB (m + n).succ
| fvar : ∀ {n}, String -> LamB n
| app : ∀ {n}, LamB n -> LamB n -> LamB n
| lam : ∀ {n}, LamB (n.succ) -> LamB n
deriving Repr
open LamB
#eval @app (0+0) (lam (bvar 0)) (fvar "x")
This one results in a type LamB (0+0)
which lean doesn't consider to be the same as LamB 0
.
Is there a better solution to want I want to accomplish? Ideally, I would want that #eval @app 0 (lam (bvar 0)) (fvar "x")
works, and #eval @app 0 (lam (bvar 1)) (fvar "x")
doesn't.
A. (Jan 23 2025 at 18:07):
This seems to work:
inductive LamB : Nat -> Type
| bvar : ∀ {n}, (m : Nat) -> (_ : m < n := by omega) -> LamB n
| fvar : ∀ {n}, String -> LamB n
| app : ∀ {n}, LamB n -> LamB n -> LamB n
| lam : ∀ {n}, LamB (n.succ) -> LamB n
deriving Repr
open LamB
#eval @app 0 (lam (bvar 0)) (fvar "x")
Last updated: May 02 2025 at 03:31 UTC