Abou Chleih

{the magic lies between the brackets}

Menü Schließen

Monat: Oktober 2014

Aussagenlogik in der Mathematik

In der Mathematik und der Informatik müssen Aussagen auf ihre Wahrheit hin untersucht werden.
Also muss man „schlicht“ herausfinden, ob die Aussage

  • wahr
  • falsch

ist.

Beispiel:
Aussage: 1 = 2 -> Diese Aussage ist falsch
Aussage: 4 = 4 -> Die Aussage ist richtig, also wahr

Schließt man Vermutungen aus, kann man dies mit beliebigen Aussagen fortführen. Es kann also jede Aussage entweder wahr oder falsch sein.

Wie in der Umgangssprache, so kann auch in der Mathematik eine Aussage verneint (negiert) werden. Kennzeichnen tut man dies mit ¬Aussage oder /Aussage sowie einem Negierungsstrich über dem A.

Beispiel: ¬(„Heute ist ein schöner Tag“) -> („Heute ist kein schöner Tag“)
Beispiel2: Aussage: „Die Lampe leuchtet“ => ¬(„Die Lampe leuchtet“) -> („Die Lampe leuchtet nicht“)

Also wird aus einer wahren Aussage eine falsche Aussage und vice versa.

Im folgenden werde ich für wahr eine 1 setzen und für falsch eine 0. Dies ist bei mir reine Gewohnheitssache, da ich aus der IT komme und dort mit boolschen Binärwerten (0/1) gearbeitet wird.

Wahrheitstabelle für Negation (NOT oder Nicht):

NOT

Ist eine Aussage wahr (1), so wird er falsch (0). Ist eine Aussage falsch(0), so wird sie wahr(1).

Sprechweise: ¬A ist die Negation von A.

Zur Wahrheitstabelle gibt es noch kurz etwas zu sagen, bevor wir richtig anfangen:
Wahrheitstabellen haben immer 2^n Möglichkeiten, wobei n für die Anzahl der Parameter steht. Im oberen Beispiel haben wir einen Parameter 2^1 = 2, also zwei Möglichkeiten. Bei zwei Parametern (Beispiel folgt nachher) haben wir 2^2 = 4 Möglichkeiten usw.
Dann müssen wir alle Möglichkeiten abdecken, indem wir jede mögliche Konstellation der Werte in diese Tabelle schreiben (A:01010101, B:00110011, C:00001111).
Auf die Werte in der Klammer gehe ich jetzt nicht weiter ein, aber mit etwas Nachdenken kommt man auf das System.

 Machen wir nun also weiter.

Wie in der Umgangssprache, gibt es auch in der Technik und Mathematik Aussagen die sich bedingen, die getrennt voneinander das gleiche Aussagen etc.

Für solche Bedingungen, gibt es die logischen Operatoren oder richtiger Junktoren, die da wären:

1.Konjunktion (AND / UND):

Diesen logischen Operator kann man sich wie eine elektronische Reihenschaltung mit zwei Schaltern vorstellen.

Reihenschaltung

Für die Nichttechniker: A und B sind Schalter, der Kreis mit dem Kreuz ist eine Glühlampe und die zwei parallelen Striche eine Energiequelle, bspw. eine Batterie

Der Stromkreislauf ist geschlossen, wenn beide Schalter geschlossen sind. Erst wenn dies der Fall ist leuchtet die Lampe.

Symbol: ∧, Beispiel: A∧B=C, gesprochen „Wenn A und B, dann C“.

Bauen wir uns dafür nun wieder eine Wahrheitstabelle mit zwei Eingängen („Schaltern“) A und B und einem Ausgang („Lampe“) A∧B

0 = Schalter nicht gedrückt bzw. Lampe leuchtet nicht, 1 = Schalter gedrückt bzw. Lampe leuchtet

AND

2. Disjunktion (OR / ODER)

Diesen logischen Operator kann man sich wie eine elektronische Parallelschaltung mit zwei Schaltern vorstellen.

Parallelschaltung

Der Stromkreislauf ist geschlossen, wenn einer der beiden Schalter geschlossen ist, also Schalter A oder Schalter B. Erst wenn dies der Fall ist leuchtet die Lampe.

Symbol: ∨, Beispiel: A∨B=C, gesprochen „Wenn A oder B, dann C“.

Bauen wir uns dafür nun wieder die entsprechende Wahrheitstabelle mit zwei Eingängen („Schaltern“) A und B und einem Ausgang („Lampe“) A∨B

OR

3. Implikation (Folgt-aus)

