Я преподаю в университете на курсе Системы типов языков, и профессор использовал следующий пример для индуктивных доказательств в теории типов на доске на прошлой лекции:
Предположим, что есть натуральные числа, определенные индуктивно (по какой-то причине он настаивает на том, чтобы называть их терминами), и у нас есть функция больше чем, определенная на них рекурсивно. Мы можем доказать, что для любого n выполняется (su n> n).
У меня есть следующий код Coq, подготовленный для реализации этого в классе:
Inductive term : Set :=
| zero
| suc (t : term)
.
Fixpoint greaterThan (t t' : term) {struct t} : bool :=
match t, t' with
| zero, _ => false
| suc t, zero => true
| suc t, suc t' => t > t'
end
where "t > t'" := (greaterThan t t').
Lemma successorIsGreater : forall t : term, suc t > t = true.
Proof.
induction t.
(* zero *)
- simpl.
reflexivity.
(* suc t *)
-
что приводит меня к следующей цели:
1 subgoal
t : term
IHt : (suc t > t) = true
______________________________________(1/1)
(suc (suc t) > suc t) = true
Я могу решить эту проблему несколькими способами, переписав, развернув и / или упростив до того, как она просто превратится в рефлексивность, но что мне действительно хотелось бы сделать, чтобы она была чище, так это применить одну итерацию больше, чем, которая просто превратит (suc (suc t) > suc t) = true
в (suc t > t) = true
, и я мог бы закончить доказательство с помощью exact IHt
.
Есть ли способ добиться этого?
ps: Я знаю, что могу simpl in IHt
, а затем использовать exact
, но оно расширяется до выражения соответствия, которое намного более подробное, чем то, что здесь необходимо.
Изменить: Благодаря ответу Théo Winterhalter
я понял, что могу также использовать exact
сам по себе, поскольку термины можно конвертировать, но это не слишком хорошо покажет процесс студентам. (Примечание: оба случая индукции также решаются с помощью trivial
, но я не думаю, что они тоже многому научились бы.: D)