Bläddra i källkod

Cut (Prolog) hinzugefügt; weitere Scala-Beispiele hinzugefügt

Martin Thoma 10 år sedan
förälder
incheckning
20994f6cc3

BIN
documents/Programmierparadigmen/Programmierparadigmen.pdf


+ 17 - 1
documents/Programmierparadigmen/Prolog.tex

@@ -56,6 +56,22 @@ die beiden Terme bereits identisch sind.
 
 
 Weitere Informationen: \url{http://stackoverflow.com/a/8220315/562769}
 Weitere Informationen: \url{http://stackoverflow.com/a/8220315/562769}
 
 
+\subsection{! (Cut)}\xindex{"! (Cut, Prolog)}
+Das \texttt{!} wird in Prolog als \textit{cut} bezeichnet. Ein Cut verhindert
+Backtracking nach dem cut.
+
+Die Klauseln eines Prädikates werden von Prolog von links nach rechts evaluiert.
+Prolog bindet einen Wert an eine Variable in der linkesten Klausel. Wenn diese
+Klausel als \texttt{true} ausgewertet wird, dann versucht Prolog die nächste
+Klausel auszuwerten. Falls nicht, wird eine neuer Wert an die momentan
+betrachtete Klausel gebunden.
+
+Da Klauseln über logische UND verbunden sind, führt eine nicht erfüllbare
+Klausel dazu, dass das gesamte Prädikat als \texttt{false} evaluiert wird.
+
+Der cut ist ein Gate: Sind die Klauseln vor dem cut ein mal wahr, werden die
+Werte festgelegt.
+
 \subsection{Arithmetik}
 \subsection{Arithmetik}
 Die Auswertung artihmetischer Ausdrücke muss in Prolog explizit durch \texttt{is}
 Die Auswertung artihmetischer Ausdrücke muss in Prolog explizit durch \texttt{is}
 durchgeführt werden:
 durchgeführt werden:
@@ -219,7 +235,7 @@ bei Prof. Dr. Snelting:
 
 
 \inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/regex.pl}
 \inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/regex.pl}
 
 
-\subsection{Two Bases}
+\subsection{Coffeetime 01: Two Bases}
 
 
 \inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/01-two-bases.prolog}
 \inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/01-two-bases.prolog}
 
 

+ 22 - 0
documents/Programmierparadigmen/Scala.tex

@@ -160,6 +160,28 @@ man immer wieder Quadriert:
 
 
 \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=power-futures.scala]{scala}{scripts/scala/power-futures.scala}
 \inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=power-futures.scala]{scala}{scripts/scala/power-futures.scala}
 
 
+\subsection{Coffeetime 01: Two Bases}
+Find three digits $X$, $Y$ and $Z$ such that $XYZ$ in base 10 is equal to $ZYX$
+in base 9.
+
+\inputminted[linenos, numbersep=5pt, tabsize=2, frame=lines, label=01-TwoBases.scala]{scala}{scripts/scala/01-TwoBases.scala}
+
+\subsection{Coffeetime 04: Exactly a third}
+Arrange the numerals 1-9 into a single fraction that equals exactly
+$\frac{1}{3}$.
+
+No other math symbols wanted; just concatenation some digits for the
+numerator, and some to make a denominator.
+
+\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=04-ExactlyAThird.scala]{scala}{scripts/scala/04-ExactlyAThird.scala}
+
+\subsection{Coffeetime 05: Three Dice}\xindex{yield (Scala)@\texttt{yield} (Scala)}
+I roll three dice, and multiply the three numbers together.
+
+What is the probability the total will be odd?
+
+\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=05-ThreeDice.scala]{scala}{scripts/scala/05-ThreeDice.scala}
+
 \section{Weitere Informationen}
 \section{Weitere Informationen}
 \begin{itemize}
 \begin{itemize}
     \item \url{http://www.scala-lang.org/api}
     \item \url{http://www.scala-lang.org/api}

+ 3 - 0
documents/Programmierparadigmen/Vorwort.tex

@@ -6,6 +6,9 @@ geschrieben. Dazu wurden
 die Folien von Prof.~Dr.~Snelting und Jun.-Prof.~Dr.~Hummel benutzt, die Struktur
 die Folien von Prof.~Dr.~Snelting und Jun.-Prof.~Dr.~Hummel benutzt, die Struktur
 sowie einige Beispiele, Definitionen und Sätze übernommen.
 sowie einige Beispiele, Definitionen und Sätze übernommen.
 
 
+Es wurden einige Aufgaben von \url{http://www.datagenetics.com/blog/june22014/index.html}
+genommen um Beispielcode für einfache Probleme zu schreiben.
+
 Das Ziel dieses Skriptes ist vor allem
 Das Ziel dieses Skriptes ist vor allem
 in der Klausur als Nachschlagewerk zu dienen; es soll jedoch auch
 in der Klausur als Nachschlagewerk zu dienen; es soll jedoch auch
 vorher schon für die Vorbereitung genutzt werden können und nach
 vorher schon für die Vorbereitung genutzt werden können und nach

+ 12 - 0
documents/Programmierparadigmen/scripts/scala/01-TwoBases.scala

@@ -0,0 +1,12 @@
+object TwoBases {
+    def test(x: Int, y: Int, z: Int) =
+        (100*x + 10*y + z == math.pow(9,2)*z + 9*y + z)
+
+    def main(args: Array[String]) {
+        for(x <- 0 to 9; y <- 0 to 9; z <- 0 to 9) {
+            if(test(x, y, z)){
+                println("%d%d%d".format(x, y, z));
+            }
+        }
+    }
+}

+ 34 - 0
documents/Programmierparadigmen/scripts/scala/04-ExactlyAThird.scala

@@ -0,0 +1,34 @@
+import scala.math.pow
+
+object ExactlyAthrid {
+  def main(arg: Array[String]) {
+    val digits = List(1, 2, 3, 4, 5, 6, 7, 8, 9);
+    for (c <- digits.combinations(4)) {
+      for(d <- c.permutations) {
+        // Get the numerator
+        var numerator = 0;
+        for((digit, place) <- d.zipWithIndex) {
+          numerator += digit
+                       * pow(10, place).toInt;
+        }
+
+        // Get the denominator
+        var denominator = 3 * numerator;
+
+        // Check if all digits appear
+        // exactly once
+        var cdigits = numerator.toString
+                      + denominator.toString;
+        var cdigits_list = cdigits.toCharArray.
+                   distinct;
+
+        // Print solution
+        if (cdigits_list.length == 9 &&
+            !cdigits_list.contains('0')){
+              println("%d / %d = 1/3".
+               format(numerator, denominator));
+        }
+      }
+    }
+  }
+}

+ 13 - 0
documents/Programmierparadigmen/scripts/scala/05-ThreeDice.scala

@@ -0,0 +1,13 @@
+object ThreeDice {
+  def main(arg: Array[String]) {
+    val dice_results = List(1, 2, 3, 4, 5, 6);
+    var outcomes = for(a <- dice_results;
+               b <- dice_results;
+               c <- dice_results)
+            yield a*b*c;
+    println("%d / %d".
+        format(
+         outcomes.filter(x => x % 2 == 1).length,
+         outcomes.length));
+  }
+}