Eine Einführung in Prolog

Größe: px
Ab Seite anzeigen:

Download "Eine Einführung in Prolog"

Transkript

1 Eine Einführung in Prolog Emanuel Kitzelmann Professur für Angewandte Informatik / Kognitive Systems Fakultät für Wirtschaftsinformatik und Angewandte Informatik Otto-Friedrich-Universität Bamberg D Bamberg 10. vember 2004 [email protected],

2 Inhaltsverzeichnis 1 Vorwort 3 2 Grundlagen Prolog und Horn-Klauseln Horn-Klauseln Fakten, Regeln, Anfragen Prolog-Syntax Beispiel Kalküle Sinnfreies :-) Beweisen Weitergehende Konzepte Rekursive Regeln Listen Wichtige Prädikate auf Listen Beispielanfragen Implementationen für last und append Listen sortieren Arithmetik Der Cut Negation bagof, setof, findall

3 1 Vorwort Diese Einführung entsteht im Rahmen der Vorlesung Kognitive Agenten I: Intelligente Agenten. Intention ist es, die Übung, in der Prolog eingeführt wird, zu unterstützen. Zum jetzigen Zeitpunkt ist diese Einführung im Entstehen und wird kontinuierlich erweitert werden. 3

4 # 2 Grundlagen 2.1 Prolog und Horn-Klauseln Prolog-Programme bestehen im Wesentlichen aus einer bestimmten Form prädikatenlogischer Formeln, sogennanten Horn-Klauseln, und werden Datenbasen genannt. Die Benutzung einer Datenbasis erfolgt über Anfragen, die wiederum Formeln sind und von Prolog gegeben der Datenbasis zu beweisen versucht werden. Anfragen können (implizit existenzquantifizierte) Variable enthalten. Falls eine solche Anfrage von Prolog bewiesen werden kann, liefert Prolog die gültigen Belegungen als Ergebnis Horn-Klauseln Ein Prädikat ist eine Formel, die mittels eines Relationssymbols gebildet ist, beispielsweise oder in Präfix-Schreibweise. Anderes Beispiel: vater darth_vader luke. Ein Literal ist ein Prädikat (positives Literal) oder ein negiertes Prädikat (negatives Literal). Beispiele:, vater darth_vader luke (positive Literale),, vater darth_vader luke (negative Literale). Eine Disjunktion von Formeln ist eine Formel, in der diese (Teil-)Formeln mittels des Disjunktors verbunden sind: Eine Horn-Klausel ist eine Disjunktion von Literalen, wobei maximal eines der Literale positiv ist: (2.1) Eine Horn-Klausel heißt definit, wenn sie (genau) ein positives Literal besitzt. Gerechtfertigt durch die Äquivalenzen! " ## # (2.2) $&% " '(% (2.3) * % gelten, läßt sich die obige Horn-Klausel auch schrei- )+ # (2.4) die für beliebige Formeln ) ben als 4

5 # # # Fakten, Regeln, Anfragen Prolog differenziert begrifflich zwischen zwei Arten definiter Horn-Klauseln: Fakten sind definite Horn-Klauseln, die aus genau einem positiven Literal, also aus genau einem Prädikat bestehen: (2.5) Regeln sind definite Horn-Klauseln, die auch aus negativen Literalen bestehen, die also eine Disjunktion aus einem positiven und mindestens einem negativen Literal sind. Wie oben gezeigt, läßt sich eine solche Regel auch darstellen als Implikation von einer Konjunktion positiver Literale zu einem einzelnen positiven Literal: wird Kopf der Regel, aus einem Kopf. # + # (2.6) Körper der Regel genannt. Ein Fakt besteht einfach nur Ein Prolog-Programm ist eine Menge von Fakten und Regeln und wird auch Datenbasis genannt. In den Fakten und Regeln können natürlich Variable vorkommen. Diese sind implizit allquanitifiziert, d.h. falls in Fakten oder Regeln beispielsweise die Variable vorkommen, sind diese sinngemäß zu lesen als: Für alle gilt, dass.... An ein Prolog-Programm eine Datenbasis kann man Anfragen stellen. Eine Anfrage ist eine Konjunktion positiver Literale: # # (2.7) Die Variable in einer Anfrage sind implizit existenzquantifiziert. Eine Anfrage, falls in ihr beispielsweise die Variable vorkommen, ist zu lesen als: Existieren ein und ein, so dass...?. Prolog versucht nun, die Anfrageformel aus den Formeln der Datenbasis zu beweisen. Im Falle einer Anfrage mit Variablen muss Prolog dazu mindestens eine Belegung der Variable finden, so dass die mit dieser Belegung instanziierte Anfragekonjunktion bewiesen werde kann. Eine Belegung ist eine Funktion, die Variablen Terme (z.b. Konstante) zuweist und die Instanziierung einer Formel (ohne Quantoren) mit einer Belegung ist eine neue Formel, die aus der alten hervorgeht, indem in ihr alle Variable gemäß ihrer Belegung ersetzt sind. Für das Ergebnis einer Anfrage sind drei Fälle zu unterscheiden: 1. Die Anfrageformel ist beweisbar und enthält Variable: Dann ist das Ergebnis die gefunde Belegung bzw. beliebig viele der möglichen Belegungen. 2. Die Anfrageformel ist beweisbar, enthält aber keine Variable: Dann ist das Ergebnis schlicht yes. 3. Die Anfrageformel ist nicht beweisbar: Dann ist das Ergebnis. Beispiele folgen weiter unten. 5

6 2.1.3 Prolog-Syntax Für die Junktoren hat Prolog eine spezielle Syntax: Der Konjunktor, in der Regel mit dem Symbol # repräsentiert, wird in Prolog durch ein Komma, ausgedrückt, der Disjunktor durch ein Semikolon ; und der (umgekehrte) Subjunktor + durch einen Doppelpunkt gefolgt von einem Minuszeichen :-. Ein Fakt bzw. eine Regel kann auf mehrere Zeilen verteilt werden. Fakten und Regeln müssen jeweils mit einem Punkt abgeschlossen werden. Der Fakt in Formel (2.5) würde in Prolog also folgendermaßen geschrieben: p. Die Regel aus Formel 2.6 folgendermaßen: p_1 :- p_2,..., p_n. An der Groß- bzw. Kleinschreibung unterscheidet Prolog Variable von allen anderen Symbolen. Variable werden groß geschrieben, Relationssymbole (mit denen Prädikate gebildet werden), Operationssymbole (mit denen Terme gebildet werden) und Konstante (nullstellige Operationssymbole, die Individuen bezeichnen) werden klein geschrieben. Kommentare können in den Programmcode durch ein Prozentzeichen eingefügt werden. Alles, was in einer Zeile auf ein % folgt, wird vom Prolog-Interpreter ignoriert Beispiel Beispielprogramm % Etwas Starwars-Verwandschaft % Fakten vater(darth_vader, luke). vater(darth_vader, leia). mutter(shmi, darth_vader). mutter(leia, jacen). mutter(leia, jaina). % Regeln elternt(x,y) :- vater(x,y). elternt(x,y) :- mutter(x,y). 6

7 Dieses Programm besteht aus einigen Fakten zu einem wichtigen Teil der Starwars-Verwandschaft und zwei Regeln, die definieren, wann jemand ein Elternteil von jemand anderem ist. vater, mutter und elternt sind Relationssymbole, darth_vader, luke, leia, jacen und jaina sind Konstante, bezeichnen also Individuen, und X und Y sind Variable. Variable und Konstante sind elementare (einfache) Terme. vater(darth_vader, luke) oder elternt(x,y) sind Beispiele für Prädikate, also bestimmte prädikatenlogische Formeln, nämlich die, die mittels eines Relationssymbols und Termen als Parameter gebildet sind. Was mit vater(darth_vader, luke) gemeint ist, dürfte klar sein natürlich das Faktum, dass Darth Vader der Vater von Luke ist. (Prolog weiß natürlich von dieser Bedeutung nichts.) Die beiden (implizit allquantifizierten) Regeln lassen sich folgendermaßen interpretieren: Für alle X,Y gilt, dass X ein Elternteil von Y ist, wenn X Vater von Y ist und Für alle X,Y gilt, dass X ein Elternteil von Y ist, wenn X Mutter von Y ist. Eine einfache Anfrage Eine Anfrage sieht nun beispielsweise folgendermaßen aus: elternt(darth_vader, leia). Auch eine Anfrage endet mit einem Punkt und wird nach einem RETURN vom Prolog-Interpreter bearbeitet. Das ist nicht Teil der Anfrage, sondern das Symbol des Promts des Interpreters. Die Bedeutung der Formel in ihrer Rolle als Anfrage ist: Ist Darth Vader ein Elternteil von Leia? Um die Anfrage zu beantworten, versucht Prolog nun, die Formel, also die Aussage Darth Vader ist ein Elternteil von Leia, zu beweisen. Die Antwort von Prolog lautet: Yes Prolog hat unsere Beispielanfrageformel unter Voraussetzung der Datenbasis bewiesen bzw. die Anfrageformel aus der Datenbasis gefolgert. Das Ergebnis unsere spezielle Bedeutung der Formeln (von denen Prolog allerdings nichts weiß) vorausgesetzt, nämlich dass Darth Vader ein Elternteil von Leia ist, ist ja auch richtig. Obwohl Prolog von dem, was uns als Programmierer die Formeln bedeuten, überhaupt nichts weiß, ist es Prolog möglich, auf Fragen von uns, die für uns wiederum eine Bedeutung haben, von denen Prolog nichts weiß, Antworten zu finden, die, von uns mittels unserer Bedeutung interpretiert, stimmen. chmal an diesem Beispiel verdeutlicht: Prolog weiß weder, was uns als Programmierer die Formeln der Datenbasis bedeuten, noch was uns die Anfrageformel elternt(darth_vader, leia) bedeutet. Trotzdem kommt Prolog zu dem Ergebnis yes, das für uns bedeutet, dass Darth Vader ein Elternteil von Leia ist. Und diese Antwort stimmt (obwohl dieser Fakt nicht explizit in der Datenbasis kodiert ist). Die kurze Erklärung der Frage, wie das zuverlässig funktionieren kann, steht in Abschnitt

