[Agda] Size Issue when Modelling Effectful Data Structures and Computations

jonas.hoefer at stud.htwk-leipzig.de jonas.hoefer at stud.htwk-leipzig.de
Tue Sep 15 10:10:02 CEST 2020


Hello

> Note that the last example works fine:

Your code only seems works with the current Agda version from the Master
branch
not Agda version 2.6.1 (or 2.6.1.1). I don't think the last example should
work.
It fails in version 2.6.1 with the error message "Set (suc a) is not less or
equal than Set a".

> foo bar : Free (Op a) (Listᴹ (Op a) Bool)
> foo = pure nil
> bar = op foo

Op a produces a container of level suc a. Free and Listᴹ both use
the level of
their container i.e. suc a. op expects an argument of level a (not suc a,
because the stored type is smaller), but passing foo seems to work.

> op : {A : Set a} → Free (Op a) A → Free (Op a) A
> op {A = A} ma = impure (opˢ A , λ { (inj₁ tt) →
ma; (inj₂ x) → pure x })

Replacing Set a with Set (suc a) in the definition of op fails with the same
error, but the following works.

> op′ : {a : Level} {A : Set (suc a)} → Free (Op a) A →
Free (Op a) A
> op′ {a} {A} ma = op {a} ma

Passing {A} directly as an argument to op also yields the error, but omitting
it works. I think this behavior is a bug in the current version, because the
following implementation of Russel's paradox type checks with my build of the
latest version (commit 832057961873856915c41745c37e055ff4b2c583).

  {-# OPTIONS --cumulativity #-}

  open import Data.Bool
  open import Data.Empty
  open import Data.Product
  open import Data.Sum
  open import Data.Unit
  open import Data.Maybe

  open import Function
  open import Level

  open import Relation.Binary.PropositionalEquality

  private
    variable
      a : Level

  record Container a : Set (suc a) where
    constructor _◁_/_
    field
      Shape : Set a
      Pos   : Shape → Set a
      Ctx   : (s : Shape) → Pos s → Maybe {a = suc a} (Set a)

  open Container public

  ⟦_⟧ : Container a → (Set a → Set a) →
Set a → Set a
  ⟦ S ◁ P / C ⟧ F A = Σ[ s ∈ S ] ((p : P s)
→ F (fromMaybe A (C s p)))

  data Free {a : Level} (C : Container a) (A : Set a) : Set a where
    pure   : A                → Free C A
    impure : ⟦ C ⟧ (λ A → Free C A) A →
Free C A

  data Listᴹ (C : Container a) (A : Set a) : Set a where
    nil : Listᴹ C A
    cons : Free C A → Free C (Listᴹ C A) → Listᴹ C A

  ROp : ∀ a → Container (suc a)
  ROp a = Set a ◁ id / λ _ _ → nothing

  rop : {a : Level} {A : Set a} → Free (ROp a) A
  rop {_} {A} = impure (A , pure)

  rop′ : {a : Level} {A : Set (suc a)} → Free (ROp a) A
  rop′ = rop

  rop₁ : {A : Set₁} → Free (ROp 0ℓ) A
  rop₁ = rop′

  _bind_ : {A B : Set (suc a)} → Free (ROp a) A → (A →
Free (ROp a) B)
    → Free (ROp a) B
  pure x bind k = k x
  impure (X , pf) bind k = impure (X , λ p → pf p bind k)

  M : Set₁
  M = Free (ROp 0ℓ) ⊥

  m : (I : Set₁) → (I → M) → M
  m I pf = rop₁ {I} bind pf

  -- Now we can follow some implementation of Russell's Paradox
  -- http://www.cs.nott.ac.uk/~psztxa/g53cfr/l20.html/l20.html

  _∈_ : M → M → Set₁
  a ∈ (impure (I , f)) = ∃[ i ] (a ≡ f i)

  _∉_ : M → M → Set₁
  x ∉ y = x ∈ y → ⊥

  R : M
  R = m (Σ M λ s → s ∉ s) proj₁

  lem-1 : {X : M} → X ∈ R → X ∉ X
  lem-1 ((s , s∉s) , p) = subst₂ _∉_ p' p' s∉s
where p' = sym p

  lem-2 : {X : M} →  X ∉ X → X ∈ R
  lem-2 {X} X∉X = ((X , X∉X) , refl)

  lem-3 : R ∉ R
  lem-3 R∈R = lem-1 R∈R R∈R

  contr : ⊥
  contr = lem-3 (lem-2 {R} lem-3)

Jonas




More information about the Agda mailing list