Logische Terme vereinfachen

Lestas89

Bekanntes Mitglied
Ich wäre sehr dankbar, wenn man mir hier zumindest von a - e helfen könnte, da ich leider keinen Ansatz dafür habe, wie man die logischen Terme vereinfachen könnte. Habe dazu auch nichts in Büchen gefunden.

Wie muss man hier genau vorgehen? (Bild)

Aufgabe ist es, die Terme soweit wie möglich zu vereinfachen.
 

Anhänge

  • Vereinfachen.jpg
    Vereinfachen.jpg
    29,5 KB · Aufrufe: 94

Gmork

Mitglied
Kann es sein, dass du die Bedeutung der Vergleichsoperatoren nicht verstehst?
Folgende gibt es: (Die mir gerade einfallen)
'a<b' - a ist echt kleiner b (Also gilt auch: a ungleich b.)
'a<=b' - a ist kleiner gleich b (Also a ist kleiner oder gleich b.)
'a>b' - a ist echt größer b (Also gilt auch: a ungleich b.)
'a>=b' - a ist größer gleich b (Also a ist größer oder gleich b.)
'a==b' - a ist gleich b
'a>=b' - a ist ungleich b (Also a ist größer oder kleiner als b, aber a ist nicht gleich b.)

Ein Ausrufezeichen vor einem Term ist eine Verneinung. Also zB
!(a == b) bedeutet das Selbe wie (a != b)

Mit && kann man Terme verknüpfen. Das heißt beide Terme müssen stimmen.
Beispiel:
(a<=b) && (a==b) bedeutet das Selbe wie (a==b)

Mit || kann man auch Terme verknüpfen. In dem Fall muss mindestens einer der beiden
Terme stimmen.
Beispiel:
(a<=b) || (a==b) bedeutet das Selbe wie (a<=b)

Zu deinen Aufgaben. Numero 1:
(x > y) || (y==x)
x ist größer als y oder y ist gleich x. Eines der beiden muss stimmen.
Also wäre es verkürzt x >= y. Diese Aussage ist nämlich erfüllt, wenn x ist kleiner y,
aber auch wenn x ist gleich y.
 

Lestas89

Bekanntes Mitglied
Klasse Gmork, dass du mir hilfst. Kannst du mir bei den nächsten auch noch weiterhelfen, sodass ich die anderen dann alleine versuchen kann? Bei der nächsten Aufgabe mit der Verneinung weiß ich z.B. auch nicht wie man das vereinfacht schreiben könnte.
 

Gmork

Mitglied
Lies den Text mal komplett... Ich habe dir die Lösung schon gegeben für die Verneinung...

Nochmal zusätzlich:
Es gibt immer 3 Intervalle (Bereiche) - Kleiner, gleich und größer.
Nicht kleiner wäre gleich oder größer.
Nicht kleiner oder gleich wäre größer.
Nicht kleiner, gleich oder größer wäre 'false' (also keine Lösung).

Kleiner und Größer wäre ungleich.
Kleiner und Gleich wäre 'false'. (Es kann ja nicht gleichzeitig gelten a < b und a ist gleich b.)
 

Lestas89

Bekanntes Mitglied
Stimmt! Ich sehe das jetzt erst. Ich habe mich heute lange genug damit beschäftigt. Ich werde morgen meine Lösungen posten und wäre dir dankbar wenn du sie kontrollieren würdest :)
 

Lestas89

Bekanntes Mitglied
So, ich habe nun die Lösungen von a - e erstmal erarbeitet. Danach werde ich die restlichen Aufgaben machen. Wäre dankbar wenn Gmork oder jemand anderes mal drüber schauen könnten ob das alles so stimmt :)


a) (x > y) || (y == x) : x >= y
b) !(x == y) : x != y
c) !(y < x) : y >= x
d) (x < y) && ( y < x) : false
e) (x < y) && (y > x): y > x oder x < y

sind a - e schonmal richtig?
 

Lestas89

Bekanntes Mitglied
Klasse. Vielen Dank! Bei f - j brauche ich aber einpaar Hilfen:

f) (!x && y) || (x && !y) : ?
g) (x == y) && false: ?
h) (x == 0 || false) && (y == 0) && true : ?
i) (x == y) && (x == 0) && (y == 0) : ?
j) (x || y) && (x == y) : ?

Tut mir leid das ich nicht einen alleine lösen kann. Ich wäre über einpaar Hilfestellungen sehr dankbar :)
 

Viktim

Bekanntes Mitglied
wenn da !x steht heißt das, dass in x ein boolscher Wert steht, also true oder false. !x heißt, das der Wert sich in das Gegenteil verwandelt.

EDIT: wenn es also heißt (!x && y) und x != y ist, dann kommt da insgesammt true raus ;)
 

Viktim

Bekanntes Mitglied
bei f) heißt das einfach, dass x != y.
Weil da ja steht das entweder:
x = true und y = false
oder:
x = false und y = true.
Und weil true und false die einzigen beiden möglichkeiten sind, wie x und y gefüllt seinkönnen, aber immer eins von beidem Negativ und das andere Positiv sein muss bedeutet das x != y ;)
 

