Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » formale Sprachen » Logische Operatoren » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Logische Operatoren
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Dragon_Fighter
Jungspund


Dabei seit: 10.04.2013
Beiträge: 11

Logische Operatoren Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Hallo, ich hoffe, dass ich Euch nicht mit meinen Anfängerfragen auf die Nerven gehe. Hier ist wieder eine Aufgabe, an der ich mich versucht habe:

(a) Wie würden Sie diese Bedingung beschreiben:

code:
1:
( (x && !y) ) || ( (!x&&y) )
?

(b) Worin liegt der Unterschied zwischen

code:
1:
(a && b)
und

code:
1:
(!(!a || !b))
?

(c) Formulieren Sie den Ausdruck

code:
1:
!(a && b)
ohne den ! Operator.

Meine Ideen:
Zu (a):

Das würde ich als "Entweder-Oder" bezeichnen.
Beispiel:

a="Es regnet."
b="Es stürmt."

Der gesamte Ausdruck ist (theoretisch) in folgenden drei Fällen wahr:

1.) Es regnet und stürmt nicht. (linke Aussage stimmt)
2.) Es regnet nicht und stürmt. (rechte Aussage stimmt)
3.) Es regnet und stürmt nicht. Und es regnet nicht und stürmt. (linke und rechte Aussage stimmen)

Aber die Aussage 3 kann nicht eintreten; es kann nicht gleichzeitig regnen und nicht regnen bzw. stürmen und nicht stürmen.

Also entweder es regnet und es stürmt nicht - oder es regnet nicht und es stürmt.


----

(b) Meiner Ansicht nach gibt es da keinen Unterschied!

Nach de Morgan hat man doch

code:
1:
(!a || !b)=!(a && b)
, also

code:
1:
(!(!a || !b))=(!(!(a && b))=(a&&b)


--------------

Zu (c)

Das weiß ich leider nicht!
Ich weiß nur:

code:
1:
!(a&&b)=!a || !b
,

aber da kommt der ! Operator ja noch drin vor.
11.04.2013 12:30 Dragon_Fighter ist offline Beiträge von Dragon_Fighter suchen Nehmen Sie Dragon_Fighter in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo,

die Anfängerfragen nerven keineswegs. Mir persönlich helfen Sie immer wieder den Stoff präsent zu halten.

zu a)
Stimmt. Weitere geläufige bezeichnungen für den Ausdruck sind XOR oder Antivalenz. Deine Argumentation von 3) verstehe ich nicht ganz. Da es aber eh nicht eintritt, ist es irrelevant. Ich persönlich hätte den Fall 3 weggelassen und Fall 3 + 4 folgendermaßen beschrieben:
3) Es regnet nicht und es stürmt nicht führt zu einer falschen Aussage
4) Es regnet und es stürmt führt zu einer falschen Aussage

zu b)
Genau richtig begründet. Da die De-Morganschen gesetzte äquivalente Umformungen darstellen, sind die beiden Ausdrücke Äquivalent.

zu c)
Es gibt keinen Äquivalenten Ausdruck ohne die Negation, da es keine Möglichkeit gibt, den Negationsoperator mit anderen Operatoren darzustellen. Vorrausgesetzt es gibt nur die zweistelligen Operatoren && und ||, dann führen a && a oder a||a immer auf die identische Abbildung.

VG,

Karlito
11.04.2013 13:34 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Dragon_Fighter
Jungspund


Dabei seit: 10.04.2013
Beiträge: 11

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Vielen Dank!
11.04.2013 13:38 Dragon_Fighter ist offline Beiträge von Dragon_Fighter suchen Nehmen Sie Dragon_Fighter in Ihre Freundesliste auf
Airblader*
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ich bin mir nicht so sicher, ob die b) richtig ist. Es könnte einen subtilen Unterschied geben. Ich teste es nachher mal, wenn ich daheim bin.
11.04.2013 17:55
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

So – ich habe in der U-Bahn doch einen Denkfehler gehabt, es ist also doch alles korrekt. Vielleicht dennoch der Gedanke, der mir kam:

Die logischen Operatoren "&&" bzw. "||" sind sogenannte "short circuit"-Operatoren. Sie werden in der Regel von links nach rechts ausgewertet und die Auswertung wird abgebrochen, sobald das Ergebnis bereits feststeht – das spart Rechenzeit.

Ein Beispiel:

code:
1:
2:
3:
4:
5:
6:
bool a = false;
bool b = true;

if( a && b ) {
    // ...
}


Da a bereits false ist, kann die Bedingung schon nicht mehr erfüllt werden. Der Wert von b wird daher erst gar nicht ausgewertet. Interessant wird das, wenn man nicht Variablen, sondern Funktionen verknüpft.

Folgendes Beispielprogramm führt zweimal eigentlich die selbe Abfrage durch, lediglich die Seiten werden vertauscht:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
bool testFunction( bool param ) {
    cout << "Tick ";
    return param;
}

int main () {
    // Output: "Tick Tick "
    if( testFunction( true ) && testFunction( false ) ) {
        // do nothing
    }

    // Output: "Tick "
    if( testFunction( false ) && testFunction( true ) ) {
        // do nothing
    }
}


Wie man hier sogar online sehen kann, stimmt der angegebene Output tatsächlich. In der zweiten if-Abfrage wird der rechte Operand also erst gar nicht evaluiert, da das Ergebnis durch den linken Operanden bereits feststeht.

Beim "||" sieht das Ganze analog aus, nur andersrum: Evaluiert bereits der erste Operand zu "true", so ist die Bedingung bereits erfüllt und der Rest wird nicht ausgewertet.

Lange Rede, kurzer Sinn: Mein Gedanke war vorhin, dass dieser Effekt eine subtil andere Auswertung der beiden Versionen aus der Aufgabe zur Folge hätte – war allerdings ein Gedankenfehler in der Schnelle. Augenzwinkern

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Airblader: 11.04.2013 19:31.

11.04.2013 19:29 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Noch ein Zusatz:

Dieser Effekt erlaubt allerlei Sprachkonstrukte und Abkürzungen. Eine if-Abfrage wie

code:
1:
2:
3:
if( someVariable == true ) {
    doSomething();
}


lässt sich damit abkürzen zu

code:
1:
someVariable && doSomething();


Wir haben ja schließlich eben gelernt, dass die rechte Seite nur evaluiert wird, wenn die linke Seite "true" ergibt.

Wichtig: Auch hier gilt, dass solche Spielereien lustig sind und man sich solchen Effekten bewusst sein darf, aber tatsächlich verwenden sollte man sowas nicht.

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
11.04.2013 19:36 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Karlito Karlito ist männlich
Kaiser


Dabei seit: 11.04.2011
Beiträge: 1.461

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Zitat:
Original von Airblader
Noch ein Zusatz:

Dieser Effekt erlaubt allerlei Sprachkonstrukte und Abkürzungen. Eine if-Abfrage wie

code:
1:
2:
3:
if( someVariable == true ) {
    doSomething();
}


lässt sich damit abkürzen zu

code:
1:
someVariable && doSomething();



Das funktioniert nur, wenn die Methode doSomething() nicht den Rückgabetyp void hat.

VG,

Karlito
11.04.2013 20:02 Karlito ist offline E-Mail an Karlito senden Beiträge von Karlito suchen Nehmen Sie Karlito in Ihre Freundesliste auf
Airblader Airblader ist männlich
Doppel-As


Dabei seit: 03.03.2013
Beiträge: 138
Herkunft: München

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Das kann natürlich gut sein. Ich halte mich selbst daran, sowas nicht zu schreiben, darum übersehe ich sowas dann auch mal. großes Grinsen

Letztlich ist das nur ein Grund mehr, solche Konstrukte nicht wirklich anzuwenden.

__________________
The best thing about a boolean is that even if you're wrong, you're only off by a bit.
11.04.2013 20:06 Airblader ist offline Beiträge von Airblader suchen Nehmen Sie Airblader in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » formale Sprachen » Logische Operatoren