Funktional-logische Programmierung in Maude

Größe: px
Ab Seite anzeigen:

Download "Funktional-logische Programmierung in Maude"

Transkript

1 Arbeitsgruppe Programmiersprachen und Übersetzerkonstruktion Institut für Informatik Christian-Albrechts-Universität zu Kiel Betreuer: Prof. Dr. Michael Hanus Seminararbeit Funktional-logische Programmierung in Maude Jasper Paul Sikorra Wintersemester 2015/2016

2 Inhaltsverzeichnis 1 Einleitung 1 2 Maude Funktionale Module Systemmodule Full-Maude Full-Maude als Erweiterung von Maude Narrowing in Full-Maude Narrowing als Generalisierung von Termersetzung Die Narrowing Implementierung in Full-Maude Funktional-logische Programmierung in Full-Maude Nicht-deterministische Berechnungen Gleichheitsconstraint Freie Variablen Residuation Zusammenfassung 15 ii

3 1 Einleitung Funktional-logische Sprachen kombinieren zwei Programmierparadigmen: die logische Programmierung und die funktionale Programmierung. Daraus entstehen besondere Eigenschaften, die funktional-logischen Programmiersprache zu eigen sind. In Full-Maude, der Erweiterung der Sprache Maude, können diese Eigenschaften reproduziert werden. Maude ist eine Programmier- und Spezikationssprache deren Programme aus Gleichungen und Rewrite-Regeln bestehen, welche durch Termersetzung ausgewertet werden. In der Erweiterung von Maude namens Full-Maude ist Narrowing implementieren. Narrowing kann eingesetzt werden, um Lösungen für das Problem zu nden, ob eine Termersetzung für einen Term mit freien Variablen durchgeführt werden darf. Narrowing kann auch genutzt werden, um Instanzen für freie Variablen zu generieren. Wie oben beschrieben sind die Sprache Maude und die Erweiterung Full-Maude geeignet, typische funktional-logische Programmeigenschaften zu implementieren. Das bedeutete nicht-deterministische Programmierung, das Ausnutzen von Constraints und das Suchen auf ungebunden Variablen lassen sich in Full-Maude umsetzen[esc14]. Im Folgenden wird zunächst Maude vorgestellt, wobei die Unterscheidung zwischen funktionalen und Systemmodulen eingegangen und die Ausführung von Programmen kurz erklärt wird. Dann wird Full-Maude und vor allem Narrowing in Full-Maude beschrieben. Schlieÿlich werden besondere Features der funktional-logischen Programmierung, wie nicht-deterministische Berechnungen und die Auswertung von Ausdrücken mit freien Variablen vorgestellt und gezeigt wie diese in Full-Maude reproduziert werden können. 1

4 2 Maude Maude ist eine höhere Programmier- und Spezikationssprache, welche auf Termersetzung basiert. Maude-Programme sind in Module aufgeteilt, welche aus einer Signatur, Gleichungen und Termersetzungsregeln bestehen. Gleichungen und Termersetzungsregeln haben eine einfache semantische Bedeutung, nämlich die Ersetzung von Instanzen der linken Seite durch passende Instanzen der rechten Seite. Besteht ein Maude-Modul nur aus einer Signatur und Gleichungen, wird es funktional genannt und wird durch Vereinfachung der Gleichungen ausgewertet. Enthält es auch Termersetzungsregeln so heiÿt es Systemmodul und wird durch Übergänge zwischen Zuständen ausgewertet. Diese Übergänge stellen die Anwendung der Termersetzungsregeln von links nach rechts dar. Auf diese Weise erlaubt es Maude sowohl deterministische, als auch nebenläuge, nichtdeterministische Berechnungen auszuführen und enthält einen funktionalen Teil, welcher eigenständig genutzt werden kann. 2.1 Funktionale Module Ein funktionales Modul in Maude besteht aus Signaturen, welche Datentypen und Operationen deklarieren, und Gleichungen, welche die Operationen denieren. Ein rein funktionales Modul zeichnet sich durch seine Schlüsselwörter aus und besitzt die Struktur: fmod <ModuleName> is <DeclarationsAndStatements> endfm Ein einfaches Beispiel für ein funktionales Modul ist die Denition der Addition auf den Peano-Zahlen mittels Gleichungen: fmod SIMPLE NAT is sort Nat. op zero : > Nat [ctor]. op s_ : Nat > Nat [ctor]. op _+_ : Nat Nat > Nat [comm]. vars N M : Nat. eq zero + N = N. eq s N + M = s (N + M). endfm In diesem Beispiel wird eine einfache Algebra über den natürlichen Zahlen beschrieben. In der Signatur werden die Sorte Nat und ihre beiden Konstruktoren (gekennzeichnet durch das Schlüsselwort ctor) deklariert. Auÿerdem wird der Operator + auf der Sorte Nat deklariert und deniert, dass dieser kommutativ ist (gekennzeichnet durch das Schlüsselwort comm). Der Operator wird dann im Sinne der Addition auf den Peano-Zahlen durch 2

5 2 Maude Gleichungen deniert. In Maude können neben Sorten auch Untersorten deklariert werden. Beispielsweise könnten wir eine Untersorte NzNat deklarieren, welche sämtliche natürliche Zahlen enthalten soll, die nicht Null sind: subsort NzNat < Nat. Die Operatoren könnten dann entsprechend angepasst werden: op zero : > Nat [ctor]. op s_ : Nat > NzNat [ctor]. op _+_ : Nat Nat > Nat [comm]. op _+_ : NzNat Nat > NzNat [comm]. Eine Berechnung in einem funktionalen Modul ist die Vereinfachung von Termen mit Hilfe von Gleichungen. Bei einem Vereinfachungsschritt für einen Term wird nach einer Belegung für die Variablen in einer linken Gleichungsseite gesucht, durch die der Term und die Gleichungsseite identisch werden. Der Term wird dann durch die rechte Gleichungsseite unter dieser Belegung ersetzt. Werden solche Vereinfachungsschritte wiederholt, bis keine linke Gleichungsseite mehr angewendet werden kann, so erhält man die kanonische Form des Terms. In einem funktionalen Modul sollte diese für jeden Ausdruck erreichbar sein und nicht von der Auswahl der Gleichungen in den Vereinfachungsschritten abhängen. Das heiÿt ein funktionales Modul sollte konuent und terminierend sein. 1 Erhält man sämtliche kanonische Formen aus Termen, die aus Konstruktoren und Operatoren gebildet werden, so bilden diese zusammen mit den Operatoren genau die im Programm beschriebene Algebra. In unserem Beispiel sind diese kanonischen Formen genau die Menge der Peano-Zahlen {zero, s zero, s s zero,...}. Im Maude Interpreter kann eine Vereinfachung durch das Schlüsselwort reduce eingeleitet werden: Maude> load simple nat.maude Maude> reduce s (s (zero)) + s (zero). reduce in SIMPLE NAT : s s zero + s zero. rewrites: 3 in 0ms cpu (0ms real) (~ rewrites/second) result Nat: s s s zero Hierbei wird der Term so lange vereinfacht, bis keine Gleichung mehr anwendbar ist. Gleichungen können in Maude mit dem Schlüsselwort noexec versehen werden, was dazu führt, dass sie nicht für Vereinfachungen verwendet werden und somit zunächst nur der Spezikation dienen. Weiterhin können Operatoren mit Attributen wie comm versehen werden, um auf bestimmte mathematische Eigenschaften hinzuweisen. Assoziativität und Kommutativität sollte in Maude zum Beispiel nur durch dieses Schlüsselwort ausgedrückt werden, da sonst nicht-terminierenden Vereinfachungen entstehen können. 1 mehr in [Cla+15], Kapitel 4.7 3