Die Implikation A=>B ist essentiell für mathematische Beweisführungen.

Allerdings wird es hier auch etwas komplizierter, denn zuerst einmal muss man sich etwas klar machen.

Nehmen wir an, man habe eine falsche Aussage, bspw. 2 = 5 (A) und nehme diese *2 -> 2*3 = 5*3 <=> 6 = 15 (B) ist immer noch falsch.
Also können wir sagen, dass eine falsche Aussage auch eine falsche Aussage implizieren kann.

Nehmen wir nun allerdings wieder (A) * 0 -> 2*0 = 5*0 => (keine Äquivalenz!) 0 = 0. Dies ist eine wahre Aussage!
Also können wir sagen, dass eine falsche Aussage auch eine wahre Aussage implizieren kann.

Sagen wir jetzt 2 = 2 (A) ist eine wahre Aussage. Und multiplizieren/addieren/dividieren/subtrahieren diese mit einer beliebigen Zahl, so kommt immer eine wahre Aussage heraus. (Bspw.: 2+2 = 2+2 <=> 4 = 4 -> wahr)
Also können wir sagen, dass eine wahre Aussage auch eine immer eine wahre Aussage impliziert.

Nehmen wir nun wieder diese wahre Aussage 2 = 2. Wir werden feststellen,  dass wir keine falsche Aussage aus dieser implizieren können.

Die Wahrheitstabelle sieht dann wie folgt aus:

Implikation

Symbol: =>, Beispiel: A=>B, gesprochen „A impliziert B“ oder „Aus A folgt B“.

4. Äquivalenz (Genau-wenn)

Symbol: <=>, Beispiel: A<=>B, gesprochen „A genau dann, wenn B“ oder „A ist äquivalent zu B“.

Herleiten können wir diese Wahrheitstabelle einfach, in dem wir eine falsche Aussage mathematisch versuchen mit Äquivalenzumforumgen (Subtraktion, Addition, Multiplikation (außer *0) oder Division) umzuformen, sodass dies eine wahre Aussage ergibt.
Es wird uns nicht gelingen.
Auch anders herum wird es uns nicht gelingen. Denken wir nochmals an die Implikation: Dort habe man nur eine falsche Aussage in eine wahre umformen können, indem ich mit 0 multiplizierte, was nicht äquivalent ist. Denn man kann diese Operation nicht mehr rückgängig machen.

Daraus folgt:

Aequivalenz

Wichtige Begriffe in der Aussagenlogik:

  1. Tautologie = eine Aussage, die immer wahr ist.
  2. Junktoren = logische Operatoren
    1. zweistellige Junktoren:  ⇔, ⇒, ∨, ∧
    2. einstellige Junktoren: ¬

Neben den bisher eingeführten Verknüpfungen gibt es noch weitere, welche vorwiegend in der  Informations- und Digitaltechnik eingesetzt werden.

Sätze der Aussagenlogik:

Sätze von De Morgan:

  • ¬(A∧B) ⇔¬A∨¬B
  • ¬(A∨B) ⇔¬A∧¬B

Kontrapositionssatz:

  • (A⇒B) ⇔ (¬A⇒¬B)

Distributivsatz:

  • A∧(B∨C) ⇔(A∧B)∨(A∧C )
  • A∨(B∧C) ⇔(A∨B)∧(A∨C )

SQL Datenbanken in Windows Phone 8 nutzen

Man kann Daten in Projekten auf vielfältige Arten speichern, eine davon ist die Hinterlegung der Daten in einer Datenbank.
Dazu gibt es in Windows Phone mehrere Optionen. Das bekannteste und weit verbreitetste Datenbank-Datenbanksystem  ist SQLite.
Sie ist open-source und kann kostenfrei in Projekten eingesetzt werden. Zudem hat SQLite den Ruf sehr stabil und schnell zu laufen.

Wieso soll ich denn überhaupt eine Datenbank nutzen?

Das muss man nicht, aber ab einer bestimmten Komplexität der Daten/Informationen, ist eine Datenbank sinniger, als ein „plumpes“ Hinterlegen der Informationen in Dateien, bspw. über XML oder JSON.

Beginnen wir…
Grundsätzlich gibt es eine Vielzahl von Anbietern, welche SQLite Zugriffe bereitstellen, bspw. SQLite-Net, SQLitePCL, uvm…

Ich habe mich für SQLitePCL entschieden, da ich hier den „simplen“ SQL Syntax nutzen kann und nicht – wie bei SQLite-NET – über LINQ gehen muss.

