[Agda] test report

mechvel at scico.botik.ru mechvel at scico.botik.ru
Wed Mar 17 12:29:58 CET 2021


On 2021-03-16 23:49, Nils Anders Danielsson wrote:
> On 2021-03-15 14:34, mechvel at scico.botik.ru wrote:
>> How to force erasing by @erase as much as possible for this example?
>> Where to set @0 ?
> 
> Here is one way to erase the proofs:
> [..]


Nils, thank you very much.
I am going to try this approach.

------
Sergei



>   record Erased (@0 A : Set) : Set where
>     constructor [_]
>     field
>       @0 erased : A
> 
>   efficient+withProof : (m n : ℕ) → Σ ℕ (\s → Erased (s ≡ m + n))
> 
>   efficient+withProof 0       n =  (n , [ refl ])
>   efficient+withProof (suc m) n =
>     let
>       (eff-m-n , [ eff-m-n≡m+n ]) = efficient+withProof m n
>       s = suc eff-m-n
> 
>       @0 s≡1+m+n : s ≡ (suc m) + n
>       s≡1+m+n = cong suc eff-m-n≡m+n
>     in
>     (s , [ s≡1+m+n ])
> 
>   efficient+ : (m n : ℕ) → ℕ
>   efficient+ m =  proj₁ ∘ efficient+withProof m
> 
>   @0 efficient+comm : Commutative _≡_ efficient+
>   efficient+comm m n =
>     let
>       open EqReasoning (PE.setoid ℕ)
>       (eff[m,n] , [ eff[m,n]≡m+n ]) = efficient+withProof m n
>       (eff[n,m] , [ eff[n,m]≡n+m ]) = efficient+withProof n m
>     in
>     begin efficient+ m n  ≡⟨ eff[m,n]≡m+n ⟩
>           m + n           ≡⟨ +-comm m n ⟩
>           n + m           ≡⟨ sym eff[n,m]≡n+m ⟩
>           efficient+ n m
>> 
> If, instead of using Erased, you switch to a variant of Σ with an 
> erased
> second field, then the GHC backend might erase more of your code:
> 
>   record Σ (A : Set) (@0 B : A → Set) : Set where
>     constructor _,_
>     field
>       proj₁    : A
>       @0 proj₂ : B proj₁
> 
> With Erased I get the following Haskell code for efficient+withProof:
> 
>   d20 :: Integer -> Integer -> MAlonzo.Code.Agda.Builtin.Sigma.T14
>   d20 v0 v1
>     = case coe v0 of
>         0 -> coe MAlonzo.Code.Agda.Builtin.Sigma.C32 (coe v1) erased
>         _ -> let v2 = subInt (coe v0) (coe (1 :: Integer)) in
>              coe
>                MAlonzo.Code.Agda.Builtin.Sigma.C32
>                (coe
>                   addInt (coe (1 :: Integer))
>                   (coe
>                      MAlonzo.Code.Agda.Builtin.Sigma.d28 (coe d20 (coe
> v2) (coe v1))))
>                erased
> 
> With an erased second projection I get the following Haskell code
> instead:
> 
>   newtype T6 = C20 AgdaAny
> 
>   d16 :: T6 -> AgdaAny
>   d16 v0
>     = case coe v0 of
>         C20 v1 -> coe v1
>         _ -> MAlonzo.RTE.mazUnreachableError
> 
>   d28 :: Integer -> Integer -> T6
>   d28 v0 v1
>     = case coe v0 of
>         0 -> coe C20 v1
>         _ -> let v2 = subInt (coe v0) (coe (1 :: Integer)) in
>              coe
>                C20
>                (addInt (coe (1 :: Integer)) (coe d16 (coe d28 (coe v2)
> (coe v1))))


More information about the Agda mailing list