Isabelle - A Generic Theorem Proving Environment

Größe: px
Ab Seite anzeigen:

Download "Isabelle - A Generic Theorem Proving Environment"

Transkript

1 Westfälische Wilhelms-Universität Münster Ausarbeitung Isabelle - A Generic Theorem Proving Environment im Rahmen des Seminars Formale Spezifikation Markus Heinrich Themensteller: Prof. Dr. Herbert Kuchen Betreuer: Dipl.-Wirt.Inform. Christoph Lembeck Institut für Wirtschaftsinformatik Praktische Informatik in der Wirtschaft

2 Inhaltsverzeichnis 1 Einleitung Grundlagen des Theorem Proving mit Isabelle/HOL Kurzbeschreibung von Isabelle/HOL Definitionen Das Beweisen von Theoremen mit Isabelle/HOL Beweise im Rahmen funktionaler Programmierung Datentypen Funktionen Beweise von funktionalen Programmen Beweise im Rahmen der Logik Beweise mit Hilfe von Regeln Beweise mit Hilfe des Classical Reasoner Proof-General und Isabelle Praktische Anwendungen Zusammenfassung Literaturverzeichnis II

3 Abbildungsverzeichnis Abb.: 1 Beispiele für α und β Regeln Abb.: 2 Anwendung des Tableauverfahrens Abb.: 3 Screenshot Proof-General Abb.: 4 Arbeiten mit Proof-General III

4 Kapitel 1: Einleitung 1 Einleitung In den letzten Jahrzehnten sind Softwareprogramme und ihre dazugehörige Hardware ein Teil des täglichen Lebens geworden. Sie steuern heute unterschiedlichste Maschinen, von Waschmaschinen über Airbags, bis hin zu Atomkraftwerken. Eine Möglichkeit die Korrektheit dieser Programme zu überprüfen, besteht darin, ausgiebige Tests durchzuführen. Der Nachteil dieser Methode ist, dass sie zwar Fehler finden kann, jedoch keinen Beweis liefert, dass eine Software fehlerfrei ist [Oh00]. In sicherheitskritischen Bereichen empfiehlt es sich daher, die Korrektheit der Programme formal zu beweisen. In der Vergangenheit wurden diese Beweise von Hand geführt. Dies ist jedoch zum einen fehleranfällig, zum anderen mit zunehmender Komplexität der Programme nicht mehr praktikabel [Oh00]. An dieser Stelle setzt das Forschungsgebiet das "automated Theorem Proving" an. Ziel ist es die Beweisführung mit Hilfe von Rechnern und Software zu unterstützen und damit zum einen die Komplexität zu reduzieren und zum anderen die Wahrscheinlichkeit von Fehlern in der Beweisführung zu verringern. Neben der Verifikation von Soft- und Hardware befasst sich das automated Theorem Proving mit der Unterstützung von mathematischen und logischen Beweisen. Das Forschungsgebiet lässt sich in zwei Bereiche unterteilen: "fully-automated Theorem Proving" und "semi-automatic Theorem Proving". Im Gegensatz zum "fully-automated Theorem Proving" findet beim "semi-automatic Theorem Proving" während der Beweisführung, eine mehr oder weniger starke Interaktion zischen Computer und Benutzer statt, in dessen Verlauf der Mensch die Beweisführung lenkt. Im Rahmen dieser Seminararbeit wird der "semi-automatic Theorem Prover" Isabelle/HOL vorgestellt. Hierzu wird zunächst das Programm grob beschrieben und anschließend die zentralen Grundbegriffe definiert. Im Hauptteil wird dargelegt wie man Beweise mit Hilfe von Isabelle durchführen kann. Hierbei erfolgt eine Unterteilung in die Bereiche funktionale Programmierung und Logik. Im Anschluss daran wird Isabelles grafische Benutzeroberfläche Proof-General beschrieben. Abschließend werden einige praktische Anwendungen dargelegt. Im letzten Kapitel werden die Ergebnisse zusammengefasst und ein kurzer Ausblick auf mögliche Entwicklungen gegeben. 1

5 Kapitel 2: Grundlagen des Theorem Proving mit Isabelle/HOL 2 Grundlagen des Theorem Proving mit Isabelle/HOL 2.1 Kurzbeschreibung von Isabelle/HOL Isabelle ist ein generischer, semiautomatischer Theorem Prover, welcher mit einer Reihe verschiedener Logiken instanziiert werden kann. Das hier vorgestellte Isabelle/HOL ist eine besonders weit entwickelt Instanz von Isabelle für Beweise im Rahmen der Higher Order Logic [Me00]. Das Programm Isabelle wurde in der Programmiersprache ML implementiert. Die Abkürzung ML steht für "Meta Language". ML wurde ursprünglich für die Interaktion zwischen Mensch und Maschine beim Durchführen von Beweisen entwickelt. An einigen Stellen wurde die Syntax von Isabelle/HOL daher von ML beeinflusst [NPW04]. Neben der hier vorgestellten Isabelle/HOL-Syntax existiert eine Erweiterung mit dem Namen Isabelle/HOL/ISAR [Ni02]. Sie verfolgt das Ziel die Beweisführung für Menschen lesbarer zu machen und eignet sich besonders für mathematische Beweise [MF03]. Ein Nachteil der ISAR-Syntax ist jedoch, dass der Benutzer eine genaue Vorstellung davon haben muss, welche Fakten in jeder Phase des Beweises als nächstes bewiesen werden müssen [MF03]. Dies erschwert den Einstieg in Isabelle und ist der Grund dafür, dass im Folgenden die Isabelle/HOL-Syntax beschrieben wird. Um die Wirkungsweise von Isabelle zu verdeutlichen, erfolgt bei der Erklärung eine Zweiteilung in die Bereiche funktionale Programmierung und Logik. In jedem umfangreicheren Beweis wird man jedoch weder ausschließlich mit funktionaler Programmierung noch exklusiv mit Logik arbeiten können. Da Isabelle jedoch ein relativ komplexes Werkzeug ist, erscheint die Zweiteilung trotz allem sinnvoll, um den Überblick über das Programm zu erleichtern. Für die Eingabe der Theorien in Isabelle stehen im Wesentlichen zwei verschiedene Möglichkeiten zur Verfügung. Zum einen ist eine Interaktion auf Shell-Ebene möglich, zum anderen steht die grafische Benutzeroberfläche "Proof-General" zur Verfügung. Proof-General wurde von DAVID ASPINALL entwickelt und ist das in der Praxis zur Zeit empfohlene und meist verwendete Software Produkt zum Ausführen von Beweisen mit Isabelle [NPW04]. 2

6 Kapitel 2: Grundlagen des Theorem Proving mit Isabelle/HOL 2.2 Definitionen Bevor die Durchführung von Beweisen mit Hilfe von Isabelle begonnen werden kann, sollen zunächst einige häufig verwendete Begriffe definiert werden. Das Zentrale Konstrukt bei der Verwendung von Isabelle sind die Theorien. Theorien basieren auf bereits bestehenden Theorien und enthalten Deklarationen, Definitionen, Theoreme und Lemmata. Dies lässt sich wie folgt darstellen [NPW04]: Theorie T = T T n : Deklarationen, Definitionen, Theoreme und Lemmata Ende T steht dabei für eine Theorie, die auf den bestehenden Theorien T 1 bis T n aufbaut. Die eigentliche Beweisführung erfolgt innerhalb der Theoreme und Lemmata. Um eine Strukturierung der Beweise zu unterstützen bietet es sich an, den Begriff Theorem übergeordnet zu dem Begriff Lemma zu verwenden. Weitere wichtigere Begriffe sind Typen, Funktionen, und Variablen. Beispiele für Typen sind Basistypen, wie z.b. Wahrheitswerte oder die natürlichen Zahlen. Funktionen sind dadurch definiert, dass sie für jeden gegeben Input genau einen Output liefern. In Isabelle dürfen nur totale Funktionen verwendet werden. Dies bedeutet, dass alle Funktionen für jeden Input terminieren müssen [NPW04]. Variablen werden in Isabelle in drei verschiedene Arten unterschieden: Gebunde, ungebundene und schematische Variablen. Schematische Variablen können vom Programm mit einem beliebigen Wert initialisiert werden. Ein geläufigerer Begriff für diese Arten von Variablen, z.b. aus der Programmiersprache Prolog, ist logische Variable. Terme entstehen durch das Anwenden von Funktionen auf Argumente. Sei f eine Funktion vom Typ τ 1 =>τ 2 und t vom Typ τ 1. So ist f(t) ein Term vom Typ τ 2. Formeln sind eine spezielle Form von Termen. Sie sind vom Typ bool und verwenden die logischen Operatoren. Isabelle besitzt eine eigene Meta-Logik, welche drei verschiedene Symbole unterscheidet. Das Zeichen ==> ist das Meta-Symbol für Implikation [Me00]. Ein == drückt Gleichheit aus, es kann zur Definition von Konstanten verwendet werden [NPW04]. Das dritte Symbol ist der universelle Quantor!! auf Meta-Ebene. In den hier beschriebenen Anwendungen wird er allerdings nur von Isabelle intern verwendet. 3

7 3 Das Beweisen von Theoremen mit Isabelle/HOL 3.1 Beweise im Rahmen funktionaler Programmierung Datentypen Datentypen, und im speziellen induktive Datentypen, sind ein zentraler Bestandteil von funktionaler Programmierung und als solche auch ein zentraler Bestandteil von Isabelle. Die allgemeine Datentypdefinition in Isabelle entspricht dem folgenden Schema [NPW04]: datatype (,..., ) t = C C... 1 n k1 m m1 mkm Wobei die α i für verschiedene Typenvariablen des Datentyps stehen, und t für die Bezeichnung des eigentlichen Datentyps. Die C i sind Namen für Konstruktoren. Die Parameter τ ij beschreiben die Typenvariablen der Konstruktoren. Das klassische Beispiel für induktive Datentypen im Rahmen der funktionalen Programmierung sind Listen. Listen bestehen aus einem Kopf und einem Rest, wobei der Rest wiederum eine Liste ist. In Isabelle wird der Datentyp Liste wie folgt definiert: datatype 'a list = Nil Cons 'a "'a list" Der Konstruktor Nil steht für die leere Liste. Ein weiteres wichtiges Beispiel für induktive Datentypen sind Bäume. Für die Definition von Bäumen benötigt man, in enger Anlehnung an die Listen, zum einen ein Konstruktor für einen leeren Knoten, zum anderen ein Konstruktor für einen existierenden Knoten: datatype 'a baum = Nil Knoten "'a baum" 'a "'a baum" Isabelle bietet für Datentypen die Möglichkeit an, eine alternative Notation einzuführen. Dies führt zu einer erheblichen Vereinfachung bei der Darstellung. So müsste man für die Beschreibung einer einfachen Liste mit dem Inhalt 1 und 2 in herkömmlicher Weise folgende Darstellung wählen: Cons 1(Cons2 Nil). Definiert man den Datentypen jedoch wie folgt: datatype 'a list = Nil Cons 'a "'a list" ( infixr "#" 65) 4