Viktim

Bekanntes Mitglied
Da bin ich mir selber nicht so sicher, aber ich kann mir vorstellen, dass bei g) einfach ein false rauskommt, weil das "&& false" ja quasi ein false erzwingt...
 

Viktim

Bekanntes Mitglied
Nee nicht wirklich :D
Aber bei g) jetzt schon einigermaßen :D wenn ich bei Eclipse das eingebe:
Java:
     System.out.println(true == false && false);
     System.out.println(true == true && false);
     System.out.println(false == true && false);
Dann sagt der mir bei allem false, also müsste da eigentlich false als ergebnis bleiben :D
 

Lestas89

Bekanntes Mitglied
also h lautet dann: (x == 0) && (y == 0) && true, ist das richtig?
Wieso kann ich das das false einfach weglassen. Wäre dir dankbar wenn du mir das vllt. noch erklären könntest :D
 

Gmork

Mitglied
Das 'Oder' bedeutet ja, dass eine der beiden Seiten wahr sein muss.

Da die rechte Seite ja schon falsch ist durch die Vorgabe, ist nur die eine Seite
relevant.
Sieht man hier:
true || false -> true
false || false -> false

Wie du siehst ist das Ergebnis der Wert der linken Seite, also (x==0)

Du kannst übrigens noch mehr weglassen. Betrachte mal genauso das && true.
 

Lestas89

Bekanntes Mitglied
Hallo Gmork,

bezieht sich dein Antwort auf g) ? Wie meinst du das genau? Kannst du die Lösung einmal hinschreiben?

Ich danke dir vielmals!
 

Gmork

Mitglied
(x==0 || false) && (y==0) && true
Dabei kann man x==0 || false wie zuvor beschrieben zusammenfassen
zu x==0. Somit ergibt sich nach erster Vereinfachung:
(x==0) && (y==0) && true

Nun kann man noch eine Vereinfachung vornehmen.
Bezeichnen wir (x==0) && (y==0) mit A.
A && true -> true, wenn A true
A && true -> false, wenn A false

Folglich ist die Erweiterung && true überflüssig, da sie am
Ergebnis nichts Verändert. Somit ergibt sich maximal vereinfacht:
(x==0) && (y==0)
 

Lestas89

Bekanntes Mitglied
Klasse. Ich danke dir vielmals Gmork. Jetzt bleiben nur noch i und j übrig, dann bin ich fertig :)

i) (x == y) && (x == 0) && (y == 0) : wenn x und y == 0 sein sollen, reicht dann x == y nicht einfach aus?
j) (x || y) && (x == y) : Hier weiß ich nicht weiter.
 

Gmork

Mitglied
Zu deiner Antwort zu i). Deiner Antwort zufolge könnte dann
x == 2 == y gelten, was aber ein Widerspruch zu den Bedingungen
(x==0) und (y==0) aus der Aufgabe wäre. Da fehlt also noch was.

Vielleicht hätte ich dir das schon früher zeigen könne, aber zum Prüfen
von Lösungen kann man Wahrheitstabellen benutzen.
Zu i) dementsprechend:
980b12cab26fb49abd748cf2d6c79584.png

Dabei sind zwei Aussagen gleich, wenn die true's und false's übereinstimmen. Hier zum Beispiel sind die Aussagen
(x == y) && (x == 0)
und
(x == y) && (x == 0) && (y == 0)
gleich. Damit hast du auch schon deine Lösung für i). Probiert das einmal bei j) und du wirst deine Lösung finden.

Dazu betrachtest du erst die Möglichkeiten für x und y links und in den folgenden Spalten die Teilaussagen
x || y und x == y. Danach betrachtest du die ganze Aussage.

Wichtig: x und y sind Integer-Werte. Das Prüfen geht hier mit 0 und 1, da nur == 0 vorkommt. Sonst geht das nicht.
In j) musst du statt 1 und 0 true und false benutzen.
 

Lestas89

Bekanntes Mitglied
Meine Wertetabelle sieht wie folgt aus (Bild)

Woran erkenn ich jetzt genau, wie die Vereinfachung ist?
 

Anhänge

  • 0d8853000b8f2ce42770373be60e72ee.png
    0d8853000b8f2ce42770373be60e72ee.png
    7 KB · Aufrufe: 25

Gmork

Mitglied
Nun, du suchst einen Term, der nur wahr ist, wenn x und y true sind.
Wie heißt der? ;)

(Ist einer der Standard-Vergleichsoperatoren !=, ||, &&, ==.)
 

Gmork

Mitglied
8a934228c34d806480d275c79ef6199b.png


Ausprobieren. Dann hast du die Lösung. Es muss false, false, false, true in den Zeilen stehen, damit die Lösung richtig ist.
 

Lestas89

Bekanntes Mitglied
Ich habe die Datei in meinem vorletzten Post angehängt und komme auf die gleiche Lösung wie du. Könntest du meine Tabelle überprüfen?
 

Gmork

Mitglied
Habe ich schon. :) Ist richtig - hätte schon was gesagt, wenn sie falsch gewesen wäre.