6 2 Maude Maude kennt neben Sorten auch noch kinds. Werden zusammenhängende Komponenten von Sorten aus der Ordnungsrelation auf den Sorten gebildet, so hat jede dieser Komponenten einen zugeordneten kind. Jeder Term hat somit auch einen zugeordneten kind. Hat ein Term keine Sorte, aber einen kind, so handelt es sich um einen Error-Term. Dabei werden kinds implizit durch Maude bereitgestellt. Denieren wir zum Beispiel op p_ : NzNat > NzNat dann wird dem Term p zero der kind [NzNat] zugeordnet, jedoch keine Sorte. kinds können auch explizit in der Deklaration von Operatoren benutzt werden. Werden Argumente als kinds deklariert, so gilt die Funktion als deniert für alle Argumente, deren Resultat bei der Funktionsauswertung eine Sorte haben, für alle anderen Argumente liefert die Funktionsauswertung nur einen Error-Term. 2.2 Systemmodule Systemmodule unterscheiden sich grundlegend von funktionalen Modulen. In Systemmodulen werden, zusätzlich zu der Signatur und Gleichungen, Termersetzungsregeln festgelegt, welche ähnlich wie die Gleichungen bei der Vereinfachung immer von links nach rechts angewendet werden. Die Termersetzungsregeln müssen allerdings weder ein kon- uentes noch ein terminierendes System bilden. Bei einem Termersetzungsschritt werden durch Maude zufällige Regeln, deren linke Seite instantiiert werden kann, ausgewählt, um einen Teilterm des Terms umzuschreiben. Das Rewriting ist also im Allgemeinen nicht-deterministisch. Das folgende Modul deniert die additive Zerlegung in die Zahlen eins, zwei und drei mit Hilfe von drei Rewrite-Regeln: mod DECOMPOSITION is protecting SIMPLE NAT. sort NatList. subsort Nat < NatList. op _ _ : NatList NatList > NatList [comm assoc ctor]. endm rl [decomposite1] : s s X:Nat => s(zero) s X:Nat. rl [decomposite2] : s s s X:Nat => s(s(zero)) s X:Nat. rl [decomposite3] : s s s s X:Nat => s(s(s(zero))) s X:Nat. Das Modul wird mit mod... is... endm deklariert, was darauf hinweist, dass es sich um ein Systemmodul handelt. Am Anfang des Moduls wird das funktionale Modul SIMPLE-NAT importiert, welches im letzten Abschnitt vorgestellt wurde. Dann wird die Sorte der Listen über den natürlichen Zahlen deklariert. Einzelne natürliche Zahlen sollen auch zu der Sorte NatList gehören, entsprechend wird Nat als Untersorte deniert. 4

7 2 Maude Dann wird ein Listenkonstruktor _ _ deklariert, welcher zwei Listen konkateniert. Die in diesem Modul denierte Version der Verkettung von Listen ist assoziativ und kommutativ, dass heiÿt die Gleichheit von Listen hängt nicht von der Reihenfolge der Elemente oder der Listenkonkatenation ab. 2 Es werden dann drei Regeln für die additive Zerlegung natürlicher Zahlen in Listen der Zahlen Eins, Zwei und Drei deniert. Mit Hilfe dieser Rewrite-Regeln kann nun Rewriting modulo Gleichungen angewendet werden. Beim Rewriting modulo Gleichungen im Sinne von Maude wird der Term zunächst mit Hilfe der Gleichungen auf seine kanonische Form gebracht und dann ein Teilterm mit einer passenden Rewrite-Regel durch einen anderen Term ersetzt. Das nden einer passende Rewrite-Regel für den Teilterm erfolgt dabei auf die selbe Art wie bei Gleichungen. Das heiÿt es wird eine Belegung für eine linke Regelseite gesucht, die zu einer Identität von Teilterm und Regelseite führt, und der Teilterm dann durch die rechte Regelseite unter der selben Belegung ersetzt. Mit dem search-befehl können in Maude nun mögliche Rewrite-Schritte um einen Term t in einen Term t umzuschreiben, gesucht werden. Dabei können Anzahl der Rewrite- Schritte, Tiefe der Suche und Art der Relation (=>*, =>+, =>!, etc. 3 ) ausgewählt werden. Dabei werden in t im Gegensatz zum Narrowing allerdings keine Variablen neu instantiiert. Mit search können zum Beispiel alle Zerlegungen der Zahl Drei angezeigt werden: Maude> search in DECOMPOSITION : s s s zero =>* Ns:NatList. Solution 1 (state 0) states: 1 rewrites: 0 in 0ms cpu (0ms real) (~ rewrites/second) Ns:NatList > s s s zero Solution 2 (state 1) states: 2 rewrites: 1 in 0ms cpu (0ms real) (~ rewrites/second) Ns:NatList > s zero s s zero Solution 3 (state 3) states: 4 rewrites: 4 in 0ms cpu (0ms real) (~ rewrites/second) Ns:NatList > s zero s zero s zero No more solutions. Es kann auch nach möglichen Teilzerlegungen gesucht werden: Maude> search in DECOMPOSITION : s s s X:Nat =>* Ns:NatList s s zero. Solution 1 (state 2) states: 3 rewrites: 2 in 0ms cpu (0ms real) (~ rewrites/second) Ns:NatList > s X:Nat No more solutions. 2 Es handelt sich hierbei also eher um Multimengen statt Listen. 3 Eine ausführliche Beschreibung ndet sich in [Cla+15] 5

8 2 Maude Würde die in diesem Fall ungebundene Variable X:Nat mit Peano-Zahlen instantiiert werden, so würden noch weitere Lösungen hinzukommen. Dies ist in Maude ohne die Erweiterung allerdings nicht möglich. 6

9 3 Full-Maude 3.1 Full-Maude als Erweiterung von Maude In Maude wurde von Anfang an eine Schnittstelle für Metaprogrammierung vorgesehen. Metaprogrammierung meint dabei die Umprogrammierung der Programmiersprache selbst in der Programmiersprache. Eine Einsatzmöglichkeit von Metaprogrammierung in Maude ist die Erweiterung von Maude selbst. Dies wurde in der Spracherweiterung Full- Maude umgesetzt. Full-Maude enthält sämtliche Features von Maude, sowie verschiedene Erweiterungen wie eine Notation für objekt-orientierte Programmierung und ein generalisierte Form der Termersetzung namens Narrowing. Narrowing ist für die funktional-logische Programmierung von groÿer Bedeutung, da es die Auswertung von Ausdrücken mit freien Variablen erlaubt. 3.2 Narrowing in Full-Maude Narrowing als Generalisierung von Termersetzung In 2.2 wurde Rewriting mittels Termersetzungsregeln erläutert. Rewriting mit Narrowing verallgemeinert dieses. Der Hauptunterschied besteht darin, dass bei dem Suchen nach Belegungen, um eine Identität zwischen Term und linker Regelseite herzustellen, auch freie Variablen in dem Term mit Belegungen versehen werden können. Dies erlaubt deutlich erweiterte Programmierung mit freien Variablen. So kann zum Beispiel die Frage, ob ein Term mit freien Variablen mit einer Instantiierung dieser in einen anderen Term umgeschrieben werden kann, durch eine Ausführung von Rewriting mit Narrowing beantwortet werden Die Narrowing Implementierung in Full-Maude In Full-Maude existiert eine Narrowing-Implementierung von Santiago Escobar. Betrachten wir wieder als Beispiel die Addition, diesmal mit Rewrite-Regeln statt Gleichungen und der Implementierung der natürlichen Zahlen aus Maude selbst: mod NATRL is op _add_ : Nat Nat > Nat. rl 0 add M:Nat => M:Nat. rl s M:Nat add N:Nat => s (M:Nat + N:Nat). endm 7

