Я пытаюсь формализовать каждое целое число как класс эквивалентности пар натуральных чисел, где первый компонент - положительная часть, а второй компонент - отрицательная часть.
Definition integer : Type := prod nat nat.
Я хочу определить функцию нормализации, в которой положительные и отрицательные стороны сводятся к минимуму.
Fixpoint normalize (i : integer) : integer :=
let (a, b) := i in
match a with
| 0 => (0, b)
| S a' => match b with
| 0 => (S a', 0)
| S b' => normalize (a', b')
end
end.
Однако Coq говорит:
Ошибка: Рекурсивное определение нормализации неверно сформировано. В среде normalize: integer -> integer i: integer a: nat b: nat a ': nat b': nat Рекурсивный вызов нормализации имеет главный аргумент, равный "(a ', b')" вместо подтермина "i ".
Я думаю, это может быть связано с хорошо обоснованной рекурсией?
(a, b)
не является подтермом(S a, S b)
. Я бы создал вспомогательную функцию, которая принимает два аргумента (a
иb
). Таким образом,a
является подтермомS a
, и функция в конечном итоге сойдется. Возможно, вам удастся каким-то образом заставить coq понять, что ваша начальная функция сходится, но я недостаточно знаю coq, чтобы сказать, возможно ли это. Вы можете попробовать{measure (fst i)}
, но сейчас я не могу это проверить. - person   schedule 05.07.2019Program Fixpoint normalize (i: int) { measure (fst i) } : integer
может сработать. См. Пример здесь: cs.cornell.edu/courses/cs6115 /2017fa/notes/lecture7.html (сmeasure (length xs)
) - person   schedule 05.07.2019