- Нет больше подцели, но там не создается экзистенциальные переменные в Кок язык доказательство?
Я следовал (неполным) примерам в справочном руководстве Coq 8. 5p1 в главе 11 о математическом / декларативном языке доказательства. В приведенном ниже примере для итерационных равенств (~=
и =~
) я получил предупреждение Insufficient Justification
для перезаписи 4
в 2+2
, и в конечном итоге получил ошибку, говорящую:
Больше нет подцелей, но есть не-инстанцированные экзистенциальные переменные:
?Цель : [x : R H: x = 2 _eq0 : 4 = x * x |- 2 + 2 = 4]
Вы можете использование возьмите экзистенциальные переменные.
Пример:
Goal forall x, x = 2 -> x + x = x * x.
Proof.
proof. Show.
let x:R.
assume H: (x = 2). Show.
have ( 4 = 4). Show.
~= (2*2). Show.
~= (x*x) by H. Show.
=~ (2+2). Show. (*Problem Here: Insufficient Justification*)
=~ H':(x + x) by H.
thus thesis by H'.
end proof.
Fail Qed.
Я не знаком с языком математических доказательств в Coq и не мог понять, почему это происходит. Кто-нибудь может помочь объяснить, как исправить ошибку?
-- править-- @Vinz
У меня были эти случайные импорта перед примером:
Require Import Reals.
Require Import Fourier.
2 ответа:
Ваше доказательство будет работать для
nat
илиZ
, но оно не работает в случаеR
.Из справочного руководства Coq (v8. 5):
Цель декларативного языка доказательства состоит в том, чтобы использовать противоположный подход, когда промежуточные состояния всегда задаются пользователем, но переходы системы максимально автоматизированы.Похоже, что автоматизация не работает для
4 = 2 + 2
. Я не знаю, какая автоматизация использует декларативное доказательство но, например, тактикаauto
не способна доказать почти все простые равенства, как это:Open Scope R_scope. Goal 2 + 2 = 4. auto. Fail Qed.
И как указывает @ejgallego , мы можем доказать
2 * 2 = 4
, используяauto
только случайно:Однако тактикаOpen Scope R_scope. Goal 2 * 2 = 4. auto. Qed. (* `reflexivity.` would do here *)
Работает как заклинание. Таким образом, один из подходов состоит в том, чтобы предложить механизм декларативного доказательства, используя тактику
field
:Require Import Coq.Reals.Reals. Open Scope R_scope. Unset Printing Notations. (* to better understand what we prove *) Goal forall x, x = 2 -> x + x = x * x. Proof. proof. let x : R. assume H: (x = 2). have (4 = 4). ~= (x*x) by H. =~ (2+2) using field. (* we're using the `field` tactic here *) =~ H':(x + x) by H. thus thesis by H'. end proof. Qed.
Проблема здесь заключается в том, что стандартные реалы Coq определяются аксиоматическим образом.
Таким образом,
+ : R -> R -> R
и*
и т. д... это абстрактные операции,и они никогда не будут вычисляться. Что это значит? Это означает, что Coq не имеет правила о том, что делать с+
, в отличие, например, от случая nat, где Coq знает, что:Таким образом, единственный способ манипулировать
0 + n ~> 0
S n + m ~> S (n + m)
+
для действительных чисел-это вручную применять соответствующие аксиомы, что охарактеризуйте оператора, см.:Https://coq.inria.fr/library/Coq.Reals.Rdefinitions.html https://coq.inria.fr/library/Coq.Reals.Raxioms.html
Вот что такое
field, omega
и т. д... делать. Даже0 + 1 = 1
не является вероятным вычислением.Пример Антона
2 + 2 = 4
работает случайно. На самом деле Coq должен разобрать число 4 до подходящего представления, используя реальные аксиомы, и получается, что 4 разбирается какRmult (Rplus R1 R1) (Rplus R1 R1)
(чтобы быть более эффективным), что то же самое чем левая сторона предыдущего равенства.