1 2 Einführung in die Programmierung Vorlesung 3: Logik Peter Müller Chair of Software Engineering Chair of Software Engineering Intro – Lecture 3 Logisches Denken 3 Programmieren ist logisches Denken. Logik ist die Wissenschaft des logischen Denkens. Wir benutzen Logik im Alltag: “Sokrates ist ein Mensch. Alle Menschen sind sterblich. Sokrates muss sterblich sein.” Chair of Software Engineering Eine Bedingung ist boolescher Ausdruck: Sie besteht aus booleschen Variablen (identifizieren einen booleschen Wert) booleschen Operatoren (not, or, and, =, implies) Und stellt möglicherweise einen booleschen Wert (Wahrheitswerte, entweder True oder False). Logisches Denken und Programmieren 4 Logik ist die Grundlage von Mathematik: Beweise sind nur gültig, wenn sie die Regeln der Logik befolgen. Software Entwicklung: Bedingungen in Verträgen: “x darf nicht Null sein, damit man … ausrechnen kann.” (wird später vorgestellt) Bedingungen in Programmen: “Wenn i positiv ist, führe diese Instruktion aus.” (wird später vorgestellt) Chair of Software Engineering Intro – Lecture 3 Boolesche Ausdrücke Intro – Lecture 3 5 Intro – Lecture 3 Beispiele 6 Beispiele boolescher Ausdrücke mit rain_today und cuckoo_sang_last_night als boolesche Variabeln: rain_today (eine boolesche Variabel ist ein boolescher Ausdruck) not rain_today (not cuckoo_sang_last_night) implies rain_today (Klammern: gruppieren von Teilausdrücken) dar. Chair of Software Engineering Intro – Lecture 3 Chair of Software Engineering Intro – Lecture 3 1 Negation (not) Disjunktion (or) 7 8 a not a a b a or b True False True True True False True True False True False True True False False False Eigenschaften der Negation: Für einen beliebigen booleschen Ausdruck e und beliebige Werte seiner Variabeln: Genau einer der Ausdrücke e und not e hat immer den Wert True. Genau einer der Ausdrücke e und not e hat immer den Wert False. Einer der Ausdrücke e und not e hat den Wert True. (Prinzip der ausgeschlossenen Mitte.) Nicht beide Ausdrücke e und not e haben den Wert True. (Prinzip der Widerspruchsfreiheit.) Chair of Software Engineering or Operator ist nicht-exklusiv. or Operator ist kommutativ. Disjunktionsprinzip: Eine or Disjunktion hat den Wert True ausser wenn beide Operanden den Wert False haben. Chair of Software Engineering Intro – Lecture 3 Konjunktion (and) 9 a b a and b True True True True False False False True False False False False Intro – Lecture 3 Komplexe Ausdrücke 10 Bilde komplexere boolesche Ausdrücke mit Hilfe der booleschen Operatoren. Beispiel: a and (b and (not c)) and Operator is kommutativ. Die Dualität von and und or: Eigenschaften von jeweils einem der beiden Operatoren ergeben Eigenschaften des anderen Operators (vertausche True und False). Konjunktionsprinzip: Eine and Konjunktion hat den Wert False ausser wenn beide Operanden True sind. Chair of Software Engineering Belegung und Wahrheits Tafel Belegung für eine Menge von Variabeln: Für jede Variabel wird entweder True oder False gewählt. Eine Belegung erfüllt einen Ausdruck, wenn der Wert des Ausdrucks True ist. Eine Wahrheitstafel für einen Ausdruck mit n Variabeln hat n+1 Spalten 2n Zeilen Chair of Software Engineering Chair of Software Engineering Intro – Lecture 3 Intro – Lecture 3 11 Intro – Lecture 3 Doppelaussagen (Tautologien) 12 Tautologie: Ein boolescher Ausdruck hat den Wert True für jede mögliche Belegung. Beispiel: a or (not a) not (a and (not a)) (a and b) or ((not a) or (not b)) Chair of Software Engineering Intro – Lecture 3 2 Widerspruch Widerspruch: Ein boolescher Ausdruck, der False ist für jede mögliche Belegung. Beispiel: a and (not a) 15 Mehr Tautologien: (a and (b or c)) = ((a and b) or (a and c)) (a or (b and c)) = ((a or b) and (a or c)) True True False False False True False False False True 17 b a implies b True True True True False False False True True False False True Intro – Lecture 3 Präzedenzen Chair of Software Engineering a a=b True 16 Stilregeln: Wenn man einen booleschen Ausdruck schreibt, kann man die Klammern um folgende Konstrukte weglassen: • Um die Ausdrücke auf beiden Seiten des “=“ Zeichens, falls der ganze Ausdruck eine Äquivalenz ist. • Um aufeinanderfolgende elementare Terme, wenn sie von den selben assoziativen Operatoren unterteilt sind. Intro – Lecture 3 Implikation (implies) b True Präzedenzen (beginnend mit der stärksten): not, and, or, implies (wird später vorgestellt), =. and und or sind assoziativ: a and (b and c) = (a and b) and c a or (b or c) = (a or b) or c Gesetze von De Morgan: Tautologien (not (a or b)) = ((not a) and (not b)) (not (a and b)) = ((not a) or (not b)) Chair of Software Engineering a Chair of Software Engineering Intro – Lecture 3 Gesetz von De Morgan 14 = Operator ist kommutativ (a=b hat den selben Wert wie b=a). = Operator ist reflexiv (a=a ist eine Tautologie für alle a). Substitution: Für Ausdrücke u, v und e, falls u = v eine Tautologie ist und e’ der Ausdruck den man erhält, wenn man in e jedes Vorkommen von u mit v ersetzt, dann ist e = e’ eine Tautologie. Erfüllbar: Für mindestens eine Belegung liefert der Ausdruck True. > Jede Tautologie ist erfüllbar. > Kein Widerspruch ist erfüllbar. Chair of Software Engineering Äquivalenz (=) 13 Intro – Lecture 3 Implikationen in der natürlichen Sprache 18 implies in natürlicher Sprache: “if … then …” Beispiele: “Wenn wir noch mehr Sonne kriegen, wird das ein tolles Jahr für den Burgunder.” “Wenn auf Deinem Ticket steht Flug 2034, dann fliegst Du nicht heute.” a implies b, für alle booleschen Werte a und b, ist der Wert von (not a) or b In a implies b: wird a Antecedent genannt, und b Consequent. Implikationsprinzip: Eine Implikation hat den Wert True, ausser wenn ihr Antecedent den Wert True und ihr Consequent den Wert False hat. Sie hat immer den Wert True, wenn ihr Antecedent False ist. Chair of Software Engineering Intro – Lecture 3 Chair of Software Engineering Intro – Lecture 3 3 Falschverstehen von Implikationen 19 Hollywood_actor implies rich = (not Hollywood_actor) implies (not rich) Chair of Software Engineering Intro – Lecture 3 Umkehren von Implikationen (2) 21 Richtig: a implies b = (not b) implies (not a) Beispiel: “All Hollywood actors are rich. I am not rich, so I can’t be a Hollywood actor.” Aber: Division durch null: x darf nicht 0 sein. +7 > 0 ) >(x /= 0) and ( x x Chair of Software Engineering Intro – Lecture 3 Nicht- strikte boolesche Operatoren (1) 22 x +7 > 0 x True für x > -7, x≠0 False für x <= -7 Undefiniert für x = 0 Chair of Software Engineering Intro – Lecture 3 Nicht- strikte boolesche Operatoren (2) Intro – Lecture 3 Beispiel: boolescher Ausdruck (x ist ein Integer): Hollywood_actor implies rich = (not rich) implies (not Hollywood_actor) Chair of Software Engineering 20 Falsch: a implies b = (not a) implies (not b) Beispiel: “All Hollywood actors are rich. I am not a Hollywood actor, so I am not rich.” Wenn a False ist, ist a implies b True, unabhängig von b: “Wenn ich der Papst bin, ist 2+2=5.” “Wenn 2+2=5 sind, bin ich der Papst.” > Falls ich nicht der Papst bin, und 2+2 nicht 5 ist, sind die Implikationen oben True. > Fälle, in denen a False ist, erlauben keine Aussage über die Wahrheit des Consequent. Chair of Software Engineering Umkehren von Implikationen (1) 23 Intro – Lecture 3 Nicht- strikte boolesche Operatoren (3) 24 ABER: and ist kommutativ (Programm würde abstürzen). > Wir brauchen eine nicht-kommutative Version von and (und natürlich auch von or) > nichtstrikte boolesche Operatoren. Chair of Software Engineering Intro – Lecture 3 4 Nicht-strikte boolesche Operatoren (and then, or else) 25 a and then b: Hat den selben Wert wie a and b, wenn a und b definiert sind, und ist False, wenn a False ist. a or else b: Hat den selben Wert wie a or b, wenn a und b definiert sind, und ist True, wenn a den Wert True hat. +7 > 0 ) > (x /= 0) and then ( x x Beispiel: “If you are not single, then your spouse must sign the contract.” is_single or else spouse_must_sign Chair of Software Engineering Intro – Lecture 3 Nicht-strikte Implikation 27 Beispiel: “If you are not single, then your spouse must sign the contract.” (not is_single) implies spouse_must_sign Definition von implies: In unserem Fall immer nicht-strikt! a implies b = (not a) or else b Chair of Software Engineering Aussagenlogik: Eigenschaft p gilt für ein einzelnes Objekt. Prädikatenlogik: Eigenschft p gilt für mehrere Objekte. 29 Intro – Lecture 3 Eiffel Keywords und mathematische Symbole Eiffel Keyword Übliches mathematisches Symbol not ~ oder ¬ or ∨ and ∧ = ⇔ implies ⇒ Chair of Software Engineering Intro – Lecture 3 Aussagen und Prädikatenlogik 26 Benutze Gewöhnliche boolesche Operatoren (and und or), wenn Du garantieren kannst, dass beide Operanden definiert sind. and then, wenn eine Bedingung nur Sinn macht, wenn eine andere True ist. or else, wenn eine Bedingung nur Sinn macht, wenn eine andere False ist. Nicht-strikte Operatoren erlauben, eine Ordnung der Ausdrucksevaluation zu definieren (von links nach rechts). >Wichtig fürs Programmieren, wenn undefinierte Objekte Programmabstürze verursachen können. Chair of Software Engineering Gewöhnliche vs. nicht-strikte boolesche Operatoren 28 Intro – Lecture 3 Generalisierung von or 30 G: Gruppe von Objekten, p: Eigenschaft or: Erfüllt midestens eines der Objekte in G p? Kann man bei mindestens einer Station der Line 8 umsteigen? Station_Balard.is_exchange or Station_Lourmel.is_exchange or Station_Boucicaut.is_exchange or … (alle Stationen der Line 8) Existenz-Quantor: exists, oder ∃ ∃ s: Stations8 | s.is_exchange “Es exisitiert ein s in Stations8 so dass, s.is_exchange true ist” Chair of Software Engineering Intro – Lecture 3 Chair of Software Engineering Intro – Lecture 3 5 Generalisierung von and 31 and: Erfüllt jedes Objekt in G p? Kann man bei allen Stationen von Tram 8 unsteigen? Station_Balard.is_exchange and Station_Lourmel.is_exchange and Station_Boucicaut.is_exchange and … (alle Stationen der Line 8) Beweisen True: Finde ein Element aus SOME_SET, das die Eigenschaft erfüllt. False: Beweise, dass kein Element aus SOME_SET die Eigenschaft erfüllt (überprüfe alle Elemente). Chair of Software Engineering Intro – Lecture 3 Universell quantifizierte Ausdrücke 32 boolesche Ausdrücke: ∃ s: SOME_SET | s.some_property True genau dann, wenn mindestens eines der Elemente von SOME_SET some_property erfüllt. All-Quantor: for_all, oder ∀ ∀ s: Stations8 | s.is_exchange “Für alle s in Stations8 ist s.is_exchange true” Chair of Software Engineering Existenz qualifizierte Ausdrücke 33 Intro – Lecture 3 Dualität 34 Generalisierung von DeMorgan’s Gesetzen: boolesche Ausdrücke: ∀ s: SOME_SET | s.some_property True genau dann, wenn jedes Element der Menge SOME_SET die Eigenschaft some_property erfüllt, not (∃ s: SOME_SET | P) = ∀ s: SOME_SET | not P > Was ist mit leeren Mengen? not (∀ s: SOME_SET | P) = ∃ s: SOME_SET | not P not (∃ s: SOME_SET | not s.some_property) Beweisen True: Beweise, dass jedes Element von SOME_SET die Eigenschaft erfüllt (überprüfe alle Elemente). False: Finde ein Element von SOME_SET, das die Eigenschaft nicht erfüllt. Chair of Software Engineering Chair of Software Engineering Intro – Lecture 3 Leere Mengen Intro – Lecture 3 35 36 ∃ s: SOME_SET | some_property mit SOME_SET leer > immer False ∀ s: SOME_SET | some_property mit SOME_SET leer > immer True Chair of Software Engineering Intro – Lecture 3 Ende Vorlesung 3 Chair of Software Engineering Intro – Lecture 3 6