8 Jetzt aber nochmal an Hand unserer Bedeutung der Formeln erläutert, warum es plausibel ist, aus den Formeln der Datenbasis zu folgern, dass Darth Vader ein Elternteil von Leia ist: In der Datenbasis besagt die erste Regel ja, daß für alle Individuen gilt, dass Individuum Elternteil von Individuum ist, wenn Individuum Vater von Individuum ist. Insbesondere gilt also, dass Darth Vader Elternteil von Leia ist, wenn er ihr Vater ist. Dass er ihr Vater ist, besagt aber gerade der zweite Fakt der Datenbasis. Die Folgerung ist also plausibel. Prologs Bearbeitung der Anfrage Wie bewerkstelligt Prolog diese Folgerung? Im Allgemeinen wählt Prolog sich als erstes das erste Prädikat der Anfragekonjunktion aus. In unserem Fall besteht die Anfrage nur aus dem einzigen Prädikat elternt(darth_vader, leia), also wird es ausgewählt. Nun sucht Prolog sich die erste/oberste Horn-Klausel in der Datenbasis, deren Kopf mit dieser Anfrage unifizierbar ist. Zwei Horn-Klauseln sind unifizierbar, wenn eine Belegung ihrer jeweiligen Variablen existiert, so dass die Formel, die aus der einen Formel durch die Instanziierung ihrer Variable mit ihrer Belegung hervorgeht, dieselbe ist, wie diejenige Formel, die durch Instanziierung der Variable der anderen Formel mit ihrer Belegung hervorgeht. Im Falle einer Anfragebearbeitung von Prolog werden offensichtlich Prädikate nämlich Anfrageprädikate mit den Köpfen (die ja Prädikate sind) von Datenbasis-Formeln unifiziert. Die erste Horn-Klausel, deren Kopf mit dem Anfrageprädikat unifizierbar ist, ist elternt(x,y) :- vater(x,y). Der Kopf dieser Regel ist elternt(x,y). Das Anfrageprädikat ist elternt(darth_vader, leia). Lediglich in dem einen Prädikat kommen Variable vor. Wenn wir nun die Belegung wählen, die auf darth_vader und auf leia abbildet, dann ergibt die Instanziierung von elternt(x,y) mit dieser Belegung die Formel elternt(darth_vader, leia), stimmt also mit dem Anfrageprädikat überein. Also sind die beiden Prädikate unifizierbar. Als Ergebnis dieser Unifikation sind jetzt die Variable gebunden an die Terme, die ihnen die Belegung zuordnet. Diese Bindung wird jetzt auf die ganze Regel übertragen, die mit dieser Bindung instanziiert wird und nun lautet: elternt(darth_vader, leia) :- vater(darth_vader, leia). Ob elternt(darth_vader, leia) beweisbar ist, hängt nun (nur noch) davon ab, ob vater(darth_vader, leia) beweisbar ist. Andersrum: Um elternt(darth_vader, leia) zu beweisen, genügt es, vater(darth_vader, leia) zu beweisen. Das Original-Anfrageprädikat wird also gestrichen und stattdessen ein neues, nämlich vater(darth_vader, leia) zur Anfrage hinzugefügt. Genau das tut Prolog. Es generiert während der Bearbeitung einer Benutzer-Anfrage intern neue Anfragen. Die neue Anfrage vater(darth_vader, leia) wird nun genauso bearbeitet, wie die ursprüngliche: Es wird nach der ersten Horn-Klausel in der Datenbasis gesucht, deren Kopf mit dem ersten Anfrageprädikat unifizierbar ist. Das Ergebnis dieser Suche ist der Fakt vater(darth_vader, leia), der ja, wie es alle Fakten tun, nur aus einem Kopf besteht. Dieser Kopf ist nun schon genau dasselbe Prädikat wie das von Prolog generierte Anfrageprädikat. Es ist also trivialerweise mit diesem Fakt unifizierbar. Da diese gefundene Horn-Klausel ein Fakt ist und von gar keiner weiteren Voraussetzung abhängt, ist das intern generierte Anfrageprädikat vater(darth_vader, leia) bewiesen, einfach dadurch, dass 8

9 es als Fakt in der Datenbasis vorkommt. 1 Da die aktuelle (intern generierte) Anfrage lediglich aus diesem einen Prädikat besteht, ist gleichzeitig die ganze intern generierte Anfrage bewiesen. Damit ist also die Voraussetzung/der Körper der Formel elternt(darth_vader, leia) :- vater(darth_vader, leia) bewiesen und damit, wie oben schon erläutert, auch elternt(darth_vader, leia), die ursprüngliche Anfrage. Prologs Bearbeitung von Anfragen allgemein Um eine Anfragekonjunktion zu beweisen, wählt Prolog das erste Prädikat der Konjunktion aus und durchsucht die Datenbasis von oben nach unten nach einem Fakt oder einer Regel (allgemein nach einer Horn-Klausel), mit dessen/deren Kopf (wobei ein Fakt lediglich aus seinem Kopf besteht) sich das gewählte Anfrageprädikat unifizieren lässt. Durch die Unifikation kommt eine Bindung der Variable des Anfrageprädikats und der Horn-Klausel zustande. Das Anfrageprädikat wird nun aus der Anfragekonjunktion gelöscht und stattdessen der Körper der Horn-Klausel, instanziiert gemäß der Belegung ihrer Variablen, der Anfragekonjunktion anstelle des gelöschten Prädikats hinzugefügt. Falls die Horn-Klausel eine Fakt ist, wird natürlich einfach nur das Anfrageprädikat gelöscht und nichts hinzugefügt, denn ein Fakt besitzt ja keinen Körper. Ziel ist es, eine leere Anfragekonjunktion zu erreichen, da in diesem Fall alle Prädikate bewiesen wurden. Falls es nicht gelingt, ein Prädikat mit einer Horn-Klausel zu unifizieren, macht Prolog die letzte Unifikation rückgängig und sucht eine alternative Horn-Klausel (die nächste passende Horn-Klausel in der Datenbasis) zur Unifikation. Falls sich die Anfrageliste endgültig nicht leeren lässt, weil es keine Suchschritte mehr rückgängig zu machen gibt, antwortet Prolog no, da in diesem Fall die Anfrage nicht bewiesen werden konnte. Man kann sich eine Abarbeitung als Tabelle aufschreiben, wobei man in die erste Zeile links die Anfrageliste und rechts die gewählte Horn-Klausel aus der Datenbasis schreibt. In die zweite Zeile schreibt man die Belegung der Variablen in der Form X/Term, Y/Term_2 usw.. In die dritte Zeile dann wieder links die neue Anfrageliste, rechts die gewählte Horn-Klausel usw.. Um in der letzten Zeile bei erfolgreicher Abarbeitung die leere Anfrageliste zu markieren, benutzen wir das Symbol. Um im Falle des Backtracks den Rücksprungpunkt anzugeben, wird jede zweite Zeile numeriert. Falls keine Horn-Klausel zur Unifikation gefunden werden kann, notieren wir das durch das Symbol. Die Antworten von Prolog sind fett geschrieben. Die Tabelle für die Beispielanfrage von oben sähe dann folgendermaßen aus: 1. elternt(darth_vader, leia) elternt(x,y) :- vater(x,y) X/darth_vader, Y/leia 2. vater(darth_vader, leia) vater(darth_vader, leia) keine Bindung, da keine Variable 3. Yes 1 Es gilt ganz grundsätzlich und trivialerweise, daß eine Formel aus einer Menge von Formeln gefolgert werden kann, wenn sie selbst schon in dieser Menge enthalten ist. 9

10 Eine nicht-beweisbare Anfrage Als nächstes stellen wir die Anfrage elternt(luke, jacen). die Prolog korrekterweise mit beantwortet. Warum? Die erste Horn-Klausel, mit deren Kopf das Anfrageprädikat unifizierbar ist, ist elternt(x,y) :- vater(x,y) mit der Bindung ' luke ' jacen. Es bleibt also vater(luce, jacen) zu beweisen. Prolog sucht also wieder eine Formel, mit deren Kopf dieses intern generierte Anfrageprädikat unifizierbar ist. Eine solche Formel existiert aber nicht in der Datenbasis. Das intern generierte Anfrageprädikat lässt sich endgültig nicht beweisen, weshalb Prolog nun einen Backtrack durchführt und eine andere Regel zur Unifikation mit der ursprünglichen Anfrage sucht. Es findet elternt(x,y) :- mutter(x,y) mit der Bindung ' luke ' jacen, womit die intern generierte Anfrage mutter(luce, jacen) zu beweisen bleibt. Auch für diese Anfrage existiert keine unifizierbare Formel in der Datenbasis, weshalb Prolog wieder einen Backtrack zur ursprünglichen Anfrage durchführt. Eine weitere Formel, mit der die ursprüngliche Anfrage elternt(luke, jacen) zu unifizieren wäre, existiert allerdings nicht, womit diese Anfrage endgültig unbewiesen bleibt und Prolog antwortet. 1. elternt(luke, jacen) elternt(x,y) :- vater(x,y) X/luke, Y/jacen 2. vater(luke, jacen) Backtrack zu elternt(luke, jacen) elternt(x,y) :- mutter(x,y) X/luke, Y/jacen 1.2. mutter(luce, jacen) Backtrack zu elternt(luke, jacen) kein Backtrack mehr möglich: 10

