Почему программа проверки завершения Coq не поддерживает случай, когда один аргумент становится структурно меньше, а другие остаются прежними

Программа проверки завершения Coq не любит такие функции, как:

Fixpoint interleave (A : Type) (l1 l2 : list A) : list A :=
  match l1 with 
  | cons h1 t1 => cons h1 (interleave l2 t1)
  | nil => l2
  end.

Однако некоторые другие языки с аналогичными средствами проверки завершения, такие как Lean, Idris и Isabelle, принимают такие функции. Мне интересно, почему средство проверки завершения Coq не принимает такие функции, когда по крайней мере один аргумент становится структурно меньше каждый раз, а аргументы не становятся больше. Мне кажется, что если хотя бы один аргумент всегда становится меньше и ни один не растет, функция должна в конечном итоге завершиться, или есть какой-то случай, который мне не хватает?

Edit: Кажется, я выбрал ужасный пример, поскольку, очевидно, Идрис и Лин тоже не могут с этим справиться. Лучшим примером может служить формулировка «исправление в исправлении», приведенная в Как работать с действительно большими терминами, созданными программой Fixpoint в Coq?; Я знаю, что мне удалось реализовать ту же функцию в Lean и Idris напрямую, не требуя конструкции «исправление в исправлении». Кроме того, остается открытым исходный вопрос: почему эта конструкция не поддерживается?


person LogicChains    schedule 17.12.2017    source источник
comment
Действительно, программа проверки завершения Coq на одно поколение старше, чем та, которая используется в упомянутых вами языках, поэтому она не такая мощная. Вы можете использовать плагин Equations, чтобы приблизиться к современной проверке завершения в Coq.   -  person ejgallego    schedule 17.12.2017
comment
@ejgallego Очевидно, иногда даже современные языки с зависимой типизацией не могут победить старый добрый Coq :) См., например, эта проблема с Идрисом   -  person Anton Trunov    schedule 17.12.2017
comment
Идрис не принимает эту функцию как полную (я пробовал с Идрисом v1.1.1)   -  person Anton Trunov    schedule 18.12.2017
comment
Lean (версия 3.3.1, commit 1b4d2a850afd) тоже не принимает   -  person Anton Trunov    schedule 18.12.2017
comment
@AntonTrunov Извините, похоже, я выбрал плохой пример; Я обновил вопрос. Я все еще задаюсь вопросом, есть ли что-то конкретное, что мешает этой конструкции поддерживаться?   -  person LogicChains    schedule 18.12.2017
comment
@ejgallego Уравнения выглядят чрезвычайно полезными, я удивлен, что никогда не слышал о них раньше. Может ли это в конечном итоге заменить / интегрировать в функцию или точку фиксации программы, когда они будут объединены, или это вряд ли когда-либо будет интегрировано в основной дистрибутив Coq?   -  person LogicChains    schedule 18.12.2017
comment
Equations действительно является преемником Function и Program и уже официально поддерживается командой разработчиков Coq. И действительно, в какой-то момент он будет распространяться вместе с Coq.   -  person ejgallego    schedule 18.12.2017
comment
Если все остальное не помогает, вы можете вручную определить соответствующее отношение меньше, чем для пар аргументов, доказать его обоснованность (и, возможно, убедиться, что доказательство является прозрачным определением, если вам нужно оценить функцию), а затем написать вспомогательную функцию, которая принимает Acc доказательство как дополнительный аргумент для установки в качестве убывающего аргумента фиксированной точки.   -  person Daniel Schepler    schedule 19.12.2017
comment
или просто используйте measure, который представляет собой сумму length в двух списках.   -  person gallais    schedule 21.12.2017


Ответы (1)


Как предлагает Галле, вы можете использовать measure:

Require Import PeanoNat.
Require Import Coq.Program.Wf.

Program Fixpoint interleave (A : Type) (l1 l2 : list A) {measure (length l1 + length l2)} : list A :=
  match l1 with
  | nil => l2
  | cons h1 t1 => cons h1 (interleave A l2 t1)
  end.
Next Obligation.
  simpl.
  rewrite Nat.add_comm.
  apply Nat.lt_succ_diag_r.
Defined.
Next Obligation.
Admitted.

После определения вам нужно доказать две вещи: во-первых, что на каждом шаге мера уменьшается; и, во-вторых, эта мера хорошо обоснована. После завершения двух доказательств ваше определение готово.

person ana-borges    schedule 10.07.2018