[Agda] "metavariable" message

Andreas Abel abela at chalmers.se
Sun Nov 3 19:55:17 CET 2013


The error about the metavariable indicates that you overlooked a dependency.

Your proof is easy with 'with'.  'case' is obviously the wrong strategy 
because you are proving something about functions that were defined with 
'with'.

Here is the proof:

toDgs'-suc=toDgs-suc : ∀ n → toDgs' (suc n) =l toDgs (suc n)
toDgs'-suc=toDgs-suc 0       = blRefl
toDgs'-suc=toDgs-suc (suc n) with toDigits 2 (suc (suc n))
toDgs'-suc=toDgs-suc (suc n) | [] , ()
toDgs'-suc=toDgs-suc (suc n) | 0b ∷ [] , ()
toDgs'-suc=toDgs-suc (suc n) | sucF 0b ∷ [] , ()
toDgs'-suc=toDgs-suc (suc n) | sucF (sucF ()) ∷ [] , _
toDgs'-suc=toDgs-suc (suc n) | 0b ∷ b' ∷ bs , p = LP.refl PE.refl
toDgs'-suc=toDgs-suc (suc n) | sucF b ∷ b' ∷ bs , p = LP.refl PE.refl

Cheers,
Andreas


On 03.11.2013 19:22, Sergei Meshveliani wrote:
> People,
> I have the two questions about the below program.
>
> 1) Why the checker reports about "metavariable" ?
>
>     (Agda 2.3.2.2 MAlonzo).
>
> 2) How to prove  toDgs'-suc=toDgs-suc ?
>
> The statement looks as trivial,
> and  " → blRefl"  needs to be sufficient in the last branch.
> But it fails.
>
> Thank you in advance for explanation,
>
> ------
> Sergei
>
>
> --------------------------------------------------------------
> open import Function using (_$_; _∘_; case_of_)
> open import Relation.Binary using
>       (IsEquivalence; module IsEquivalence; Setoid;
>        module Setoid; DecSetoid; module DecSetoid;
>        DecTotalOrder; module DecTotalOrder
>       )
> open import Relation.Binary.PropositionalEquality as PE
>                                                    using (_≡_)
> open import Data.Empty      using (⊥; ⊥-elim)
> open import Data.Unit       using (⊤)
> open import Data.Fin as Fin using (Fin)
>                              renaming (zero to 0b; suc to sucF)
> import Data.Fin.Props as FinP using (decSetoid)
> open import Data.Digit using (Bit)
> open import Data.Bin   using (Bin⁺)
> open import Data.Digit using (toDigits; fromDigits)
> open import Data.Product    using (_×_; _,_; proj₁; proj₂; ∃)
> open import Data.Nat as Nat using (ℕ; suc)
>                              renaming (decTotalOrder to natDTO)
> open import Data.List     using (List; []; _∷_)
> open import Relation.Binary.List.Pointwise as LP using ()
>
> -------------------------------------------------------------------
> bitDecSetoid = FinP.decSetoid 2
> open DecSetoid bitDecSetoid using () renaming (setoid to bitSetoid)
> blSetoid = LP.setoid bitSetoid
> open Setoid blSetoid using ()
>                    renaming (_≈_ to _=l_; isEquivalence to blEquiv)
> open IsEquivalence blEquiv using ()
>                             renaming (refl to blRefl; sym to blSym)
>
> postulate anything : ∀ {a} {A : Set a} → A  -- for debug
>
> toDgs = proj₁ ∘ toDigits 2
>
> toDigits' : (n : ℕ) → ∃ \ (bs : Bin⁺) → fromDigits bs ≡ n
> toDigits' n  with  toDigits 2 n
>
> ... | ([]      , eq) =  ([]     , eq)  -- inaccessible
> ... | (0b ∷ [] , eq) =  ([]     , eq)
> ... | (b ∷ bs  , eq) =  (b ∷ bs , eq)
> --
> -- It differs from  toDigits  only at  n = 0.
>
> toDgs' = proj₁ ∘ toDigits'
>
> toDgs'-suc=toDgs-suc : ∀ n → toDgs' (suc n) =l toDgs (suc n)
> toDgs'-suc=toDgs-suc 0       = blRefl
> toDgs'-suc=toDgs-suc (suc n) =
>    case
>        toDigits 2 (suc (suc n))
>    of \
>    { ([]                    , ())
>    ; (0b ∷ []               , ())
>    ; ((sucF 0b) ∷ []        , ())
>    ; ((sucF (sucF ())) ∷ [] , _ )
>    ; (b ∷ b' ∷ bs           , _ ) →
>           let gl : toDgs' (suc $ suc n) =l (b ∷ b' ∷ bs)
>                                           -- toDgs (suc $ suc n)
>               gl = anything
>           in  gl
>    }
>
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
>



More information about the Agda mailing list