11 Ein einfache Anfrage mit Variablen Ein interessanteres Ein-/Ausgabeverhalten erreicht man, wenn man in Anfragen Variable verwendet. Zum Beispiel: elternt(darth_vader, Kind). Durch die Großschreibung von Kind erkennt Prolog, daß dies eine Variable ist und keine Konstante. Die Anfrage lautet sinngemäß also: Existiert ein Kind, für dass gilt: Darth Vader ist ein Elternteil von Kind? Als Ergebnis liefert Prolog nun: Kind = luke Mit dieser Antwort ist erstens die Anfrage bewiesen, zweitens aber auch zusätzlich eine mögliche Belegung der Variable angegeben, die die Anfrage beweisbar macht. Nun haben wir als Benutzer zwei Möglichkeiten: Entweder wir beenden die Anfragebearbeitung mittels RETURN. Oder wir veranlassen Prolog mittels Eingabe von ;, nach weiteren möglichen Belegungen für zu suchen. In diesem Fall führt Prolog ebenfalls ein Backtrack aus und macht die letzte Unifikation rückgängig: Kind = luke ; Kind = leia ; Als weitere Belegung liefert Prolog Kind = leia, woraufhin wir nochmals ; eingeben und nun als Antwort und den Prompt bekommen, da es keine weitere Belegung von gibt, die die Anfrageformel beweisbar macht. Diese Funktionalität von Prolog legt eine alternative Lesart von Anfragen mit Variablen nahe: Nicht mehr Existieren ), so dass..., sondern Liste mir (alle möglichen) Belegungen von auf, für die gilt, dass.... Die Abarbeitung von Prolog läuft in diesem Beispiel-Fall folgendermaßen ab: 11

12 1. elternt(darth_vader, Kind) elternt(x,y) :- vater(x,y) X/darth_vader, Kind/Y 2. vater(darth_vader, Y) vater(darth_vader, luke) Y/luke 3. Kind = luke (durch ; Backtrack zu 2.) 2.1. vater(darth_vader, Y) vater(darth_vader, leia) Y/leia 2.2. Kind = leia (durch ; Backtrack zu 2.) 2.1. vater(darth_vader, Y) Backtrack zu elternt(darth_vader, Kind) elternt(x,y) :- mutter(x,y) X/darth_vader, Kind/Y 1.2. mutter(darth_vader, Y) kein Backtrack mehr möglich: Wie kommt nun z.b. die Antwort Kind = luke zustande, wenn die letzte Unifikation, die zu dieser Antwort führt, Y/luke war (siehe Zeile 2.)? Was der Benutzer natürlich als Antwort erwartet, ist die Belegung der Variablen in seiner Anfrage. Diese werden auf dem Beweisweg alle gebunden (durch Unifikation). Falls die Anfrageliste zu einem Zeitpunkt leer ist, die Anfrage also bewiesen ist, sind alle Variable aller (auch intern) generierten Anfragen auf diesem Beweisweg gebunden. Anhand dieser Bindungen berechnet Prolog dann die Belegung der Variablen in der Benutzeranfrage transitiv zurück. Im Beispiel gelten die Bindungen Y/luke (Zeile 2.) und Kind/Y (Zeile 1.) und damit Kind/luke. Prolog und Tiefensuche In der letzten Beispielbearbeitung einer Anfrage ist bereits deutlich geworden, auf welche Art und Weise Prolog nach Lösungen sucht, nämlich mittels Tiefensuche. Nähere Ausführung folgt Kalküle Sinnfreies :-) Beweisen Warum kann Prolog Formeln beweisen, deren Bedeutung es gar nicht kennt? Kalküle, Korrektheit, Vollständigkeit kurz erläutern. 12

13 3 Weitergehende Konzepte Zwei wichtige Konzepte sind bisher unerwähnt geblieben: Rekursive Regeln, also solche, deren Körper Prädikate enthält, die mit demselben Relationssymbol gebildet sind, wie der Kopf der Regel. Und Listen als spezielle Terme und Datenstruktur und ihre Verarbeitung mittels Prolog. 3.1 Rekursive Regeln Erweitern wir unser Beispielprogramm um zwei Regeln für eine neue Relation. vorfahr(x,y) :- elternt(x,y). vorfahr(x,z) :- elternt(x,y), vorfahr(y,z). Die erste Regel ist klar: Jemand ist Vorfahr von jemand anderem, wenn er Elternteil von ihm ist. Die zweite Regel besagt, dass jemand ( ) Vorfahr von jemand anderem ( ) ist, wenn er ( ) Elternteil von jemand drittem ( ) ist, der Vorfahr von ist. Eine Beispielanfrage und Prologs Antwort: vorfahr(shmi, jacen). Yes Warum ist Shmi Vorfahr von Jacen? Shmi ist Elternteil von Darth Vader, Darth Vader ist Elternteil von Leia und Leia ist Elternteil von Jacen. Da Leia Elternteil von Jacen ist, ist sie auch ein Vorfahr von ihm (das besagt die erste Regel). Da Darth Vader Elternteil von Leia ist und sie wiederum Vorfahr von Jacen, ist auch er Vorfahr von Jacen (laut zweiter Regel). Da Shmi Elternteil von Darth Vader ist und dieser Vorfahr von Jacen, ist auch Shmi Vorfahr von Jacen (wieder laut zweiter Regel). Fertig. Überlegt Euch selbst, wie Prolog diese Abfrage abarbeitet. Die Regel vorfahr(x,z) :- elternt(x,y), vorfahr(y,z) zeichnet sich nun dadurch von den bisherigen Regeln aus, dass in ihrem Körper ein Prädikat vorkommt, das mit demselben Relationssymbol gebildet ist wie der Kopf der Regel. Eine solche Regel heißt rekursiv. Rekursive Regeln sind sind essentiell in Prolog, da sie die einzige Möglichkeit darstellen, mit induktiv aufgebauten (also potentiell unendlichen) Datentypen wie Zahlen oder Listen effektiv umzugehen. Schleifen, wie man sie aus imperativen Programmiersprachen kennt, gibt es 13

14 + # in Prolog nicht. Aus der prädikatenlogischen Perspektive haben rekursive Regeln in Prolog allerdings einige merkwürdige Eigenarten, die durch Prologs Beweisverfahren, insbesondere die Tiefensuche, zustandekommen. Die Gefahr, die potentiell besteht, wenn man rekursive Regeln verwendet, ist die, dass die Bearbeitung einer Anfrage nicht terminiert. Dieses Problem ist ein Charakteristikum des Beweisverfahrens und nicht eines von rekursiven Formeln an sich. Aus prädikatenlogischer Sicht ist eine rekursive Formel eine Formel wie jede andere, zwischen rekursiven und nicht rekursiven Formeln wird überhaupt nicht differenziert, weshalb auch der Begriff rekursiv zur Einordnung von prädikatenlogischen Formeln gar nicht existiert. Ein Beispiel: (3.1) Diese Formel drückt die Transitivität von aus und ist eine ganz normale prädikatenlogische Formel, die keiner besonderen Behandlung bedarf. Aus Prolog-Perspektive jedoch ist diese Formel rekursiv und Bedarf deshalb einer besonderen Behandlung. In diesem Falle ist es sogar so, dass diese Formel zweckmäßigerweise als Regel überhaupt nicht notiert würde, da sie eine nicht-terminierende Anfragebearbeitung für bestimmte Fälle geradezu garantiert. Folgende Regeln sind zu beachten, wenn man von rekursiven Regeln Gebrauch macht: 1. Jede Relation, die mittels mindestens einer rekursiven Regel definiert ist, muss auch mittels mindestens einer nicht-rekursiven Regel bzw. eines Fakts definiert sein. 2. Jede rekursive Regel sollte mindestens ein Prädikat im Körper enthalten, das nicht mittels desselben Relationssymbols gebildet ist, wie der Kopf der Regel. 3. Nicht-rekursive Regeln einer Relation sind in der Datenbasis vor/über den rekursiven Regeln der Relation zu notieren. 4. Die Prädikate einer rekursiven Regel, die die Rekursivität dieser Regel nicht verursachen (nicht-rekursive Prädikate), sind im Körper der Regel vor denjenigen Prädikaten zu notieren, die die Rekursivität verursachen (rekursive Prädikate). Bevor wir diese Regeln begründen, schauen wir uns zwei Beispiele an: Die Vorfahr-Relation, die wir der Starwars-Datenbasis hinzugefügt haben, hält diese Regeln ein: Sie ist mittels einer rekursiven Regel und einer nicht-rekursiven Regeln, die über der rekursiven steht, definiert. Ferner enthält die rekursive Regel ein nicht-rekursives Prädikat, elternt(x,y), das im Körper der Regel vor dem rekursiven Prädikat vorfahr(y,z) steht. Hingegen hält die Formel (3.1) diese Regeln nicht ein, da in ihrem Körper kein nicht-rekursives Prädikat vorkommt. Begründungen dieser Regeln folgen später. 3.2 Listen Die einzige Datenstruktur in Prolog sind Terme. Eine wichtige Art von Termen sind Listen. Was eine Liste ist, ist induktiv (also mittels Grundelementen und Konstruktoren) definiert: Die Konstante ist eine Liste (die leere Liste). 14