10 3 Full-Maude Ein Narrowing-Schritt für den Term X add 0 wäre dann X add 0 {X 0, add1} 0. Es würde also eine Belegung für die freie Variable X gefunden werden, unter der eine Rewrite-Regel angewendet werden kann. Das Resultat ist dann die rechte Seite dieser Rewrite-Regel mit der selben Belegung. Ein anderer Narrowing-Schritt wäre X add 0 {X s Y,add2} s (Y add 0). Es lässt sich das search-kommando nun auch mit Narrowing benutzen, verwenden wir wieder das Beispiel aus 2.2, so erhalten wir mehr Lösungen. Maude> (search [2] in DECOMPOSITION : s s s X:Nat ~>* Ns:NatList s s zero.) Solution 1 Ns:NatList > s X:Nat Solution 2 Ns:NatList > s s s zero ; X:Nat > s s zero No more solutions. Die Anzahl der Lösungen wurde in diesem Fall auf zwei beschränkt. Bei der zweiten Lösung erfolgt die Instantiierung der Variable X durch Narrowing. Diese Lösung haben wir im Beispiel in 2.2 nicht erhalten. 8

11 4 Funktional-logische Programmierung in Full-Maude Funktional-logische Programmierung ist eine Form der deklarativen Programmierung. Dabei werden wichtige Paradigmen der funktionalen und der logischen Programmierung vereint. Funktionale Programme bestehen aus Daten und Funktionen, ihre Semantik entspricht Funktionsauswertungen. Logische Programme bestehen aus Fakten und Regeln aus denen mit Hilfe von Inferenzsystemen Schlüsse berechnet werden können. Logische Programme können auch mit freien Variablen ausgewertet werden, indem nach passenden Werten gesucht wird. Die besonderen Vorteile funktionaler Sprachen, wie die Möglichkeit der Bedarfsauswertung, von polymorphen Typen und Funktionen höherer Ordnung werden in funktionallogischen Programmiersprachen mit den Vorteilen der logischen Programmierung, wie Berechnungen mit partiellen Informationen und Constraint-Solving, kombiniert. Aus mathematischer Sicht basieren funktionale Programmiersprachen auf dem λ-kalkül, während logische auf der Prädikatenlogik erster Stufe aufbauen. Bei der Vereinigung dieser beiden grundverschiedenen Systeme kann Narrowing eingesetzt werden 1. Maude bietet oensichtlich Möglichkeiten der rein funktionalen Programmierung, was durch die Aufteilung in funktionale und Systemmodule deutlich wird. Die nicht-deterministische Auswertung ist in durch das nicht-deterministische Rewriting vorhanden. Im Folgenden wird daher auf die Reproduktion der besonderen Eigenschaften des Nicht- Determinismus in funktional-logischen Programmiersprachen und das Rechnen mit freien Variablen und Constraints eingegangen. 4.1 Nicht-deterministische Berechnungen Nicht-Determinismus bedeutet, dass ein Ausdruck zu unterschiedlichen Ergebnissen ausgewertet werden kann. In Curry ist es möglich Nicht-Determinismus durch den Operator? auszudrücken. In dem folgenden Programm kann nicht zugesichert werden, zu welcher Zahl die Konstante coin ausgewertet wird, möglich sind 0 und 1. coin = 0? 1 In Maude würde man diesen Nicht-Determinismus durch Rewrite-Regeln ausdrücken: op coin : > Nat. rl coin => 0. rl coin => 1. 1 Vergleiche [Han13] 9

12 4 Funktional-logische Programmierung in Full-Maude Werden in Curry nicht-deterministische Parameter an deterministische Funktionen übergeben, so kann das Ergebnis von der Auswertungsstrategie abhängen. Nehmen wir etwa das Curry-Programm double : : Int > Int double x = x + x welches eine einfache Funktion deniert. Bei der Auswertung von double coin variiert nun die Menge der möglichen Ergebnisse je nach Auswertungszeitpunkt des nichtdeterministischen Arguments. Wird das Argument vor der Funktionsauswertung ausgewertet (call-time choice), so ist die Menge der möglichen Ergebnisse des Aufrufs {0, 2}. Wird das Argument ausgewertet, wenn es während der Funktionsauswertung aufgerufen wird (run-time choice), so erhalten wir {0, 1, 2} als mögliche Ergebnisse von double coin. Ähnliche Ergebnisse können auch in Maude erzielt werden. Dafür deklarieren wir double und denieren passende Rewrite-Regeln: op double : Nat > Nat. rl double(n:nat) => N:Nat + N:Nat. Führen wir nun mit Maude ein search aus, so erhalten wir drei Ergebnisse für double(coin): Maude> search in NATLR : double(coin) =>! N:Nat. N:Nat > 0 N:Nat > s 0 N:Nat > s s 0 No more solutions. In diesem Fall werden in Maude alle möglichen Rewrite-Schritte probiert, was zu der Ergebnismenge {0, 1, 2} führt. Hierbei handelt es sich allerdings weder um eine calltime choice noch um eine run-time choice Semantik, da alle möglichen Rewrite-Schritte ausprobiert werden. Es ist möglich kinds einzusetzen, um die Auswertungsstrategie zu ändern. Wir können zum Beispiel die Signatur von coin ändern, so dass nicht mehr zugesichert wird, dass kein Error-Term geliefert wird: op coin : > [Nat]. Das führt dazu das auf den gesamten Term double(coin) keine Rewrite-Regeln mehr angewendet werden können, da in der Rewrite-Regel von double die Variable von der Sorte Nat sein muss. Es muss also der Teilterm coin umgeschrieben werden, bevor die Regel angewendet werden kann. Nach dieser Änderung liefert search nur noch {0, 2} als Ergebnisse. Um eine echte run-time choice Semantik zu erzeugen, erlauben wir den Error-Term als Parameter für double. Auÿerdem setzten wir das Parameter auf frozen. Dies führt dazu, dass keine Rewrite-Regel auf diesen Teilterm angewendet werden darf. Daraus folgt, dass zunächst die Regel für double angewendet werden muss. 10

13 4 Funktional-logische Programmierung in Full-Maude op double : [Nat] > Nat [frozen (1)]. rl double(n:[nat]) => N:[Nat] + N:[Nat]. Wir erhalten nun wieder {0, 1, 2} als Ergebnismenge. Ein typisches Beispiel für die Anwendung von Nicht-Determinismus ist die Permutation von Listen. Dabei wird eine Funktion permute deniert, welche eine nicht-deterministische insert Funktion aufruft und nicht-deterministisch Permutationen der Liste zurück liefert. Dies kann in Maude umgesetzt werden: mod PERMUTATION is protecting LIST{Nat}. vars X,Y : Nat. var XS : List{Nat}. op permute : List{Nat} > [List{Nat}]. rl permute(nil) => nil. rl permute(x XS) => insert(x, permute(xs)). op insert : Nat List{Nat} > [List{Nat}]. rl insert (X, nil) => X nil. rl insert (X, Y XS) => X Y XS. rl insert (X, Y XS) => Y insert(x, XS). endm In diesem Fall wird wieder call-time choice benutzt. Nun lassen sich zum Beispiel nichtdeterministisch alle Permutationen der Liste [1 2 3] berechnen, die mit 2 anfangen: Maude> search in PERMUTATION : permute(1 2 3) =>! 2 N:List{Nat}. N:List{Nat} > 1 3 N:List{Nat} > 3 1 No more solutions. 4.2 Gleichheitsconstraint In funktional-logischen Programmiersprachen kann die Anwendung von Gleichungen an die Erfüllung von Bedingungen geknüpft werden. In Curry gibt es dafür den Operator =:=. Dieser Operator kann als ein Constraint verstanden werden, welches erfüllt werden muss, damit die Gleichung angewendet werden kann. Dieser Gleichheitsconstraint e 1 =:=e 2 wird genau dann erfüllt, wenn eine Belegung für e 1 und e 2 gefunden werden kann, so dass e 1 ==e 2 gilt. In Curry kann weiterhin der Operator &> verwendet werden, um einen Constraint an einen Ausdruck zu binden. Dabei wird ein Term c &> e mit Constraint c und Ausdruck e auch als Constraint Expression bezeichnet. Ein Beispiel für eine solche Constraint Expression ist die eine Denition der Subtraktion auf den Peano-Zahlen: 11

