Понимание Coq с помощью простого доказательства теоремы - PullRequest
0 голосов
/ 30 апреля 2018

Я очень новичок в Coq, и теперь я застрял, пытаясь понять, как Coq "обосновывает" простую теорему:

Theorem andb_true_elim2 : forall b c : bool,
  andb b c = true -> c = true.

Я предполагал, что доказательство будет просто:

Proof.
  intros b c.
  destruct c.
    - destruct b.
     + reflexivity.
     + reflexivity.
    - destruct b.
     + reflexivity.
     + reflexivity.
  Qed.

Но это не с:

In environtment
H: true && false = true
Unable to unify "true" with "false"

Сбой подцели - третий reflexivity, где c равен false, а b равен true:

1 subgoal
______________________________________(1/1)
true && false = true -> false = true

Почему это? Разве это не эквивалентно подтексту?

true && (false = true) -> (false = true)
true && false -> false
false -> false
true

1 Ответ

0 голосов
/ 30 апреля 2018

Есть несколько проблем с этим доказательством. Во-первых, вы неправильно поняли, что хотел Кок; фактическая цель была следующей:

((true && false) = true) -> (false = true)

Это не сопровождается рефлексивностью, поскольку вывод этой формулы, false = true, является равенством между двумя синтаксически различными выражениями.

Во-вторых, Coq не упрощает операторы -> и = так, как вы описали. Теория Кока позволяет автоматическое упрощение в нескольких выбранных выражениях, таких как те, которые определены анализом случая Например, && является синтаксическим сахаром для функции andb, которая определена в стандартной библиотеке следующим образом:

Definition andb b c :=
  if b then c else false.

Когда Coq видит выражение, такое как false && true, оно расширяет его до эквивалентного if false then true else false, что, в свою очередь, упрощает ветвь else true. Вы можете проверить это, вызвав тактику simpl на проблемной ветке.

Операторы -> и =, с другой стороны, определены по-разному: первый является примитивом в логике, тогда как другой является так называемым индуктивным высказыванием. Ни один из них не может быть автоматически упрощен в Coq, потому что они выражают понятия, которые, как правило, не являются вычислимыми: например, мы можем использовать =, чтобы выразить равенство двух функций f и g, которые принимают бесконечное число натуральных чисел в качестве входных данных. Этот вопрос обсуждает эту разницу более подробно.

Если хотите, вы можете сформулировать свою теорему чисто вычислимым образом с альтернативными определениями импликации и равенства:

Definition negb b := if b then false else true.

Definition eqb b c := if b then c else negb c.

Definition implb b c := if b then c else true.

Lemma test : forall b c, (implb (eqb (andb b c) true) (eqb c true))
                         = true.
Proof. intros [] []; reflexivity. Qed.

Однако такое утверждение, как правило, труднее использовать в Coq.

...