15 ist eine Liste, falls Nichts sonst ist eine Liste. ein Term und eine Liste sind. Offensichtlich dürfen nach dieser Definition die Elemente einer Liste wieder Listen sein, denn für die Elemente einer Liste ist ja gefordert, dass es Terme sein müssen (ohne weitere Einschränkung), dass es also insbesondere wieder Listen sein dürfen. Für die benutzerfreundlichere Verwendung * von Listen gibt es in Prolog nun bestimmte Schreibweisen: Eine Liste lässt sich äquivalent schreiben als * * bzw. als oder oder auch als. Allgemein gilt. wird Kopf (Head) der Liste, wird Rest (Tail) der Liste genannt. Der Operator wird also innerhalb von eckigen Klammern verwandt, um eine Liste mittels ihres Kopfes und ihrer Restliste zu bezeichnen. Das Komma hingegen, um eine Liste mittels einer Auflistung ihrer einzelnen Elemente zu bezeichnen. Dabei lassen sich diese Mittel beliebig kombinieren Wichtige Prädikate auf Listen Es gibt einige Standardfunktionen (bzw. Prädikate unter Prolog) auf Listen, zu denen gehören: last/2: Das letzte Element einer Liste berechnen. member/2: Vorkommen eines Elements in einer Liste prüfen. append/3: Zwei Listen konkatenieren. reverse/2: Eine Liste umdrehen. Die angegebenen Stelligkeiten bezeichnen die Stelligkeiten der jeweiligen Prolog-Prädikate. Falls man die entsprechende Funktionalität als Funktion realisiert (was in Prolog nicht geht, weil es in Prolog keine Funktionen gibt, was aber z.b. in funktionalen Programmiersprachen die Lösung wäre), wäre die Stelligkeit jeweils um eins reduziert. Die genannten Prädikate sind in Prolog bereits standardmäßig definiert und liefern in folgenden Fällen yes: last, falls das letzte Element der Liste ist, member, falls in der Liste vorkommt, append, falls die Konkatenation der Listen und ist, reverse, falls von hinten gelesen ergibt. 15

16 3.2.2 Beispielanfragen Einige Beispiele für last: last([a,b,c,d], Last). Last = d ; last([a,b,c,d], d). Yes last([a,b,c,d], c). Die erste Anfrage ist zu lesen als: Liste mir alle Belegungen für auf, unter denen gilt, dass das letzte Element der Liste ist. Prolog liefert die korrekte Belegung und antwortet auf die Anforderung weiterer Belegungen. Die nächsten beiden Anfragen testen ein bestimmtes Element daraufhin, ob es das jeweils letzte einer Liste ist. member lässt sich analog verwenden. Einige Beispiele für append: append([a,b], [c,d], Result). Result = [a, b, c, d] ; append(init, [c,d], [a,b,c,d]). Init = [a, b] ; append(init, Rest, [a,b,c,d]). Init = [] Rest = [a, b, c, d] ; Init = [a] Rest = [b, c, d] ; Init = [a, b] Rest = [c, d] ; 16

17 Init = [a, b, c] Rest = [d] ; Init = [a, b, c, d] Rest = [] ; Mittels der ersten Anfrage wird die Konkatenation zweier Listen berechnet. An der zweiten Anfrage sieht man nun bereits, wie flexibel sich Prolog-Prädikate einsetzen lassen: Hier dient das append-prädikat dazu, zu einer Liste und einer weiteren Liste, wobei letztere eine Konkatenation einer unbekannten und der Liste sein soll, diese unbekannte Liste zu berechnen. ch deutlicher wird das mit der dritten Anfrage, mit der alle Kombinationen zweier Listen berechnet werden, die konkateniert eine gegebene Liste als Ergebnis haben. Während Funktionen in funktionalen oder imperativen Programmiersprachen immer festgelegte Input-Parameter und einen festen Wertebereich haben, sind Prädikate unter Prolog in beliebige Richtungen einsetzbar. Jede Funktion (zum Beispiel append) lässt sich auch als Umkehrfunktion bzw. -relation einsetzen bzw. lässt sich noch allgemeiner beliebig instanziieren und berechnet dann passende Werte für die variabel gelassenen Parameter Implementationen für last und append Im folgenden Beispielimplementationen für last append: last([last], Last). last([_ R], Last) :- last(r, Last). append([], List, List). append([f R], List, [F Appended]) :- append(r, List, Appended). Beide Prädikate sind mittels einer rekursiven Regel und einem Fakt für den Rekursionsabbruch implementiert. Der Fakt für last besagt, dass ein Element das letzte Element der Liste, also der Liste, die ausschließlich dieses Element enthält, ist. Die rekursive Regel behandelt nun den Fall, dass die Liste aus einem Kopf und einer Restliste (die als Sonderfall natürlich leer sein kann) besteht. Hier taucht das Symbol _ als ein spezielles Variablensymbol (für den Kopf der Liste) auf. _ steht für eine Variable, die nicht benannt zu sein braucht, da sie nur ein einziges Mal in der Regel vorkommt. In einem solchen Fall sollte man immer dieses spezielle Symbol verwenden. Die Regel besagt nun, dass dann das letzte Element dieser Liste _ ist, wenn das letzte Element der Restliste ist. Die Erläuterung für append sowie Prologs Abarbeitung einer Beispielanfrage folgen. 17

18 3.2.4 Listen sortieren Eine weitere Standardfunktionalität ist das Sortieren von Listen. In SWI-Prolog sind dafür einige Prädikate vordefiniert: sort/2, msort/2, keysort/2 und predsort/3. Jedes dieser Prädikate nimmt eine Liste als ersten Parameter und bindet an die Variable, die mit dem zweiten Parameter übergeben wird, die sortierte Liste. Bei sort werden Duplikate in der Liste entfernt, bei msort nicht. Bei keysort muss die zu sortierende Liste als Elemente Key-Value-Paare enthalten. Solche Key-Value-Paare werden mittels des Operators - gebildet und haben die Form key-value, z.b. 3-luke, wobei 3 dann der Key zum Value luke wäre. keysort sortiert die Liste dann an Hand der Keys. Die Ordnung, die zum Sortieren gebraucht wird, ist eine Ordnung über Termen. (Siehe SWI-Prolog-Manual, später hier mehr). Beispiele: sort([leia, shmi, luke, darth_vader], Sorted). Sorted = [darth_vader, leia, luke, shmi] ; sort([leia, shmi, luke, darth_vader, luke], Sorted). Sorted = [darth_vader, leia, luke, shmi] ; msort([leia, shmi, luke, darth_vader, luke], Sorted). Sorted = [darth_vader, leia, luke, luke, shmi] ; keysort([3-leia, 1-shmi, 67-luke, 4-darth_vader], Sorted). Sorted = [1-shmi, 3-leia, 4-darth_vader, 67-luke] ; sort([[a,c,b], [a,c], [a,b], [a,b,c,d]], Sorted). Sorted = [[a, b], [a, b, c, d], [a, c], [a, c, b]] ; keysort([1-[a,c,b], 3-[a,c], 4-[a,b], 2-[a,b,c,d]], Sorted). Sorted = [1-[a, c, b], 2-[a, b, c, d], 3-[a, c], 4-[a, b]] ; 18

19 3.3 Arithmetik Terme werden in Prolog in der Regel nicht ausgewertet. Wir verdeutlichen dies an Hand eines Beispiels. Gegeben sei folgende kleine Datenbasis, die die Relation einterm/1 definiert: einterm(3+6). einterm(4+9). einterm([a,b,c,d]). 3+6 und 4+9 sind offenbar Terme. Listen sind auch Terme. Die Relation klassifiziert also drei bestimmte Terme als Terme. Dass die Relation von daher nicht viel Sinn macht, weil sie alle anderen Terme nicht als Terme klassifiziert, obwohl der Name nahelegt, dass sie genau alle Terme als Terme klassifiziert, davon sehen wir ab. Nun stellen wir ein paar Anfragen: einterm(3+6). Yes einterm(3+7). einterm(9). einterm(x). X = 3+6 ; X = 4+9 ; X = [a, b, c, d] ; In der ersten Anfrage wollen wir wissen, ob 3+6 ein Term ist und erhalten ein positive Antwort, was naheliegend ist, da es so in der Datenbasis steht. In der zweiten Anfrage wollen wir es für 3+7 wissen und erhalten eine negative Antwort, was ebenfalls naheliegend ist. In der dritten 19

20 Anfrage wollen wir wissen, ob 9 ein Term ist. Wenn es nun so wäre, dass Prolog arithmetische Terme auswerten würde, könnte man annehmen, dass Prolog positiv antworten sollte, da wir ja 3+7 als Term definiert hatten und ergibt. Da Prolog Terme aber in der Regel nicht auswertet, sind 3+7 und 9 verschieden. In der letzten Anfrage lassen wir uns die Relation auflisten und sehen auch hier, dass Prolog die Terme nicht auswertet. Eine Auswertung von Termen erreicht man mit der vordefinierten Relation is/2, die in Infix- Schreibweise benutzt wird: X is 3+7. X = 10 ; 10 is X+Y. ERROR: Arguments are not sufficiently instantiated 10 is X+6. ERROR: Arguments are not sufficiently instantiated Wie man sieht zeichnet sich diese Relation von üblichen Relationen dadurch aus, dass man nicht beliebige Parameter spezifizieren darf und beliebige unspezifiziert lassen kann und dann die unspezifizierten von Prolog belegt bekommt. Sondern die is-relation verlangt, dass auf der rechten Seite ein Term ohne Variable steht. Dieser wird dan ausgewertet und das Ergebnis an die Variable auf der linken Seite gebunden. 3.4 Der Cut Der Cut ist eine Möglichkeit, die Abarbeitung von Anfragen an Prolog zu beeinflussen. Genauer gesagt ist es eine Möglichkeit, das Backtracking an bestimmten Punkten zu verhindern. 3.5 Negation folgt später. 3.6 bagof, setof, findall bagof/3, setof/3 und findall/3 sind vordefinierte Prädikate, die in verschiedenen Varianten die Funktionalität implementieren, zu einem Term eine Liste aller seiner Instanzen, die zu einer gegebenen Konjunktion passen, zu berechnen. Eine Beispielanfrage: 20

