Почему Coq не допускает инверсии, разрушения и т. Д., Когда целью является Тип?

При refine запуске программы я попытался завершить доказательство с помощью inversion гипотезы False, когда целью была Type. Вот сокращенная версия доказательства, которое я пытался сделать.

Lemma strange1: forall T:Type, 0>0 -> T.
  intros T H.
  inversion H.  (* Coq refuses inversion on 'H : 0 > 0' *)

Coq пожаловался

Error: Inversion would require case analysis on sort 
Type which is not allowed for inductive definition le

Однако, поскольку я ничего не делаю с T, это не имеет значения ... или?

Я избавился от T вот так, и доказательство прошло:

Lemma ex_falso: forall T:Type, False -> T.
  inversion 1.
Qed.  

Lemma strange2: forall T:Type, 0>0 -> T.
  intros T H.
  apply ex_falso.  (* this changes the goal to 'False' *)
  inversion H.
Qed.

На что жаловался Coq? Это просто недостаток в inversion, destruct и т. Д.?


person larsr    schedule 05.12.2014    source источник
comment
Поучительное обсуждение в списке рассылки coq-club: sympa .inria.fr / sympa / arc / coq-club / 2014-12 / msg00036.html.   -  person larsr    schedule 10.12.2014


Ответы (1)


Я никогда раньше не сталкивался с этой проблемой, но это имеет смысл, хотя, вероятно, можно было бы возразить, что это ошибка в inversion.

Эта проблема связана с тем, что inversion реализуется путем анализа случаев. В логике Coq нельзя в целом выполнять анализ случая на основе логической гипотезы (т. Е. Чего-то, чей тип Prop), если результат является чем-то вычислительным (т. Е. если тип возвращаемой вещи - Type). Одна из причин этого заключается в том, что разработчики Coq хотели сделать возможным стирать аргументы доказательства из программ при извлечении их в код разумным способом: таким образом, можно только анализировать случай гипотезы, чтобы произвести что-то вычислительное, если разрушаемая вещь не может изменить результат. Это включает в себя:

  1. Предложения без конструкторов, например False.
  2. Предложения с одним конструктором, если этот конструктор не принимает аргументы вычислительного характера. Это включает True, Acc (предикативная доступность, используемая для выполнения хорошо обоснованной рекурсии), но исключает экзистенциальный квантификатор ex.

Однако, как вы заметили, это правило можно обойти, преобразовав одно предложение, которое вы хотите использовать для получения результата, в другое, на котором вы можете провести анализ случая напрямую. Таким образом, если у вас есть противоречивое предположение, как в вашем случае, вы можете сначала использовать его, чтобы доказать False (что разрешено, поскольку False является Prop), и затем исключив False для получения результата ( что разрешено вышеуказанными правилами).

В вашем примере inversion слишком консервативен, отказываясь только потому, что не может провести анализ случая для чего-то типа 0 < 0 в этом контексте. Верно то, что он не может проводить анализ кейсов непосредственно по правилам логики, как объяснено выше; тем не менее, можно подумать о создании немного более умной реализации inversion, которая признает, что мы исключаем противоречивую гипотезу, и добавляла False в качестве промежуточного шага, как и вы. К сожалению, похоже, что нам нужно проделать этот трюк вручную, чтобы он заработал.

person Arthur Azevedo De Amorim    schedule 05.12.2014
comment
Разве не факт, что < находится в Prop, поэтому вы не можете проанализировать его, чтобы создать Type реальную проблему? Я что-то упустил? - person Vinz; 08.12.2014
comment
Хммм, наверное, я неправильно истолковал вашу ошибку в inversion. Я бы назвал это особенностью, чтобы предотвратить несогласованность вселенной. Даже если в этом конкретном случае результат инверсии не используется для вычисления результата, я рад, что Coq предотвращает подобную эскалацию. Если результат не зависит от инверсии, не выполняйте ее;) - person Vinz; 08.12.2014
comment
@Vinz, как это предотвратить несогласованность вселенной? - person Arthur Azevedo De Amorim; 08.12.2014
comment
Подробностей не помню, давно уже не задумывался над подобными проблемами. Я попробую откопать несколько старых статей по этому поводу и посмотрю, смогу ли я на это ответить :) - person Vinz; 08.12.2014
comment
@Vinz, независимо от проблем с согласованностью, в этом случае инверсия все же может попытаться быть умнее, не меняя основную логику - я думаю, я не очень понимал это. Он может автоматически делать то, что в этом случае можно было бы сделать вручную, а именно сначала произвести доказательство False. - person Arthur Azevedo De Amorim; 10.12.2014