Installieren wir uns nun also SQLitePCL. Hierbei handelt es sich um ein NuGet-Paket, welches wir in VisualStudio mit über den NuGet Paket Manager installieren können.
Hier gibt es zwei Wege:

  • GUI:
    Rechtsklick auf das Projekt -> NuGet-Pakete verwalten.
    Jetzt aktivieren wir auf der linken Seite die Option „Online“ und suchen nach SQLite-PCL. Hier installieren wir die „Portable Class Library for SQLite“.
    Sobald gefunden, installieren wir sie.
  • Kommandozeile (Nuget-Console):
    Wir öffnen die Kommandozeile und geben folgendes ein: Install-Package SQLitePCL

SQLitePCL_Nuget_Install

 

Danach installieren wir noch die benötigte Windows Library „SQLite for Windows Phone“, hierbei handelt es sich NICHT um ein NuGet-Paket sondern eine Windows SDK Extension:

SQLitePCL_SDK_Install.png

 

Nun installieren wir die Library und fügen eine/n Referenz/Verweis unserem Projekt hinzu.

Anschließend können wir endlich anfangen.

Ganz allgemein sieht ein SQLite-Befehl so aus – wie man die Verbindung (conn) aufbaut, erfahrt ihr gleich:

 
                using (var command = conn.Prepare("INSERT INTO MyTable(VALUE1) VALUES (?);"))
                {
                    command.Bind(1, MeinWert); //1-indexed parameter
                    command.Step(); //Absetzen des Befehls an die Datenbank
                }

Grundsätzlich muss man erst einmal eine Datenbank anlegen.

[spoiler title=“Datenverbindung erstellen“ style=“fancy“ anchor=“Datenbank“]

        public DatabaseConn()
        {
            SQLiteConnection conn = new SQLiteConnection("mydatabase.db");
        }

[/spoiler]
Dies legt die Datenbank in einer Datei namens „mydatabase.db“ ab oder öffnet diese.
Jetzt müssen wir – falls noch nicht geschehen – die Datenbank mit Tabellen füllen:
[spoiler title=“Tabellen-Erstellung“ style=“fancy“ anchor=“Tabelle“]

        public void LoadOrCreateDatabase()
        {
            string sql = @"CREATE TABLE IF NOT EXISTS 
                        MyTable
                        (Id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
                         Header VARCHAR(255),
                         Text VARCHAR(4096),
                         Position INTEGER);";

            using (var statement = conn.Prepare(sql))
            {
                statement.Step();
            }
        }

[/spoiler]

Um Daten aus der Datenbank abzurufen, muss man erstmal differenzieren.

  • Bekommt man einen Datensatz zurück?
  • Bekommt man mehrere Datensätze zurück?

Für den ersten Fall können wir einfach eine Abfrage absetzen und die Spalten des ersten Datensatzes durchlaufen:

[spoiler title=“Select-Einzeldatensatz“ style=“fancy“ anchor=“Einzeldatensatz“]

using (var command = conn.Prepare("SELECT Id, Header, Text, Position FROM MyTable WHERE Id = ?"))
                {
                    command.Bind(1, ID); //Fill the first (one-indexed!) parameter
                    if (command.Step() == SQLiteResult.ROW || command.Step() == SQLiteResult.DONE) // Überprüfe, ob Reihe existiert oder Step ausgeführt
                    {
                        MyTableObject obj= new MyTableObject ()
                        {
                            id = (long)command["Id"],
                            header = (string)command["Header"],
                            text = (string)command["Text"],
                            position = (long)command["Position"]
                        };
                        return obj;
                    }
                }

[/spoiler]

Für den zweiten Fall müssen wir durch alle Zeilen laufen und diese Daten in unsere Objekte laden:

[spoiler title=“Select mehrerer Datensätzen“ style=“fancy“ anchor=“Mehrfachdatensätze“]

                using (var command = conn.Prepare("SELECT Id, Header, Text, Position FROM MyTable "))
                {
                    while (SQLiteResult.ROW == command.Step()) //Solange noch eine Reihe verfügbar ist, mache weiter
                    {
                        MyTableObject obj= new MyTableObject ()
                        {
                            id = (long)command["Id"],
                            header = (string)command["Header"],
                            text = (string)command["Text"],
                            position = (long)command["Position"]
                        };
                        this.list.Add(obj);
                    }
                }

[/spoiler]

Und zu guter Letzt Befehle ohne Rückgabe. Diese sind sehr einfach und lassen sich