21 bagof(leiaskind, mutter(leia, LeiasKind), Kinder). LeiasKind = _G158 Kinder = [jacen, jaina] ; Diese Anfrage hat folgende Bedeutung: Binde an die Variable Kinder die Liste aller Belegungen der Variable LeiasKind, mit denen das Prädikat mutter(leia, LeiasKind) gilt. Prologs Antwort ist Kinder = [jacen, jaina]. Das war auch zu erwarten, denn Prolog würde auf die Anfrage mutter(leia, LeiasKind) ja zunächst LeiasKind = jacen und anschließend, falls wir ein ; eintippen würden, LeiasKind = jaina antworten und wiederum nach einem ;, da es keine weiteren gültigen Belegungen gibt, antworten. jacen und jaina sind die beiden Belegungen für LeiasKind, mit denen mutter(leia, LeiasKind) bewiesen werden kann. Der erste Parameter für bagof ist also der Term, deren konkrete Instanzen in einer Liste, die durch den dritten Parameter benannt wird, passend zu dem Prädikat bzw. der Konjunktion von Prädikaten, das/die im zweiten Parameter benannt wird, aufgelistet werden sollen. Das ergibt natürlich nur Sinn, wenn sich der Term (in unserem Beispiel einfach die Variable LeiasKind) und die Konjunktion (in unserem Beispiel das einzelne Prädikat mutter(leia, LeiasKind)) Variable teilen (in unserem Beispiel die Variable LeiasKind). Passend meint dann, dass die Variable des Terms (im Beispiel LeiasKind ) mit Belegungen instanziiert werden, unter denen die Konjunktion gültig ist. Ein weiteres Beispiel: bagof([darthskind, LeiasKind], (vater(darth_vader, DarthsKind), mutter(leia, LeiasKind)), KinderKombinationen). DarthsKind = _G157 LeiasKind = _G160 KinderKombinationen = [[luke, jacen], [luke, jaina], [leia, jacen], [leia, jaina]] ; Die Anfrage bedeutet: Binde an die Liste KinderKombinationen alle Instanzen des Terms/der Liste [DarthsKind, LeiasKind], so dass für die entsprechenden Belegungen der Variablen die Konjunktion (vater(darth_vader, DarthsKind), mutter(leia, LeiasKind)) gilt. 21

22 In den bisherigen zwei Beispielen kamen alle Variable, die in der Konjunktion vorkamen, auch im Term, dessen Instanzen berechnet werden sollten, vor. Nun ein Beispiel für den Fall, dass diese Bedingung nicht gegeben ist: bagof(kind, elternt(elternt, Kind), Kinder). Kind = _G158 Elternt = darth_vader Kinder = [luke, leia] ; Kind = _G158 Elternt = shmi Kinder = [darth_vader] ; Kind = _G158 Elternt = leia Kinder = [jacen, jaina] ; Die Anfrage lautet sinngemäß: Binde an die Liste Kinder die Liste aller Instanzen von Kind, für die elternt(elternt, Kind) gilt. Die Variable Elternt kommt nun in dem Term (hier die Variable Kind) dessen Instanzen berechnet werden sollen, nicht vor. In diesem Falle berechnet bagof nun eine Liste von Instanzen von Kind für die erste gefundene gültige Belegung von Elternt. Wenn wir dann unsererseits ein ; eingeben, veranlassen wir Prolog nach weiteren gültigen Belegungen für Elternt zu suchen und uns wieder eine, zu dieser Belegung passende, Liste von Belegungen für Kind zu berechnen usw.. setof unterscheidet sich von bagof dadurch, dass Duplikate, sofern sie auftreten würden, aus der berechneten Liste entfernt werden und dass die Liste sortiert ist (zu einer bestimmten Ordnung über Termen). Falls keine passende Instanz des Terms gefunden wird, antwortet Prolog bei bagof und setof mit. findall unterscheidet sich von bagof dadurch, dass, falls in der Konjunktionen Variable vorkommen, die nicht in dem Term, dessen Instanzen berechnet werden sollen, vorkommen, nicht jeweils eine Liste für jede Belegung der nicht im Term vorkommenden Variablen berechnet wird. Es wird in diesem Fall eine einzige Liste berechnet, in der alle passenden Instanzen des Terms aufgelistet sind, für die es (irgend)eine gültige Belegung von der nicht im Term vorkommenden Variablen gibt. Beispiel: 22

23 findall(kind, elternt(elternt, Kind), Kinder). Kind = _G158 Elternt = _G157 Kinder = [luke, leia, darth_vader, jacen, jaina] ; Die Anfrage ist dieselbe wie die vorige, nur mit findall anstelle von bagof. Die Kinder werden nun nicht nach Elternteil separiert aufgelistet, sondern alle gemeinsam in einer einzigen Liste. Falls man diesen Effekt auch mit bagof und setof erreichen will, muss man die Variable, die nicht im Term vorkommt und nach der dennoch nicht separiert werden sol (hier elternt) extra auszeichnen. Das geschieht mittels des Operators ^. Beispiel: bagof(kind, Elternt^elternt(Elternt, Kind), Kinder). Kind = _G158 Elternt = _G157 Kinder = [luke, leia, darth_vader, jacen, jaina] ; chmal dieselbe Anfrage wie die vorletzte, diesmal in der Variation, dass Elternt derart ausgezeichnet ist, dass nicht nach dieser Variablen separiert werden soll. Ein weiterer Unterschied von findall zu bagof und setof ist der, dass Prolog in dem Fall, dass keine Instanz gefunden werden kann, bei findall die leere Liste berechnet und nicht antwortet. 23

Logische und funktionale Programmierung

Logische und funktionale Programmierung Logische und funktionale Programmierung Vorlesung 11: Logikprogramme Babeş-Bolyai Universität, Department für Informatik, Cluj-Napoca [email protected] 19. Dezember 2016 1/55 WIEDERHOLUNG: HORN-KLAUSELN

Mehr

Übungen zu Kognitive Systeme I

Übungen zu Kognitive Systeme I Übungen zu Kognitive Systeme I Stephan Weller ([email protected]) Kognitive Systeme / WIAI / Uni Bamberg 19. Oktober 2005 Inhalt Intro Was ist Prolog? Wie funktioniert Prolog? Rekursion

Mehr

Logisches und funktionales Programmieren

Logisches und funktionales Programmieren Prof. Dr. Christoph Beierle, Dr. Harald Ganzinger, Prof. Dr. Michael Hanus Kurs 01816 Logisches und funktionales Programmieren LESEPROBE Das Werk ist urheberrechtlich geschützt. Die dadurch begründeten

Mehr

Grundlagen der Theoretischen Informatik

Grundlagen der Theoretischen Informatik FH Wedel Prof. Dr. Sebastian Iwanowski GTI22 Folie 1 Grundlagen der Theoretischen Informatik Sebastian Iwanowski FH Wedel Kap. 2: Logik, Teil 2.2: Prädikatenlogik FH Wedel Prof. Dr. Sebastian Iwanowski

Mehr

Formale Grundlagen der Informatik 1 Kapitel 16 Normalformen und Hornformeln

Formale Grundlagen der Informatik 1 Kapitel 16 Normalformen und Hornformeln Formale Grundlagen der Informatik 1 Kapitel 16 Normalformen und Frank Heitmann [email protected] 9. Juni 2015 Frank Heitmann [email protected] 1/36 Ersetzbarkeitstheorem

Mehr

Logikprogrammierung. Berechnung durch Resolution Die Programmiersprache Prolog

Logikprogrammierung. Berechnung durch Resolution Die Programmiersprache Prolog Logikprogrammierung Berechnung durch Resolution Die Programmiersprache Prolog Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.1 Logikprogrammierung Berechnung durch Resolution 213 Resolution

Mehr

Programmiersprache Prolog