Allerdings ist die neue Tabelle hier wieder für dich gedacht. Einer der Terme mit den nicht ausgefüllten Spalten ist die Lösung.
 

Lestas89

Bekanntes Mitglied
Woher wusstest du welche neuen Terme du hinzufügen musst? Ich dachte ich nehme nur die, die in dem Term selbst enthalten sind.
 

Gmork

Mitglied
Ja, die enthaltenden Terme hinzuzufügen soll in erster Linie dafür sorgen, dass keine Fehler passieren und dient auch Lernzwecken. Manchmal wie zB bei Aufgabe i) kann man dadurch auch die Lösung oder eine Vereinfachung finden.

Wenn man aber etwas vereinfachen möchte, sollte man gewisse Strukturen erkennen können.
Beispiel:
7def381c97bc448187f8ccea4a22660d.png

Wenn so etwas da steht und du wüsstest nicht, dass das x || y ist, sollte man am false, true, true, true erkennen, dass es sich um das 'Oder' handelt. Das macht man ein paar mal und dann kann man das.

Wenn man das das erste Mal macht, hilft oft probieren aus. Bei j) zum Beispiel hast du 2 Aussagen mit einem 'Und' verknüpft. Wenn du diese vereinfachen kannst, muss diese folglich kürzer sein... naja und 1,5 Aussagen gibt es nicht. Somit ist schon klar, dass eine Aussage reichen muss.
Das kann man dann einfach durchprobieren.


Ja, deine Antwort ist richtig!
 

Lestas89

Bekanntes Mitglied
Ich danke dir für deine Geduld und Hilfe! Bleibt nur noch die Frage zu f)

Ist das nun ein XOR wie Flown es sagte? Oder x!=y ?
 
X

Xyz1

Gast
TL;DR

Ich fasse das mal schnell zusammen (nichts was nicht schon gesagt wurde):

Java:
(x > y) || (y == x)						=>	x >= y
!(x == y)								=>	x != y
!(y < x)								=>	y >= x
(x < y) && (y < x)						=>	false
(x < y) && (y > x)						=>	x < y
(!x && y) || (x && !y)					=>	x XOR y
(x == y) && false						=>	false
(x == 0 || false) && (y == 0) && true	=>	x == y == 0		(beide 0)
(x == y) && (x == 0) && (y == 0)		=>	x == y == 0		(beide 0)
(x || y) && (x == y)					=>	x == y == true	(bzw. > 0)

Dabei ist mir aufgefallen, das man normalerweise zwischen Wahrheitswerten und arithmetischen Werten unterscheidet, bei j) sind entweder beide true oder beide > 0, je nachdem was man rein steckt.

Falls ich falsch liege, korrigiert mich einfach.
 

Gmork

Mitglied
@DerWissende :
Ich habe den Code jetzt als Java-Code betrachtet und nicht als Java-Script-Code oder
als eigene Definition. Wäre es die mathematische Aussagenlogik, so würde die Syntax
ja anders aussehen.
Allerdings wird das XOR in Java-Script und Java ja auch als ^ bezeichnet...

In Java ist ein Integer größer Null kein Äquivalent zum Boolean-Wert true; auch nicht, wenn
man 2 Integer-Werte miteinander vergleicht. 1 || 2 wirft zB einfach einen Fehler aus.
In Java-Script wirft das keinen Fehler aus, gibt aber nur die erste Zahl zurück, was irgendwie
unsinnvoll ist.
Das hier: 'x == y == 0', geht weder in Java (Fehler) , noch in Java-Script (funktionale Mängel).

Allerdings kenne ich mich bzgl Java-Script nicht wirklich gut aus, also bitte korrigieren, falls ich Unsinn erzählt habe.
 

Lestas89

Bekanntes Mitglied
@ Gmork. Die letzten drei die derWissende zusammengefasst hat: Dafür hatten wir hier aber andere Lösungen. Ist seine Zusammenfassung denn richtig?
 

Gmork

Mitglied
@Lestas89 :
An den letzten Dreien zweifle ich sehr. Kommt aber drauf an - ist deine Aufgabe auf die Programmiersprache Java bezogen? Wenn ja dann ist sie richtig wie wir sie gemacht hatten.
Bzw wenn du bei f) nicht != genommen hast, sollte da ^ stehen und nicht XOR.

Die Lösung von DerWissende ist bzgl Java in den Teilaufgaben f), h), i) und j) falsch.
 
X

Xyz1

Gast
Die Lösung von DerWissende ist bzgl Java in den Teilaufgaben f), h), i) und j) falsch.

Sind nicht falsch. Ich denke jeder weiß, was mit XOR gemeint ist. Kennt ihr die Schreibweise x == y == 0 nicht? Das bedeutet, sowohl x als auch y sind 0. h) ist äquivalent zu i). j) ist auch richtig. || ist in Java nur als binärer logischer kurzschließender Operator definiert.
Java:
f) => x ^ y

h) => x == 0 && y == 0
i) => x == 0 && y == 0
j) => x == true && y == true => x && y

An welcher Stelle weicht denn etwas wie von eurer "Musterlösung" ab?
 

Neue Themen


Oben