Как бих доказал, че b = c ако (и b b c = orb b c) в coq?

Нов съм в coq и се опитвам да докажа това...

Theorem andb_eq_orb :
  forall (b c : bool),
  (andb b c = orb b c) -> (b = c).

Ето моето доказателство, но се забивам, когато стигна до целта (false = true -> false = true).

Proof.
intros b c.
induction c.
destruct b.
reflexivity.
simpl.
reflexivity.

Не съм сигурен как бих пренаписал този израз, така че да мога да използвам рефлексивност. Но дори и да го направя, не съм сигурен, че ще доведе до доказателството.

Все пак успях да разреша доказателството, ако започнах с хипотезата b = c. А именно...

Theorem andb_eq_orb_rev :
  forall (b c : bool),
  (b = c) -> (andb b c = orb b c).
Proof.
intros.
simpl.
rewrite H.
destruct c.
reflexivity.
reflexivity.
Qed.

Но не мога да разбера как да реша, ако започна с хипотезата, която има булеви функции.


person Albtzrly    schedule 30.08.2015    source източник
comment
човече, измина изключително дълъг период от време, откакто направих това, но не можеш ли просто да го направиш случайно на b и след това да използваш simpl и reflexivity? като, хипотеза b=true, след това я докажете, след това хипотеза b=false и я докажете.   -  person Chris Beck    schedule 30.08.2015


Отговори (3)


Не се нуждаете от индукция, тъй като bool не е рекурсивна структура от данни. Просто преминете през различните случаи за стойностите на b и c. Използвайте destruct, за да направите това. В два случая хипотезата H ще бъде от типа true = false и можете да завършите доказателството с inversion H. В другите два случая целта ще бъде от типа true = true и може да се реши с reflexivity.

Theorem andb_eq_orb : forall b c, andb b c = orb b c -> b = c.
Proof. destruct b,c;  intro H; inversion H; reflexivity. Qed.
person larsr    schedule 31.08.2015
comment
Благодаря ви, мисля, че това е най-добрият отговор. Тактиката на обръщане изглежда като най-добрия начин да го направите. cis.upenn.edu/~bcpierce/sf/current/ Prop.html#lab257 - person Albtzrly; 06.09.2015

Ще искате да използвате тактиката intro. Това ще премести false = true във вашия контекст на доказателство като предположение, което след това можете да използвате, за да пренапишете.

person Matt    schedule 30.08.2015
comment
Благодаря ви, това помогна. И от там пренаписах с предположението. rewrite H. reflexivity. - person Albtzrly; 30.08.2015

Това може да не е най-ефективният начин да го направите.

На стъпка induction c. (където е заседнало):

______________________________________(1/2)
b && true = b || true -> b = true
______________________________________(2/2)
b && false = b || false -> b = false

Можете да използвате rewrite и основни теореми в [bool][1], за да опростите термини като b && true до b и b || true до true.

Това може да го намали до две „тривиални“ подцели:

b : bool
______________________________________(1/2)
b = true -> b = true
______________________________________(2/2)
false = b -> b = false

Това е почти тривиално доказателство, използващо assumption, освен че е на едно symmetry разстояние. Можете да try ако symmetry ги накара да съпоставят, като използвате:

try (symmetry;assumption); try assumption.

(Някой, който наистина познава Coq, може да ме просветли как да try това по-накратко)

Сглобяване:

Require Import Bool.
Theorem andb_eq_orb : forall b c, andb b c = orb b c -> b = c.
Proof. 
destruct c; 

try (rewrite andb_true_r);
try (rewrite orb_true_r);
try (rewrite andb_false_r);
try (rewrite orb_false_r);
intro H;
try (symmetry;assumption); try assumption.
Qed.

Вторият подход е груба сила и използване на метода "Таблица на истината". Това означава, че можете да разбиете всички променливи до техните истински стойности и да опростите: destruct b, c; simpl.. Това отново дава четири тривиални следствия, до едно symmetry до try:

4 subgoal
______________________________________(1/4)
true = true -> true = true
______________________________________(2/4)
false = true -> true = false
______________________________________(3/4)
false = true -> false = true
______________________________________(4/4)
false = false -> false = false

Сглобяване:

Theorem andb_eq_orb1 : forall b c, andb b c = orb b c -> b = c.
Proof. 
destruct b, c; simpl; intro; try (symmetry;assumption); try assumption.
Qed.

Първият подход е по-обезпокоителен, но не включва изброяване на всички редове на таблицата на истината (мисля).

person tinlyx    schedule 30.08.2015
comment
Това е за помощта, която не знаех, че мога да импортирам и използвам теоремите от библиотеките. - person Albtzrly; 30.08.2015
comment
Един въпрос обаче, ако не трябваше да използвам auto след индукция b, как бих разрешил false = true -› false = true? Тъй като съм начинаещ, искам да съм сигурен, че разбирам всички стъпки, които auto прави. Също така induction b. auto. функционира различно от induction b; auto. Какво прави точката и запетая? - person Albtzrly; 30.08.2015
comment
О, мисля, че разбрах. Беше intro. rewrite H. reflexivity. - person Albtzrly; 30.08.2015
comment
Само за протокола, типът bool не е рекурсивен (само 2 основни конструктора, true и false), така че трябва само да destruct b, използването на induction няма да ви даде повече информация. - person Vinz; 31.08.2015