В таких простых случаях, как этот, вам не нужно раскрывать определения, такие как well_founded
и MR
, а использовать соответствующие леммы.
Чтобы справиться с MR
, вы можете использовать лемму measure_wf
в Program.Wf.
Чтобы доказать обоснованность tuple_lt
, вы можете положиться на леммы, показывающие обоснованность отношения, основанного на обоснованности другого отношения. Здесь мы можем использовать well_founded_lt_compat
. В других случаях могут оказаться полезными другие леммы, такие как wf_inverse_image
, well_founded_ltof
или well_founded_gtof
.
Доказательство обоснованности tuple_lt
становится простым.
Lemma tuple_lt_wf : well_founded tuple_lt.
Proof.
apply well_founded_lt_compat with fst.
intros ? ? []; assumption.
Defined.
Так же, как и доказательство второго обязательства.
Next Obligation.
apply measure_wf. apply tuple_lt_wf.
Defined.
(Обратите внимание, что в обоих случаях вы должны заканчивать доказательства Defined
вместо Qed
, если вы хотите, чтобы ваша функция, определенная Program Fixpoint
, вычисляла внутри Coq (в противном случае она застревает в непрозрачных доказательствах); кажется, что вы можете закончить доказательство первого обязательства с Qed
, однако).
Вы также можете использовать следующее более простое определение для tuple_lt
:
Definition tuple_lt (p1 p2 : nat * nat) := fst p1 < fst p2.
В этом случае доказательство обоснованности тривиально.
Lemma tuple_lt_wf : well_founded tuple_lt.
Proof.
apply well_founded_ltof.
Defined.