[Agda] some brown for your nerves

Conor McBride conor at strictlypositive.org
Sun May 2 22:49:58 CEST 2010


Folks

I was in the middle of something else when I tripped over this
little infelicity. The following code-with-shed refines, but the
resulting code will not reload. I can guess why, but I wonder
what will come of it. Here's the stuff.

---------------------------------------------------------------
module PushyU where

data Nat : Set where
  ze : Nat
  su : Nat -> Nat

data Bool : Set where
  tt ff : Bool

record One : Set where
data Zero : Set where

So : Bool -> Set
So tt = One
So ff = Zero

_<_ : Nat -> Nat -> Bool
_ < ze = ff
ze < su n = tt
su m < su n = m < n

data Lt (m n : Nat) : Set where
  lt : So (m < n) -> Lt m n

boo : {m n : Nat} -> So (m < n) -> Lt (su m) (su n)
boo p = lt {!p!}
---------------------------------------------------------------

Interactively, I suppose it's rightly happy to
accept p : So (m < n) when it wants a (So (su m < su n)) as
these types are definitionally equal.

On reload, I fear it foolishly jumps to the conclusion that
when I write
  lt p
I mean
  lt {m} {n} p : Lt m n
because
  p : So (m < n)
and unification is happy to choose the solution which presents
itself, even if it's not unique.

Am I right? Is it choosing a non-unique unifier over the more
reliable information coming from the type pushed in? Is this a
bug or a feature?

I've noticed in the past that Agda's implicit syntax machinery
commits hastily, but less often that doing so produces incorrect
results. It may very well be the case that making unification
less aggressive will break a lot of existing code which relies
on correct guesswork rather than forced moves.

It may be that, pragmatically, just tweaking the order in which
constraints are attacked to make better use of types pushed in
will result in better guesswork. Of course, it might just result
in different guesswork. That's the trouble with guesswork.

As ever, unvoodoo overdue

Cheers

Conor



More information about the Agda mailing list