14 4 Funktional-logische Programmierung in Full-Maude data Peano = Zero P Peano add : : Peano > Peano > Peano add Zero n = n add (P n) m = P ( add n m) sub n m = add x m =:= n &> x where x f r e e In diesem Beispiel wird eine freie Variable x eingeführt, mit einer Suche auf ihr der Gleichheitsconstraint gelöst und diese als Ergebnis der Subtraktion ausgegeben. Der Gleichheitsconstraint kann in Maude mit Hilfe einer Konstanten success und einer Rewrite-Regel deniert werden: sort Success. op success : > Success [ctor]. op _=:=_ : Nat Nat > [Success] [comm]. rl X:Nat =:= X:Nat => success. Es wird in diesem Fall angenommen, dass als Resultat von nicht-deterministischen Operatoren immer als kind deklariert wird. Wie oben gezeigt wurde, führt dies zu einer call-time choice Semantik, wenn die Funktionsargument als Sorten deklariert werden. Dies ist für den Operator =:= der Fall. Ansonsten würde coin =:= coin zu success ausgewertet werden, ohne das der Nicht-Determinismus aufgelöst würde. Um eine Constraint Expression zu ermöglichen muss noch ein weiterer Operator &> de- niert werden. Diesen nennen wir in Maude in um und denieren ihn folgendermaÿen: op _>>_ : [Success] [Nat] > [Nat] [frozen (2) strat (1 0)]. rl success >> X:[Nat] => X:[Nat]. In der Deklaration des Operators ist das zweite Argument als frozen markiert, was dazu führt, dass dieses Argument nicht durch Rewriting ersetzt werden kann. Dies hat zur Konsequenz, dass das zweite Argument niemals durch die Anwendung einer Regel verändert wird, bevor das erste Argument zu success umgeschrieben wurde, was der Semantik des Constraint entspricht. Der Operator ist weiterhin mit strat 1 0 gekennzeichnet, was bedeutet, dass zunächst das erste Argument vereinfacht wird, bevor der gesamte Term vereinfacht werden kann. Dies ist wichtig, da auf diese Weise rekursive Vereinfachungen abgefangen werden können. Mit Hilfe des Gleichheitsconstraints haben wir die Voraussetzung um ungebundene Variablen in Maude Programmen zu benutzen. 12

15 4 Funktional-logische Programmierung in Full-Maude 4.3 Freie Variablen Ungebundene oder logische Variablen sind ein Merkmal von funktional-logischen Sprachen. Auch in Curry ist es möglich, freie Variablen zu benutzen. Diese Variablen werden mit where... free deklariert und es wird automatisch nach passenden Belegungen gesucht. Im folgenden Beispiel sind ys und e freie Variablen: l a s t xs = ys++[e ] =:= xs &> e where ys, e f r e e Die Funktion last berechnet das letzte Element einer Liste. Bei der Auswertung werden ys und e mit passenden Werten belegt. Das gleiche Verhalten kann in Full-Maude erzeugt werden. Dazu wird zunächst das Gleichheitsconstraint auf den in 2.2 denierten Listen von natürlichen Zahlen 2 deniert: mod CONSTRAINT is protecting DECOMPOSITION. sort Success. op success : > Success [ctor]. op _=:=_ : NatList NatList > [Success] [comm]. rl X:NatList =:= X:NatList => success. endm op _>>_ : [Success] [NatList] > [NatList] [frozen (2) strat (1 0)]. rl success >> X:[NatList] => X:[NatList]. Mit Hilfe dieses Operators können wir jetzt die Funktion last wie in Curry denieren: op last : NatList > [Nat]. rl last(ls:natlist) => (R:NatList L:Nat) =:= LS:NatList >> L:Nat [nonexec]. Mit Narrowing können wir damit das letzte Element einer Liste berechnen. In dieser Denition kommen zwei freie Variablen R und L vor. Aus diesem Grund müssen wir das noexec-attribut verwenden, da Maude dies sonst nicht erlaubt. 4.4 Residuation In der logischen Programmierung gibt es verschiedene Strategien um das Lösen von mehreren Constraints zu beschleunigen. Residuation ist eine solche Strategie, deren Ansatz darin besteht, das Lösen von Constraints zu pausieren, bis eine neue Instantiierung durch ein anderes Constraint erfolgt ist. Das Hauptprinzip hinter Residuation ist so lange mit einem Funktionsaufruf in einem Constraint zu warten, bis die nicht-deterministische Auswertung der Argumente beendet ist. Residuation steht unter anderem in Curry zur Verfügung. Um Residuation in Maude zu ermöglichen, wird zunächst ein Operator für die Kombination von Constraints deniert: 2 Allerdings ohne die Kommutativität der Konkatenation! 13

16 4 Funktional-logische Programmierung in Full-Maude op _&_ : [Success] [Success] > [Success] [assoc comm id: success]. Da Maude immer Vereinfachungen ausführt bevor Termersetzungsregeln angewendet werden, ist es relativ einfach Residuation umzusetzen, indem man die Funktionen als Gleichungen und die Instantiierung als Rewriting-Regeln deniert. Ein einfaches Programm, welches eine Variable nicht-deterministisch mit natürlichen Zahlen instantiiert und die Addition als Gleichungen deniert, wurde von Escobar folgendermaÿen implementiert: op nat : Nat > [Success]. rl nat(0) => success. rl nat(s N) => nat(n). op _+_ : Nat Nat > [Nat]. eq 0 + M = M. eq (s N) + M = s (N + M). Es kann nun eine Operation deniert werden, welche Residuation zur Berechnung benutzt: op sub : Nat > Nat > [Nat]. rl sub(x:nat, Y:Nat) => nat(z:nat) & Z:Nat + Y:Nat =:= X:Nat >> Z:Nat [nonexec]. Es wird dabei immer zuerst Z instantiiert, bevor die Addition vereinfacht wird um den Constraint zu lösen. 14