8 lässt sich der oben beschriebene Sachverhalt als 1#2#Nil ausdrücken. Hierbei führt infixr zum einen Infix-Notation ein und legt zum anderen fest, dass das Zeichen # zur rechten Seite bindet. Die Zahl 65 gibt die Priorität des Zeichens an. Abstrakte Datentypen können in Isabelle mit Hilfe von typedecl definiert werden. In seltenen Fällen kann die Anwendung von typedef notwendig sein [NPW04]. Mit diesem Schlüsselwort lassen sich neue Typen aus Untermengen von bereits bestehenden Typen erstellen Funktionen Funktionen sind der zweite wichtige Bestandteil funktionaler Programmierung. Es ist wichtig festzuhalten, dass in Isabelle jede verwendete Funktion explizit deklariert sein muss [NPW04]. Verwendet man bei der Deklaration eine freie Typenvariable, führt Isabelle beim Aufruf der Funktion eine automatische Typeninferenz aus. Um die Lesbarkeit zu erhöhen empfiehlt es sich jedoch, die verwendeten Typen explizit anzugeben. Eine Funktion mal2 welche eine natürliche Zahl verdoppelt könnte demnach auf die folgenden zwei Arten deklariert werden: consts consts mal2 :: "'a => 'a" mal2 :: "nat => nat" Die Definition nicht rekursiver Funktion erfolgt mit Hilfe des Schlüsselwortes defs: defs mal2_def: "mal2 n == 2*n" Wobei mal2_def der Name der Definition ist. Konstanten können mit Hilfe des Schlüsselwortes constdefs definiert werden. Definitionen werden während eines Beweises nicht automatisch expandiert. Dies geschieht manuell mit Hilfe von: apply (unfold < Name der Definition >) Bei rekursiven Funktionen muss sichergestellt werden, dass sie trotz rekursiver Aufrufe terminieren. In Isabelle kann dies auf zwei verschiedene Arten geschehen. Bei der ersten Möglichkeit wird das Schlüsselwort primrec verwendet. Es kann immer dann angewandt werden, wenn eine rekursive Funktion über einen induktiven Datentypen definiert wird, wobei das Argument der Funktion bei jedem rekursiven Aufruf kleiner werden muss. In diesem Fall beweist Isabelle die Terminierung der Funktion automatisch. Allgemein lässt sich dies wie folgt darstellen [NPW04]: 5

9 primrec f (x... (C... )... x ) = r k1 n f (x... (C... )... x ) = r 1 m m1 mkm nm m Wobei f für die Funktion, C i die Konstruktoren des Datentyps, τ ij für die Typenvariablen des Konstruktors und die x s für sonstige Variablen stehen, welche nicht unbedingt vorhanden sein müssen. Um primrec anwenden zu können müssen alle rekursiven Aufrufe in r a die folgende Form aufweisen: f(a 1... aj... a n a ) Eine weitere Restriktion von primrec ist, dass nur eine rekursive Gleichung pro Konstruktor erlaubt ist, wobei die Reihenfolge keine Rolle spielt [NPW04]. Ein einfaches Beispiel für die Verwendung von primrec ist die folgende Funktion, welche eine Liste in umgekehrter Reihenfolge darstellt: consts primrec "umd [] = []" umd :: "'a list => 'a list" "umd(x # xs) = (umd (x # [])" Die zweite Variante verwendet das Schlüsselwort recdef. Im Gegensatz zu primrec ist der Nutzer bei der Verwendung von recdef nicht auf die Rekursion über Datentypen beschränkt. Allerdings muss explizit eine Funktion measure definiert werden, welche bei jedem rekursiven Aufruf kleiner wird. Das Umdrehen einer Liste könnte demnach auch wie folgt definiert werden: consts recdef "umd [] = []" umd :: "'a list => 'a list" umd measure(%liste. length liste) "umd(x # xs) = (umd (x # [])" In der zweiten Zeile wird bei jedem Aufruf explizit die Länge der Liste gemessen. In einfachen Fällen kann Isabelle die Terminierung der Rekursion mit Hilfe der Funktion measure direkt beweisen. Sollte dies nicht gelingen, muss der Benutzer den Beweis selbst führen. Wichtig ist hierbei, dass die Funktion measure nicht das eigentliche Abbruchkriterium darstellt, sondern lediglich dazu verwendet wird, die Terminierung der Funktion zu beweisen. Folglich ist die Funktion measure nicht an einen bestimmten Wertebereich gebunden [NPW04]. 6

10 Auch für Funktionen lassen sich abkürzende Schreibweisen definieren. Eine Funktion anhlist, welche eine Liste an eine andere Liste anhängt, kann wie folgt deklariert werden: consts anhlist :: "'a list => 'a list => 'a list" ( infixr "@" 65) Beweise von funktionalen Programmen Nachdem die wichtigsten Bereiche der funktionalen Programmierung in Isabelle vorgestellt wurden, soll im Folgenden die Beweisführung für funktionale Programme dargestellt werden. Isabelle besitzt eine vordefinierte Theorie Main. In ihr sind eine Reihe von wichtigen Theorien, wie z.b. für arithmetische Berechnungen und Listen zusammengefasst. In den meisten Fällen empfiehlt es sich, die Theorie Main als Basis für Beweise einzubinden. Neben dem Einbinden der benötigten Theorien muss jeder neuen Theorie ein Name gegeben werden. Dieses Beispiel verwendet zur Illustration einen binären Baum und erhält daher den Namen BBaum. In Isabelle Syntax ergibt sich: theory BBaum = Main: Des Weiteren wird der Konstruktor für den Baum benötigt. Wie bereits oben erwähnt, lässt sich ein Binärbaum wie folgt beschreiben: datatype 'a baum = Nil Knoten "'a baum" 'a "'a baum" Es soll im Folgenden bewiesen werden, dass ein zweimal vertikal gespiegelter Baum wieder dem ursprünglichen Baum entspricht. Die Spiegelung eines Baumes lässt sich rekursiv mit Hilfe von primrec definieren. An dieser Stelle soll jedoch zur Illustration nicht primrec sondern recdef verwendet werden. Um recdef anwenden zu können, muss zunächst eine Funktion measure Funktion definiert werden. Diese könnte z.b. wie folgt aussehen: consts anzahlk :: "'a baum => nat" primrec "anzahlk Nil = 1" "anzahlk (Knoten l v r) = anzahlk(knoten l) anzahlk(knoten r)" In der ersten Zeile wurde die Funktion anzahlk zunächst deklariert. Die Funktion bildet einen Baum entsprechend der Anzahl seiner Knoten auf eine natürliche Zahl ab. Die Bestimmung der Anzahl der Knoten in einem Baum kann rekursiv mit Hilfe von primrec erfolgen. 7

11 Nachdem die measure Funktion definiert ist, kann die Funktion für die Spiegelung mit Hilfe von recdef definiert werden: consts spiegeln :: "'a baum => 'a baum" recdef "measure(%a. zaehler(a))" "spiegeln Nil = Nil" "spiegeln (Knoten l v r) = spiegeln(knoten r) + v + spiegeln(knoten l)" Die Deklaration in der ersten Zeile legt fest, dass bei einer Spiegelung eines Baumes wieder ein Baum entsteht. Ein gespiegelter leerer Baum ergibt wieder einen leeren Baum. Das Spiegeln eines nicht leeren Baumes geschieht durch rekursives Vertauschen der Subbäume. Nachdem die benötigten Funktionen definiert sind, kann mit dem eigentlichen Beweis begonnen werden. Dazu muss zunächst das zu beweisende Theorem aufgestellt werden. In Isabelle lässt es sich wie folgt darstellen: theorem spiegel2 : "spiegeln(spiegeln(a)) = a" Isabelle liefert daraufhin das erste zu lösende Subgoal, welches dem Theorem entspricht: goal (theorem (spiegel2), 1 subgoal): 1. spiegeln (spiegeln a) = a In der ersten Zeile kann man ablesen, dass in dem Theorem spiegel2 ein Subgoal zu lösen ist. In der folgenden Zeile ist es nummeriert aufgeführt. An dieser Stelle wird deutlich, dass es sich bei Isabelle um einen semi-automatischen Theorem Prover handelt: Isabelle gibt ausschließlich das zu lösende Subgoal aus. Hinweise darauf welche Methode zur Lösung anzuwenden ist, liefert das Programm nicht. Eigenschaften rekursiv definierter Funktionen lassen sich häufig mit Hilfe von Induktion beweisen [NPW04]. Das Verwenden von Methoden, die auch Tactics genannt werden, erfolgt in Isabelle mit Hilfe des Schlüsselwortes apply. Für den hier vorliegenden Sachverhalt muss Induktion über die Variable a angewandt werden: apply (induct_tac a) Nach Durchführung der Induktion liefert Isabelle eine Reihe von neuen Subgoals, die nun ebenfalls zu beweisen sind. Das Programm gibt folgende Meldung aus: 8

