Zulip Chat Archive

Stream: lean4

Topic: (kernel) function expected


Enrico Borba (Feb 16 2024 at 16:26):

Ran into (kernel) function expected trying to do some affine lambda calculus normalization. The logic of the substitution is clearly incorrect (doesn't recurse in the non-beta-reduction case), but I don't think that's relevant.

inductive Affine : (vs : Finset )  Type
| var (x : ) : Affine {x}
| abs (x : ) (e : Affine vs) : Affine (vs \ {x})
| app (e₁ : Affine vs₁) (e₂ : Affine vs₂) (h : vs₁  vs₂ = ) : Affine (vs₁  vs₂)

namespace Affine

/-- The free variables in an affine term. -/
abbrev free (_ : Affine vs) : Finset  := vs

def subst (e : Affine vs₁) (x : ) (hx : x  vs₁) (e' : Affine vs₂) : Affine ((vs₁ \ {x})  vs₂) :=
  sorry

end Affine

/-- error: (kernel) function expected _x_48 (_ : HEq e₁✝ e₁✝) -/
def small_step (e : Affine vs) : (vs' : Finset ) × (h : vs'  vs) ×' Affine vs' :=
  match e with
  | .app (.abs x e₁) e₂ h =>
    if hx₁ : x  e₁.free then
      e₁.free \ {x}  e₂.free, Finset.Subset.refl _, e₁.subst x hx₁ e₂
    else
      have : e₁.free  e₁.free \ {x}  e₂.free := by
        intro v hv
        have : v  {x} := Finset.not_mem_singleton.mpr (fun heq : v = x => hx₁ (heq  hv))
        exact Finset.mem_union_left _ (Finset.mem_sdiff.mpr hv, this⟩)

      e₁.free, this, e₁

  | e => vs, Finset.Subset.refl _, e

end Affine

It's not clear to me how to minimize this further. However, replacing that .app (.abs x e₁) e₂ h match arm with a sorry removes this error.

I saw that there were other posts about this, and that it's likely a compiler bug, but I wanted to confirm here before opening any issues.

Enrico Borba (Feb 16 2024 at 16:30):

Here's a bit smaller:

inductive Affine : (vs : Finset )  Type
| var (x : ) : Affine {x}
| abs (x : ) (e : Affine vs) : Affine (vs \ {x})
| app (e₁ : Affine vs₁) (e₂ : Affine vs₂) (h : vs₁  vs₂ = ) : Affine (vs₁  vs₂)

namespace Affine

/-- The free variables in an affine term. -/
abbrev free (_ : Affine vs) : Finset  := vs

def subst (e : Affine vs₁) (x : ) (hx : x  vs₁) (e' : Affine vs₂) : Affine ((vs₁ \ {x})  vs₂) :=
  sorry

/-- error: (kernel) function expected _x_42 (_ : HEq e₁✝ e₁✝) -/
def small_step (e : Affine vs) : (vs' : Finset ) × Affine vs' :=
  match e with
  | .app (.abs x e₁) e₂ h =>
    if hx₁ : x  e₁.free then
      e₁.free \ {x}  e₂.free, e₁.subst x hx₁ e₂
    else
      e₁.free, e₁

  | e => vs, e

end Affine

Enrico Borba (Feb 16 2024 at 16:44):

This does not occur if I use a list instead of a Finset:

inductive Affine : (vs : List )  Type
| var (x : ) : Affine {x}
| abs (x : ) (e : Affine vs) : Affine (vs \ {x})
| app (e₁ : Affine vs₁) (e₂ : Affine vs₂) (h : vs₁  vs₂ = ) : Affine (vs₁  vs₂)

namespace Affine

/-- The free variables in an affine term. -/
abbrev free (_ : Affine vs) : List  := vs

def subst (e : Affine vs₁) (x : ) (hx : x  vs₁) (e' : Affine vs₂) : Affine ((vs₁ \ {x})  vs₂) :=
  sorry

/- no error! -/
def small_step (e : Affine vs) : (vs' : List ) × Affine vs' :=
  match e with
  | .app (.abs x e₁) e₂ h =>
    if hx₁ : x  e₁.free then
      _, e₁.subst x hx₁ e₂
    else
      _, e₁

  | e => _, e

end Affine

Enrico Borba (Feb 21 2024 at 00:06):

What are the proper steps to opening a bug, should I just file an issue in the lean4 repo?

Mario Carneiro (Feb 21 2024 at 08:55):

yes


Last updated: May 02 2025 at 03:31 UTC