17 5 Zusammenfassung In dieser Arbeit wurde beschrieben, wie funktional-logische Programmierung in Maude funktioniert. Dazu wurde die Programmier- und Spezikationssprache kurz beschrieben, wobei auf Syntax und Semantik der funktionalen und Systemmodule von Maude eingegangen wurde. Es wurde dann die Erweiterung von Maude mit dem Namen Full-Maude und das in dieser enthaltene Modul für Narrowing vorgestellt. Im Anschluss wurde gezeigt, wie Nicht-Determinismus, Constraints und freie Variablen in Full-Maude so verwendet werden können, wie es in funktional-logischen Sprachen wie Curry möglich ist. Es wurde ersichtlich, dass Konzept aus Curry, wie Residuation, durch die Syntax und Semantik von Maude-Programmen einfach umgesetzt werden können. Durch die Unterstützung von und Kombination aus gleichungsbasierten Vereinfachungen und regelbasierter, nicht-deterministischer Termersetzung sind mächtige Werkzeuge für diese Anwendungsfälle gegeben. Bisher wurde nur ein Narrowing Ansatz in Full-Maude umgesetzt. Needed Narrowing, eine Technologie die in Curry vorhanden ist und die der Bedarfsauswertung in funktionalen Programmen ähnelt, fehlt bislang in Maude. Wie performant die von Escobar implementierte Narrowing Lösung im Vergleich zu anderen Sprachen wie Curry ist, wurde in dieser Arbeit, wie auch in Escobars Aufsatz, nicht evaluiert. 15

18 Literatur [Cla+15] Manuel Clavel u. a. Maude Manual (Version 2.7). März [Esc14] [Han13] Santiago Escobar. Functional Logic Programming in Maude. In: Specication, Algebra, and Software. Hrsg. von Shusaku Iida, José Meseguer und Kazuhiro Ogata. Bd Lecture Notes in Computer Science. Springer Berlin Heidelberg, 2014, S M. Hanus. Functional Logic Programming: From Theory to Curry. In: Programming Logics - Essays in Memory of Harald Ganzinger. Springer LNCS 7797, 2013, S

Foundations of Systems Development

Foundations of Systems Development Foundations of Systems Development Vergleich und Zusammenfassung Martin Wirsing in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer WS 2007/08 2 Ziele Wichtige Aspekte von algebraischen Spezikationen

Mehr

Foundations of System Development

Foundations of System Development Foundations of System Development Martin Wirsing in cooperation with Axel Rauschmayer WS 05/06 Vergleich am Beispiel der Uhr: Maude und TLA 2 1. Uhr in TLA TLA spezifiziert die Menge aller möglichen (unendlichen)

Mehr

Escher funktionale und logische Programmierung

Escher funktionale und logische Programmierung Escher funktionale und logische Programmierung Seminar Programming Languages From Hell Lars Hupel 2010-06-07 Dieses Werk ist lizenziert unter den Bedingungen der Creative Commons Namensnennung 3.0 Deutschland.

Mehr

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell): Was bisher geschah deklarative Programmierung funktional: Programm: Menge von Termgleichungen, Term Auswertung: Pattern matsching, Termumformungen logisch: Programm: Menge von Regeln (Horn-Formeln), Formel

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

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Milners

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

Verträge für die funktionale Programmierung Design und Implementierung

Verträge für die funktionale Programmierung Design und Implementierung 1 Verträge für die funktionale Programmierung Design und Implementierung RALF HINZE Institut für Informatik III, Universität Bonn Römerstraße 164, 53117 Bonn, Germany Email: ralf@informatik.uni-bonn.de

Mehr

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Typdeklarationen. Es gibt in Haskell bereits primitive Typen: Typdeklarationen Es gibt in bereits primitive Typen: Integer: ganze Zahlen, z.b. 1289736781236 Int: ganze Zahlen mit Computerarithmetik, z.b. 123 Double: Fließkommazahlen, z.b. 3.14159 String: Zeichenketten,

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

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

2 Mengen und Abbildungen

2 Mengen und Abbildungen 2.1 Mengen Unter einer Menge verstehen wir eine Zusammenfassung von Objekten zu einem Ganzen. Die Objekte heiÿen Elemente. Ist M eine Menge und x ein Element von M so schreiben wir x M. Wir sagen auch:

Mehr

Objektorientierte Modellierung (1)

Objektorientierte Modellierung (1) Objektorientierte Modellierung (1) Die objektorientierte Modellierung verwendet: Klassen und deren Objekte Beziehungen zwischen Objekten bzw. Klassen Klassen und Objekte Definition Klasse Eine Klasse ist

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Repetitorium Informatik (Java)

Repetitorium Informatik (Java) Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen

Mehr

Zahlen in Haskell Kapitel 3

Zahlen in Haskell Kapitel 3 Einführung in die Funktionale Programmiersprache Haskell Zahlen in Haskell Kapitel 3 FH Wedel IT-Seminar: WS 2003/04 Dozent: Prof. Dr. Schmidt Autor: Timo Wlecke (wi3309) Vortrag am: 04.11.2003 - Kapitel

Mehr

Die Programmiersprache C Eine Einführung

Die Programmiersprache C Eine Einführung Die Programmiersprache C Eine Einführung Christian Gentsch Fakutltät IV Technische Universität Berlin Projektlabor 2. Mai 2014 Inhaltsverzeichnis 1 Einführung Entstehungsgeschichte Verwendung 2 Objektorientiert

Mehr

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich 13 OOP MIT DELPHI Delphi war früher "Object Pascal". Dieser Name impliziert eine Funktionalität, welche in der Welt der Programmierung nicht mehr wegzudenken ist: die objektorientierte Programmierung,

Mehr

Javakurs 2013 Objektorientierung

Javakurs 2013 Objektorientierung Javakurs 2013 Objektorientierung Objektorientierte Programmierung I Armelle Vérité 7 März 2013 Technische Universität Berlin This work is licensed under the Creative Commons Attribution-ShareAlike 3.0

Mehr

Erstellung von Bibliotheken in CoDeSys V3

Erstellung von Bibliotheken in CoDeSys V3 Dokument Version 2.0 3S - Smart Software Solutions GmbH Seite 1 von 10 INHALT 1 EINFÜHRUNG 3 2 BIBLIOTHEKSKONZEPT IM DETAIL 4 2.1 Kategorien von Bibliotheken 4 2.1.1 System 4 2.1.2 Internal 4 2.1.3 Application

Mehr

Gruppentheorie und Symmetrie in der Chemie

Gruppentheorie und Symmetrie in der Chemie Gruppentheorie und Symmetrie in der Chemie Martin Schütz Institut für theoretische Chemie, Universität Stuttgart Pfaffenwaldring 55, D-70569 Stuttgart Stuttgart, 26. April 2002 Mathematische Definition

Mehr

(Man sagt dafür auch, dass die Teilmenge U bezüglich der Gruppenoperationen abgeschlossen sein muss.)

(Man sagt dafür auch, dass die Teilmenge U bezüglich der Gruppenoperationen abgeschlossen sein muss.) 3. Untergruppen 19 3. Untergruppen Nachdem wir nun einige grundlegende Gruppen kennengelernt haben, wollen wir in diesem Kapitel eine einfache Möglichkeit untersuchen, mit der man aus bereits bekannten

Mehr

Mathematik 1 für Informatik Inhalt Grundbegrie

Mathematik 1 für Informatik Inhalt Grundbegrie Mathematik 1 für Informatik Inhalt Grundbegrie Mengen, speziell Zahlenmengen Aussagenlogik, Beweistechniken Funktionen, Relationen Kombinatorik Abzählverfahren Binomialkoezienten Komplexität von Algorithmen

Mehr

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte Grundkonzepte Objektorientierter Programmierung Nicole Himmerlich FSU Jena mit Java, Oberon-2, Object-Pascal und Python Inhaltsüberblick I. Grundbegriffe 1) Kopplung 2) Datenkaspelung 3) Konstruktor 4)

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Funktionale Programmierung

Funktionale Programmierung Funktionale Programmierung Jörg Kreiker Uni Kassel und SMA Solar Technology AG Wintersemester 2011/2012 2 Teil II Typen mit Werten und Ausdruck, sogar listenweise 3 Haskell Programme Programm Module ein

