[Agda] Resolving a universe level problem
Jesper Cockx
Jesper at sikanda.be
Wed Sep 9 09:12:16 CEST 2020
Hi Marco,
Here Agda is complaining that you gave it a type (something of type `Set`),
but it expected something of type `suc n Nat.≤ Context-size Γ`. Indeed, you
gave `n < Context-size Γ` in the type of #'_, but you should've given a *proof*
of that type. One way to fix the problem is by adding an extra argument of
this type to the function `#'_`. By adding an argument of this type, you
make explicit the precondition that the number `n` should not be greater
than the length of the context, which was implicit in the plfa version.
-- Jesper
On Wed, Sep 9, 2020 at 9:01 AM Marko Dimjašević <marko at dimjasevic.net>
wrote:
> Dear Agda community,
>
> I've been working out an alternative formalisation of De Bruijn indices to
> that of provided in a book Programming Language Foundations in Agda:
>
> https://plfa.github.io/DeBruijn/#13523
>
> #_ : ∀ {Γ} → (n : ℕ) → Γ ⊢ lookup Γ n
> # n = ` count n
>
> My goal is to define an alternative #_ under the name #'_ such that it
> relies on no postulates, which are used in functions count and lookup that
> #_ depends on. I guess it should be possible to check statically that the
> index provided does not go out of context bounds. However, I am stuck with
> a universe level problem that I could use your help with.
>
>
> In my attempt I end up with an error reading:
>
> /home/marko/projects/agda/plfa-exercises/plfa/DeBruijn.agda:104,42-60
> Set !=< suc n Nat.≤ Context-size Γ of type Set₁
> when checking that the expression n < Context-size Γ has type
> n < Context-size Γ
>
> with the first line of #'_ highlighted in yellow, indicating the problem in
> the return type of #'_.
>
> Here is a self-contained code excerpt that leads to the error (my apologies
> for not having a shorter snippet):
>
>
> module DeBruijn where
>
> open import Data.Empty using (⊥)
> open import Data.Nat as Nat using (ℕ; zero; suc; _<_; s≤s; z≤n)
> open import Data.Nat.Properties using (≤-pred)
> open import Data.Unit using (⊤; tt)
>
> infix 4 _⊢_
> infix 4 _∋_
> infixl 5 _,_
>
> infixr 7 _⇒_
>
> infix 5 ƛ_
> infix 5 μ_
> infixl 7 _·_
> infix 8 `suc_
> infix 9 `_
> infix 9 S_
>
> -- Types
> data Type : Set where
> _⇒_ : Type → Type → Type
> `ℕ : Type
>
> -- Contexts
> data Context : Set where
> ∅ : Context
> _,_ : Context → Type → Context
>
> Context-size : Context → ℕ
> Context-size ∅ = zero
> Context-size (c , _) = suc (Context-size c)
>
> -- Variables and the lookup judgment
> data _∋_ : Context → Type → Set where
>
> Z : ∀ {Γ A}
> ---------
> → Γ , A ∋ A
>
> S_ : ∀ {Γ A B}
> → Γ ∋ A
> ---------
> → Γ , B ∋ A
>
> -- Terms and the typing judgment
> data _⊢_ : Context → Type → Set where
>
> `_ : ∀ {Γ A}
> → Γ ∋ A
> -----
> → Γ ⊢ A
>
> ƛ_ : ∀ {Γ A B}
> → Γ , A ⊢ B
> ---------
> → Γ ⊢ A ⇒ B
>
> _·_ : ∀ {Γ A B}
> → Γ ⊢ A ⇒ B
> → Γ ⊢ A
> ---------
> → Γ ⊢ B
>
> `zero : ∀ {Γ}
> ---------
> → Γ ⊢ `ℕ
>
> `suc_ : ∀ {Γ}
> → Γ ⊢ `ℕ
> ------
> → Γ ⊢ `ℕ
>
> case : ∀ {Γ A}
> → Γ ⊢ `ℕ
> → Γ ⊢ A
> → Γ , `ℕ ⊢ A
> ----------
> → Γ ⊢ A
>
> μ_ : ∀ {Γ A}
> → Γ , A ⊢ A
> ---------
> → Γ ⊢ A
>
> lookup' : (c : Context) → (n : ℕ) → (n < Context-size c) → Type
> lookup' (_ , A) zero _ = A
> lookup' (Γ , _) (suc n) ≤-suc = lookup' Γ n (≤-pred ≤-suc)
>
> count' : ∀ {Γ} → (n : ℕ) → (s : n < Context-size Γ) → Γ ∋ lookup' Γ n s
> count' {_ , _} zero _ = Z
> count' {Γ , A} (suc n) ≤-suc = S (count' n (≤-pred ≤-suc))
>
> _≤?_ : ∀ (m n : ℕ) → Set
> zero ≤? n = ⊤
> suc m ≤? zero = ⊥
> suc m ≤? suc n = m ≤? n
>
> soundness-< : ∀(m n : ℕ) → suc m ≤? n → m < n
> soundness-< zero (suc n) tt = s≤s z≤n
> soundness-< (suc m) (suc n) m≤?n = s≤s (soundness-< m n m≤?n)
>
> #'_ : ∀ {Γ} → (n : ℕ) → Γ ⊢ lookup' Γ n (n < Context-size Γ)
> #'_ {Γ} n = ` count' n (soundness-< n (Context-size Γ) tt)
>
>
> --
> Regards,
> Marko Dimjašević <marko at dimjasevic.net>
> https://dimjasevic.net/marko
> Mastodon: https://mamot.fr/@mdimjasevic
> PGP key ID: 056E61A6F3B6C9323049DBF9565EE9641503F0AA
> Learn email self-defense! https://emailselfdefense.fsf.org
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20200909/6eac483b/attachment.html>
More information about the Agda
mailing list