Аксиома экстенсиональности: почему она не несостоятельна? - PullRequest
0 голосов
/ 07 апреля 2020

Аксиома экстенсиональности говорит, что две функции равны, если их действия на каждый аргумент области равны.

Axiom func_ext_dep : forall (A : Type) (B : A -> Type) (f g : forall x, B x),
  (forall x, f x = g x) -> f = g.

Равенство = с обеих сторон утверждения теоремы - это пропозициональное равенство (тип данных с одним конструктором eq_refl). Используя эту аксиому, можно доказать, что f = a + b и g = b + a пропозиционально равны.

Но f и g явно не равны структурам данных.

Не могли бы вы объяснить, что мне здесь не хватает? Возможно, что функциональные объекты не имеют нормальной формы?

1 Ответ

5 голосов
/ 07 апреля 2020

РЕДАКТИРОВАТЬ: После дальнейшего обсуждения в комментариях, фактическая путаница была такая:

Не match a with... = match b with дает мне False сразу же, как S S Z = S Z ?

Вы можете сопоставить с шаблоном nat, а с функциями - нет. Зависимое сопоставление с образцом - это то, как мы можем доказать инъективность и дизъюнктность конструкторов, тогда как единственное, что мы можем сделать с функцией, это применить ее. (См. Также Откуда мы знаем, что все конструкторы Coq инъективны и не пересекаются? )

Тем не менее, я надеюсь, что остальная часть ответа ниже по-прежнему поучительна.


Из комментариев:

AFAIU, = имеет очень точное значение в Coq / CI C - syntacti c равенство нормальных форм.

Это не так правильно. Например, мы можем доказать следующее:

Lemma and_comm : forall a b : bool, (* a && b = b && a *)
   match a with
   | true => b
   | false => false
   end = match b with
         | true => a
         | false => false
         end.
Proof.
  destruct a, b; reflexivity.
Qed.

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

Но f и g, очевидно, не равны как структуры данных.

Это утверждение кажется путать доказуемость и правду. Важно различать guish эти два мира. (И я не логик, так что возьмите то, что я собираюсь сказать, с долей соли.)

Coq - игра с символами, с четко определенными правилами для построения терминов определенных типов. , Это доказуемость. Когда Coq принимает доказательство, все, что мы знаем, это то, что мы создали термин, следуя правилам.

Конечно, мы также хотим, чтобы эти термины и типы что-то значили. Когда мы докажем предложение, мы ожидаем, что это скажет нам что-то о состоянии мира. Это правда. И в некотором смысле, Coq очень мало говорит по этому вопросу. Когда мы читаем f = g, мы даем значение символу f, значение g, а также значение =. Это полностью зависит от нас (ну, всегда есть правила, которым нужно следовать), и существует более одной интерпретации (или «модели»).

«Наивная модель», которую большинство людей имеет в виду, рассматривает функции как отношения (также называемые графиками) между входами и выходами. В этой модели функциональность расширяется: функция - это не более, чем отображение между входами и выходами, поэтому две функции с одинаковыми отображениями равны. Функциональность расширяется в Coq (мы не можем доказать False), потому что есть хотя бы одна модель, в которой она действительна.

В вашей модели функция характеризуется своим кодом, по модулю уравнения. (Это более или менее «модель syntacti c», где мы интерпретируем каждое выражение как само по себе, с минимально возможным количеством поведения semanti c.) Тогда действительно есть функции, которые экстенсивно равны, но с разными код. Таким образом, функциональная экстенсиональность недопустима в этой модели, но это не означает, что она неверна (то есть, что мы можем доказать ее отрицание) в Coq, как это оправдывалось ранее.

f и g не являются «очевидно, не равен», потому что равенство, как и все остальное, относится к конкретной интерпретации.

...