Mehr

1. Erläutern Sie die Aufgaben von Datentypen in der imperativen Programmierung.

1. Erläutern Sie die Aufgaben von Datentypen in der imperativen Programmierung. 1. Erläutern Sie die Aufgaben von Datentypen in der imperativen Programmierung. Beschreiben Sie ferner je einen frei gewählten Datentyp aus der Gruppe der skalaren und einen aus der Gruppe der strukturierten

Mehr

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4.

Programmierparadigmen. Programmierparadigmen. Imperatives vs. objektorientiertes Programmieren. Programmierparadigmen. Agenda für heute, 4. Agenda für heute, 4. Mai, 2006 Programmierparadigmen Imperative Programmiersprachen In Prozeduren zusammengefasste, sequentiell ausgeführte Anweisungen Die Prozeduren werden ausgeführt, wenn sie als Teil

Mehr

Primitive Datentypen und Felder (Arrays)

Primitive Datentypen und Felder (Arrays) Primitive Datentypen und Felder (rrays) Primitive Datentypen Java stellt (genau wie Haskell) primitive Datentypen für Boolesche Werte, Zeichen, ganze Zahlen und Gleitkommazahlen zur Verfügung. Der wichtigste

Mehr

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden Kapitel 8 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Methoden Überladen von Methoden Der this-zeiger Konstruktoren Vererbung WS 07/08

Mehr

Differenzengleichungen. und Polynome

Differenzengleichungen. und Polynome Lineare Differenzengleichungen und Polynome Franz Pauer Institut für Mathematik, Universität Innsbruck Technikerstr. 13/7, A-600 Innsbruck, Österreich franz.pauer@uibk.ac.at 1 Einleitung Mit linearen Differenzengleichungen

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

Java Einführung Operatoren Kapitel 2 und 3

Java Einführung Operatoren Kapitel 2 und 3 Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren 2 Operatoren Abhängig

Mehr

expr :: Expr expr = Mul (Add (Const 3) (Const 4)) (Div (Sub (Const 73) (Const 37)) (Const 6))

expr :: Expr expr = Mul (Add (Const 3) (Const 4)) (Div (Sub (Const 73) (Const 37)) (Const 6)) 1 - Korrektur 2 - Abstrakte Datentypen für arithmetische Ausdrücke Der Datentyp Wir beginnen zunächst mit dem algebraischen Datentyp für Ausdrücke. Hierfür definieren wir einen Konstruktor Number für Zahlen,

Mehr

Sudoku. Warum 6? Warum 6?

Sudoku. Warum 6? Warum 6? . / Sudoku Füllen Sie die leeren Felder so aus, dass in jeder Zeile, in jeder Spalte und in jedem x Kästchen alle Zahlen von bis stehen.. / Warum?. / Warum?. / Geschichte der Logik Syllogismen (I) Beginn

Mehr

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen Was bisher geschah Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen Syntax: Signatur Semantik: Axiome (FOL-Formeln, meist

Mehr

Vererbung & Schnittstellen in C#

Vererbung & Schnittstellen in C# Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung

Mehr

Prof. W. Henrich Seite 1

Prof. W. Henrich Seite 1 Klasse - ist ein benutzerdefinierter Datentyp (Referenztyp) - hat Datenelemente - hat Methoden - Konstruktor ist spezielle Methode zum Erstellen eines Objektes vom Typ der Klasse (Instanz) - jede Klasse

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

Programmieren in C/C++ und MATLAB

Programmieren in C/C++ und MATLAB Programmieren in C/C++ und MATLAB Sven Willert Sabine Schmidt Christian-Albrechts-Universität zu Kiel CAU 4-1 Übung 1) Schreiben Sie ein Programm, das die Fläche unter einer Parabel, also das Integral

Mehr

Binärbäume als weiteres Beispiel für abstrakte Datentypen in PVS mit in Knoten gespeicherten Werten vom Typ T:

Binärbäume als weiteres Beispiel für abstrakte Datentypen in PVS mit in Knoten gespeicherten Werten vom Typ T: Binäre Bäume Binärbäume als weiteres Beispiel für abstrakte Datentypen in PVS mit in Knoten gespeicherten Werten vom Typ T: BinTree [T: TYPE]: DATATYPE empty: empty? node (key: T, left:bibtree, right:bibtree):

Mehr

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme Bisher Datentypen: einfach Zahlen, Wahrheitswerte, Zeichenketten zusammengesetzt Arrays (Felder) zur Verwaltung mehrerer zusammengehörender Daten desselben Datentypes eindimensional, mehrdimensional, Array-Grenzen

Mehr

Funktionale Programmierung. der direkte Weg vom Modell zum Programm

Funktionale Programmierung. der direkte Weg vom Modell zum Programm 1 Funktionale Programmierung der direkte Weg vom Modell zum Programm Peter Padawitz, TU Dortmund 19. Juni 2010 2 Inhalt Modelle Bestandteile eines Modells Konstruktor- versus destruktorbasierte Modelle

Mehr

Lineare Gleichungssysteme

Lineare Gleichungssysteme Christian Serpé Universität Münster 14. September 2011 Christian Serpé (Universität Münster) 14. September 2011 1 / 56 Gliederung 1 Motivation Beispiele Allgemeines Vorgehen 2 Der Vektorraum R n 3 Lineare

Mehr

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011 Programmieren I Martin Schultheiß Hochschule Darmstadt Wintersemester 2010/2011 1 Operatoren für elementare Datentypen 2 Bedingte Anweisungen 3 Schleifen Zuweisungsoperator Die Zuweisung von Werten an

Mehr

Haskell zur Constraint-Programmierung HaL8

Haskell zur Constraint-Programmierung HaL8 Haskell zur Constraint-Programmierung HaL8 Alexander Bau 2. Mai 2013 Wir benutzen eine Teilmenge von Haskell zur Spezifikation von Constraint- Systemen über Haskell-Datentypen. Ein Constraint-Compiler

Mehr

Auswahl von Klauseln und Atomen in Prolog

Auswahl von Klauseln und Atomen in Prolog 5.6 Prolog... ist die bekannteste Implementierung einer LP-Sprache; wurde Anfang der 1970er von Alain Colmerauer (Marseille) und Robert Kowalski (Edinburgh) entwickelt. konkretisiert den vorgestellten

Mehr

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme Bisher Datentypen: einfach Zahlen, Wahrheitswerte, Zeichenketten zusammengesetzt Arrays (Felder) zur Verwaltung mehrerer zusammengehörender Daten desselben Datentypes eindimensional, mehrdimensional, Array-Grenzen

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl PROGRAMMIEREN MIT C Allgemeine hinweise Alles was hier beschrieben wird, soll auch ausprobiert werden. Warum C? Weil die coolen Dinge mit C am einfachsten gehen. Das werden wir in den folgenden Übungen

Mehr

Funktionale Programmierung mit Haskell

Funktionale Programmierung mit Haskell Funktionale Programmierung mit Haskell Dr. Michael Savorić Hohenstaufen-Gymnasium (HSG) Kaiserslautern Version 20120622 Überblick Wichtige Eigenschaften Einführungsbeispiele Listenerzeugung und Beispiel

Mehr

Übungsaufgaben zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 6

Übungsaufgaben zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 6 Prof. Dr. Wilhelm Schäfer Paderborn, 24. November 204 Christian Brenner Tristan Wittgen Besprechung der Aufgaben:. - 4. Dezember 204 Übungsaufgaben zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren Themen Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren Statische Methoden Klassenmethoden Merkmal der Klasse nicht eines einzelnen Objekts

Mehr

Strukturierte Objekttypen