Programmiersprache Prolog Theoretische Informatik: Logik, M. Lange, FB16, Uni Kassel: 6.2 Logikprogrammierung Prolog 240 Programmiersprache Prolog Prolog-Programm ist Liste von Fakten (einelementige Hornklausel) und Regeln (mehrelementige

Mehr

Syntax. 1 Jedes A AS AL ist eine (atomare) Formel. 2 Ist F eine Formel, so ist auch F eine Formel. 3 Sind F und G Formeln, so sind auch

Syntax. 1 Jedes A AS AL ist eine (atomare) Formel. 2 Ist F eine Formel, so ist auch F eine Formel. 3 Sind F und G Formeln, so sind auch Formale der Informatik 1 Kapitel 15 Folgerbarkeit, Äquivalenzen und Normalformen Frank Heitmann [email protected] 8. Juni 2015 Syntax Definition (Syntax der Aussagenlogik) Mit AS AL sei

Mehr

Teil 4: Rekursion und Listen

Teil 4: Rekursion und Listen Einführung in das Programmieren Prolog Sommersemester 2006 Teil 4: Rekursion und Listen Version 1.0 Gliederung der LV Teil 1: Ein motivierendes Beispiel Teil 2: Einführung und Grundkonzepte Syntax, Regeln,

Mehr

Resolutionskalkül. wird t als eine Menge K t von Klauseln geschrieben, welche die einzelnen Maxterme repräsentieren:

Resolutionskalkül. wird t als eine Menge K t von Klauseln geschrieben, welche die einzelnen Maxterme repräsentieren: Resolutionskalkül Ein Kalkül ist eine Kollektion von syntaktischen Umformungsregeln, die unter gegebenen Voraussetzungen aus bereits vorhandenen Formeln neue Formeln erzeugen. Der Resolutionskalkül besteht

Mehr

Die Prädikatenlogik erster Stufe: Syntax und Semantik

Die Prädikatenlogik erster Stufe: Syntax und Semantik Die Prädikatenlogik erster Stufe: Syntax und Semantik 1 Mathematische Strukturen und deren Typen Definition 1.1 Eine Struktur A ist ein 4-Tupel A = (A; (R A i i I); (f A j j J); (c A k k K)) wobei I, J,

Mehr

Gliederung. Programmierparadigmen. Einführung in Prolog: Einführung in Prolog: Programmieren in Prolog. Einführung Syntax Regeln Listen Relationen

Gliederung. Programmierparadigmen. Einführung in Prolog: Einführung in Prolog: Programmieren in Prolog. Einführung Syntax Regeln Listen Relationen Gliederung Programmierparadigmen Programmieren in Prolog D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg 1 Sommer 2011, 26. April

Mehr

Prolog Tutorial Norbert E. Fuchs Institut für Informatik Universität Zürich

Prolog Tutorial Norbert E. Fuchs Institut für Informatik Universität Zürich Prolog Tutorial Norbert E. Fuchs Institut für Informatik Universität Zürich Inhalt Vom deklarativen Wissen zum prozeduralen Programm Vom Programm zur Berechnung Elemente eines Prolog-Programms Zugverbindungen

Mehr

Formale Logik. PD Dr. Markus Junker Abteilung für Mathematische Logik Universität Freiburg. Wintersemester 16/17 Sitzung vom 14.

Formale Logik. PD Dr. Markus Junker Abteilung für Mathematische Logik Universität Freiburg. Wintersemester 16/17 Sitzung vom 14. Formale Logik PD Dr. Markus Junker Abteilung für Mathematische Logik Universität Freiburg Wintersemester 16/17 Sitzung vom 14. Dezember 2016 Die formale Sprache der Prädikatenlogik: Zeichen Benutzt werden

Mehr

Formale Grundlagen der Informatik 1 Kapitel 19. Syntax & Semantik

Formale Grundlagen der Informatik 1 Kapitel 19. Syntax & Semantik Formale Grundlagen der Informatik 1 Kapitel 19 & Frank Heitmann [email protected] 23. Juni 2015 Frank Heitmann [email protected] 1/25 Motivation Die ist eine Erweiterung

Mehr

Deklarative Semantik

Deklarative Semantik 7. Deklarative Semantik 7-1 Deklarative Semantik Bisher: Prolog als Programmiersprache. Operationale Semantik : Wie wird ein Programm ausgeführt? Welche Antworten werden berechnet? Jetzt: Prolog als logischer

Mehr

SS2010 BAI2-LBP Gruppe 1 Team 07 Entwurf zu Aufgabe 4. R. C. Ladiges, D. Fast 10. Juni 2010

SS2010 BAI2-LBP Gruppe 1 Team 07 Entwurf zu Aufgabe 4. R. C. Ladiges, D. Fast 10. Juni 2010 SS2010 BAI2-LBP Gruppe 1 Team 07 Entwurf zu Aufgabe 4 R. C. Ladiges, D. Fast 10. Juni 2010 Inhaltsverzeichnis 4 Aufgabe 4 3 4.1 Sich mit dem Programmpaket vertraut machen.................... 3 4.1.1 Aufgabenstellung.................................

Mehr

Logik Vorlesung 4: Horn-Logik und Kompaktheit

Logik Vorlesung 4: Horn-Logik und Kompaktheit Logik Vorlesung 4: Horn-Logik und Kompaktheit Andreas Maletti 14. November 2014 Überblick Inhalt 1 Motivation und mathematische Grundlagen 2 Aussagenlogik Syntax und Semantik Äquivalenz und Normalformen

Mehr

Syntax der Prädikatenlogik: Variablen, Terme. Formeln. Freie und gebundene Variablen, Aussagen. Aufgabe

Syntax der Prädikatenlogik: Variablen, Terme. Formeln. Freie und gebundene Variablen, Aussagen. Aufgabe Syntax der Prädikatenlogik: Variablen, Terme Formeln Eine Variable hat die Form x i mit i = 1, 2, 3.... Ein Prädikatensymbol hat die Form Pi k und ein Funktionssymbol hat die Form fi k mit i = 1, 2, 3...

Mehr

Normalform. 2.1 Äquivalenz und Folgerung. 2.2 Die pränexe Normalform

Normalform. 2.1 Äquivalenz und Folgerung. 2.2 Die pränexe Normalform 2 Normalformen 2.1 Äquivalenz und Folgerung Definition 2.1 Äquivalenz, Folgerung). Seien ϕ, ψ FO[σ]. a) ϕ und ψ heißen äquivalent kurz: ϕ ψ, bzw. ϕ = ψ), wenn für alle zu ϕ und ψ äquivalent passenden σ-interpretationen

Mehr

Formale Grundlagen der Informatik 1 Kapitel 15 Normalformen und Hornformeln

Formale Grundlagen der Informatik 1 Kapitel 15 Normalformen und Hornformeln Formale Grundlagen der Informatik 1 Kapitel 15 Normalformen und Frank Heitmann [email protected] 30. Mai 2016 Frank Heitmann [email protected] 1/42 Zusammenfassung Syntax

Mehr

Zusammenfassung Syntax: Formale Grundlagen der Informatik 1 Kapitel 15 Normalformen und Hornformeln. Zusammenfassung

Zusammenfassung Syntax: Formale Grundlagen der Informatik 1 Kapitel 15 Normalformen und Hornformeln. Zusammenfassung Formale der Informatik 1 Kapitel 15 und Frank Heitmann [email protected] 30. Mai 2016 Zusammenfassung Syntax Zusammenfassung Syntax: Motivation Definition der Syntax: Alphabet, Junktor

Mehr

Einführung in PROLOG. Christian Stocker

Einführung in PROLOG. Christian Stocker Einführung in PROLOG Christian Stocker Inhalt Was ist PROLOG? Der PROLOG- Interpreter Welcher Interpreter? SWI-Prolog Syntax Einführung Fakten, Regeln, Anfragen Operatoren Rekursion Listen Cut Funktionsweise

Mehr

1 Aussagenlogischer Kalkül

1 Aussagenlogischer Kalkül 1 Aussagenlogischer Kalkül Ein Kalkül in der Aussagenlogik soll die Wahrheit oder Algemeingültigkeit von Aussageformen allein auf syntaktischer Ebene zeigen. Die Wahrheit soll durch Umformung von Formeln

Mehr

Reihenfolge von Klauseln

Reihenfolge von Klauseln Reihenfolge von Klauseln Bei der Programmierung in Prolog steht grundsätzlich die Repräsentation logischer Zusammenhänge im Vordergrund. Nichtsdestotrotz ist es unvermeidbar, die Mechanismen der Abarbeitung

Mehr

Logik Vorlesung 7: Grundlagen Prädikatenlogik

Logik Vorlesung 7: Grundlagen Prädikatenlogik Logik Vorlesung 7: Grundlagen Prädikatenlogik Andreas Maletti 5. Dezember 2014 Überblick Inhalt 1 Motivation und mathematische Grundlagen 2 Aussagenlogik Syntax und Semantik Äquivalenz und Normalformen

Mehr

Motivation. Formale Grundlagen der Informatik 1 Kapitel 17. Syntax & Semantik. Motivation - Beispiel. Motivation - Beispiel

Motivation. Formale Grundlagen der Informatik 1 Kapitel 17. Syntax & Semantik. Motivation - Beispiel. Motivation - Beispiel Motivation Formale Grundlagen der Informatik 1 Kapitel 17 & Frank Heitmann [email protected] 6. & 7. Juni 2016 Frank Heitmann [email protected] 1/43 Die ist eine Erweiterung

Mehr

Fragen zum Nachdenken: Wie könnte man das Fehlen eines Attribut-Wertes interpretieren?

Fragen zum Nachdenken: Wie könnte man das Fehlen eines Attribut-Wertes interpretieren? Attribut-Werte-Paare Eine Eigenschaft kann beschrieben werden durch ein Paar [a,w]. Dabei bezeichnet a das Attribut und w den konkreten Wert aus dem Wertebereich W a des Attributs. Die Eigenschaften eines

Mehr

3 Terme und Algebren 3.1 Terme

3 Terme und Algebren 3.1 Terme 3 Terme und Algebren 3.1 Terme Mod - 3.1 In allen formalen Kalkülen benutzt man Formeln als Ausdrucksmittel. Hier betrachten wir nur ihre Struktur - nicht ihre Bedeutung. Wir nennen sie Terme. Terme bestehen

Mehr

Ersetzbarkeitstheorem

Ersetzbarkeitstheorem Ersetzbarkeitstheorem Die Abgeschlossenheit läßt sich auch folgendermaßen formulieren: Ersetzbarkeitstheorem Seien F und G Formeln mit F G. SeienH und H Formeln, so daß H aus H hervorgeht, indem ein Vorkommen

Mehr

Lösungsmenge L I = {x R 3x + 5 = 9} = L II = {x R 3x = 4} = L III = { }

Lösungsmenge L I = {x R 3x + 5 = 9} = L II = {x R 3x = 4} = L III = { } Zur Einleitung: Lineare Gleichungssysteme Wir untersuchen zunächst mit Methoden, die Sie vermutlich aus der Schule kennen, explizit einige kleine lineare Gleichungssysteme. Das Gleichungssystem I wird

Mehr

4.1 Motivation. Theorie der Informatik. Theorie der Informatik. 4.1 Motivation. 4.2 Syntax der Prädikatenlogik. 4.3 Semantik der Prädikatenlogik

4.1 Motivation. Theorie der Informatik. Theorie der Informatik. 4.1 Motivation. 4.2 Syntax der Prädikatenlogik. 4.3 Semantik der Prädikatenlogik Theorie der Informatik 3. März 2014 4. Prädikatenlogik I Theorie der Informatik 4. Prädikatenlogik I 4.1 Motivation Malte Helmert Gabriele Röger 4.2 Syntax der Prädikatenlogik Universität Basel 3. März

Mehr

Rekursive Listenverarbeitung

Rekursive Listenverarbeitung Rekursive Listenverarbeitung Übersicht Rekursion ist die wichtigste Programmiertechnik in Prolog! Rekursive Datenstrukturen Einfache und rekursiv gebildete Strukturen Rekursive Datenstrukturen und rekursive