12 goal (theorem (spiegel2), 2 subgoals): 1. spiegeln (spiegeln baum.nil) = baum.nil 2.!!baum1 a baum2. [ spiegeln (spiegeln baum1) = baum1; spiegeln (spiegeln baum2) = baum2 ] ==> spiegeln (spiegeln (Knoten baum1 a baum2)) = Knoten baum1 a baum2 In der ersten Zeile kann man ablesen, dass zwei neue Subgoals zu lösen sind. Das erste zu beweisende Subgoal besagt, dass ein leerer, zweimal gespiegelter Baum wieder einen leeren Baum ergibt. Das zweite Subgoal trifft die folgende Aussage: Wenn für einen Baum baum1 gilt, dass er zweimal gespiegelt wieder den Baum baum1 ergibt und wenn für einen Baum baum2 gilt, dass er zweimal gespiegelt wieder den Baum baum2 ergibt, dann gilt auch für einen Knoten baum1 a baum2, dass er zweimal gespiegelt, wieder den Knoten baum1 a baum2 ergibt. Die erste Zeile des zweiten Subgoals besagt, dass sich die Variablen baum1 a baum2 lokal auf dieses Subgoal beziehen. Erneut liefert Isabelle keinen Hinweis darauf, wie die beiden Subgoals zu lösen sind. In beiden Fällen muss Term Rewriting angewandt werden, welches in Isabelle durch die Methode simp ausgeführt wird. : apply (simp) Das Rewriting erfolgt durch sukzessive Anwendung instanziierter Gleichung, von links nach rechts, auf die entsprechenden Terme. Die verwendeten Gleichungen werden auch als Rewriting Rules bezeichnet. Das Rewriting wird im Folgenden am Beispiel des zweiten Subgoals näher beschrieben. Die Lösung des ersten Subgoals erfolgt analog. Die verwendeten Regeln ergeben sich hierbei aus der Definition der Funktion spiegeln, sowie den beiden Voraussetzungen des zweiten Subgoals: Regel1: Regel2: Regel3: Regel4: spiegeln Nil = Nil (Wird zum lösen des ersten Subgoals verwendet) spiegeln (Node l v r)= Node (spiegeln r) v (spiegeln l) spiegeln (spiegeln baum1) = baum1 spiegeln (spiegeln baum2) = baum2 Das zu beweisende Ziel des Subgoals lautet: spiegeln (spiegeln (Knoten baum1 a baum2)) = Knoten baum1 a baum2 Durch die Anwendung von simp werden die folgenden Schritte ausgeführt: 9

