[Agda] strange let-in-case-let
Martin Stone Davis
martin.stone.davis at gmail.com
Mon Jan 23 22:19:24 CET 2017
That does look like strange behavior yet I'm guessing this is not a bug.
Would you revise the problem example to be as small as possible and only
relying on the Agda.Builtin.*?
On 01/23/2017 03:35 AM, Sergei Meshveliani wrote:
> People,
> I have further problems with matching in let+case+let.
> Consider the following two fragments.
>
> open OfMax natDTO using (Maximum; maximum′; maximum ...)
> open Maximum using (max; all≤max)
> -- Maximum is a record with constructor maximum′
> ...
> --------------------------------------------------------- (I) ---
> ; (tri≈ _ e≡e' _) →
> let
> es = map proj₂ mons
> maxStruc = maximum e (e' ∷ es) -- : Maximum (e ∷ e' ∷ es)
> m = max maxStruc
> ee'es≤m = all≤max maxStruc
> e'es≡ees = PE.sym $ PE.cong (_∷ es) e≡e'
> ord-ees = PE.subst DecrOrderedList e'es≡ees ord-e'es
>
> ees≤m : All (_≤ m) (e ∷ es)
> ees≤m = DPrelude.anything
> in
> ((pol′ ((a + b , e) ∷ mons) ord-ees) , ees≤m)
> ------------------------------------------------------------------
>
> ----------------------------------------------------------- (II) ---
> ...
> ; (tri≈ _ e≡e' _) →
> let
> es = map proj₂ mons
> in
> case maximum e (e' ∷ es)
> of \
> { (maximum′ m _ ee'es≤m) →
> let
> e'es≡ees = PE.sym $ PE.cong (_∷ es) e≡e'
> ord-ees = PE.subst DecrOrderedList e'es≡ees ord-e'es
>
> ees≤m : All (_≤ m) (e ∷ es)
> ees≤m = DPrelude.anything
>
> debug : All (_≤ m) (e ∷ e' ∷ es) -- for more testing
> debug = ee'es≤m
> in
> ((pol′ ((a + b , e) ∷ mons) ord-ees) , ees≤m)
> }
> ----------------------------------------------------------------------
>
> The difference is that in (I) the fields of the result of `maximum' are
> extracted explicitly, by applying their labels. And in (II) their values
> are found by matching against the record of the result.
>
> (I) is type-checked.
> And (II) leads to the report
>
> ------------------------
> Cannot instantiate the metavariable _295 to solution All (λ section
> → section ≤ m) (e ∷ map proj₂ mons) since it contains the variable
> m which is not in scope of the metavariable or irrelevant in the
> metavariable but relevant in the solution
> when checking that the expression ees≤m has type
> _B_295 upComR a e b e' mons ord-e'es .¬a e≡e' .¬c
> (pol′ ((a + b , e) ∷ mons)
> (PE.subst DecrOrderedList
> (PE.sym $ PE.cong (λ section → section ∷ map proj₂ mons) e≡e')
> ord-e'es))
> ------------------------
>
> in Agda 2.5.2.
>
> This report refers to the line after last "in".
> I also add the two "debug" lines to make sure that the value of m
> is valid in the body of "in".
>
> Does this effect show a bug in Agda?
>
> (Generally, matching against a record makes many programs nicer).
>
> Thank you in advance for explanation,
>
> ------
> Sergei
>
>
>
> _______________________________________________
> Agda mailing list
> Agda at lists.chalmers.se
> https://lists.chalmers.se/mailman/listinfo/agda
More information about the Agda
mailing list