Mehr

Einführung in die mathematische Logik

Einführung in die mathematische Logik Prof. Dr. H. Brenner Osnabrück SS 2014 Einführung in die mathematische Logik Vorlesung 3 Tautologien In der letzten Vorlesung haben wir erklärt, wie man ausgehend von einer Wahrheitsbelegung λ der Aussagevariablen

Mehr

b liegt zwischen a und c.

b liegt zwischen a und c. 2 DIE ANORDNUNGSAXIOME 5 (2.4) a, b, c R : (a < b 0 < c) ac < bc Monotoniegesetz der Multiplikation Bezeichnungen a > b : b < a (> wird gelesen: größer als ) a b : a < b oder a = b a b : a > b oder a =

Mehr

SS Juni Übungen zur Vorlesung Logik Blatt 8

SS Juni Übungen zur Vorlesung Logik Blatt 8 SS 2011 08. Juni 2011 Übungen zur Vorlesung Logik Blatt 8 Prof. Dr. Klaus Madlener Abgabe bis 23. Juni 2011 10:00 Uhr 1. Aufgabe: [Terme und Formeln, Übung] Betrachten Sie folgende Ausdrücke: a) 3 + 4

Mehr

1 Prädikatenlogik. 1.1 Signaturen und Strukturen

1 Prädikatenlogik. 1.1 Signaturen und Strukturen 1 Prädikatenlogik Die Constraint-logische Programmierung basiert auf der Prädikatenlogik: Constraints sind prädikatenlogische Formeln und logische Sprachen wie prolog machen einen Ausschnitt der Prädikatenlogik

Mehr

Motivation. Formale Grundlagen der Informatik 1 Kapitel 14 Aussagenlogik Syntax & Semantik. Motivation. Motivation

Motivation. Formale Grundlagen der Informatik 1 Kapitel 14 Aussagenlogik Syntax & Semantik. Motivation. Motivation Formale Grundlagen der Informatik 1 Kapitel 14 Aussagenlogik & Frank Heitmann [email protected] Mit der Aussagenlogik lassen sich einfache Verknüpfungen zwischen (atomaren) Gebilden ausdrücken

Mehr

Formale Methoden 2. Gaetano Geck Lehrstuhl I Logik in der Informatik WS 2015/2016

Formale Methoden 2. Gaetano Geck Lehrstuhl I Logik in der Informatik WS 2015/2016 Formale Methoden 2 Gaetano Geck Lehrstuhl I Logik in der Informatik WS 2015/2016 Teil 2: Logik 1 Prädikatenlogik (Einleitung) 2 Aussagenlogik Motivation Grundlagen Eigenschaften Eigenschaften Normalformen

Mehr

Abstrakte Syntax von Prolog (1)

Abstrakte Syntax von Prolog (1) 3. Prolog Syntax 3-1 Abstrakte Syntax von Prolog (1) Abstrakte und konkrete Syntax: Abstrakte Syntax: Nur Datenstrukturen, die der Parser anlegt (z.b. Operatorbaum). Konkrete Syntax: Zeichenketten, die

Mehr

Logik I. Symbole, Terme, Formeln

Logik I. Symbole, Terme, Formeln Logik I Symbole, Terme, Formeln Wie jede geschriebene Sprache basiert die Prädikatenlogik erster Stufe auf einem Alphabet, welches aus den folgenden Symbolen besteht: (a) Variabeln wie zum Beispiel v 0,v

Mehr

Tilman Bauer. 4. September 2007

Tilman Bauer. 4. September 2007 Universität Münster 4. September 2007 und Sätze nlogik von Organisatorisches Meine Koordinaten: Sprechstunden: Di 13:30-14:30 Do 9:00-10:00 [email protected] Zimmer 504, Einsteinstr. 62 (Hochhaus)

Mehr

Aufgabe. Gelten die folgenden Äquivalenzen?. 2/??

Aufgabe. Gelten die folgenden Äquivalenzen?. 2/?? Äquivalenz Zwei Formeln F und G heißen (semantisch) äquivalent, falls für alle Belegungen A, die sowohl für F als auch für G passend sind, gilt A(F ) = A(G). Hierfür schreiben wir F G.. 1/?? Aufgabe Gelten

Mehr

Mathematik für Informatiker I

Mathematik für Informatiker I Mathematik für Informatiker I Mitschrift zur Vorlesung vom 19.10.2004 In diesem Kurs geht es um Mathematik und um Informatik. Es gibt sehr verschiedene Definitionen, aber für mich ist Mathematik die Wissenschaft

Mehr

Einführung in die Theoretische Informatik

Einführung in die Theoretische Informatik Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Sascha Böhme, Lars Noschinski Sommersemester 2011 Lösungsblatt 9 25. Juli 2011 Einführung in die Theoretische Informatik

Mehr

Logik für Informatiker

Logik für Informatiker Vorlesung Logik für Informatiker 9. Prädikatenlogik Syntax und Semantik der Prädikatenlogik Bernhard Beckert Universität Koblenz-Landau Sommersemester 2006 Logik für Informatiker, SS 06 p.1 Syntax der

Mehr

Prolog 3. Kapitel: Rekursion

Prolog 3. Kapitel: Rekursion Zusammenfassung: Kapitel 2 Prolog 3. Kapitel: Rekursion Wir haben gelernt wie komplexe Strukturen durch Matching in Prolog aufgebaut werden können und wie die Beweisführung in Prolog funktioniert. Dozentin:

Mehr

Kapitel 1.5 und 1.6. Ein adäquater Kalkül der Aussagenlogik

Kapitel 1.5 und 1.6. Ein adäquater Kalkül der Aussagenlogik Kapitel 1.5 und 1.6 Ein adäquater Kalkül der Aussagenlogik Teil 1: Kalküle und Beweisbarkeit und die Korrektheit des Shoenfield-Kalküls Mathematische Logik (WS 2010/11) Kapitel 1.5 und 1.6: Kalküle 1 /

Mehr

Prolog 3. Kapitel: Rekursion

Prolog 3. Kapitel: Rekursion Prolog 3. Kapitel: Rekursion Dozentin: Wiebke Petersen Kursgrundlage: Learn Prolog Now (Blackburn, Bos, Striegnitz) Petersen Prolog: Kapitel 3 1 Zusammenfassung: Kapitel 2 Wir haben gelernt wie komplexe

Mehr

Aussagenlogik. Übersicht: 1 Teil 1: Syntax und Semantik. 2 Teil 2: Modellierung und Beweise. Aussagenlogik H. Kleine Büning 1/25

Aussagenlogik. Übersicht: 1 Teil 1: Syntax und Semantik. 2 Teil 2: Modellierung und Beweise. Aussagenlogik H. Kleine Büning 1/25 Aussagenlogik Übersicht: 1 Teil 1: Syntax und Semantik 2 Teil 2: Modellierung und Beweise Aussagenlogik H. Kleine Büning 1/25 Einführendes Beispiel Falls Lisa Peter trifft, dann trifft Lisa auch Gregor.

Mehr

Einführung in die Logik, Übungsklausur 2016/07/11

Einführung in die Logik, Übungsklausur 2016/07/11 Institut für Theoretische Informatik ITI Dr. Jürgen Koslowski Einführung in die Logik, Übungsklausur 2016/07/11 Diese Aufgaben werden in der Extra-Übung am Freitag, 2016-07-15, 13:15, im SN 19.4 besprochen,

Mehr

Abschnitt 11: Korrektheit von imperativen Programmen

Abschnitt 11: Korrektheit von imperativen Programmen Abschnitt 11: Korrektheit von imperativen Programmen 11. Korrektheit von imperativen Programmen 11.1 11.2Testen der Korrektheit in Java Peer Kröger (LMU München) in die Programmierung WS 16/17 931 / 961

Mehr

13 Auswahlaxiom und Zornsches Lemma

13 Auswahlaxiom und Zornsches Lemma 13 Auswahlaxiom und Zornsches Lemma Handout zur Funktionalanalysis I von H. Glöckner, 25.11.2008 Wichtige Teile der modernen Mathematik beruhen auf dem sogenannten Auswahlaxiom der Mengenlehre. Dieses

Mehr

Frage 8.3. Wozu dienen Beweise im Rahmen einer mathematischen (Lehramts-)Ausbildung?

Frage 8.3. Wozu dienen Beweise im Rahmen einer mathematischen (Lehramts-)Ausbildung? 8 Grundsätzliches zu Beweisen Frage 8.3. Wozu dienen Beweise im Rahmen einer mathematischen (Lehramts-)Ausbildung? ˆ Mathematik besteht nicht (nur) aus dem Anwenden auswendig gelernter Schemata. Stattdessen

Mehr

SLD-Ableitungsbäume. G = B 1... B m. G die Menge aller SLD-Resolventen von G und definiten. G einen Nachfolger, der mit G markiert ist.

SLD-Ableitungsbäume. G = B 1... B m. G die Menge aller SLD-Resolventen von G und definiten. G einen Nachfolger, der mit G markiert ist. SLD-Ableitungsbäume Definition 5.48 Sei P ein definites Programm und G ein definites Ziel. Ein SLD-Ableitungsbaum ist ein Baum, der die folgenden Bedingungen erfüllt: 1. Jeder Knoten des Baums ist mit

Mehr

Theoretische Informatik II

Theoretische Informatik II Theoretische Informatik II Dr. Eva Richter / Holger Arnold Universität Potsdam, Theoretische Informatik, Sommersemester 2008 Übungsblatt 3 (Version 4) Abgabetermin: 13.5.2008, 12.00 Uhr Der λ-kalkül Da

Mehr

1 Aussagenlogik. 1.1 Aussagen. 15 ist eine Primzahl. 3 < 8 x < 15 (hängt von x ab, keine Aussage) Aussage = Behauptung Beispiele: Es regnet.

