# Logische Terme vereinfachen



## Lestas89 (31. Mrz 2016)

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.


----------



## Gmork (31. Mrz 2016)

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 (31. Mrz 2016)

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 (31. Mrz 2016)

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 (31. Mrz 2016)

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


----------



## Viktim (1. Apr 2016)

Gmork hat gesagt.:


> 'a>=b' - a ist größer gleich b (Also a ist größer oder gleich b.)
> 'a>=b' - a ist ungleich b (Also a ist größer oder kleiner als b, aber a ist nicht gleich b.)



Ich glaube hier stimmt was nicht 
a ungleich b müsste so aussehen:
'a!=b'


----------



## Lestas89 (1. Apr 2016)

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?


----------



## Viktim (1. Apr 2016)

sieht gut aus


----------



## Jardcore (1. Apr 2016)

sieht alles richtig aus


----------



## Lestas89 (1. Apr 2016)

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 (1. Apr 2016)

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


----------



## Lestas89 (1. Apr 2016)

Trotzdem weiß ich nicht wie ich in f) weiterkommen soll. Kannst du mir vllt noch weiter auf die Sprünge helfen?


----------



## Viktim (1. Apr 2016)

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


----------



## Lestas89 (1. Apr 2016)

Klasse, vielen Dank für die Hilfe. wie muss ich bei g) und h) vorgehen?


----------



## Viktim (1. Apr 2016)

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...


----------



## Lestas89 (1. Apr 2016)

Danke dir . Also bist du dir bei den anderen auch nicht sicher?


----------



## Viktim (1. Apr 2016)

Nee nicht wirklich 
Aber bei g) jetzt schon einigermaßen  wenn ich bei Eclipse das eingebe:

```
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


----------



## Viktim (1. Apr 2016)

bei h) bin ich mir aber ziemlich sicher, dass du das "|| false" einfach weglassen kannst


----------



## Lestas89 (1. Apr 2016)

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


----------



## Gmork (1. Apr 2016)

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 (1. Apr 2016)

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 (1. Apr 2016)

Auf h). g) ist richtig mit false als Antwort.


----------



## Lestas89 (1. Apr 2016)

Ich habe immer noch nicht verstanden wie nun die Lösung für h) lautet. Einfach x == 0 ?


----------



## Gmork (1. Apr 2016)

(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 (1. Apr 2016)

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.


----------



## Flown (1. Apr 2016)

Also f) ist auf jedenfall ein XOR und wird in Java mit ^ gekennzeichnet: x ^ y


----------



## Gmork (1. Apr 2016)

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:





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 (1. Apr 2016)

Hallo Flown,

danke für deine Hilfe. Kannst du mir auch bei i und j weiterhelfen?


----------



## Lestas89 (1. Apr 2016)

Also ist bei i) (x == y) && (x == 0) die Lösung? Ich probiere das eben mal für j) aus.


----------



## Gmork (1. Apr 2016)

Wenn du das mit der Tabelle probieren möchtest, hier eine Vorlage:


----------



## Lestas89 (1. Apr 2016)

Meine Wertetabelle sieht wie folgt aus (Bild)

Woran erkenn ich jetzt genau, wie die Vereinfachung ist?


----------



## Gmork (1. Apr 2016)

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

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


----------



## Lestas89 (1. Apr 2016)

x || y und (x == y) sind jeweils true.

Woran erkenn ich denn welchen ich nehmen muss?


----------



## Gmork (1. Apr 2016)

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


----------



## Lestas89 (1. Apr 2016)

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 (1. Apr 2016)

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 (1. Apr 2016)

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


----------



## Lestas89 (1. Apr 2016)

Ich habe die Tabelle ausgefüllt: Ist x && y die Lösung?


----------



## Gmork (1. Apr 2016)

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:




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 (1. Apr 2016)

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 ?


----------



## Gmork (1. Apr 2016)

Es geht beides.
Ich würde aber das XOR benutzen, da das speziell für Booleans gedacht ist.


----------



## Lestas89 (1. Apr 2016)

Alles klar. Vielen Dank


----------



## Xyz1 (2. Apr 2016)

TL;DR

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


```
(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 (2. Apr 2016)

@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 (2. Apr 2016)

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


----------



## Gmork (2. Apr 2016)

@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.


----------



## Lestas89 (2. Apr 2016)

Ja die Aufgaben sind auf die Programmiersprache Java bezogen


----------



## Gmork (2. Apr 2016)

Okay, dann sind die Lösungen auch richtig, die wir zuvor erstellt hatten.


----------



## Lestas89 (2. Apr 2016)

Alles klar


----------



## Xyz1 (2. Apr 2016)

Gmork hat gesagt.:


> 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.

```
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?


----------



## Xyz1 (2. Apr 2016)

Ich glaube, es ist alles nur, weil ich nicht a) - j) davorgeschrieben habe.

Wenn Lestas langweilig ist, kann er ja einen Algorithmus herstellen, der erst mal bestimmt, ob Wahrheitswerte oder Zahlen, und dann ggf. noch automatisch vereinfacht. Also das, was auch Compiler, JIT und Optimierung machen. Term(e) parsen & evaluieren, ist aber eine Mammutaufgabe.^^


----------



## Lestas89 (2. Apr 2016)

Das würde ich niemals schaffen DerWissende, ich bin ein Anfänger in Java


----------



## Xyz1 (2. Apr 2016)

Kommt drann im 9-10 Semester (ggf.), also bis dahin ist noch etwas Zeit.


----------



## Meniskusschaden (2. Apr 2016)

DerWissende hat gesagt.:


> Kennt ihr die Schreibweise x == y == 0 nicht?


Als Java-Ausdruck ist es ungültig. Ich kenne es eigentlich nur aus der Mathematik (dann aber ohne gedoppelte Gleichheitszeichen), wenn man ausdrücken möchte, dass die drei Werte gleich sind. Hier geht es aber nicht darum, zu zeigen dass die Werte gleich sind, sondern einen logischen Ausdruck zu definieren. Dafür finde ich die Schreibweise nicht so zweckmässig, wenn man nicht definiert, wie sie zu lesen ist. Ich bezweifle auch, dass es als boolscher Ausdruck akzeptiert wird, denn den könnte man bei Aufgabe j) auch so interpretieren, dass `x == y == true`wie`(x == y) == true`zu lesen ist. Und das wäre auch wahr, falls x und y beide false wären. Ich stimme dir also zu, dass es so, wie du es offenbar gemeint hast, richtig ist. Aber wenn es als Lösung eingereicht wird, wird es wahrscheinlich als fehlerhaft bewertet.


----------



## Xyz1 (2. Apr 2016)

Ja, schon klar. Mit der Klammerung und den Vorfahrtsregeln muss man auch aufpassen. Kanonische Infixnotation lautete dann so:
((x == true) && (y == true))
vielleicht sogar noch um 'true' 'ne Klammer.

Also erst mal, bevor man auch nur eine Aufgabe löst, muss klar sein:
Befinden wir uns in der:
Aussagenlogik
Prädikatenlogik
Java
JS (Java ist nicht JS  )
Mathematik
boolesche Algebra
Mengentheorie
was gibt es denn noch....
Quantenphysik
usw.

Ich hab mir halt eine eigene Grammatik & Syntax definiert.


----------



## Gmork (2. Apr 2016)

@DerWissende :
Es tut mir Leid, wenn ich dich mit meiner Aussage angegriffen habe und
ich würde niemals bestreiten, dass der Gedanke hinter deinen Lösungen richtig
ist und es vielleicht auch eine Sprache gibt, die diese Syntax akzeptiert.

Ich habe auch nur gesagt, dass die Lösung bzgl Java-Syntax falsch ist.
Selbst wenn du einen Algorithmus schreibst, der Java um diese Syntax
erweitert, ist das klassische Java ohne Algorithmus immer noch nicht
in der Lage diese Syntax zu lesen.
Damit wäre das als Lösung für einen Java-Anfänger ungeeignet.

Und versteh' mich bitte nicht falsch. Du konntest ja nicht wissen, dass
Lestas89 Java-Code verwendet hat, da er es nicht angemerkt hat.


----------



## Xyz1 (2. Apr 2016)

Ach was, ich bin nicht so empfindlich/schnell beleidigt, aber dass auf einmal die Hälfte der Aufgaben/Antworten falsch ist/sei, ach egal.

Bei DIESEN Aufgaben kommt es um so mehr auf den Kontext an, in dem sie stehen.

^ (XOR) könnte genausogut das logische Und, bekannt aus der Mathem., sein.

x = y = 0 könnte, so geschrieben, genausogut zwei Zuweisungen sein.

Dann mal schönen Abend.


----------



## Meniskusschaden (3. Apr 2016)

Der Vollständigkeit halber noch eine Anmerkung, weil ich geschrieben hatte, dass`a == b == 0`kein gültiger Java-Ausdruck ist. Das stimmt zwar, aber das andere Beispiel (Aufgabe j)`x == y == true`ist durchaus ein gültiger Java-Ausdruck. Folgender Code
	
	
	
	





```
public static void main(String[] args) {
    boolean x = false;
    boolean y = false;
    System.out.println((x || y) && (x == y));
    System.out.println(x==y==true);
}
```
erzeugt folgende Ausgabe:
	
	
	
	





```
false
true
```


----------



## Xyz1 (3. Apr 2016)

Ja, lüften wir das Geheimnis, dass x == y auch true ist, wenn beide false sind. Damit unterscheidet es sich von &&.

Java vergleicht auch keine boolean und int. Gut so.

Hätte ich meins mal nicht in den Raum geworfen, ich dachte, jeder versteht XOR und das andere auch.

Schönen Sonntag.


----------

