LINUX.ORG.RU

История изменений

Исправление fmdw, (текущая версия) :

Анонiмус открыл для себя проблему останова?

Agda может определять только некоторые случаи, когда остановка точно произойдёт, для этого используются алгоритм, использованный в Foetus. Этот алгоритм очень ограничен, например такой случай он забракует (я уже крепко забыл её синтаксис, так что пусть будет haskell):

f :: Nat -> Nat
f x | x == 0 = 0
    | even x = f $ x + 1
    | True = f $ x - 2

Хотя очевидно, что эта ф-ция завершается, обо

f (f x) | x == 0 = 0
        | even x = f (x + 1 - 2) -> f $ (x - 1)
        | True  = f $ x - 4

(Когда-то я проверял этот пример, вроде не вру)

Был ещё язык MiniAgda, использующий sized-типы (т.е. типы, параметризуемые максимальной глубиной терма). Критерием остановки в этом случае будет просто уменьшающийся размер терма. Вроде сейчас их запилили и в Agda.

Но вообще, я не понимаю, что мешало набрать в поисковике «agda termination checker» и прочитать всё там, не прибегая к помощи лорчан с дырявой памятью.

Исходная версия fmdw, :

Анонiмус открыл для себя проблему останова?

Agda может определять только некоторые случаи, когда остановка точно произойдёт, для этого используются алгоритм, использованный в Foetus. Этот алгоритм очень ограничен, например такой случай он забракует (я уже крепко забыл её синтаксис, так что пусть будет haskell):

f :: Nat -> Nat
f x | x == 0 = 0
    | even x = f $ x + 1
    | True = f $ x - 2

Хотя очевидно, что эта ф-ция завершается, обо

f (f x) | x == 0 = 0
        | even x = f (x + 1 - 2) -> f $ (x - 1)
        | True  = f $ x - 4

(Когда-то я проверял этот пример, вроде не вру)

Был ещё язык MiniAgda, использующий sized-типы (т.е. типы, параметризуемые максимальной глубиной терма). Критерием остановки в этом случае будет просто уменьшающийся размер терма. Вроде сейчас их запилили и в Agda.