Strukturierte Objekttypen Strukturierte Objekttypen Der Typ t approxmatch row des letzten Beispiels ist ein sogenannter Objekttyp. Definition: Ein Objekttyp ist ein Datentyp, bei dem (u.u. verschiedene) bekannte Datentypen zu einem

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Einführung in die Informatik

Einführung in die Informatik Einführung in die Informatik Jochen Hoenicke Software Engineering Albert-Ludwigs-University Freiburg Sommersemester 2014 Jochen Hoenicke (Software Engineering) Einführung in die Informatik Sommersemester

Mehr

Generische Record-Kombinatoren mit statischer Typprüfung

Generische Record-Kombinatoren mit statischer Typprüfung System Generische mit statischer Typprüfung Brandenburgische Technische Universität Cottbus Lehrstuhl Programmiersprachen und Compilerbau Lehrstuhlkolloquium am 13. Januar 2010 Überblick System System

Mehr

Mathematische Grundlagen der Computerlinguistik Relationen und Funktionen

Mathematische Grundlagen der Computerlinguistik Relationen und Funktionen Mathematische Grundlagen der Computerlinguistik Relationen und Funktionen Dozentin: Wiebke Petersen 2. Foliensatz Wiebke Petersen math. Grundlagen 25 n-tupel und Cartesisches Produkt Mengen sind ungeordnet,

Mehr

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl Funktionen Zusammenfassung von Befehlssequenzen als aufrufbare/wiederverwendbare Funktionen in einem Programmblock mit festgelegter Schnittstelle (Signatur) Derartige prozedurale Programmierung erlaubt

Mehr

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Inhalt SWP Funktionale Programme (2. Teil) Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie wotawa@ist.tugraz.at Interpreter für funktionale Sprache

Mehr

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe Prof. Dr. Oliver Haase Oliver Haase Hochschule Konstanz 1 Was sind Operatoren? Ein Operator ist eine in die Programmiersprache eingebaute Funktion,

Mehr

4 Kontrollfluss-Diagramme

4 Kontrollfluss-Diagramme 4 Kontrollfluss-Diagramme In welcher Weise die Operationen eines Programms nacheinander ausgeführt werden, läßt sich anschaulich mithilfe von Kontrollfluss-Diagrammen darstellen. Ingredienzien: Start Stop

Mehr

Grundlagen der Informatik I (Studiengang Medieninformatik)

Grundlagen der Informatik I (Studiengang Medieninformatik) Grundlagen der Informatik I (Studiengang Medieninformatik) Thema: 3. Datentypen, Datenstrukturen und imperative Programme Prof. Dr. S. Kühn Fachbereich Informatik/Mathematik Email: skuehn@informatik.htw-dresden.de

Mehr

5 Logische Programmierung

5 Logische Programmierung 5 Logische Programmierung Logik wird als Programmiersprache benutzt Der logische Ansatz zu Programmierung ist (sowie der funktionale) deklarativ; Programme können mit Hilfe zweier abstrakten, maschinen-unabhängigen

Mehr

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

C++ - Operatoren. Eigene Klassen mit neuen Funktionen C++ - Operatoren Eigene Klassen mit neuen Funktionen Übersicht Klassen bisher Eigene Operatoren definieren 2 Bisher Durch Kapselung, Vererbung und Polymorphy können nun eigene Klassen definiert werden,

Mehr

Python ist leicht zu erlernen, unterstützt mehrere Programmierparadigmen und ist klar strukturiert.

Python ist leicht zu erlernen, unterstützt mehrere Programmierparadigmen und ist klar strukturiert. 1 Einführung In diesem Kapitel wird die moderne Programmiersprache Python vorgestellt. Nach einigen Bemerkungen zur Installation dieser Sprache wird gezeigt, wie Python interaktiv ausgeführt werden kann.

Mehr

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren: 5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen 5. Abstrakte Klassen Beispiel Beispiel (3) Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Probleme des Implementierungsvorschlags:

Mehr

Objektorientiertes Programmieren für Ingenieure

Objektorientiertes Programmieren für Ingenieure Uwe Probst Objektorientiertes Programmieren für Ingenieure Anwendungen und Beispiele in C++ 18 2 Von C zu C++ 2.2.2 Referenzen und Funktionen Referenzen als Funktionsparameter Liefert eine Funktion einen

Mehr

Installation. Arbeiten mit der MATLAB-Entwicklungsumgebung. MATLAB als Taschenrechner mit Matrix- und Vektorrechnung.

Installation. Arbeiten mit der MATLAB-Entwicklungsumgebung. MATLAB als Taschenrechner mit Matrix- und Vektorrechnung. Installation. Arbeiten mit der MATLAB-Entwicklungsumgebung. MATLAB als Taschenrechner mit Matrix- und Vektorrechnung. Die heutige Sitzung dient dem ersten Kennenlernen von MATLAB. Wir wollen MATLAB zuerst

Mehr

3 Kurzeinführung in Matlab

3 Kurzeinführung in Matlab 3 Kurzeinführung in Matlab Matlab ist ein sehr leistungsfähiges interaktives Programmpaket für numerische Berechnungen. Nutzen Sie dies parallel zu den Vorlesungen. Sie können damit persönlich erfahren,

Mehr

C.3 Funktionen und Prozeduren

C.3 Funktionen und Prozeduren C3 - Funktionen und Prozeduren Funktionsdeklarationen in Pascal auch in Pascal kann man selbstdefinierte Funktionen einführen: Funktionen und Prozeduren THEN sign:= 0 Funktion zur Bestimmung des Vorzeichens

Mehr

Theorie zu Übung 8 Implementierung in Java

Theorie zu Übung 8 Implementierung in Java Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich Theorie zu Übung 8 Implementierung in Java Klasse in Java Die Klasse wird durch das class-konzept

Mehr

Vorlesung Theoretische Informatik

Vorlesung Theoretische Informatik Vorlesung Theoretische Informatik Automaten und Formale Sprachen Hochschule Reutlingen Fakultät für Informatik Masterstudiengang Wirtschaftsinformatik überarbeitet von F. Laux (Stand: 09.06.2010) Sommersemester

Mehr

Fragenkatalog Software Engineering I & II 25 Februar 1997 Bernd Thomas Ich habe mal eine kleine Liste der Fragen, die ich so in den Prufungsprotokollen gefunden habe, zusammengetragen. Im groen und ganzen

Mehr

Eine Einführung in C-Funktionen

Eine Einführung in C-Funktionen Eine Einführung in C-Funktionen CGK-Proseminar 2014 Philip Gawehn 04.07.2014, Hamburg Inhaltsverzeichnis 1 Einleitung 2 2 Grundlagen 2 2.1 Der Aufbau einer Funktion....................... 2 2.2 Schlüsselwörter.............................

Mehr

Programmierung in Python

Programmierung in Python Programmierung in Python imperativ, objekt-orientiert dynamische Typisierung rapid prototyping Script-Sprache Funktionales und rekursives Programmieren P raktische Informatik 1, W S 2004/05, F olien P

Mehr

Interpreter - Gliederung

Interpreter - Gliederung Institut für Informatik Ludwig-Maximilian Universität Interpreter - Gliederung Programmiersprache Syntax Konkrete Syntax Abstrakter Syntax Baum (Abstrakte Syntax) Parser Syntaktische Struktur einer Sprache

Mehr

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9

Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Prof. Dr. Wilhelm Schäfer Paderborn, 15. Dezember 2014 Christian Brenner Tristan Wittgen Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 9 Aufgabe 1 Codegenerierung

Mehr

Klassenbeziehungen & Vererbung

