Докази теореми в Coq


10

Фон

Я навчаюсь допомоги, Кок, самостійно. Поки я закінчив читати Кок Іва Бертота поспіхом . Тепер моя мета - довести основні результати щодо натуральних чисел, що досягають кульмінації так званого алгоритму ділення. Однак я зіткнувся з деякими невдачами на своєму шляху до цієї мети. Зокрема, два наступні результати виявились (каламбур) важче довести у Кок, ніж я спочатку уявляв. Насправді я після багатьох безрезультатних спроб вдався довести їх вручну (як показано нижче). Це явно не допомагає мені стати більш досвідченим у роботі з Coq; саме тому я звертаюся до цього форуму. Я сподіваюсь, що хтось на цьому сайті здатний та бажаєщоб допомогти мені перекласти мої докази нижче в доказ, який Кок приймає. Вся допомога щиро цінується!

Теорема А

Для всіх Доказ:х,уN

х<S(у)х<уЯ(N,х,у)

Нехай . Отже, є з Звідси по (Peano 1b і 3)х<S(у)zN

(*)Я(N,х+S(z),S(у))
Я(N,х+z,у)

Визначте предикат

Q(у): =(Я(N,х+у,у)х<уЯ(N,х,у)

Досить показати . Доводимо це індукцією на . Щоб побачити , а не це, якщо утримує тоді відповідає Peano 1a. Таким чином, . Тепер доведемо : Припустимо, . З цього визначення ми маємо і таким чином також у цьому випадку. Нарешті, п’ята аксіома Пеано дає і через отримуємо . Q(z)zQ(0)I(N,x+0,y)I(N,x,y)x<yI(n,x,y)Q(S(v))I(N,x+S(v),y)x<yx<yI(N,x,y)Q(z)()х<уЯ(N,х,у)

()

Теорема В

Для всіх Доказ:x,yN

x<yI(N,x,y)y<x

Якщо тоді за визначенням, а якщо то також за визначенням. Якщо і то через транзитивність і рефлексивність ми маємо , що є протиріччям. Отже, не більше одного із тверджень є правдивим.x<y¬I(N,x,y)x>y¬I(N,х,у)х>у у>хЯ(N,х,у)

Тримаємо фіксованим та індукуємо на . Коли маємо для всіх , що доводить базовий випадок. Далі, припустимо, теорема справедлива для ; тепер ми хочемо довести теорему для . З трихотомії для виділяють три випадки: і . Якщо , то чітко . Якщо , то (як для всіх ). Нарешті, припустимоухI(N,0,y)0<yI(N,0,y)yxS(x)xx<y,I(N,x,y)x>yx>yS(x)>yI(N,x,y)S(x)>yS(x)>xxNx<yТоді за теоремою A маємо або , і в будь-якому випадку ми робимо це. S(x)<yI(N,S(x),y)

()

Теореми, які я хочу довести, можна викласти у Coq.

Лема менше_lem (xy: N): менше x (succ y) -> або (менше xy) (IN xy).

Теорема Нтрихотомія: (для xy: N, або (менше xy) (або (IN xy) (менше yx))).

Корисні результати

Тут я зібрав деякі результати, які я визначив, і довів до цього моменту. Це ті, про які я згадуюсь вище. * Це код, який мені вдалося написати досі, зауважте, що більшість складається з визначень. *

(* Sigma types *)


Inductive Sigma (A:Set)(B:A -> Set) :Set :=
  Spair: forall a:A, forall b : B a,Sigma A B.

Definition E (A:Set)(B:A -> Set)
  (C: Sigma A B -> Set)
  (c: Sigma A B)
  (d: (forall x:A, forall y:B x, 
      C (Spair A B x y))): C c :=

match c as c0 return (C c0) with
| Spair a b => d a b
end. 


(* Binary sum type *)

Inductive sum' (A B:Set):Set := 
inl': A -> sum' A B | inr': B -> sum' A B.

Print sum'_rect.

Definition D (A B : Set)(C: sum' A B -> Set)
(c: sum' A B)
(d: (forall x:A, C (inl' A B x)))
(e: (forall y:B, C (inr' A B y))): C c :=

match c as c0 return C c0 with
| inl' x => d x
| inr' y => e y
end.

(* Three useful finite sets *)

Inductive N_0: Set :=.

Definition R_0
  (C:N_0 -> Set)
  (c: N_0): C c :=
match c as c0 return (C c0) with
end.

Inductive N_1: Set := zero_1:N_1.

Definition R_1 
  (C:N_1 -> Set)
  (c: N_1)
  (d_zero: C zero_1): C c :=
match c as c0 return (C c0) with
  | zero_1 => d_zero
end.

Inductive N_2: Set := zero_2:N_2 | one_2:N_2.

Definition R_2 
  (C:N_2 -> Set)
  (c: N_2)
  (d_zero: C zero_2)
  (d_one: C one_2): C c :=
match c as c0 return (C c0) with
  | zero_2 => d_zero
  | one_2  => d_one
end.


(* Natural numbers *)

Inductive N:Set :=
zero: N | succ : N -> N.

Print N. 

Print N_rect.

Definition R 
  (C:N -> Set)
  (d: C zero)
  (e: (forall x:N, C x -> C (succ x))):
  (forall n:N, C n) :=
fix F (n: N): C n :=
  match n as n0 return (C n0) with
  | zero => d
  | succ n0 => e n0 (F n0)
  end.

(* Boolean to truth-value converter *)

Definition Tr (c:N_2) : Set :=
match c as c0 with
  | zero_2 => N_0
  | one_2 => N_1
end.

(* Identity type *)

Inductive I (A: Set)(x: A) : A -> Set :=
r :  I A x x.

Print I_rect.

Theorem J 
  (A:Set)
  (C: (forall x y:A, 
              forall z: I A x y, Set))
  (d: (forall x:A, C x x (r A x)))
  (a:A)(b:A)(c:I A a b): C a b c.
induction c.
apply d.
Defined.

(* functions are extensional wrt
  identity types *)

Theorem I_I_extensionality (A B: Set)(f: A -> B):
(forall x y:A, I A x y -> I B (f x) (f y)).
Proof.
intros x y P.
induction P.
apply r.
Defined.


(* addition *)

Definition add (m n:N) : N 
 := R (fun z=> N) m (fun x y => succ y) n.

(* multiplication *)

Definition mul (m n:N) : N 
 := R (fun z=> N) zero (fun x y => add y m) n.


(* Axioms of Peano verified *)

Theorem P1a: (forall x: N, I N (add x zero) x).
intro x.
(* force use of definitional equality
  by applying reflexivity *)
apply r.
Defined.


Theorem P1b: (forall x y: N, 
I N (add x (succ y)) (succ (add x y))).
intros.
apply r.
Defined.


Theorem P2a: (forall x: N, I N (mul x zero) zero).
intros.
apply r.
Defined.


Theorem P2b: (forall x y: N, 
I N (mul x (succ y)) (add (mul x y) x)).
intros.
apply r.
Defined.

Definition pd (n: N): N :=
R (fun _=> N) zero (fun x y=> x) n.

(* alternatively
Definition pd (x: N): N :=
match x as x0 with
  | zero => zero
  | succ n0 => n0
end.
*)

Theorem P3: (forall x y:N, 
I N (succ x) (succ y) -> I N x y).
intros x y p.
apply (I_I_extensionality N N pd (succ x) (succ y)).
apply p.
Defined.

Definition not (A:Set): Set:= (A -> N_0).

Definition isnonzero (n: N): N_2:=
R (fun _ => N_2) zero_2 (fun x y => one_2) n.


Theorem P4 : (forall x:N, 
not (I N (succ x) zero)).
intro x.
intro p.

apply (J N (fun x y z => 
    Tr (isnonzero x) -> Tr (isnonzero y))
    (fun x => (fun t => t)) (succ x) zero)
.
apply p.
simpl.
apply zero_1.
Defined.

Theorem P5 (P:N -> Set):
P zero -> (forall x:N, P x -> P (succ x))
   -> (forall x:N, P x).
intros base step n.
apply R.
apply base.
apply step.
Defined.

(* I(A,-,-) is an equivalence relation *)

Lemma Ireflexive (A:Set): (forall x:A, I A x x).
intro x.
apply r.
Defined.

Lemma Isymmetric (A:Set): (forall x y:A, I A x y -> I A y x).
intros x y P.
induction P.
apply r.
Defined.

Lemma Itransitive (A:Set): 
(forall x y z:A, I A x y -> I A y z -> I A x z).
intros x y z P Q.
induction P.
assumption.
Defined.


Lemma succ_cong : (forall m n:N, I N m n -> I N (succ m) (succ n)).
intros m n H.
induction H.
apply r.
Defined.

Lemma zeroadd: (forall n:N, I N (add zero n) n).
intro n.
induction n.
simpl.
apply r.
apply succ_cong.
auto.

Defined.

Lemma succadd: (forall m n:N, I N (add (succ m) n) (succ (add m n))).
intros.
induction n.
simpl.
apply r.
simpl.
apply succ_cong.
auto.

Defined.

Lemma commutative_add: (forall m n:N, I N (add m n) (add n m)).
intros n m; elim n.
apply zeroadd.
intros y H; elim (succadd m y).
simpl.
rewrite succadd.
apply succ_cong.
assumption.


Defined.

Lemma associative_add: (forall m n k:N, 
I N (add (add m n) k) (add m (add n k))).
intros m n k.
induction k.
simpl.
apply Ireflexive.
simpl.
apply succ_cong.
assumption.
Defined.

Definition or (A B : Set):= sum' A B.


Definition less (m n: N) :=
 Sigma N (fun z => I N (add m (succ z)) n).



Lemma less_lem (x y:N) : 
less x (succ y) -> or (less x y) (I N x y).
intro.
destruct H.
right.

(* Here is where I'm working right now *)

Defined.


Theorem Ntrichotomy: (forall x y:N, 
or (less x y) (or (I N x y) (less y x))).

3
Щоб зрозуміти, як далеко у вас є, допоможе, якщо ви опублікуєте свій код Coq поки що, щоб ми могли завантажити його і перевірити, що те, що ми пропонуємо, працює для ваших визначень.
Жил "ТАК - перестань бути злим"

1
Кілька коментарів та уточнюючих питань: - Чи достатньо було б для ваших цілей просто використовувати синтаксичну рівність ("=" у Coq) замість I (N, x, y)? Чи є причина використання "чи" способу, який ви визначили? Coq (ну, основні бібліотеки для Coq) має спосіб вираження логічної диз'юнкції, що полегшує певні приємні аспекти доказів. Так само є спосіб визначити "менше", який може бути для вас більш корисним. З цією метою ви можете ознайомитись з першими розділами програм «Основи програм» . Поки кінець книги ...
Люк Матхісон

... йдеться про перевірку програм і т. д., початок є досить хорошим вступом до Coq і має теореми, подібні до тих, які ви отримали як вправи та приклади. Це безкоштовно, і насправді все написано як сценарії Coq, так що ви можете виконувати вправи і складати їх під час читання. Для того, що ви тут робите, у розділах Основи, Індукція, Проп та Логіка є цікаві біти та фрагменти - і, ймовірно, деякі залежності від бітів між ними.
Люк Матхісон

1
Ще одна примітка: Thm P5 (індуктивний принцип) вбудований у Coq в більш сильній формі (структурна індукція), тому вам не потрібно явно сприймати це як аксіому.
Люк Матхісон

Я опублікував код Coq, який я написав до цього часу.
користувач11942

Відповіді:


7

Кок - трохи жорстокіший, ніж паперові докази: коли ви пишете «і ми зробили» або «чітко» у паперовому доказі, часто потрібно набагато більше зробити, щоб переконати Кок.

Тепер я трохи очистив ваш код, намагаючись зберегти його в тому ж дусі. Ви можете знайти його тут .

Кілька зауважень:

  1. Я використовував вбудовані типи даних та визначення, де я вважав, що це не зашкодить вашим намірам. Зауважте, що якби я використовував вбудовану рівність замість identityі вбудоване відношення "менше ніж", доведення було б набагато простіше, оскільки багато ваших лем знаходяться в базі відомих теорем, які перевіряються при кожному виклику

    auto with arith.
    
  2. Я використав деякі тактики, яких ви, мабуть, не знаєте, але "справжній" користувач Coq мав би набагато більш потужну тактику і написав власну тактику, щоб спростити роботу. Я завжди рекомендую CPDT як місце, щоб дізнатися про потужне використання тактики.

  3. Я використав нотації та вкладки для поліпшення читабельності та вбудованих конструкцій, таких як відповідність та inductionтактика, щоб полегшити доведення та повторний фактор. Зокрема, з вашим визначенням lessважко було працювати, ви можете бачити, як я його трохи змінив

    х, м+(х+1)=н
    до еквівалента (але простіше у використанні)
    х, (х+м)+1=н
    подібного роду "налаштування визначення" трапляється багато в формальних доказах.
  4. Хоча ви можете отримати відповіді на подібні питання тут, я настійно рекомендую подати свою роботу в Coq-Club, який був створений з явною метою відповіді на подібні питання.


1
Чудова відповідь Коді! Чудово дізнатися, що там є такі щедрі люди, як ти, які готові допомогти іншим, хто потребує. Я щиро ціную це! Я, безумовно, погляну на CPDT та Coq-Club; обидва вони мені, швидше за все, знадобляться найближчим часом, оскільки я продовжую працювати над доведенням алгоритму поділу в Coq.
user11942

Дякую! Зауважте, що це часто називають "Евклідовим поділом" і вже є в деяких бібліотеках (хоча над цілими числами)
cody

Це мене не дивує, бібліотеки Coq, які я розглядав, були надзвичайно добре забезпечені визначеннями, лемами та теоремами. Я буду намагатися опублікувати свій підхід до алгоритму поділу Евкліда як питання не пізніше завтра.
користувач11942

4

Відповідь Коді відмінна і відповідає вашому питанню про переклад ваших доказів на Coq. Як доповнення до цього, я хотів додати однакові результати, але перевірений, використовуючи інший маршрут, головним чином як ілюстрацію деяких біт Coq і продемонструвати те, що можна довести синтаксично за допомогою дуже мало додаткових робіт. Однак це не твердження, що це найкоротший маршрут - просто інший. Докази включають лише одну додаткову лемму-помічник, і покладаються лише на основні визначення, я не ввожу складання, множення чи будь-які їх властивості, або функціональну розширеність, і єдині аксіоми Пеано є простою формою <= b -> a + c <= b + c в леммі-помічниці (лише для c = 1) та структурної індукції, яка в будь-якому випадку поставляється з індуктивними типами безкоштовно.

Як і Коді, де я вважав, що це не має ніякого значення, я використовував попередньо визначені типи і т. Д., Тому перед доказом опишу це:

  • Я використовував вбудований тип nat для натуральних чисел, який має (до точного іменування) те саме визначення, що і ваше:

Індуктивний nat: Set: = O: nat | S: nat -> nat

  • Я використовував вбудовані ле і lt для менш або рівних і менше, ніж відповідно, які мають нотаційні скорочення "<=" і "<" для читабельності. Вони визначаються:

Індуктивна ле: nat -> nat -> Реп: =
| le_n: forall n, le nn
| le_S: forall nm, (le nm) -> (le n (S m)).

і

Визначення lt (nm: nat): = le (S n) m.

  • Вбудований eq (скорочений "=") є синтаксичною рівністю і працює так само, як і ваше "Я", з одним конструктором, який просто говорить, що що-небудь дорівнює собі. Симетричні та перехідні властивості - прості докази звідси, але нам у цьому випадку вони не знадобляться. Визначення для eq нижче містить вбудовані позначення.

Індуктивний еквівалент (A: Тип) (x: A): A -> Prop: = eq_refl: x = x

  • Нарешті, я використав пропозицію або (скорочення "\ /" - що є зворотним нахилом вперед), яке має два конструктори, в основному, що або у вас є докази для лівого аргументу, або правого аргументу. Coq також має деяку тактику скорочення, зліва і справа, яка означає лише "застосувати or_introl" і "застосовувати or_intror" відповідно.

Індуктивний або (AB: Prop): Prop: =
or_introl: A -> A / B | or_intror: B -> A / B

Наступне - це мої докази, в принципі, якщо розмітка не заважає, ви зможете просто вирізати та передати це у файл Coq .v, і він спрацює. Я включив коментарі, щоб відзначити цікаві біти, але вони містяться в (* *) роздільниках, тому не потрібно їх видаляти.

Theorem lt_or_eq: forall (n m : nat),
  n < S m -> n < m \/ n = m.
Proof.
(*
  This proof is just a case analysis on n and m, whether they're zero or
  a successor of something.
*)
destruct n as [|n']; destruct m as [|m']. 

(*n = 0, m = 0*)
intros.
  right. reflexivity.

(*n = 0, m = S m'*)
intros H.
  inversion H.
  inversion H1.
  left. unfold lt. constructor.
  (*The constructor tactic tries to match the goal to a constructor
    that's in the environment.*) 
  left. unfold lt. constructor. assumption.
  (*Assumption tries to match the goal to something that's in the
    current context*)

(*n = S n', m = 0
  This case is false, so we can invert our way out of it.*)
intros.
  inversion H. inversion H1.

(*n = S n', m = S m'*)
intros.
  inversion H.
    right. reflexivity.
    left. unfold lt. assumption.
Qed.


(*
  The following lemma with be useful in the proof of the trichotomy theorem,
  it's pretty obviously true, and easy to prove. The interesting part for
  anyone relatively new to Coq is that the induction is done on the
  hypothesis "a <= b", rather than on either a or b.
*)
Lemma a_le_b_implies_Sa_le_Sb: forall a b, a <= b -> S a <= S b.
Proof.
  intros a b Hyp.
  induction Hyp.
  constructor.
  constructor.
  apply IHHyp.
Qed.

(*
  The proof of the trichotomy theorem is a little more involved than the
  last one but again we don't use anything particularly tricky. 
  Other than the helper lemma above, we don't use anything other than the
  definitions.

  The proof proceeds by induction on n, then induction on m.  My personal
  feeling is that this can probably be shortened.  
*)
Theorem trich: forall (n m : nat),
  n < m \/ n = m \/ m < n.
Proof.
  induction n.
    induction m.
      right. left. reflexivity.
        inversion IHm.
          left. unfold lt. constructor. unfold lt in H. assumption.
          inversion H.
          left. unfold lt. subst. constructor.
          inversion H0.     
    induction m.
      assert (n < 0 \/ n = 0 \/ 0 < n).
      apply IHn.
      inversion H.
      inversion H0.
      inversion H0.
      right. right. subst. unfold lt. constructor.
      right. right. unfold lt. constructor. assumption.
      inversion IHm. unfold lt in H.
      left. unfold lt. constructor. assumption.
      inversion H; subst.
      left. unfold lt. constructor.
      inversion H0.
      right. left. reflexivity.
      right. right. apply lt_or_eq in H0.

      inversion H0.
      apply a_le_b_implies_Sa_le_Sb. assumption.
      subst. unfold lt. apply a_le_b_implies_Sa_le_Sb. assumption.
Qed.

(*
  The following is just to show what can be done with some of the tactics
  The omega tactic implements a Pressburger arithmetic solver, so anything
  with natural numbers, plus, multiplication by constants, and basic logic
  can just be solved. Not very interesting for practicing Coq, but cool to
  know.
*)

Require Import Omega.

Example trich' : forall (n m : nat),
  n < m \/ n = m \/ m < n.
Proof.
  intros.
  omega.
Qed.

Ще одна чудова відповідь! Я щиро вдячний вам за той час і зусилля, які ви вклали, відповідаючи на моє запитання.
користувач11942
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.