Я только что столкнулся с проблемой, когда Coq induction
отбрасывает информацию о сконструированных терминах при чтении доказательства из здесь.
Авторы использовали что-то вроде:
remember (WHILE b DO c END) as cw eqn:Heqcw.
переписать гипотезу H
перед фактической индукцией induction H
. Мне действительно не нравится идея вводить тривиальное равенство, потому что это похоже на черную магию.
Некоторый поиск здесь, в SO, показывает, что на самом деле трюк remember
необходим. Однако один ответ, здесь, указывает на то, что новый dependent induction
можно использовать, чтобы избежать уловки remember
. Это хорошо, но сама dependent induction
теперь кажется немного волшебной.
Мне трудно понять, как работает dependent induction
. В документации приведен пример, в котором требуется dependent induction
:
Lemma le_minus : forall n:nat, n < 1 -> n = 0.
Я могу проверить, как induction
выходит из строя и dependent induction
работает в этом случае. Но я не могу использовать трюк remember
, чтобы воспроизвести результат dependent induction
.
До сих пор я пытался имитировать трюк remember
:
Require Import Coq.Program.Equality.
Lemma le_minus : forall n:nat, n < 1 -> n = 0.
intros n H. (* dependent induction H works*)
remember (n < 1) as H0. induction H.
Но это не работает. Кто-нибудь может объяснить, как dependent induction
здесь работает с точки зрения remember
-ing?