[spoiler title=“Befehle ohne Rückgabe“ style=“fancy“ anchor=“Ohne-Rückgabe“]

                using (var command = conn.Prepare("DELETE FROM MyTable WHERE Id = ?;"))
                {
                    command.Bind(1, "MEINWERT");
                    command.Step(); //Absetzen des Befehls
                }

[/spoiler]

Das war’s. Jetzt könnt ihr eure Datenbank füllen und mit ihr arbeiten.

Release des Valve Server Tools für Windows Phone 8

Gestern war es soweit, das Valve Server Tool ging im Windows Phone Store online und kann nun auf Windows Phone 8.1 Geräten installiert werden.

„Das Valve Server Tool ist eine App zur Abfrage von Server-Daten der HLDS (Half-Life-Dedicated Servers) und SRCDS (Source Dedicated Servers), bspw. Counter-Strike:Source Servern für Game-Server Admins.
Welche Map läuft gerade auf dem Server und wie viele Spieler befinden sich auf diesem? Welche Regeln sind für diesen gerade aktiv?

Features:
* Klassische Server Information über das Valve Query Protokoll (A2S_INFO)
* Informationen über die aktuellen Spieler auf dem Server (A2S_PLAYER)
* Informationen über die, auf dem Server gültigen Regeln (A2S_RULES)

App-Sprache: Englisch“

Zur Projektseite geht’s hier entlang.

Update:
– Fixed connection issues to servers

Screenshots:
Serverdata_wvga PlayerStats_wvga Mainmenu_wvga Rules_wvga

Allgemein gültige Lösung für Zahlenketten vom Typ (x+iy) bei i <= 4

Man kam auf mich zu mit einer Knobelaufgabe der siebten Klasse und wollte von mir die Lösung für diese Frage bzw. Aufgabe wissen.
Aufgabe:
Gegeben sei eine Zahlenkette mit der „Startzahl“ x. Diese wird viermal mit der „Additionszahl“ y multipliziert.
Die Summe der Einzelergebnisse ist der Wert S.

Bsp.

math_990_2570d0efd9719cda8b93b62afdb66550

Frage:
Was ist eine Lösung für S = 100 und S = 66?

Lösungsansatz:

Zerbröseln wir einmal das ganze. Wenn man die obere Zahlenkette anschaut, so kann man sehen, dass

3(=x)   5(=x+y)    7(=x+2y)   9(=x+3y)   11(=x+4y) = S für x = 3, y = 2

x + (x+y) + (x+2y) + (x+3y) + (x+4y) = S

Nun kann man diese Funktion auch so schreiben: math_975.5_d9ea1843b3d8b23abc6979ff78d90fdf

 Durch Ausaddieren aller Werte, ergibt sich: 5x + 10y = S

Durch Umstellung ergeben sich folgende Werte: math_983_c4a9c5d5aca00bfc06d62c8d2641ac4a (1) und math_983_8ca5deb2bad2fb104d082274710eae66 (2)

Aus (2) in (1) folgt: y= math_983_6bd8c2a034b85ef49d5fed12d5ecb4e8

Aus (1) in (2) folgt: x= math_983_fd15c3a41dec083cf95a625f18aadaf9

Setzt man (1) und (2) nun wieder in die Funktion ein, so erhält man:

math_962_7b3b7172a00785dcbbbd15db86448ee2

Will man bspw. einen Wert für x wissen für die Summe 100, so nimmt man folgende Formel:
math_983_3bdbf171fee2a606058c9a1f8daaa7c4
x in (1):
math_983_ac92172b5553ddb7f0b67c5d2c789618 oder allg. math_983_6e416c20a08e1127fbb98cefed01f3ec

Die Lösungsmesse für für x und y bei S = 100 ist also:

L = {x = 10; y = 5}

Für 66 erhält man die Lösung:

L = {x = 6,6; y = 3,3}

Dies kann man jetzt noch weiterspinnen und den Parameter i ohne Zahlenwerte belassen, sodass wir eine allgemingültige Lösung für alle Zahlenketten bekommen.

Dies tun wir jetzt auch:

math_976_6943eda49eb15da2814e06b72938246c

Dies können wir nun nach y auflösen:

math_971_2ff9a81f9f4d6ac1b055cad7ad636c88(1)

math_971_a77e678ba05def2c4febe9079f424c84(2)

Nun (1) in (2) einsetzen und vice versa und man hat die Formeln für x und y unabhängig von den gegebenen Parametern y und x.

Fertig, abschließend einfach die Aufgabenwerte einsetzen.

© 2019 Abou Chleih. Alle Rechte vorbehalten.

Thema von Anders Norén.