Доказване на if then else в Coq

Аз съм нов в Coq и се опитвам да докажа нещо доста основно

Лема eq_if_eq : за всички a1 a2, (ако beq_nat a1 a2 тогава a2 else a1) = a1.

Затруднявах се с решение, публикувано по-долу, но мисля, че трябва да има по-добър начин. В идеалния случай бих искал чисто да регистрирам beq_nat a1 a2, докато поставям стойностите на регистъра в списъка с хипотези. Има ли тактика t такава, че използването на t (beq_nat a1 a2) дава два подслучая, един където beq_nat a1 a2 = true и друг където beq_nat a1 a2 = false? Очевидно induction е много близо, но губи своята история.

Ето доказателството, с което се борих:

Proof.
Hint Resolve beq_nat_refl.
Hint Resolve beq_nat_eq.
Hint Resolve beq_nat_true.
Hint Resolve beq_nat_false.
intros.
compare (beq_nat a1 a2) true.
intros. assert (a1 = a2). auto. 
replace (beq_nat a1 a2) with true. auto.
intros. assert (a1 <> a2). apply beq_nat_false.
apply not_true_is_false. auto.
assert (beq_nat a1 a2 = false). apply not_true_is_false. auto.
replace (beq_nat a1 a2) with false. auto.
Qed.

coq
person nitromaster101    schedule 15.05.2013    source източник


Отговори (3)


Обикновено за такива неща използвам eqn варианта на destruct. Ще изглежда така:

destruct (beq_nat a1 a2) as []_eqn. (* Coq <= 8.3 *)

destruct (beq_nat a1 a2) as []eqn:? (* Coq >= 8.4 *)

Ще добави равенството като хипотеза. Във вариант 8.4 можете да замените въпросителния знак с име, което да дадете на хипотезата.

person Ptival    schedule 15.05.2013

Тактиката, която прави това, което искате, е case_eq. Следният скрипт доказва лемата в 8.4pl3:

intros.
case_eq (beq_nat a1 a2).
intuition.
apply beq_nat_true_iff in H.
intuition.
intuition.
person Atsby    schedule 18.03.2015

Оказа се, че простата тактика remember беше всичко, от което имах нужда. Нещо в стила на remember (beq_nat a1 a2) as e; induction e; etc.

person nitromaster101    schedule 03.06.2013