1 Aussagenlogik. 1.1 Aussagen. 15 ist eine Primzahl. 3 < 8 x < 15 (hängt von x ab, keine Aussage) Aussage = Behauptung Beispiele: Es regnet. Grundlagen der Mathematik für Informatiker 1 1 Aussagenlogik 1.1 Aussagen Aussage = Behauptung Beispiele: Es regnet. Die Straße ist naß. 15 ist eine Primzahl. 3 < 8 x < 15 (hängt von x ab, keine Aussage)

Mehr

8 Der Kompaktheitssatz und der Satz von Löwenheim und Skolem

8 Der Kompaktheitssatz und der Satz von Löwenheim und Skolem 8 Der Kompaktheitssatz und der Satz von Löwenheim und Skolem 8.1 Der Kompaktheitssatz Kompaktheitssatz Endlichkeitssatz Der Kompaktheitssatz ist auch unter dem Namen Endlichkeitssatz bekannt. Unter Verwendung

Mehr

Lösungsmenge L I = {x R 3x + 5 = 9} = L II = {x R 3x = 4} = L III = { }

Lösungsmenge L I = {x R 3x + 5 = 9} = L II = {x R 3x = 4} = L III = { } Zur Einleitung: Lineare Gleichungssysteme Wir untersuchen zunächst mit Methoden, die Sie vermutlich aus der Schule kennen, explizit einige kleine lineare Gleichungssysteme. Das Gleichungssystem I wird

Mehr

Logic in a Nutshell. Christian Liguda

Logic in a Nutshell. Christian Liguda Logic in a Nutshell Christian Liguda Quelle: Kastens, Uwe und Büning, Hans K., Modellierung: Grundlagen und formale Methoden, 2009, Carl Hanser Verlag Übersicht Logik - Allgemein Aussagenlogik Modellierung

Mehr

Logische Programmierung

Logische Programmierung Logische Programmierung B-82 Deklaratives Programmieren in Prädikatenlogik: Problem beschreiben statt Algorithmus implementieren (idealisiert). Grundlagen: Relationen bzw. Prädikate (statt Funktionen);

Mehr

Jeder Aussage p kann ein Wahrheitswert W(p) {0, 1} zugeordnet werden. Beispiele: W(Es regnet.) =? (je nach Lage der Dinge) W(Die Straße ist naß.) =?

Jeder Aussage p kann ein Wahrheitswert W(p) {0, 1} zugeordnet werden. Beispiele: W(Es regnet.) =? (je nach Lage der Dinge) W(Die Straße ist naß.) =? Grundlagen der Mathematik für Informatiker 1 Grundlagen der Mathematik für Informatiker 2 1 Aussagenlogik 1.1 Aussagen Aussage = Behauptung Beispiele: Es regnet. Die Straße ist naß. 15 ist eine Primzahl.

Mehr

Das Pumping Lemma der regulären Sprachen

Das Pumping Lemma der regulären Sprachen Das Pumping Lemma der regulären Sprachen Frank Heitmann [email protected] 1 Das Pumping Lemma Das Pumping Lemma der regulären Sprachen macht eine Aussage der Art wenn eine Sprache L regulär

Mehr

Logik Vorlesung 5: Grundlagen Resolution

Logik Vorlesung 5: Grundlagen Resolution Logik Vorlesung 5: Grundlagen Resolution Andreas Maletti 21. November 2014 Überblick Inhalt 1 Motivation und mathematische Grundlagen 2 Aussagenlogik Syntax und Semantik Äquivalenz und Normalformen Weitere

Mehr

1 K-Rahmen und K-Modelle

1 K-Rahmen und K-Modelle Seminar: Einführung in die Modallogik (WS 15/16) Lehrender: Daniel Milne-Plückebaum, M.A. E-Mail: [email protected] Handout: K-Rahmen, K-Modelle & K-Wahrheitsbedingungen Im Folgenden werden wir uns

Mehr

Grundlagen der Kognitiven Informatik

Grundlagen der Kognitiven Informatik Grundlagen der Kognitiven Informatik Resolutionskalkül und Prolog Ute Schmid Kognitive Systeme, Angewandte Informatik, Universität Bamberg letzte Änderung: 14. Dezember 2010 U. Schmid (CogSys) KogInf-Resolution

Mehr

1 Aussagenlogik. 1.1 Aussagen. 15 ist eine Primzahl. 3 < 8 x < 15 (hängt von x ab, keine Aussage) Aussage = Behauptung Beispiele: Es regnet.

1 Aussagenlogik. 1.1 Aussagen. 15 ist eine Primzahl. 3 < 8 x < 15 (hängt von x ab, keine Aussage) Aussage = Behauptung Beispiele: Es regnet. Grundlagen der Mathematik für Informatiker 1 1 Aussagenlogik 1.1 Aussagen Aussage = Behauptung Beispiele: Es regnet. Die Straße ist naß. 15 ist eine Primzahl. 3 < 8 x < 15 (hängt von x ab, keine Aussage)

Mehr

Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen

Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen 16OH21005 gefördert. Die Verantwortung für den Inhalt dieser

Mehr

Eigenschaften der Resolution für PL1 Formeln

Eigenschaften der Resolution für PL1 Formeln Eigenschaften der Resolution für PL1 Formeln Widerlegungsvollständigkeit (ohne Beweis): Sofern man Resolution auf eine widersprüchliche Klauselmenge anwendet, so existiert eine endliche Folge von Resolutionsschritten,

Mehr

Einführung in Prolog. Simon Bischof. IPD Snelting

Einführung in Prolog.   Simon Bischof. IPD Snelting Einführung in Prolog Simon Bischof IPD Snelting KIT Universität des Landes Baden-Württemberg und nationales Großforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Terme id := [a-z][a-za-z0-9]*

Mehr

Aussagenlogik Prädikatenlogik erster Stufe. Logik. Logik

Aussagenlogik Prädikatenlogik erster Stufe. Logik. Logik Grundzeichen Aussagenlogik Aussagenvariablen P, Q, R,... Junktoren nicht und oder Runde Klammern (, ) Formeln Aussagenlogik Formeln sind spezielle Zeichenreihen aus Grundzeichen, und zwar 1 Jede Aussagenvariable

Mehr

Lösung Probeklausur Informatik I

Lösung Probeklausur Informatik I Lösung Probeklausur Informatik I 1 Lösung Aufgabe 1 (5 Punkte) Algorithmen und Programme Was ist der Unterschied zwischen einem Algorithmus und einem Programm? Ein Algorithmus ist eine Vorschrift zur Durchführung

Mehr

Universität Heidelberg 12. April 2018 Institut für Informatik Klaus Ambos-Spies Nadine Losert. 2. Klausur zur Vorlesung Mathematische Logik

Universität Heidelberg 12. April 2018 Institut für Informatik Klaus Ambos-Spies Nadine Losert. 2. Klausur zur Vorlesung Mathematische Logik Universität Heidelberg 12. April 2018 Institut für Informatik Klaus Ambos-Spies Nadine Losert 2. Klausur zur Vorlesung Mathematische Logik Es können maximal 48 Punkte erworben werden. Die Klausur ist bestanden,

Mehr

Einführung in die Theoretische Informatik

Einführung in die Theoretische Informatik Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Dr. Werner Meixner, Dr. Alexander Krauss Sommersemester 2010 Lösungsblatt 11 15. Juli 2010 Einführung in die Theoretische

Mehr

Klausur zur Vorlesung Mathematische Logik

Klausur zur Vorlesung Mathematische Logik Universität Heidelberg 13. Februar 2014 Institut für Informatik Prof. Dr. Klaus Ambos-Spies Dipl.-Math. Thorsten Kräling Klausur zur Vorlesung Mathematische Logik Musterlösung Aufgabe 1 (Aussagenlogik

Mehr

Aussagenlogik. Aussagen und Aussagenverknüpfungen

Aussagenlogik. Aussagen und Aussagenverknüpfungen Aussagenlogik Aussagen und Aussagenverknüpfungen Aussagen sind Sätze, von denen sich sinnvollerweise sagen läßt, sie seien wahr oder falsch. Jede Aussage besitzt also einen von zwei möglichen Wahrheitswerten,

Mehr

Prolog. Modellieren in Prolog. Argumente eines Prädikates. Fakten

Prolog. Modellieren in Prolog. Argumente eines Prädikates. Fakten Prolog Idee (Kowalski 1979) Algorithmus = Logik + Kontrolle Logik: was ist das Problem? Kontrolle: wie lšse ich es geschickt? Sichtweisen: Theorembeweiser (Resolution) Datalog (Datenbankanfragesprache)

Mehr

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle

Modellierungsmethoden der Informatik Kapitel 2: Logikkalküle smethoden der Informatik Kapitel 2: Logikkalküle Prädikatenlogik 1. Stufe Norbert Fuhr Gudrun Fischer 29.11.2005 Organisatorisches Organisatorisches Klausur Termin: 20.2.2006, 13-15 Uhr, Audimax Anmeldung

Mehr

f(1, 1) = 1, f(x, y) = 0 sonst üblicherweise Konjunktion, manchmal auch

f(1, 1) = 1, f(x, y) = 0 sonst üblicherweise Konjunktion, manchmal auch Belegungen, Wahrheitsfunktionen 1. Wie viele binäre Funktionen gibt es auf der Menge {0, 1} (d.h., Funktionen von {0, 1} 2 nach {0, 1})? Geben Sie alle diese Funktionen an, und finden Sie sinnvolle Namen

Mehr

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 -

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 - Programmiersprachen: Klassifizierung und Methoden Programmier-Paradigmen Grundlagen der Programmierung 2 (1.C) - 1 - Programmiersprachen: Begriffe Syntax Beschreibung der Programme als Texte let xyz =

Mehr