[Agda] [ANNOUNCE] Agda 2.6.1 release candidate 1

mechvel at scico.botik.ru mechvel at scico.botik.ru
Wed Jan 1 15:50:49 CET 2020


On 2020-01-01 16:18, Guillaume Allais wrote:
> This is what I would have written:
> 
> ====================================================================
> open import Data.List.Base using (List; []; _∷_; [_])
> open import Data.Nat.Base using (ℕ; _<_; _≮_; _∸_)
> open import Data.Nat.Properties using (_<?_)
> open import Relation.Nullary using (Dec; yes; no)
> 
> g : (x y : ℕ) → x ≮ y → ℕ
> g x y _ =  x ∸ y
> 
> f : List ℕ → List ℕ → List ℕ
> f []       ys       =  ys
> f xs       []       =  xs
> f (x ∷ xs) (y ∷ ys) with (x <? y) | f (x ∷ xs) ys | f xs (y ∷ ys)
> ... | yes x<y | fy | fn = y ∷ fy
> ... | no x≮y  | fy | fn = g x y x≮y ∷ fn
> ====================================================================


I see. Thank you.

We have so easily bypassed this fundamental type checker restriction.
May be, this means that the type checker is going to recover and 
prohibit this also?
:-)

--
SM


> On 01/01/2020 12:58, mechvel at scico.botik.ru wrote:
>> On 2019-12-31 21:27, mechvel at scico.botik.ru wrote:
>>> On 2019-12-31 18:25, Guillaume Allais wrote:
>>>> I'll add to that: if you perform all the recursive calls at the
>>>> same time as `with comparePP e e'` then you should be able to get
>>>> a terminating version of the function.
>>>> 
>>>> I am saying "should" because the example is not self-contained and
>>>> as such it is impossible to test.
>>>> 
>>> 
>>> A sigh of releaf!
>>> The following is recognized as terminating:
>>> 
>>> ------------------------------------------------
>>> open import Data.List using (List; []; _∷_)
>>> open import Data.Nat using (ℕ; _<_)
>>> open import Data.Nat.Properties using (_<?_)
>>> open import Relation.Nullary using (Dec; yes; no)
>>> 
>>> g : List ℕ → List ℕ → List ℕ
>>> g []       ys       =  ys
>>> g xs       []       =  xs
>>> g (x ∷ xs) (y ∷ ys) =  aux (x <? y) (y ∷ (g (x ∷ xs) ys))
>>>                                     (x ∷ (g xs (y ∷ ys)))
>>>   where
>>>   aux : Dec (x < y) → List ℕ → List ℕ → List ℕ
>>>   aux (yes _) zs _  =  zs
>>>   aux (no _)  _  us =  us
>>> -----------------------------------------------
>>> 
>>> So that we avoid a complication of introducing a counter.
>> 
>> 
>> Still there remains a certain complication in the "dependent" case.
>> Consider
>> 
>> -------------------------------------------------------------
>> open import Data.List using (List; []; _∷_; [_])
>> open import Data.Nat using (ℕ; _<_; _≮_; _∸_)
>> open import Data.Nat.Properties using (_<?_)
>> open import Relation.Nullary using (Dec; yes; no)
>> 
>> g : (x y : ℕ) → x ≮ y → ℕ
>> g x y _ =  x ∸ y
>> 
>> f : List ℕ → List ℕ → List ℕ
>> f []       ys       =  ys
>> f xs       []       =  xs
>> f (x ∷ xs) (y ∷ ys) =  aux (x <? y)
>>   where
>>   aux : Dec (x < y) → List ℕ
>>   aux (yes _)  =  y ∷ (f (x ∷ xs) ys)
>>   aux (no x≮y) =  (g x y x≮y) ∷ (f xs (y ∷ ys))
>> -------------------------------------------------------------
>> 
>> The RHS of the second clause for  aux  depends on the value  x≮y.
>> So that we cannot set  (g x y x≮y) ∷ (f xs (y ∷ ys))
>> as the third argument for new  aux,
>> because the value  x≮y  is not in the scope
>> (and imagine that g analizes the value x≮y).
>> However the following is type-checked:
>> 
>> --------------------------------------------------------------
>> f : List ℕ → List ℕ → List ℕ
>> f []       ys       =  ys
>> f xs       []       =  xs
>> f (x ∷ xs) (y ∷ ys) =  aux (x <? y) (y ∷ (f (x ∷ xs) ys))
>>                                     (aux' (x <? y))
>>   where
>>   aux : Dec (x < y) → List ℕ → List ℕ → List ℕ
>>   aux (yes _)  xs _  =  xs
>>   aux (no x≮y) _  xs =  xs
>> 
>>   aux' : Dec (x < y) → List ℕ
>>   aux' (no x≮y) =  (g x y x≮y) ∷ (f xs (y ∷ ys))
>>   aux' (yes _)  =  []                           -- inaccessible
>> --------------------------------------------------------------
>> 
>> This does not look so nice, but it is nicer that introducing a counter
>> for termination proof.
>> 
>> What people think of this, what can be a better solution?
>> 
>> Thanks,
>> 
>> --
>> SM
>> 
>> 
>> 
>> 
>>>> On 31/12/2019 12:23, Jesper Cockx wrote:
>>>>> From the changelog:
>>>>> 
>>>>> The "with inlining" feature of the termination checker has been 
>>>>> removed. As
>>>>>> a consequence, some functions defined using with are no longer 
>>>>>> accepted as
>>>>>> terminating. See Issue #59 for why this feature was originally 
>>>>>> introduced
>>>>>> and #3604 for why it had to be removed.
>>>>>> 
>>>>> 
>>>>> It is likely that your function no longer passes the termination 
>>>>> checker
>>>>> because this feature was removed. There were several issues with 
>>>>> the
>>>>> implementation of this feature and no-one was willing to maintain 
>>>>> it, so
>>>>> unfortunately it had to be removed.
>>> 
>>> _______________________________________________
>>> Agda mailing list
>>> Agda at lists.chalmers.se
>>> https://lists.chalmers.se/mailman/listinfo/agda
>> 



More information about the Agda mailing list