0 Daumen
133 Aufrufe

Wir haben folgende Funktionen:

prod1 :: (Num a) => [a] -> a
prod1 [] = 1
prod1 (x:xs) = x * prod1 xs

prod2 :: (Num a) => [a] -> a
prod2 xs = help 1 xs
   where
help acc [] = acc
help acc (x:xs) = help (x*acc) xs

Aufgabe:

Man soll mit struktureller Induktion und unter Verwendung einer geeigneten Hilfseigenschaft beweisen, dass folgende Aussage gilt:

prod1 xs = prod2 xs

Ich habe momentan:

prod1 xs = prod2 xs

I.A. (xs = []):

prod1 [] = prod2 []

prod1 [] = 1        prod2 []    = help 1 []        -- help
                  help 1 []  = 1

              1 = 1


I.V.: Wir nehmen an, dass die Aussage gilt für ein beliebiges xs

I.S. (xs -> x:xs):

prod1 (x:xs) = prod2 (x:xs)
x * prod1 xs = help (x * 1) xs


Problem: Ich weiß nun nicht wie ich mit dem Induktionsschritt fortfahren soll.

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Beweis durch strukturelle Induktion und Hilfseigenschaft

Um zu zeigen, dass \( \text{prod1 xs} = \text{prod2 xs} \) für alle Listen \( \text{xs} \) gilt, verwenden wir die strukturelle Induktion.

Basisfall:

Für den Basisfall betrachten wir die leere Liste \( \text{xs} = [] \).

\( \text{prod1 []} = 1 \)

Für \( \text{prod2} \) verwenden wir die Funktion \( \text{help} \):

\( \text{prod2 []} = \text{help 1 []} \)

Aus der Definition von \( \text{help} \) wissen wir:
\( \text{help acc []} = acc \)

Setzen wir \( \text{acc} = 1 \):
\( \text{help 1 []} = 1 \)

Daher haben wir:
\( \text{prod1 []} = 1 = \text{help 1 []} = \text{prod2 []} \)

Induktionsvoraussetzung:

Wir nehmen an, dass die Gleichheit für eine beliebige Liste \( \text{xs} \) gilt:
\( \text{prod1 xs} = \text{prod2 xs} \)

Induktionsschritt:

Wir müssen zeigen, dass die Gleichheit auch für eine Liste der Form \( (x:xs) \) gilt.

\( \text{prod1 (x:xs)} = x * \text{prod1 xs} \)

Für \( \text{prod2} \) verwenden wir die Funktion \( \text{help} \):

\( \text{prod2 (x:xs)} = \text{help 1 (x:xs)} \)

Jetzt betrachten wir die Definition von \( \text{help} \):
\( \text{help acc (x:xs)} = \text{help (x * acc) xs} \)

Setzen wir \( \text{acc} = 1 \):
\( \text{help 1 (x:xs)} = \text{help (x * 1) xs} \)
\( \text{help 1 (x:xs)} = \text{help x xs} \)

Jetzt verwenden wir die Induktionsvoraussetzung und nehmen an, dass \( \text{prod1 xs} = \text{help 1 xs} = \text{prod2 xs} \) gilt. Unsere neue \( \text{help} \)-Funktion wird aufgerufen mit \( x \) als Akkumulator:

\( \text{help x xs} = \text{prod2 xs'} \)
wobei sich \( xs' \) auf \( xs \) bezieht, jedoch mit \( x \) als führendem Mehrfachtierer im Akkumulator \( acc \).

D.h.:
\( \text{help x xs} = x * \text{prod1 xs} \)

Mit dieser Annahme haben wir:
\( \text{prod1 (x:xs)} = x * \text{prod1 xs} = x * \text{help 1 xs} = \text{help x xs} \)

Da wir gezeigt haben, dass \( \text{prod1 (x:xs)} = \text{prod2 (x:xs)} \) im Induktionsschritt und im Basisfall zutrifft, haben wir durch strukturelle Induktion demonstriert, dass:

\( \text{prod1 xs} = \text{prod2 xs} \quad \forall \, \text{Listen} \, \text{xs} \)

Dies schließt den Beweis ab.
Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community