Klassenbeziehungen & Vererbung Klassenbeziehungen & Vererbung VL Objektorientierte Programmierung Raimund Kirner teilweise nach Folien von Franz Puntigam, TU Wien Überblick Arten von Klassenbeziehungen Untertypen versus Vererbung in

Mehr

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

Algorithmen mit konstantem Platzbedarf: Die Klasse REG Algorithmen mit konstantem Platzbedarf: Die Klasse REG Sommerakademie Rot an der Rot AG 1 Wieviel Platz brauchen Algorithmen wirklich? Daniel Alm Institut für Numerische Simulation Universität Bonn August

Mehr

Übungen zur Vorlesung Wissenschaftliches Rechnen I. Grundelemente von Java. Eine Anweisung. wird mit dem Wertzuweisungsoperator = geschrieben.

Übungen zur Vorlesung Wissenschaftliches Rechnen I. Grundelemente von Java. Eine Anweisung. wird mit dem Wertzuweisungsoperator = geschrieben. Eine Anweisung wird mit dem Wertzuweisungsoperator = geschrieben. Eine Anweisung wird mit dem Wertzuweisungsoperator = geschrieben. Daher ist y = x + 5.6; keine Gleichung, sondern die Anweisung den Wert

Mehr

ist ein regulärer Ausdruck.

ist ein regulärer Ausdruck. Dr. Sebastian Bab WiSe 12/13 Theoretische Grlagen der Informatik für TI Termin: VL 11 vom 22.11.2012 Reguläre Ausdrücke Reguläre Ausdrücke sind eine lesbarere Notation für Sprachen Denition 1 (Regulärer

Mehr

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8 Java 8 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Oktober 2014 JAV8 5 Java 8 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen

Mehr

1 Bedingungen und der Typ bool. Informatik I: Einführung in die Programmierung 5. Bedingungen, bedingte Ausführung und Schleifen. Vergleichsoperatoren

1 Bedingungen und der Typ bool. Informatik I: Einführung in die Programmierung 5. Bedingungen, bedingte Ausführung und Schleifen. Vergleichsoperatoren 1 und der Informatik I: Einführung in die Programmierung 5., bedingte Ausführung und Albert-Ludwigs-Universität Freiburg Bernhard Nebel 27. Oktober 2015 27. Oktober 2015 B. Nebel Info I 3 / 21 Der Vergleichsoperatoren

Mehr

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff Programmieren in C Macros, Funktionen und modulare Programmstruktur Prof. Dr. Nikolaus Wulff Der C Präprozessor Vor einem Compile Lauf werden alle Präprozessor Kommandos/Makros ausgewertet. Diese sind

Mehr

ALP I Einführung in Haskell

ALP I Einführung in Haskell ALP I Einführung in Haskell WS 2012/2013 Was ist Haskell? Haskell ist eine rein Funktionale Programmiersprache mit einer nach Bedarf Auswertung-Strategie oder "Lazy Evaluation". Was bedeutet rein funktional?

Mehr

Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net

Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net Jürgen Bayer Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net Inhaltsverzeichnis 1 Einleitung 1 2 Anonyme Methoden 2 3 Lambda-Ausdrücke 4 4 Ausdrucksbäume 6 4.1 Was sind Ausdrucksbäume? 6 4.2

Mehr

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Kontrollstrukturen, Pseudocode und Modulo-Rechnung Kontrollstrukturen, Pseudocode und Modulo-Rechnung CoMa-Übung III TU Berlin 29.10.2012 CoMa-Übung III (TU Berlin) Kontrollstrukturen, Pseudocode und Modulo-Rechnung 29.10.2012 1 / 1 Themen der Übung 1

Mehr

C++ für Ingenieure. Einführung in die objektorientierte Programmierung. Seite Programmverzeichnis VII HARALD NAHRSTEDT

C++ für Ingenieure. Einführung in die objektorientierte Programmierung. Seite Programmverzeichnis VII HARALD NAHRSTEDT VII HARALD NAHRSTEDT C++ für Ingenieure Einführung in die objektorientierte Programmierung Seite Erstellt am 15.01.2009 Beschreibung VIII 1 Grundlagen der Programmierung 1-1 Struktur einer Header-Datei

Mehr

2. Hintergrundverarbeitung in Android: Services und Notifications

2. Hintergrundverarbeitung in Android: Services und Notifications 2. Hintergrundverarbeitung in Android: Services und Notifications Übersicht 2. Hintergrundverarbeitung in Android: Services und Notifications Übersicht: In Mobis 1: Threads; hier genauerer Blick auf Services

Mehr

Der Zwei-Quadrate-Satz von Fermat

Der Zwei-Quadrate-Satz von Fermat Der Zwei-Quadrate-Satz von Fermat Proseminar: Das BUCH der Beweise Fridtjof Schulte Steinberg Institut für Informatik Humboldt-Universität zu Berlin 29.November 2012 1 / 20 Allgemeines Pierre de Fermat

Mehr

5. Abstrakte Klassen

5. Abstrakte Klassen 5. Abstrakte Klassen Beispiel 5. Abstrakte Klassen Angenommen, wir wollen die folgende Klassenhierarchie implementieren: Vogel Amsel Drossel Fink Peter Becker, Programiersprache Java FH Bonn-Rhein-Sieg,

Mehr

Großübung zu Einführung in die Programmierung

Großübung zu Einführung in die Programmierung Großübung zu Einführung in die Programmierung Daniel Bimschas, M.Sc. Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/bimschas Inhalt 1. Besprechung Übung 4 Iteration

Mehr

Grundlagen der Programmiersprache C++

Grundlagen der Programmiersprache C++ / TU Braunschweig Grundlagen der Programmiersprache C++ Um den Studierenden den Einstieg in die FE-Programmierung zu erleichtern werden die wesentlichen Elemente eines C-Programmes beschrieben, soweit

Mehr

Programmierung mit C Zeiger

Programmierung mit C Zeiger Programmierung mit C Zeiger Zeiger (Pointer)... ist eine Variable, die die Adresse eines Speicherbereichs enthält. Der Speicherbereich kann... kann den Wert einer Variablen enthalten oder... dynamisch

Mehr

T:\Dokumentationen\Asseco_BERIT\Schulung\BERIT_LIDS7_Basiskurs\Impo rt_export\beritde_lt_do_20120918_lids7.basisschulung_import_export.

T:\Dokumentationen\Asseco_BERIT\Schulung\BERIT_LIDS7_Basiskurs\Impo rt_export\beritde_lt_do_20120918_lids7.basisschulung_import_export. LIDS 7 Import/Export Mannheim, 11.02.2013 Autor: Anschrift: Version: Status: Modifiziert von: Ablage: Christine Sickenberger - Asseco BERIT GmbH Asseco BERIT GmbH Mundenheimer Straße 55 68219 Mannheim

Mehr

Early first draft Höllische Programmiersprachen Seminar im WS 2014/15 Speichermanagement

Early first draft Höllische Programmiersprachen Seminar im WS 2014/15 Speichermanagement Early first draft Höllische Programmiersprachen Seminar im WS 2014/15 Speichermanagement Max Haslbeck Technische Universität München 20.01.2015 Zusammenfassung 1 Einleitung 2 Begriffsklärung Heutzutage

Mehr

Java Einführung Methoden. Kapitel 6

Java Einführung Methoden. Kapitel 6 Java Einführung Methoden Kapitel 6 Inhalt Deklaration und Aufruf von Methoden Lokale und globale Namen (Bezeichner) Sichtbarkeit und Lebensdauer von Variablen in Methoden Überladen von Methoden 2 Methoden

Mehr