13 Anwenden von Regel2 liefert: spiegeln (Knoten spiegeln(baum2) a spiegeln(baum1)) = Knoten baum1 a baum2 Anwenden von Regel2 liefert: Knoten (spiegeln(spiegeln(baum1)) a spiegeln(spiegeln(baum2)) = Knoten baum1 a baum2 Anwenden von Regel3 liefert: Knoten baum1 a spiegeln(spiegeln(baum2)) = Knoten baum1 a baum2 Anwenden von Regel4 liefert: Knoten baum1 a baum2 = Knoten baum1 a baum2 An dieser Stelle erkennt simp, dass beide Seiten identisch sind. Der Term erhält den Wert True und das Subgoal ist gelöst. Die Methode simp muss für jedes Subgoal einzeln angewandt werden. Eine Alternative stellt die Methode auto dar, welche sich auf alle Subgoals gleichzeitig bezieht. In beiden Fällen liefert Isabelle nach Abschluss der Beweisführung folgende Meldung: goal (theorem (spiegel2)): No subgoals! Der Beweis des Theorems ist damit abgeschlossen und kann mit Hilfe von done beendet werden. Soll die gesamte Theorie geschlossen werden, kann dies mit Hilfe von end geschehen. Es ist möglich die Methode simp um neue Rewriting Regeln zu erweitern. Wird z.b. die Theorie spiegel2 am Anfang wie folgt definiert: theorem spiegel2 [simp] : "spiegeln(spiegeln(a)) = a" so wird nach Abschluss des Beweises und anschließendem Aufruf der Methoden simp oder auto, jedes Auftreten von spiegeln(spiegeln(a)) direkt durch a ersetzt. Durch das Hinzufügen eigener Regeln, kann es allerdings zu Endlosschleifen kommen, so dass ein Aufruf von simp im Worst-Case nicht terminiert [NPW04]. Viele Probleme im Rahmen funktionaler Programmierung lassen sich mit der oben beschriebenen Vorgehensweise lösen. Dies liegt daran, dass funktionale Programme in der Regel auf Rekursion beruhen und sich damit die Anwendung der Methode induct_tac empfiehlt. Eine Handlungseinleitung für die Beweisführung könnte demnach wie folgt aussehen: Anwenden der Methode induct_tac Anschließend Anwenden der Methode auto oder simp. In komplexeren Beweisen müssen diese Methoden in mehreren Iterationen angewendet werden; die Vorgehensweise bleibt allerdings dieselbe. In einigen Fällen kann anstelle von Induktion auch eine Fallunterscheidung durchgeführt werden. Die entsprechende 10

14 Methode heißt case_tac. Allerdings soll hier nicht weiter darauf eingegangen werden, da sich alle Probleme, die sich mit Hilfe von case_tac lösen lassen, auch mit der Methode induct_tac beweisen lassen [NPW04]. 3.2 Beweise im Rahmen der Logik Beweise mit Hilfe von Regeln Bisher wurde nur der funktionale Teil von Isabelle betrachtet. Im zweiten Teil wird die Logik Isabelles näher beschrieben. Das Ableiten von Beweisen im Rahmen der Logik erfolgt in Isabelle in der Regel durch "Backward Reasoning". Dies bedeutet, dass der Beweis ausgehend vom zu beweisenden Theorem geführt wird. "Forward Reasoning" ist in Isabelle ebenfalls möglich, spielt jedoch nach Aussagen der einschlägigen Literatur eine untergeordnete Rolle und wird daher im Folgenden nicht näher beschrieben [NPW04]. Für jeden logischen Operator gibt es zwei verschiedene Arten von Regeln [NPW04]: Einführungsregeln Eliminationsregeln Einführungsregeln treffen Aussagen darüber wie ein Sachverhalt, wie z.b. P1 P2, bewiesen werden kann. Eliminationsregeln hingegen beschreiben, was aus einem bestimmten Sachverhalt, wie z.b. P1 P2, bewiesen werden kann. Die Regeln, werden mit Hilfe der Methoden rule und erule aufgerufen: apply apply (rule <Einführungsregel>) (erule <Eliminationsregel>) Um die Funktionsweise von Isabelle zu verdeutlichen, soll im Folgenden die genaue Wirkungsweise der beiden Methoden beschrieben werden [NPW04]. Es wird von der folgenden allgemeinen Definition einer Regel ausgegangen. Zur Verdeutlichung sind zusätzlich zwei Beispiele angegeben: P 1... Pn A B A B A C B C rule: erule: Q A B C Das zu beweisende Subgoal sei wie folgt aufgebaut:... 1 m A A B 11

15 Durch das Anwenden einer Einführungsregel, mit Hilfe der Methode rule, werden die folgenden Schritte ausgeführt: Zunächst wird das Ziel Q der Regel mit dem Ziel B des zu lösenden Subgoals unifiziert. Anschließend wird das Ziel des zu lösenden Subgoals B durch die Voraussetzungen der Regel P 1 P n ersetzt. Auf diese Weise entstehen n neue Subgoals. Beim Anwenden einer Eliminationsregel, mit Hilfe der Methode erule, werden hingegen folgende Schritte durchlaufen: Zunächst wird, wie bei der Einführungsregel, das Ziel Q der Regel mit dem Ziel B des Subgoals unifiziert. Gleichzeitig wird jedoch die Voraussetzung P 1, welche in Isabelle auch Hauptvoraussetzung genannt wird, mit der ersten möglichen Annahme A 1 A m des Subgoals unifiziert. Anschließend wird die mit P 1 unfizierte Annahme A k gelöscht. Das Subgoal wird durch die Voraussetzungen P 2 P n der Regel ersetzt. Auf diese Weise entstehen n-1 neue Subgoals. Werden durch die Anwendung einer Regel mehrere neue Subgoals generiert, wird dies als Subgoalsplitting bezeichnet [NPW04]. Die Namen einzelner Regeln sowie deren Definitionen können in [NPW04] nachgelesen werden. Wichtig ist, dass sich die Anwendung der Methode rule auf die rechte Seite der Formel auswirkt, während die Anwendung von erule die linke Seite einer Formel beeinflusst. Zudem können einige Regeln sowohl als Einführungsregel als auch als Eliminationsregel angewandt werden. Ihre Wirkungsweise ist in diesem Fall abhängig von der verwendeten Methode [NPW04]. Die Regeln in Isabelle lassen sich des Weiteren in zwei verschiedene Arten aufteilen: Sichere und unsichere Regeln. Sichere Regeln zeichnen sich dadurch aus, dass ein beweisbares Subgoal auch nach der Anwendung der Regel beweisbar bleibt. Bei Anwendung einer unsicheren Regel kann die Beweisbarkeit unter Umständen verloren gehen. Das folgende Beispiel verdeutlicht diesen Sachverhalt und dient gleichzeitig zur Illustration für die Anwendung einer Regel in Isabelle. Die angewandte Regel heißt disji1 und ist wie folgt definiert: 12

16 P P Q Das zu beweisende Theorem sei in Isabelle wie folgt definiert: theorem disj : "[ A ] ==> B A" Da es sich bei disji1 bei um eine Einführungsregel handelt, muss sie wie folgt angewendet werden: apply (rule disji1) Isabelle liefert das folgende, nicht mehr beweisbare Subgoal: goal (theorem (disj), 1 subgoal): 1. A ==> B Eine Anwendung der Regel disji2, welche analog zu disji1 definiert ist, hätte das gewünschte Ergebnis geliefert: goal (theorem (disj), 1 subgoal): 1. A ==> A Steht das Ziel des Subgoals in den Annahmen, kann das Subgoal mit Hilfe der Methode assumption gelöst werden. apply (assumption) Für den Fall, dass Regeln in der gleichen Kombination mehrfach hintereinander angewendet werden müssen, bietet Isabelle verschiedene Kontrollstrukturen an. Die wiederholte Anwendung einer Regel kann zum einen mit Hilfe der Methoden intro und elim ausgeführt werden: apply apply (intro <Einführungsregel>) (elim <Eliminationsregel>) Eine alternative Darstellungsform bieten die Zeichen + und?. Ein + steht für mindestens eine Ausführung, ein? für eine oder keine Ausführung der Regel. Werden zwei Regeln mit dem Zeichen getrennt, wird zunächst die erste Methode ausgeführt. Scheitert sie, kommt die zweite Methode zur Anwendung [NPW04] Beweise mit Hilfe des Classical Reasoner Das Anwenden von Regeln mit Hilfe der oben beschriebenen Methoden gibt dem Benutzer eine genaue Kontrolle über die in der Beweisführung angewandten Schritte. 13

17 Viele Theoreme können jedoch nicht in einigen wenigen Schritten bewiesen werden, was die Anwendung einzelner Regeln unkomfortabel macht. In diesen Fällen kann Isabelles Classical Reasoner verwendet werden [Pa04]. Der Classical Reasoner stellt eine Reihe von Methoden zur Verfügung, mithilfe derer sich Beweise aus dem Bereich der Logik automatisch lösen lassen. Da der Classical Reasoner in vielen Fällen auch Probleme aus der Mengenlehre lösen kann, werden die Regeln aus diesem Bereich hier nicht vertieft. Die wichtigste dieser Methoden heißt blast [NPW04]. Anders als bei der Verwendung einzelner Regeln kommt bei der Anwendung von blast nicht die Isabelle eigene Engine zum Einsatz. Der zu führende Beweis wird stattdessen direkt an den Classical Reasoner übergeben. Dort wird mit Hilfe eines Tableau Provers versucht, den Beweis zu führen. Der Prover ordnet hierbei jedem durchgeführten Schritt die entsprechende Isabelle Regel zu. Ist ein Beweis gefunden, wird eine entsprechende Liste von Regeln an Isabelle zurückgegeben [Pa99]. Tableau Prover arbeiten mit Hilfe von Bäumen. Befinden sich Literale oder Formeln auf demselben Ast, bedeutet dies, dass sie konjunktiv verknüpft sind. An der Wurzel des Baumes steht die ursprünglich zu beweisende Formel in negierter Form. Die einzelnen Äste werden mit Hilfe von α, β, γ und δ Regeln aufgebaut. Eine α Regel zerlegt hierbei eine konjunktive Formel in zwei Teile und legt sie auf demselben Ast ab. Eine β Regel zerlegt eine disjunktive Formel in zwei Teile und legt sie auf unterschiedlichen Ästen ab. Eine γ Regel instanziiert einen universellen Quantoren, während eine δ Regel einen existentiellen Quantor instanziiert [Pa99]. Die Beweisführung ist erfolgreich abgeschlossen, wenn jeder Ast einen Widerspruch enthält. Der Tableau Prover verwendet bei der Beweisführung eine iterative Tiefensuche [Pa04]. Allgemein hat diese den Zeitaufwand O(b d ) [RN04]. Wobei b den Verzeigungsfaktor und d die Suchtiefe darstellt. Beide Faktoren, und damit die Komplexität der Beweisführung, hängen jedoch stark von dem zu lösenden Problem ab. Im Besonderen hängt der Verzweigungsfaktor mit Anzahl der verwendeten β Regeln zusammen. Im Worst-Case muss daher von einer exponentiellen Zeitkomplexität ausgegangen werden. Die Vorgehensweise soll an einem Beispiel illustriert werden. Zu beweisen sei: (P-->Q)==>( Q--> P) 14

18 In diesem Fall werden ausschließlich die folgenden α und β Regeln benötigt [Le03]: α Regeln β Regeln Nr. α α1, α2 β β1, β2 1 (P-->Q) P, Q P-->Q P, Q 2 P P Abb.: 1 Beispiele für α und β Regeln Der Baum, der sich durch Anwendung der Regeln ergibt, sieht wie folgt aus: ((P-->Q)==>( Q--> P)) Negierte zu beweisende Formel (P-->Q) αregel Nr.1 βregel Nr.1 ( Q--> P) P Q Q P Q Widerspruch αregel Nr.1 αregel Nr.2 P Widerspruch Abb.: 2 Anwendung des Tableauverfahrens Der Tableau Prover kann durch eine weitgehende Vernachlässigung von Typen wesentlich schneller arbeiten, als dies durch direkte Anwendung der Regeln in Isabelle möglich wäre [Pa04]. In seltenen Fällen kann es hierdurch allerdings dazu kommen, dass die Ausführung eines gefundenen Beweises in Isabelle an inkompatiblen Typen scheitert [Pa99]. Aus Effizienzgründen verzichtet der Tableau Prover zusätzlich auf Unifikation höherer Ordnung [Pa99]. Eine Besonderheit des Tableau Provers von Isabelle ist, dass er Backtracking erlaubt. Scheitert der Beweis eines Theorems in einem Anlauf, so findet ein Backtracking bis zur letzten unsicheren Regel statt. An diesem Punkt wird dann eine andere Regel ausgeführt [NPW04]. Während der Beweisführung werden zunächst sichere und anschließend unsichere Regeln ausgeführt [Pa04]. Ein Nachteil der blast Methode liegt darin, dass sich nicht nachvollziehen lässt, wie ein Beweis geführt wurde. Dies stellt insbesondere dann ein Problem dar, wenn der 15

19 Beweis fehlschlägt. In einem solchen Fall würde Isabelle einfach eine Fehlermeldung ausgeben, die keinerlei Informationen darüber enthält, warum der Beweis nicht erfolgreich durchgeführt werden konnte. In diesem Fall kann die Anwendung der Methode clarify hilfreich sein. Sie führt ausschließlich sichere Regeln aus. Darüber hinaus finden keine Regeln Anwendung, die ein Subgoalsplitting beinhalten. Dies hat zur Folge, dass clarify lediglich einfache Umformungen vornimmt und bereits vor einem Scheitern des Beweises abbricht. Häufig können dadurch die schwierigen Stellen eines Beweises offen gelegt werden [NPW04]. Für die Beweisführung im Rahmen der Logik und der Mengenlehre ergibt sich somit folgenden Empfehlung: Wende die Methode blast an, um den Beweis zu führen. Wende im Falle eines Scheiterns von blast die Methode clarify an, um Gründe für ein Scheitern eines Beweises offen zu legen. Weitere Methoden, die nur einen Teil der Funktionalität von blast ausführen und sich daher ebenfalls zum Auffinden von problematischen Stellen innerhalb eines Beweises eignen sind clarsimp und safe. Die Methode clarsimp verhält sich hierbei wie clarify, verwendet aber zusätzlich noch die Funktionalität der Methode simp. Die Methode safe verwendet im Gegensatz zu clarify auch Regeln, welche ein Subgoalsplitting beinhalten. 3.3 Proof-General und Isabelle Die oben beschriebene Syntax, sowie alle vorgestellten Methoden, können auf der Shell-Ebene von Isabelle eingegeben werden. Es gibt allerdings eine komfortable Alternative, die neben einer grafischen Oberfläche noch eine Reihe weiterer Features bietet: Proof-General. Es wurde ursprünglich für Linux programmiert. Unter Windows kann es mit Hilfe der Cygwin-Umgebung installiert werden. Wenn Proof-General gestartet wird, erstellt es automatisch einen Script Buffer mit dem Namen "Scratch.thy". In dem Script Buffer können Theorien in der oben beschriebenen Form entwickelt werden. Unter der Vorraussetzung, dass bereits eine Theorie existiert kann sie über den Menüpunkt "FileOpen" geöffnet werden. Hat man diese Schritte durchgeführt, könnte der Bildschirm z.b. wie folgt aussehen: 16

20 Abb.: 3 Screenshot Proof-General Charakteristisch ist die Zweiteilung der Arbeitsoberfläche. Im oberen Bereich befinden sich die Bereits erwähnten Script Buffer. Im unteren Bereich wird, von Proof-General kontrolliert, einer der folgenden Buffer angezeigt [AK04]: Der Goal Buffer zeigt noch zu beweisende Subgoals an. Der Response Buffer zeigt dem Benutzer Fehlermeldungen an. Der Trace Buffer, der eine spezielle Version des Response Buffers darstellt, zeigt Meldungen zum Debugging an. In der Regel wird im oberen Bereich der Script-Buffer und im unteren Bereich der Goal Buffer angezeigt. Die Zentrale Steuerung der Beweisführung findet sich unterhalb der Menüleiste: Die beiden ersten Tasten "State" und "Context" steuern, falls nur zwei Buffer angezeigt werden, den Inhalt des unteren Buffers. "State" zeigt den Goal Buffer an. "Context" zeigt den Namen der aktuellen Theorie und alle eingebunden Theorien an. 17

21 Abb.: 4 Arbeiten mit Proof-General Die nächsten fünf Schaltflächen übernehmen die Steuerung der Interaktion zwischen Proof-General und Isabelle. Wird der Button "Next" gedrückt wird die erste noch nicht bearbeitete Zeile des Buffers an den Proof-Assistenten geschickt, wo sie verarbeitet wird. Isabelle unterscheidet drei verschiedene farbliche Hinterlegungen [AK04]: Hellblau bedeutet, die Zeile wurde bereits vom Proof-Assistenten verarbeitet und kann nicht mehr editiert werden. Orange bedeutet, die Zeile wurde bereits an den Proof-Assistenten gesendet, wartet aber noch auf Bearbeitung. Auch Orange markierte Zeilen können nicht mehr bearbeitet werden. Grau bzw. nicht hinterlegt, bedeutet, die Zeile wurde noch nicht an den Proof- Assistenten gesendet und kann deshalb noch editiert werden. Die Taste "Undo" kann benutzt werden einen Schritt zurück zu gehen, weil man z.b. eine vorhergehende Zeile doch noch einmal editieren möchte. "Use" schickt alle Zeilen auf einmal an den Proof-Assistenten, "Retract" macht alle Schritte auf einmal rückgängig. Wird die Schaltfläche "Goto" betätigt, werden alle Zeilen nacheinander an den Proof-Assistenten geschickt, bis es eine Fehlermeldung auftritt. Die Schaltfläche ermöglicht folglich bei längeren Beweisen ein schnelles Auffinden des für die Beweisführung problematischen Abschnittes. Ein weiteres interessantes Feature von Proof-General findet sich in der Menüleiste unter dem Punkt "Index". Hier kann direkt an verschiedene Stellen innerhalb eines Buffers gesprungen werden. Im Einzelnen können Theorien, Theoreme oder Deklarationen als Sprungpunkte ausgewählt werden. Dies ermöglicht ein schnelles Navigieren innerhalb langer Beweise. 18

22 Kapitel 4: Praktische Anwendungen 4 Praktische Anwendungen Die bisher vorgestellten Beispiele dienten der Illustration und wurden deshalb bewusst einfach gehalten. Beweise realweltlicher Probleme sind in der Regel deutlich komplexer. Für ihre Lösung werden daher zum Teil auch Konstrukte von Isabelle verwendet, die aufgrund ihrer vergleichbaren Funktionsweise mit den dargestellten Konstrukten, hier aus Übersichtlichkeitsgründen nicht vorgestellt wurden. Neben mathematischen [MF03] und logischen Beweisen [Oh97] ist die Formalisierung der Programmiersprache Java ein zentrales Forschungsgebiet. Es können zwei verschiedene Arten der Formalisierung von Programmiersprachen unterschieden werden. Beim shallow embedding wird lediglich die Semantik einer Programmiersprache in die Logik des Theorembeweisers eingebettet. Diese Vorgehensweise ist dann zu empfehlen, wenn man Aussagen über Anwendungen treffen möchte, die in der abgebildeten Sprache programmiert sind. Beim deep embedding werden sowohl die Syntax als auch die Semantik abgebildet [Oh00]. Dieses Vorgehen ist zu wählen, wenn man Aussagen über die Programmiersprache selbst treffen möchte. Auf diese Weise wurde bereits die Typensicherheit für eine vereinfachte Version von Java als auch für die JVM bewiesen [Oh00]. Als Beispiel für die Herangehensweise einer Formalisierung soll hier die Abbildung des Javatyps Integer in Isabelle beschrieben werden [RW03]. Java Integer haben eine Bit- Länge von 32. Zunächst muss daher der Wertebereich in Isabelle festgelegt werden: constdefs BitLength :: nat "BitLength == 32" MinInt :: int "MinInt == -(2^(BitLength+(-1)))" MaxInt :: int "MaxInt == (2^(BitLength+(-1)))+(-1)" Anschließend kann der neue Datentyp JavaInt definiert werden: typedef JavaInt = "{i::int. MinInt <= i & i<= MaxInt}" Die Definition muss mit Hilfe von typedef geschehen, dar JavaInt eine Untermenge des Typs int in Isabelle darstellt. Es werden von Isabelle automatisch zwei Funktionen bereitgestellt, welche die unterschiedlichen Typen aufeinander abbilden: Abs_JavaInt :: int => JavaInt Rep_JavaInt :: JavaInt => int 19

23 Kapitel 4: Praktische Anwendungen Die zweite Funktion kann ohne Probleme genutzt werden. Bei der ersten Funktion muss vor jeder Benutzung sichergestellt werden, dass sich der abzubildende int Wert auch in den definierten Wertebereich von JavaInt fällt. Dies kann mit Hilfe der folgenden Funktion geschehen, die alle int Werte in den definierten Bereich mapped: const IntToJavaInt :: int => JavaInt defs IntToJavaInt_def : "IntToJavaInt (x) == Abs_JavaInt(((x+(-MinInt))) mod( 2*(-MinInt)))" Mit Hilfe der Funktionen IntToJavaInt und Rep_JavaInt können die verschiedenen Operationen für Java Integer beschrieben werden. Hierzu erfolgt zunächst eine Typenumwandlung von JavaInt nach int. Auf den Isabelle Integer Werten wird dann die entsprechende Operation durchgeführt. Im Anschluss daran wird das Ergebnis wieder in einen Wert vom Typ JavaInt umgewandelt. Ein Beispiel hierfür ist die Addition: consts add :: "JavaInt => JavaInt => JavaInt" ( infixr "plus" 65) defs add_def : "add n m == IntToJavaInt ((Rep_JavaInt n)+(rep_javaint m))" Im Anschluss an die Definition muss das Verhalten der Addition abgebildet werden. Als Beispiel dient das Kommutativgesetz: theorem kommutativ : " x plus y = y plus x" Ein Beweis könnte z.b. wie folgt aussehen: lemma lemma1 [simp]: "(Rep_JavaInt n)+(rep_javaint m) = (Rep_JavaInt m)+(rep_javaint n)" apply (simp) done theorem kommutativ : " x plus y = y plus x" apply (unfold add_def) apply (simp) Zunächst wird bewiesen, dass das Kommutativgesetz für Isabelle Integer gilt. Das entsprechende Lemma wird der Methode simp übergeben, welche es anschließend nutzt, um das Theorem kommutativ zu lösen. Auf ähnliche Weise lassen sich auch die anderen Operationen sowie deren Verhaltensweisen in Isabelle abbilden. Formalisierungen dieser Art sind die Grundlage für die Verifikation von arithmetischen Java Programmen wie z.b. Verschlüsselungs- Werkzeugen [RW03]. 20

24 Kapitel 5: Zusammenfassung 5 Zusammenfassung Ziel dieser Seminararbeit war es den semi-automatischen Theorem Prover Isabelle/HOL vorzustellen. Zu diesem Zweck wurde im einführenden Kapitel zunächst Isabelle/HOL allgemein beschrieben. Der zentrale Bestandteil war hier die Beschreibung des grundlegenden Aufbaus eines Beweises in Isabelle. Im weiteren Verlauf wurde die Beweisführung mit Isabelle/HOL im Detail beschrieben. Hierbei wurden zwei verschiedene Bereiche unterschieden. Der erste Teil erläuterte die Beweisführung im Rahmen der funktionalen Programmierung. Zunächst erfolgte eine Beschreibung der Darstellung von Datentypen und Funktionen in Isabelle/HOL. Zentraler Bestandteil war die Entwicklung einer Handlungsanweisung für die Beweisführung im Rahmen funktionaler Programme. Herausgearbeitet wurde, dass die Anwendung der Methoden induct_tac und auto zu empfehlen ist. Im zweiten Teil wurde auf die Beweisführung im Rahmen der Logik eingegangen. Zunächst wurde die Beweisführung anhand von einzelnen Regeln beschrieben. Es zeigte sich, dass ihre Anwendung in langen Beweisen wenig praktikabel ist, da jeder Schritt des Beweises einzeln durchgeführt werden muss. Aus diesem Grund wurde die Methode blast vorgestellt, welche auch komplizierte Probleme aus dem Bereich der Logik sowie der Mengenlehre in einem Schritt zu lösen in der Lage ist. Für eine Beweisführung wurde daher die Anwendung der der Methode blast empfohlen. Anschließend wurde auf die Bedienung der grafischen Benutzeroberfläche Proof- General eingegangen. Hierbei wurden im Besonderen die unterschiedlichen Funktionen der verschiedenen Buffer dargestellt. Im letzten Kapitel wurden einige praktische Anwendungen näher dargelegt. Beispielhaft wurde die Formalisierung von Java Integern in Isabelle beschrieben. Die Tatsache, dass die Typensicherheit für eine nur leicht vereinfachte Variante von Java bewiesen wurde, zeigt die Mächtigkeit von Isabelle/HOL. Die Flexibilität wird durch die vielen verschiedenen Anwendungen im Bereich der mathematischen und logischen Beweise unterstrichen. Aufgrund dieser Flexibilität kann Isabelle bisher keine Unterstützung bei der Formalisierung einzelner Probleme anbieten. An dieser Stelle könnte das Programm durchaus sinnvoll erweitert werden. Zusammenfassend kann Isabelle/HOL als ein sehr flexibles, mächtiges Werkzeug zur Beweisführung mit einer allerdings geringen Benutzerunterstützung bei der Formalisierung von Problemen beschrieben werden. 21

25 Literaturverzeichnis [AK04] [Le03] [Me00] [MF03] [Ni02] David Aspinall, Thomas Kleymann: Proof General - Users Manual. Letzter Zugriff Reinhold Letz: Praktikum Beweiser. Letzter Zugriff: Merz Stephan: Weak Alternating Automata in Isabelle/HOL. In: Lecture Notes in Computer Science 1869, S , Springer Verlag, Laura I. Meikle, Jacques D. Fleuiot: Formalizing Hilbert s Grundlagen in Isabelle/Isar. Lecture Notes in Computer Science 2758, S , Springer Verlag, Tobias Nipkow: Structered Proofs in ISAR/HOL. In: Lecture Notes in Computer Science 2646, S , Springer Verlag, [NPW04] Tobias Nipkow, Lawrence C. Paulson, Markus Wenzel: Isabelle HOL. A Proof Assistant for Higher-Order Logic. Springer Verlag, [Oh97] [Oh00] [Pa99] [Pa04] [RS04] [RW03] David von Oheimb: Machine-supported Proofs for Relation Algebra. Lecture Notes in Computer Science 1249, S , Springer Verlag, David von Oheimb: Analyzing Java in Isabelle/HOL. Dissertation an der technischen Universität München, Lawrence C. Paulson: A Generic Tableau Prover and ist Integration with Isabelle. In: Journal of Universal Computer Science, 5(3), 1999, S Lawrence C. Paulson: The Isabelle Reference Manual. Letzter Zugriff: Stuart Russel, Peter Norvig: Künstliche Intelligenz - Ein moderner Ansatz. Pearson Verlag, Nicole Rauch, Burkhart Wolff: Formalizing Java s Two s-complement Integral Type In Isabelle/HOL. In: Electronic Notes in Theoretical Computer Science, Volume (80), 2003, S

Deduktive Systeme in Isabelle

Deduktive Systeme in Isabelle Deduktive Systeme in Isabelle 1 Installation Auf den Tux-Rechnern des SCI ist Isabelle bereits für Sie installiert. Sie können dort Isabelle einfach mit dem Befehl isabelle jedit vom Terminal aus starten.

Mehr

Theorem Proving mit Isabelle

Theorem Proving mit Isabelle Theorem Proving mit Isabelle Olivera Pavlović Pavlović 1 Überblick I. Formale Verifikation II. III. IV. Achszählsystem Theorem Prover Isabelle Darstellung des Achszählsystems in Isabelle V. Abschluss Pavlović

Mehr

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle

Formale Methoden der Softwaretechnik 1 Vorlesung vom : Grundlage von Isabelle 1 Formale Methoden der Softwaretechnik 1 Vorlesung vom 16.11.09: Grundlage von Isabelle Christoph Lüth, Lutz Schröder Universität Bremen Wintersemester 2009/10 2 Fahrplan Teil I: Grundlagen der Formalen

Mehr

Beweisen mit Semantischen Tableaux

Beweisen mit Semantischen Tableaux Beweisen mit Semantischen Tableaux Semantische Tableaux geben ein Beweisverfahren, mit dem ähnlich wie mit Resolution eine Formel dadurch bewiesen wird, dass ihre Negation als widersprüchlich abgeleitet

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

Strukturelle Rekursion und Induktion

Strukturelle Rekursion und Induktion Kapitel 2 Strukturelle Rekursion und Induktion Rekursion ist eine konstruktive Technik für die Beschreibung unendlicher Mengen (und damit insbesondere für die Beschreibung unendliche Funktionen). Induktion

Mehr

Informationsverarbeitung auf Bitebene

Informationsverarbeitung auf Bitebene Informationsverarbeitung auf Bitebene Dr. Christian Herta 5. November 2005 Einführung in die Informatik - Informationsverarbeitung auf Bitebene Dr. Christian Herta Grundlagen der Informationverarbeitung

Mehr

HM I Tutorium 1. Lucas Kunz. 27. Oktober 2016

HM I Tutorium 1. Lucas Kunz. 27. Oktober 2016 HM I Tutorium 1 Lucas Kunz 27. Oktober 2016 Inhaltsverzeichnis 1 Theorie 2 1.1 Logische Verknüpfungen............................ 2 1.2 Quantoren.................................... 3 1.3 Mengen und ihre

Mehr

Theorembeweiser und ihre Anwendungen

Theorembeweiser und ihre Anwendungen Theorembeweiser und ihre Anwendungen Prof. Dr.-Ing. Gregor Snelting Dipl.-Inf. Univ. Daniel Wasserrab Lehrstuhl Programmierparadigmen IPD Snelting Universität Karlsruhe (TH) IPD Snelting, Uni Karlsruhe

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

Programmieren in Haskell Programmiermethodik

Programmieren in Haskell Programmiermethodik Programmieren in Haskell Programmiermethodik Peter Steffen Universität Bielefeld Technische Fakultät 12.01.2011 1 Programmieren in Haskell Bisherige Themen Was soll wiederholt werden? Bedienung von hugs

Mehr

A α. Theorembeweiserpraktikum. Anwendungen in der Sprachtechnologie. LEHRSTUHL PROGRAMMIERPARADIGMEN

A α. Theorembeweiserpraktikum. Anwendungen in der Sprachtechnologie.  LEHRSTUHL PROGRAMMIERPARADIGMEN Theorembeweiserpraktikum Anwendungen in der Sprachtechnologie LEHRSTUHL PROGRAMMIERPARADIGMEN λ β A α 0 SS 2018 Denis Lohner, Sebastian Ullrich - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

Mehr

Teil 7: Rekursion; Imperative Programme

Teil 7: Rekursion; Imperative Programme 1 Teil 7: Rekursion; Imperative Programme Terminierend rekursive Funktionen Im Tutorial: Kap. 3.5 / 9.2 Definition mit recdef, Nachweis der Terminierung Beweise über rekursive Funktionen Imperative Programme

Mehr

mathematik und informatik

mathematik und informatik Prof. Dr. Martin Erwig Kurs 01852 Fortgeschrittene Konzepte funktionaler Programmierung LESEPROBE mathematik und informatik Das Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere

Mehr

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung Gliederung n Teil I: Einleitung und Grundbegriffe l 1. Organisatorisches l 2. Grundlagen von Programmiersprachen n Teil II: Imperative und objektorientierte Programmierung l 1. Grundelemente der Programmierung

Mehr

Strukturierte Spezifikation: Anreicherung um nichtrekursive und rekursive Definitionen

Strukturierte Spezifikation: Anreicherung um nichtrekursive und rekursive Definitionen Strukturierte Spezifikation: Anreicherung um nichtrekursive und rekursive Definitionen 13. Mai 2013 G. Schellhorn, D. Haneberg: Formale Methoden im Software Engineering 128 / 290 Strukturierte Spezifikationen

Mehr

13 Abstrakte Datentypen

13 Abstrakte Datentypen 13 Abstrakte Datentypen Bisher: Konkrete Datentypen Menge von Elementen Operationen auf den Elementen (Konstruktoren, Selektoren, Typprädikate) Eigenschaften abgeleitet Jetzt: Abstrakte Datentypen (ADT)

Mehr

Mächtigkeit von LOOP-Programmen. Prof. Dr. Berthold Vöcking Lehrstuhl Informatik 1 Algorithmen und Komplexität RWTH Aachen

Mächtigkeit von LOOP-Programmen. Prof. Dr. Berthold Vöcking Lehrstuhl Informatik 1 Algorithmen und Komplexität RWTH Aachen Mächtigkeit von LOOP-Programmen Prof. Dr. Berthold Vöcking Lehrstuhl Informatik 1 Algorithmen und Komplexität RWTH Aachen 1 / 23 Die Programmiersprache LOOP Syntax Elemente eines LOOP-Programms Variablen

Mehr

11. Beschreiben Sie die disjunktive und die konjunktive Normalform eines logischen Ausdrucks!

11. Beschreiben Sie die disjunktive und die konjunktive Normalform eines logischen Ausdrucks! Kapitel 3 Logik Verständnisfragen Sachfragen 1. Was ist eine logische Aussage? 2. Wie ist die Konjunktion und die Disjunktion definiert? 3. Beschreiben Sie das Exklusive Oder, die Implikation und die Äquivalenz!

Mehr

Axiomatische Beschreibung der ganzen Zahlen

Axiomatische Beschreibung der ganzen Zahlen Axiomatische Beschreibung der ganzen Zahlen Peter Feigl JKU Linz peter.feigl@students.jku.at 0055282 Claudia Hemmelmeir JKU Linz darja@gmx.at 0355147 Zusammenfassung Wir möchten in diesem Artikel die ganzen

Mehr

Formale Systeme. Prof. Dr. Bernhard Beckert. Winter 2008/2009. Fakultät für Informatik Universität Karlsruhe (TH)

Formale Systeme. Prof. Dr. Bernhard Beckert. Winter 2008/2009. Fakultät für Informatik Universität Karlsruhe (TH) Formale Systeme Prof. Dr. Bernhard Beckert Fakultät für Informatik Universität Karlsruhe (TH) Winter 2008/2009 Prof. Dr. Bernhard Beckert Formale Systeme Winter 2008/2009 1 / 22 Kalküle für die Aussagenlogik

Mehr

Mathematische Grundlagen I Logik und Algebra

Mathematische Grundlagen I Logik und Algebra Logik und Algebra Dr. Tim Haga 21. Oktober 2016 1 Aussagenlogik Erste Begriffe Logische Operatoren Disjunktive und Konjunktive Normalformen Logisches Schließen Dr. Tim Haga 1 / 21 Präliminarien Letzte

Mehr

ÜBUNGS-BLOCK 7 LÖSUNGEN

ÜBUNGS-BLOCK 7 LÖSUNGEN ÜBUNGS-BLOCK 7 LÖSUNGEN Aufgabe 1: Gegeben ist folgender Code: Auto[] array = new Auto[3]; // Alle Autos im Array tunen: for (int i = 1; i

Mehr

Tableaukalkül für Aussagenlogik

Tableaukalkül für Aussagenlogik Tableaukalkül für Aussagenlogik Tableau: Test einer Formel auf Widersprüchlichkeit Fallunterscheidung baumförmig organisiert Keine Normalisierung, d.h. alle Formeln sind erlaubt Struktur der Formel wird

Mehr

Theorembeweiserpraktikum SS 2016

Theorembeweiserpraktikum SS 2016 Institut für Programmstrukturen und Datenorganisation Lehrstuhl Programmierparadigmen Am Fasanengarten 5 76131 Karlsruhe http://pp.ipd.kit.edu/ Theorembeweiserpraktikum SS 2016 http://pp.ipd.kit.edu/lehre/ss2016/tba

Mehr

2008W. Vorlesung im 2008W Institut für Algebra Johannes Kepler Universität Linz

2008W. Vorlesung im 2008W  Institut für Algebra Johannes Kepler Universität Linz Logik Institut für Algebra Johannes Kepler Universität Linz Vorlesung im http://wwwalgebrauni-linzacat/students/win/ml Inhalt Logik Logik Aussagen Die mathematische Logik verwendet mathematische Methoden,

Mehr

{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel

{P} S {Q} {P} S {Q} {P} S {Q} Inhalt. Hoare-Kalkül. Hoare-Kalkül. Hoare-Tripel. Hoare-Tripel. Hoare-Tripel Inhalt Hoare-Kalkül Formale Verifizierung Hoare-Kalkül while-sprache Terminierung Partielle / totale Korrektheit 4.0 Hoare-Kalkül entwickelt von C.A.R. (Tony) Hoare (britischer Informatiker), 1969 formales

Mehr

Einführung in die Informatik 2 9. Übung

Einführung in die Informatik 2 9. Übung Technische Universität München WS 2012/13 Institut für Informatik 11.11.2012 Prof. Tobias Nipkow, Ph.D. Abgabe: 18.12.2012, 15:30 Lars Noschinski, Dr. Jasmin Blanchette, Dmitriy Traytel Einführung in die

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

Grundlagen der Programmierung 2. Operationale Semantik

Grundlagen der Programmierung 2. Operationale Semantik Grundlagen der Programmierung 2 Operationale Semantik Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 29. April 2009 Semantik von Programmiersprachen Semantik = Bedeutung

Mehr

Programmierung WS18/19 Übungsblatt 9 (Abgabe Freitag, den um 12 Uhr)

Programmierung WS18/19 Übungsblatt 9 (Abgabe Freitag, den um 12 Uhr) Prof. aa Dr. J. Giesl S. Dollase, M. Hark, D. Korzeniewski Aufgabe 2 (Datenstrukturen in Haskell): (2 + 1 + 2 + 2.5 + 3.5 = 11 Punkte) In dieser Aufgabe geht es darum, arithmetische Ausdrücke auszuwerten.

Mehr

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML. JavaScript JavaScript wird direkt in HTML-Dokumente eingebunden. Gib folgende Zeilen mit einem Texteditor (Notepad) ein: (Falls der Editor nicht gefunden wird, öffne im Browser eine Datei mit der Endung

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

Intensivübung zu Algorithmen und Datenstrukturen

Intensivübung zu Algorithmen und Datenstrukturen Intensivübung zu Algorithmen und Datenstrukturen Silvia Schreier Informatik 2 Programmiersysteme Martensstraße 3 91058 Erlangen Übersicht Programmierung Fallunterscheidung Flussdiagramm Bedingungen Boolesche

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

III.1 Prinzipien der funktionalen Programmierung - 1 -

III.1 Prinzipien der funktionalen Programmierung - 1 - 1. Prinzipien der funktionalen Programmierung 2. Deklarationen 3. Ausdrücke 4. Muster (Patterns) 5. Typen und Datenstrukturen 6. Funktionale Programmiertechniken III.1 Prinzipien der funktionalen Programmierung

Mehr

Einführung in die Theoretische Informatik

Einführung in die Theoretische Informatik Einführung in die Theoretische Informatik Maximilian Haslbeck Fabian Mitterwallner Georg Moser David Obwaller cbr.uibk.ac.at Zusammenfassung der letzten LVA Definition Eine Registermaschine (RM) R ist

Mehr

Anregungen zu Übung 2

Anregungen zu Übung 2 Anregungen zu Übung 2 Allgemeine Informatik II - SS 2007 Was sind Arrays und wie kann man sie verwenden? Ein Array ist ein spezieller Datentyp, der mehrere Werte zu einer Einheit zusammenfasst. Er ist

Mehr

Stratego/XT und ASF+SDF Meta-Environment. Paul Weder Seminar Transformationen Datum:

Stratego/XT und ASF+SDF Meta-Environment. Paul Weder Seminar Transformationen Datum: Stratego/XT und ASF+SDF Meta-Environment Paul Weder Seminar Transformationen Datum: 20.01.2006 Gliederung Allgemeines ASF+SDF Meta-Environment Stratego/XT Zusammenfassung/Vergleich SDF (Syntax Definition

Mehr

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 csacarea@cs.ubbcluj.ro 19. Dezember 2016 1/55 WIEDERHOLUNG: HORN-KLAUSELN

Mehr

Wertebereich und Genauigkeit der Zahlendarstellung

Wertebereich und Genauigkeit der Zahlendarstellung Wertebereich und Genauigkeit der Zahlendarstellung Sowohl F als auch C kennen bei ganzen und Floating Point-Zahlen Datentypen verschiedener Genauigkeit. Bei ganzen Zahlen, die stets exakt dargestellt werden

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

Im allerersten Unterabschnitt wollen wir uns mit einer elementaren Struktur innerhalb der Mathematik beschäftigen: Mengen.

Im allerersten Unterabschnitt wollen wir uns mit einer elementaren Struktur innerhalb der Mathematik beschäftigen: Mengen. Kapitel 1 - Mathematische Grundlagen Seite 1 1 - Mengen Im allerersten Unterabschnitt wollen wir uns mit einer elementaren Struktur innerhalb der Mathematik beschäftigen: Mengen. Definition 1.1 (G. Cantor.

Mehr

Vollständige Induktion

Vollständige Induktion Angenommen, wir wollen zeigen, dass eine Aussage P(n) für alle n N wahr ist. Anders ausgedrückt: Es gilt n N : P(n) Hierzu können wir die Technik der vollständigen Induktion verwenden. Wir zeigen, dass

Mehr

Grundbegriffe für dreiwertige Logik

Grundbegriffe für dreiwertige Logik Grundbegriffe für dreiwertige Logik Hans Kleine Büning Universität Paderborn 1.11.2011 1 Syntax und Semantik Die klassische Aussagenlogik mit den Wahrheitswerten falsch und wahr bezeichnen wir im weiteren

Mehr

Benutzerdefinierte Housekeepinglisten in SAP BW //

Benutzerdefinierte Housekeepinglisten in SAP BW // Was wir vorhersagen, soll auch eintreffen! Benutzerdefinierte Housekeepinglisten in SAP BW // Stefan Rutte 1. Housekeepingliste anlegen Zum Anlegen der Housekeepingliste muss der Aufgaben-Manager mit der

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS 2013/14 Operatoren Operatoren führen Aktionen mit Operanden aus. Der

Mehr

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2 Fakultät Verkehrswissenschaften Friedrich List, Professur für Verkehrsbetriebslehre und Logistik Modul Entscheidungsunterstützung in der Logistik Einführung in die Programmierung mit C++ Übung 2 SS 2016

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

Hilbert: Prädikatenlogik Teil I (formale Beweise) Text von Hilbert; Text von Halbeisen et al. Christine Simantiri Ueli Gisiger

Hilbert: Prädikatenlogik Teil I (formale Beweise) Text von Hilbert; Text von Halbeisen et al. Christine Simantiri Ueli Gisiger Hilbert: Prädikatenlogik Teil I (formale Beweise) Text von Hilbert; Text von Halbeisen et al. Christine Simantiri Ueli Gisiger 13.04.2016 Hilbert: Prädikatenlogik Teil I (formale Beweise) Ablauf der Text-Vorstellung

Mehr

Kapitel 12: Induktive

Kapitel 12: Induktive Kapitel 12: Induktive Datenstrukturen Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2009 Folien nach einer Vorlage von H.-Peter

Mehr

Funktionen in JavaScript

Funktionen in JavaScript Funktionen in JavaScript Eine Funktion enthält gebündelten Code, der sich in dieser Form wiederverwenden lässt. Es können ganze Programmteile aufgenommen werden. Mithilfe von Funktionen kann man denselben

Mehr

Vorsemesterkurs Informatik

Vorsemesterkurs Informatik Vorsemesterkurs Informatik Sommersemester 2018 Ronja Düffel 14. März 2018 Theoretische Informatik Wieso, weshalb, warum??!? 1 Modellieren und Formalisieren von Problemen und Lösungen 2 Verifikation (Beweis

Mehr

Logik für Informatiker

Logik für Informatiker Vorlesung Logik für Informatiker 7. Aussagenlogik Analytische Tableaus Bernhard Beckert Universität Koblenz-Landau Sommersemester 2006 Logik für Informatiker, SS 06 p.1 Der aussagenlogische Tableaukalkül

Mehr

GTI. Hannes Diener. 18. Juni. ENC B-0123,

GTI. Hannes Diener. 18. Juni. ENC B-0123, GTI Hannes Diener ENC B-0123, diener@math.uni-siegen.de 18. Juni 1 / 32 Als Literatur zu diesem Thema empfiehlt sich das Buch Theoretische Informatik kurzgefasst von Uwe Schöning (mittlerweile in der 5.

Mehr

Überabzählbarkeit der reellen Zahlen

Überabzählbarkeit der reellen Zahlen Überabzählbarkeit der reellen Zahlen Mathematik M4 Dozentin: Dr. Regula Krapf Jan Lukas Schallenberg Matr. Nr.: 214202241 November 2017 1 Inhaltsverzeichnis 1 Dedekindsche Schnitte 3 2 Addition und Multiplikation

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

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift

Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2008/09 Einführung in die Informatik 2 Klausur Prof. Dr. Helmut Seidl, T. M. Gawlitza, S. Pott,

Mehr

Vorsemesterkurs Informatik

Vorsemesterkurs Informatik Vorsemesterkurs Informatik Vorsemesterkurs Informatik Mario Holldack WS2015/16 30. September 2015 Vorsemesterkurs Informatik 1 Einleitung 2 Aussagenlogik 3 Mengen Vorsemesterkurs Informatik > Einleitung

Mehr

Kontrollstrukturen -- Schleifen und Wiederholungen

Kontrollstrukturen -- Schleifen und Wiederholungen Kontrollstrukturen -- Schleifen und Wiederholungen Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling benedict.reuschling@h-da.de Hochschule Darmstadt Fachbereich Informatik WS 2013/14

Mehr

Vorsemesterkurs Informatik

Vorsemesterkurs Informatik Vorsemesterkurs Informatik Ronja Düffel WS2018/19 01. Oktober 2018 Theoretische Informatik Wieso, weshalb, warum??!? 1 Modellieren und Formalisieren von Problemen und Lösungen 2 Verifikation (Beweis der

Mehr

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp Kapitel 4 Programmierkurs Birgit Engels, Anna Schulze Datentypen und Operatoren Ganzzahlige Numerische Datentypen Logischer Datentyp ZAIK Universität zu Köln WS 07/08 1 / 6 Datentypen Arten von Datentypen

Mehr

Einführung in die Theoretische Informatik

Einführung in die Theoretische Informatik Einführung in die Theoretische Informatik Woche 5 Harald Zankl Institut für Informatik @ UIBK Wintersemester 2014/2015 Zusammenfassung Zusammenfassung der letzten LV Jede binäre Operation hat maximal ein

Mehr

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2016/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2016/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft Formale Systeme Prof. Dr. Bernhard Beckert, WS 2016/2017 Aussagenlogik: Tableaukalku l KIT I NSTITUT F U R T HEORETISCHE I NFORMATIK www.kit.edu KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Mehr

Tableaux-Beweise in der Aussagenlogik

Tableaux-Beweise in der Aussagenlogik Tableaux-Beweise in der Aussagenlogik Wie kann man auf syntaktische Weise eine Belegung mit Wahrheitswerten finden, die einen gegebenen Ausdruck wahr oder falsch macht? Die Frage schliesst Beweise durch

Mehr

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2017/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

Formale Systeme. Prof. Dr. Bernhard Beckert, WS 2017/ KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft Formale Systeme Prof. Dr. Bernhard Beckert, WS 2017/2018 Aussagenlogik: Tableaukalku l KIT I NSTITUT F U R T HEORETISCHE I NFORMATIK www.kit.edu KIT Die Forschungsuniversita t in der Helmholtz-Gemeinschaft

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

Theorembeweiserpraktikum

Theorembeweiserpraktikum Theorembeweiserpraktikum Anwendungen in der Sprachtechnologie LEHRSTUHL PROGRAMMIERPARADIGMEN 0 KIT SS Universität 2011 desdenis Landes Lohner, Baden-Württemberg Daniel Wasserrab: und Theorembeweiserpraktikum

Mehr

1.9 Beweis durch Kontraposition

1.9 Beweis durch Kontraposition 1.9 Beweis durch Kontraposition 1.9 Beweis durch Kontraposition Ein Beweis durch Kontraposition ist ein Spezialfall des indirekten Beweises. Wir betrachten zwei Aussagen A und B und wollen A B zeigen,

Mehr

Grundlagen der Programmierung 3 A

Grundlagen der Programmierung 3 A Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2016 Haskell, Typen, und Typberechnung Ziele: Haskells Typisierung Typisierungs-Regeln

Mehr

Kapitel 6. Programme mit Schleifen. Wir betrachten jetzt eine einfache imperative Programmiersprache IMP. IMP verfügt

Kapitel 6. Programme mit Schleifen. Wir betrachten jetzt eine einfache imperative Programmiersprache IMP. IMP verfügt Kapitel 6 Programme mit Schleifen Wir betrachten jetzt eine einfache imperative Programmiersprache IMP. IMP verfügt über zuweisbare Variablen, Konditionale und Schleifen, hat aber keine Prozeduren. IMP

Mehr

Logik Vorlesung 3: Äquivalenz und Normalformen

Logik Vorlesung 3: Äquivalenz und Normalformen Logik Vorlesung 3: Äquivalenz und Normalformen Andreas Maletti 7. November 2014 Überblick Inhalt 1 Motivation und mathematische Grundlagen 2 Aussagenlogik Syntax und Semantik Äquivalenz und Normalformen

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 20 Einstieg in die Informatik mit Java Rekursion Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 20 1 Überblick 2 Rekursion 3 Rekursive Sortieralgorithmen 4 Backtracking

Mehr

Überblick. 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 Induktion und Rekursion 3.3 Boolsche Algebra

Überblick. 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 Induktion und Rekursion 3.3 Boolsche Algebra Überblick 3. Mathematische Grundlagen 3.1 Mengen und Abbildungen 3.2 3.3 Boolsche Algebra Peer Kröger (LMU München) Einführung in die Programmierung WS 14/15 72 / 179 Beweisprinzip der vollständigen Induktion

Mehr

Algorithmen für OBDD s. 1. Reduziere 2. Boole sche Operationen

Algorithmen für OBDD s. 1. Reduziere 2. Boole sche Operationen Algorithmen für OBDD s 1. Reduziere 2. Boole sche Operationen 1 1. Reduziere siehe auch M.Huth und M.Ryan: Logic in Computer Science - Modelling and Reasoning about Systems, Cambridge Univ.Press, 2000

Mehr

Logik. Gabriele Kern-Isberner LS 1 Information Engineering. TU Dortmund Wintersemester 2014/15 WS 2014/15

Logik. Gabriele Kern-Isberner LS 1 Information Engineering. TU Dortmund Wintersemester 2014/15 WS 2014/15 Logik Gabriele Kern-Isberner LS 1 Information Engineering TU Dortmund Wintersemester 2014/15 WS 2014/15 G. Kern-Isberner (TU Dortmund) Logik WS 2014/15 1 / 125 Übersicht Modallogik 5. Grundlagen 6. Erfüllbarkeit

Mehr

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Algorithmus. Wie beschreibt man Algorithmen?

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Algorithmus. Wie beschreibt man Algorithmen? Programm heute Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2015 1 Einführung Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München 2 Grundlagen von Algorithmen

Mehr

Funktionen in JavaScript

Funktionen in JavaScript Funktionen in JavaScript Eine Funktion enthält gebündelten Code, der sich in dieser Form wiederverwenden lässt. Mithilfe von Funktionen kann man denselben Code von mehreren Stellen des Programms aus aufrufen.

Mehr

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 - 1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen I.2. I.2. Grundlagen von von Programmiersprachen. - 1 - 1. Der Begriff Informatik "Informatik" = Kunstwort aus Information und Mathematik

Mehr

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 -

1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen - 1 - 1. Der Begriff Informatik 2. Syntax und Semantik von Programmiersprachen I.2. I.2. Grundlagen von von Programmiersprachen. - 1 - 1. Der Begriff Informatik "Informatik" = Kunstwort aus Information und Mathematik

Mehr

Einführung in die Theoretische Informatik

Einführung in die Theoretische Informatik Einführung in die Theoretische Informatik Woche 4 Harald Zankl Institut für Informatik @ UIBK Wintersemester 2014/2015 Zusammenfassung Zusammenfassung der letzten LV Modus Ponens A B B A MP Axiome für

Mehr

/26

/26 7 8 3 3 7 2 8 2 8. /2 Sudoku 2 2 3 3 7 7 8 8 8 Füllen Sie die leeren Felder so aus, dass in jeder Zeile, in jeder Spalte und in jedem 3x3 Kästchen alle Zahlen von bis stehen.. 2/2 Warum? 7 8 3 3 7 2 8

Mehr

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT) Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2016 Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Programm heute 1 Einführung 2 Grundlagen von Algorithmen

Mehr

Grundlagen der Programmierung 3 A

Grundlagen der Programmierung 3 A Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Haskell, Typen, und Typberechnung Ziele: Haskells Typisierung Typisierungs-Regeln

Mehr

Dezimaldarstellung ganzer Zahlen (Division mit Rest) 1 Division mit Rest in der Hochschule

Dezimaldarstellung ganzer Zahlen (Division mit Rest) 1 Division mit Rest in der Hochschule Berufsfeldbezogenes Fachseminar - Zahlentheorie Lisa Laudan Prof. Dr. Jürg Kramer Wintersemester 2014/2015 Dezimaldarstellung ganzer Zahlen (Division mit Rest) 1 Division mit Rest in der Hochschule 1.1

Mehr

03 Boolesche Algebra. Technische Grundlagen der Informatik

03 Boolesche Algebra. Technische Grundlagen der Informatik 03 Boolesche Algebra Technische Grundlagen der Informatik Automation Systems Group E183-1 Institute of Computer Aided Automation Vienna University of Technology email: tgi@auto.tuwien.ac.at Inhalt Operationen

Mehr

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3 Programmieren mit Java Modul 5 Objekte Theorieteil Inhaltsverzeichnis 1 Modulübersicht 3 2 Klassen und Objekte 3 2.1 Klassen.................................... 4 2.2 Objektvariablen und Methoden.......................

Mehr

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3 Programmieren mit Java Modul 3 Arrays Theorieteil Inhaltsverzeichnis 1 Modulübersicht 3 2 Eindimensionale Arrays 3 2.1 Arrays deklarieren.............................. 3 2.2 Arrays erzeugen................................

Mehr

Logik für Informatiker Logic for computer scientists

Logik für Informatiker Logic for computer scientists Logik für Informatiker Logic for computer scientists Till Mossakowski Wintersemester 2014/15 Till Mossakowski Logik 1/ 23 Die Logik der Booleschen Junktoren Till Mossakowski Logik 2/ 23 Aussagenlogische

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable 1 Kapitel 3 Grunddatentypen, Ausdrücke und Variable 2 Eine Datenstruktur besteht aus Grunddatentypen in Java einer Menge von Daten (Werten) charakteristischen Operationen Datenstrukturen werden mit einem

Mehr

Einführung in die Theoretische Informatik. Inhalte der Lehrveranstaltung. Definition (Boolesche Algebra) Einführung in die Logik

Einführung in die Theoretische Informatik. Inhalte der Lehrveranstaltung. Definition (Boolesche Algebra) Einführung in die Logik Zusammenfassung Einführung in die Theoretische Informatik Woche 5 Harald Zankl Institut für Informatik @ UIBK Wintersemester 2014/2015 Zusammenfassung der letzten LV Jede binäre Operation hat maximal ein

Mehr

Ein Fragment von Pascal

Ein Fragment von Pascal Ein Fragment von Pascal Wir beschreiben einen (allerdings sehr kleinen) Ausschnitt von Pascal durch eine kontextfreie Grammatik. Wir benutzen das Alphabet Σ = {a,..., z, ;, :=, begin, end, while, do} und

Mehr

5. Äquivalenzrelationen

5. Äquivalenzrelationen 36 Andreas Gathmann 5. Äquivalenzrelationen Wenn man eine große und komplizierte Menge (bzw. Gruppe) untersuchen will so kann es sinnvoll sein zunächst kleinere einfachere Mengen (bzw. Gruppen) zu betrachten

Mehr

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom Einstieg in die Informatik mit Java, Vorlesung vom 2.5.07 Übersicht 1 2 definition 3 Parameterübergabe, aufruf 4 Referenztypen bei 5 Überladen von 6 Hauptprogrammparameter 7 Rekursion bilden das Analogon

Mehr

Logik für Informatiker

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

Mehr

Die Modellierung der Robotik-Domäne von SAMS im Theorembeweiser Isabelle

Die Modellierung der Robotik-Domäne von SAMS im Theorembeweiser Isabelle C. Hertzberg: Modellierung der SAMS-Robotik-Domäne 1 [12] Die Modellierung der Robotik-Domäne von SAMS im Theorembeweiser Isabelle Christoph Hertzberg Universität Bremen Fachbereich 3 Mathematik und Informatik

Mehr

Aussagenlogische Kalküle

Aussagenlogische Kalküle Aussagenlogische Kalküle Ziel: mit Hilfe von schematischen Regeln sollen alle aus einer Formel logisch folgerbaren Formeln durch (prinzipiell syntaktische) Umformungen abgeleitet werden können. Derartige

Mehr

A α. Theorembeweiserpraktikum. Anwendungen in der Sprachtechnologie. LEHRSTUHL PROGRAMMIERPARADIGMEN

A α. Theorembeweiserpraktikum. Anwendungen in der Sprachtechnologie.  LEHRSTUHL PROGRAMMIERPARADIGMEN Theorembeweiserpraktikum Anwendungen in der Sprachtechnologie LEHRSTUHL PROGRAMMIERPARADIGMEN λ β A α 0 SS 2018 Denis Lohner, Sebastian Ullrich - Theorembeweiserpraktikum LEHRSTUHL PROGRAMMIERPARADIGMEN

Mehr