Also dies ist eine der Übung, die ich gearbeitet habe von Software Foundations, in dem ich beweisen muss, dass die Multiplikation ist kommutativ. Und das ist meine Lösung:Beweisen, dass Multiplikation ist kommutativ
Theorem brack_help : forall n m p: nat,
n + (m + p) = n + m + p.
Proof.
intros n m p.
induction n as [| n'].
Case "n = 0".
simpl.
reflexivity.
Case "n = S n'".
simpl.
rewrite -> IHn'.
reflexivity.
Qed.
Lemma plus_help: forall n m: nat,
S (n + m) = n + S m.
Proof.
intros n m.
induction n as [| n].
Case "n = 0".
simpl.
reflexivity.
Case "n = S n".
simpl.
rewrite -> IHn.
reflexivity.
Qed.
Theorem mult_0_r : forall n:nat,
n * 0 = 0.
Proof.
intros n.
induction n as [|n'].
Case "n = 0".
simpl.
reflexivity.
Case "n = S n'".
simpl.
rewrite -> IHn'.
reflexivity.
Qed.
Theorem plus_comm : forall n m : nat,
n + m = m + n.
Proof.
intros n m.
induction n as [| n].
Case "n = 0".
simpl.
rewrite <- plus_n_O.
reflexivity.
Case "n = S n".
simpl.
rewrite -> IHn.
rewrite -> plus_help.
reflexivity.
Qed.
Theorem plus_swap : forall n m p : nat,
n + (m + p) = m + (n + p).
Proof.
intros n m p.
rewrite -> brack_help.
assert (H: n + m = m + n).
Case "Proof of assertion".
rewrite -> plus_comm.
reflexivity.
rewrite -> H.
rewrite <- brack_help.
reflexivity.
Qed.
Lemma mult_help : forall m n : nat,
m + (m * n) = m * (S n).
Proof.
intros m n.
induction m as [| m'].
Case "m = 0".
simpl.
reflexivity.
Case "m = S m'".
simpl.
rewrite <- IHm'.
rewrite -> plus_swap.
reflexivity.
Qed.
Lemma mult_identity : forall m : nat,
m * 1 = m.
Proof.
intros m.
induction m as [| m'].
Case "m = 0".
simpl.
reflexivity.
Case "m = S m'".
simpl.
rewrite -> IHm'.
reflexivity.
Qed.
Lemma plus_0_r : forall m : nat,
m + 0 = m.
Proof.
intros m.
induction m as [| m'].
Case "m = 0".
simpl.
reflexivity.
Case "m = S m'".
simpl.
rewrite -> IHm'.
reflexivity.
Qed.
Theorem mult_comm_helper : forall m n : nat,
m * S n = m + m * n.
Proof.
intros m n.
simpl.
induction n as [| n'].
Case "n = 0".
assert (H: m * 0 = 0).
rewrite -> mult_0_r.
reflexivity.
rewrite -> H.
rewrite -> mult_identity.
assert (H2: m + 0 = m).
rewrite -> plus_0_r.
reflexivity.
rewrite -> H2.
reflexivity.
Case "n = S n'".
rewrite -> IHn'.
assert (H3: m + m * n' = m * S n').
rewrite -> mult_help.
reflexivity.
rewrite -> H3.
assert (H4: m + m * S n' = m * S (S n')).
rewrite -> mult_help.
reflexivity.
rewrite -> H4.
reflexivity.
Qed.
Theorem mult_comm : forall m n : nat,
m * n = n * m.
Proof.
intros m n.
induction n as [| n'].
Case "n = 0".
simpl.
rewrite -> mult_0_r.
reflexivity.
Case "n = S n'".
simpl.
rewrite <- IHn'.
rewrite -> mult_comm_helper.
reflexivity.
Qed.
Jetzt ist meiner Meinung nach dieser Beweis recht sperrig. Gibt es eine prägnantere Möglichkeit, dies zu tun, ohne eine Bibliothek zu benutzen? (Beachten Sie, dass Sie zur Verwendung der Case-Taktik einen vordefinierten Code benötigen. Ein eigenständiger Arbeitscode ist in der folgenden Liste enthalten: https://gist.github.com/psibi/1c80d61ca574ae62c23e).
IMO das sieht gut aus - ich hatte nur einen kurzen Blick aber Wenn Sie von den ersten Prinzipien ausgehen, ist dies mehr oder weniger das, was Sie tun müssten (schauen Sie, was [Whitehead und Russel] (https://en.wikipedia.org/wiki/Principia_Mathematica) tun mussten, bis sie dies nachweisen konnten 1 + 1 = 2;)) - nachdem du das gesagt hast (und genauer hinsehen) - brauchst du vielleicht nicht 'mult_comm_helper' wenn du zu deiner Induktion auf' m' stehst (wie ist dein '*' definiert?) - aber Ich hatte noch keinen Kaffee, also ist es wahrscheinlich Schwachsinn) – Carsten
@Carsten macht einen guten Punkt - es gibt mehrere leicht unterschiedliche Möglichkeiten, die Multiplikation zu definieren, und genau das, was leicht ist und was schwer ist, scheint ziemlich empfindlich zu sein, für das Sie sich entscheiden. Natürlich macht das, was eines leicht macht, fast sicher ein anderes schwer. – dfeuer
@Carsten Selbst wenn ich Induktion auf 'm' hätte, würde ich immer noch' mult_comm_helper' brauchen (nur die Rewrite-Richtung würde in diesem Fall anders sein). Das '*' ist in Addition definiert. :) – Sibi