[Agda] Wrong reporting error ? (Was question on `compare')

Andreas Abel abela at chalmers.se
Wed Feb 11 17:43:21 CET 2015


https://code.google.com/p/agda/issues/detail?id=1431

On 11.02.2015 16:50, Andreas Abel wrote:
> Ah, I think it is because type information is not propagated optimally
> into an extended lambda (in this case at least).
>
> It infers the wrong result type (m \leq n) from the clause rhs (\leqrefl
> m=n) and then fails when checking the subsequent clauses.
>
> In particular as case_of_ has type _A -> (_A -> _B) -> _B  and the
> arguments are checked before unifying _B with the expected return type
> (n \leq m), result type _B is actually inferred from the clause rhss.
>
> This explains the puzzle.
>
> Andreas
>
>
> On 11.02.2015 16:43, Andreas Abel wrote:
>> Yes, the error location is wrong when clause tri> comes before
>> tri\approx (otherwise it is correct).  Weird.
>>
>> On 11.02.2015 14:18, Andrés Sicard-Ramírez wrote:
>>>
>>> On 11 February 2015 at 05:37, Sergei Meshveliani <mechvel at botik.ru
>>> <mailto:mechvel at botik.ru>> wrote:
>>>
>>>     Please, what is wrong here?
>>>
>>>     --------------------------------------------------------------------
>>>     open import Function        using (case_of_)
>>>     open import Relation.Binary using (module DecTotalOrder;
>>>                                         module StrictTotalOrder;
>>> module Tri)
>>>     open import Data.Empty using (⊥-elim)
>>>     open import Data.Nat as Nat using (ℕ; _≮_; _≤_; _≥_; _<_)
>>>     open import Data.Nat.Properties as NatProp using ()
>>>
>>>     open StrictTotalOrder NatProp.strictTotalOrder using (compare)
>>>     open DecTotalOrder    Nat.decTotalOrder using ()
>>>                                              renaming (reflexive to
>>> ≤refl)
>>>     open Tri
>>>
>>>
>>>     postulate  <→≤ : ∀ {m n} → m < n → m ≤ n
>>>
>>>     ≮→≥ : ∀ {m n} → m ≮ n → n ≤ m
>>>     ≮→≥ {m} {n} m≮n =
>>>          case compare m n
>>>          of \
>>>          { (tri< m<n _   _   ) → ⊥-elim (m≮n m<n)
>>>          ; (tri≈ _   m=n _   ) → ≤refl m=n
>>>          ; (tri> _   _    m>n) → let n<m : n < m
>>>                                      n<m = m>n
>>>
>>>                                      n≤m : n ≤ m
>>>                                      n≤m = <→≤ {n} {m} n<m
>>>                                  in
>>>                                  n≤m
>>>          }
>>>
>>>
>>> ​Rewriting the function by
>>>
>>> ≮→≥ : ∀ {m n} → m ≮ n → n ≤ m
>>> ≮→≥ {m} {n} m≮n with compare m n
>>> ≮→≥         m≮n | tri< m<n _   _   = ⊥-elim (m≮n m<n)
>>> ≮→≥         m≮n | tri≈ _   m=n _   = ≤refl m=n
>>> ≮→≥ {m} {n} m≮n | tri> _   _   m>n =
>>>    let n<m : n < m
>>>        n<m = m>n
>>>
>>>        n≤m : n ≤ m
>>>        n≤m = <→≤ {n} {m} n<m
>>>    in n≤m
>>>
>>> Why does ​Agda (correctly) report the error ​in `≤refl m=n`, but using
>>> the original function Agda reports the error `n≤m`?
>>>
>>> --
>>> Andrés
>>>
>>>
>>> _______________________________________________
>>> Agda mailing list
>>> Agda at lists.chalmers.se
>>> https://lists.chalmers.se/mailman/listinfo/agda
>>>
>>
>>
>
>

-- 
Andreas Abel  <><      Du bist der geliebte Mensch.

Department of Computer Science and Engineering
Chalmers and Gothenburg University, Sweden

andreas.abel at gu.se
http://www2.tcs.ifi.lmu.de/~abel/


More information about the Agda mailing list