[Agda] [ANNOUNCE] Agda 2.6.1 release candidate 1
mechvel at scico.botik.ru
mechvel at scico.botik.ru
Wed Jan 1 13:58:35 CET 2020
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