Belegarbeit. Erstellung eines ProLog Programms

Ähnliche Dokumente
SOA verspielt - rekursive BPEL Prozesse

Benutzerhandbuch AUGES 4. Amt für Migration und Zivilrecht. Benutzerhandbuch AUGES2

Prüfungsrelevante Studienleistung Logische Programmierung (Sommer 2006) Magische Quadrate. Patricia Röschke (46016) Martin Grandrath (46375)

ABITURPRÜFUNG 2010 LEISTUNGSFACH INFORMATIK

Teil 1: Suchen. Problemstellung Elementare Suchverfahren Hashverfahren Binäre Suchbäume Ausgeglichene Bäume. B-Bäume. AVL-Bäume Treaps Splay-Bäume

Technische Dokumentation RouterInfo

Grundlagen der Informatik

Counting-Übungen (SS4) Felix Rohrer. Grundlagen des Zählens. 1. KR, Abschnitt 5.1, Aufgabe 7: I. KR, Abschnitt 5.1, Aufgabe 15:

Verhalten. Def. und Nutzen von Verhalten. Pseudocode Schreibtischtest. Algorithmen

IR Seminar SoSe 2012 Martin Leinberger

Praktikumsprotokoll Mikrorechentechnik I Versuch

Vorbereitung zur Einführung der Videohilfe - alle Versionen. Datenübertragung in der CLOUD-Version erhöht.

Permutation = Anordnung aller Elemente einer Menge, Kombination = Auswahl von einigen aus vielen Elementen, Variation = Auswahl und Anordnung.

Anwenderhandbuch zum Print Converter Version 1.1.0

Abiturprüfung Informatik, Grundkurs

Künstliche Intelligenz

Grundlagen der Informatik

RV-Win Einzelfälle exportieren/importieren

Interessante Projekte mit dem BBC Micro:bit

ABITURPRÜFUNG 2007 LEISTUNGSFACH INFORMATIK

Prolog: Listen und Cut. Mark Ugarov

MODEL CHECKING 2 - AUTOMATEN

*** Viel Erfolg! ***

Diana Lange. Generative Gestaltung Komplexe Datentypen: String

Schulungsunterlagen zur Version 3.3 Arbeiten mit Veranstaltungsvorlagen

Einstieg in die Informatik mit Java

6. Legen Sie Notizen zu dem jeweiligen [DvRELATIONS]-Kontakt an. Customer Relations for DvISE I Funktionen des Kontextmenüs

Das HERON-Verfahren mit der TI84-Tabellenkalkulation CellSheet

Laborprotokoll Informationstechnologien

Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss

Enthaltene Programmänderungen. DMP-Assist Version 4.40

Kodieren Von Graphen

Mehrdimensionale Arrays

3 Geoverarbeitung mit dem ModelBuilder

Benutzerdefinierte Housekeepinglisten in SAP BW //

Dokumentation: Zurücknehmen von Zahlläufen. wilke. Dokumentation: Zurücknehmen von Zahlungsläufen

Dynamisches Huffman-Verfahren

ALP I Turing-Maschine

SVG Maut Exact. SVG Wir bewegen Logistik

SEPA-Verwendungszweck mit Buchungstext

Handbuch: PlagScan PlugIn in Moodle 2.X und 3.X für den Nutzer

Kombinatorische Abzählverfahren

ADS: Algorithmen und Datenstrukturen

WIN-Explorer für ACT! (EFA)

Textbausteine. t Textbausteine 1

beigefügte Excel-Datei dient zum Erstellen einer CSV-Datei für den Personen-Daten-Import in FeuerOn.

Projektarbeit. Java-Application zur Generierung von Zahlenrätseln

Informatik 1. Sommersemester Helmut Seidl. Institut für Informatik TU München

Effiziente Algorithmen 2

ABITURPRÜFUNG 2001 LEISTUNGSFACH INFORMATIK (HAUPTTERMIN)

Auswerten der Startkontrolle mit OLEinzel

Exact.GlobeLohn Österreich: Elektronische Übermittlung der Kommunalsteuererklärung

10. Sortieren III. Untere Schranken für das vergleichsbasierte Sortieren, Radix- und Bucketsort

Enthaltene Programmänderungen. DMP-Assist Version

Vorhandener Code zur Gäste-Optimierung

Proseminar String Matching

News Inhalt. PNW-News-DE-6.4.docx Seite 2 von 12

Algorithmen und Datenstrukturen

Einführung in die Informatik

Station 2 - Hintergrundwissen und Anleitung

Benutzerhandbuch BILDARCH-Viewer

Algorithmische Bioinformatik 1

Logische und funktionale Programmierung

Handbuch. BsSepaTester

Tutoraufgabe 1 (Listen):

Produktinformation MSChromSearch

Spezielle Datenstrukturen

8 Baum in perfekter Komposition

Projektarbeit: Arktur individuell: Transportabler ODS-Server Arktur für Lehrer am ZWV

Künstliche Intelligenz Unifikation, Backtracking, Rekursion und Listen in Prolog

Künstliche Intelligenz Einführung in Prolog

Abzählen und Konstruktion der Strukturisomere von Alkanen, Alkenen und Alkinen

- dynamisches Laden -

GRAITEC FAQ für Autodesk Advance Steel. Wie können bei der Positionierung Präfixe vergeben werden? Positionierung

Schreiben erstellen in KeItSi

Informatik Abitur Bayern 2017 / II - Lösung

Inhalt. 3. Spezielle Algorithmen

Lastenheft für dynamische Geometrie-Software der Firma EduSoft

Whitepaper In File Delta

Programmieren in C/C++ und MATLAB

a) Für das vorgegebene Programmstück ergibt sich folgendes Referenzgeflecht:

Algorithmen und Datenstrukturen

Brandenburger Biotopkartierung (BBK) Wichtige Hinweise zur Einrichtung und Dateneingabe

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS)

Shell-Scripting Linux-Kurs der Unix-AG

GRUNDLAGEN VON INFORMATIONSSYSTEMEN INDEXSTRUKTUREN I: B-BÄUME UND IHRE VARIANTEN

STARFACE MS Outlook Connector 2.0

Jahresinventur bei POS-Lagerhaltung

Die Klasse string Verfasser: Christian Bartl

Lohndaten importieren

Frilo.Document.Designer

Lösungsvorschläge zur Hauptklausur Datenstrukturen

AutoEdit: Vom Automat zum LaTeX Dokument

4 Programmieren in Java III

Die interne Textverarbeitung. Voraussetzungen. Grundlagen. SOFTplus Merkblatt

Com-In SMS Anleitung. Erste Schritte. Das Arbeiten mit dem SMS Tool. SMS-Tool starten: Der Absender:

ComfortsAutomatic-Datamodel

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 WIng Bachelor 6. Aufgabenblatt Zeiger, verkettete Liste, Dateieingabe und -ausgabe

GS-Verein 2014 SEPA-Verwendungszweck mit Buchungstext

PQ Start - Virtuelle Tabellen

Transkript:

Belegarbeit Erstellung eines ProLog Programms Christian Fischer, Matthias Lenk, 44597 BNC 44683 BNC

Aufgabenstellung: Erstellung eines POLOG Programms, mit dem alle nicht- repetitiven Wörter über dem Alphabet [a,b,c] der Länge m bestimmt werden. w = a a ist nicht- repetitiv, wenn keine Teilsequenz xx = x x x x für n = 1, 2,,m/2 1 m 1 n 1 n in w existiert. abcacbabcbac abcbca nicht- repetitiv repetitiv Mathematische Grundidee: Es werden Kombinationen der vorgegebenen Länge m über dem Alphabet [a,b,c] erstellt, indem aus einem Ausgangswort durch Anhängen von zwei erlaubten Zeichen zwei neue Wörter gebildet werden. Dabei müssen nicht alle Kombinationen erstellt werden, sondern es genügt, wenn man ausgehend von [a,b], Wörter erstellt. Die fehlenden Wörter werden durch Permutation von [a,b,c] untereinander, erstellt. Ob ein Element vor oder hinter dem Wort angefügt wird, spielt keine Rolle, da die Wörter vorwärts als auch rückwärts gelesen werden können. Alle neu gebildeten Wörter werden auf Wiederholung der Länge 2 bis m//2 ab der ersten Stelle im Wort geprüft. Nach erfolgloser Prüfung (keine Übereinstimmung der Teilsequenzen), wird wieder jeweils ein erlaubtes Zeichen angehängt. Ansonsten wird das Wort verworfen. Ist die gewünschte Stellenanzahl erreicht, liegt 1/6 der gesuchten Wörter vor. Die restlichen Wörter werden, wie bereits erwähnt, aus den geprüften erstellt, indem die darin enthaltenen Elemente [a,b,c] untereinander ersetzt werden. Es gibt 3! Permutationen, abzüglich der bereits existierenden, also fünf Umwandlungen, die für jedes Element eines Wortes durchgeführt werden müssen. 1. a -> a, b -> c, c -> b 2. b -> b, a -> c, c -> a 3. c -> c, a -> b, b -> a 4. a -> b, b -> c, c -> a 5. a -> c, c -> b, b -> a

Funktionsweise des Algorithmus: Zur Speicherstruktur: Jedes Wort, bestehend aus [a, b, c], wird als Liste gespeichert. Die Wörter selbst werden wiederum in einer Liste abgelegt. Bsp.: [[a,b,c,a],[a,b,c,b],[a,c,b,a]] 1. Nach Programmstart wird automatisch die Funktion <start> aufgerufen, in der der Anwender die Stellenanzahl eingibt. Anschließend wird eine Ausgangsliste mit den beiden Ausgangswörtern [[a,b,a],[c,b,a]] erstellt und die Funktion <erstelle> aufgerufen. 2. Ausgehend von der Ausgangsliste werden die möglichen Wörter der Länge i (i=4,..,m) erstellt, indem das erste Element eines jeden Wortes gelesen und wiederum aus der Liste mit den Elementen [a,b,c] gelöscht wird. So verbleiben nur zwei Elemente aus dieser Liste, die jeweils an das Wort angehängt werden, wodurch zwei neue Wörter entstehen. Dadurch wird gleich beim Erstellen vermieden, dass unnötig viele Kombinationen erzeugt werden. Die neuen Wörter werden in einer separaten Liste gespeichert. 3. Nachdem jeweils zwei Wörter auf die genannte Weise erstellt wurden, werden diese der Funktion <pruefe> übergeben. Es werden immer zwei Teilsequenzen der Länge 2 bis, falls nötig, m//2, ab der ersten Position, aus dem Wort miteinander auf Gleichheit überprüft. Die Teilsequenzen werden mittels der Funktion <hole_elem> ermittelt. 4. Ist die Ausgangsliste aus 2. komplett durchlaufen und die Wortlänge m noch nicht erreicht, dient die separat erstellte Liste als neue Ausgangsliste Ist die Stellenanzahl erreicht, (STELLEN<L) schlägt fehl, wird die Speicherstruktur vereinfacht, indem die Liste mit den Listen zu einer einzigen Liste abgeflacht wird, da für den folgenden Schritt die Elemente aus der Liste nur noch der Reihe nach ausgelesen werden müssen. 5. Weiter wird <subst> aufgerufen. Hier werden lediglich die restlichen Wörter durch Permutation von [a,b,c] erstellt. Dabei wird zunächst das erste Element aus der abgeflachten Liste entnommen (und aus dieser gelöscht) und dessen Position in der Liste [a,b,c] ermittelt. Mittels dieser Position wird nun je ein Element aus den Listen [b,a,c], [b,c,a], [a,c,b], [c,a,b], [c,b,a] selektiert. Die fünf Listen stellen die Permutationen von [a,b,c] dar. Diese fünf erhaltenen Elemente werden für jeden Durchlauf von <subst>, bis die angegebene Länge erreicht ist, zu fünf Wörtern zusammengefügt und anschließend ausgegeben. Dieser Schritt wird wiederholt, bis die abgeflachte Liste leer ist. Ende 6. Programmneustart mittels <start.>.

Erläuterungen zu den Funktionen start/0 erstelle/4 pruefe/5 hole_elem/4 subst/8 Ziel des Programms. Liest die Stellenanzahl von der Tastatur ein, prüft anschließend, ob er größer als drei und ein Integerwert ist. Erstellt neue Wörter durch das Anhängen von zwei Elementen aus [a,b,c] an bereits geprüfte Wörter. Überprüft, ob ein Wort zwei gleiche Teilsequenzen enthält. Erhöht, falls erforderlich, die Länge der Teilsequenzen. Stellt mittels Backtracking die Teilsequenzen aus einem Wort zusammen. [Erstellt die restlichen Wörter.] [Gibt alle Wörter aus.] Bemerkung: Um den Algorithmus weiter zu beschleunigen, kann man auf die Umwandlung der Listen zu Atomen verzichten. Die Umwandlung dient lediglich der besseren Lesbarkeit für den Nutzer. Es wurde eine zweite Version implementiert (repetitiv_short.pl), in der komplett auf die Erzeugung der restlichen Wörter, sowie auf die Umwandlung zu Atomen verzichtet wurde. Hier werden nur die nicht permutierten Listen ausgegeben. Eingebrachte Verbesserungen: 1. Beim Erstellen der Wörter wird darauf geachtet, dass keine zwei gleichen Elemente hintereinander angefügt werden. Das Element, das nicht verwendet werden darf, wird der Liste der möglichen Elemente gelöscht. 2. Beim Anfügen von Elementen werden die Elemente vor dem Wort angefügt. 3. Alle Wörter beginnen beim Erstellen mit [a,b], dadurch müssen nur 1/6 der Wörter auf diese Weise erstellt werden. 4. Als Datenstruktur werden Listen verwendet, mit denen effektiver als mit Strings umgegangen werden kann. 5. Die Wörter werden sofort nach dem Erstellen geprüft. 6. Es werden nur die Teilsequenzen aller möglichen Längen ab der ersten Position im Wort verglichen. 7. Die Permutation am Ende, um die restlichen Wörter zu Erstellen, wird per Selektion realisiert, ohne zu prüfen, um welches Element es sich konkret handelt. 8. In einer zweiten Programmversion (repetitiv_short.pl), wird auf das Erstellen und Konvertieren der restlichen Listen verzichten, was gerade bei einer höheren Stellenanzahl sinnvoll erscheint (s. Testläufe).

Testläufe/ Vergleich: Testsystem: CPU: AMD Athlon XP (Barton) 2800+ Speicher FSB: 333 MHz (1024 MB) SWI- Prolog Version 5.4.7 Alte Programmversion Stellenanzahl Zeit1 Zeit2 Zeit3 Wörter 10 0,06 0,05 0,05 144 11 0,14 0,13 0,15 204 12 0,43 0,44 0,43 264 13 1,38 1,43 1,43 342 14 5,30 5,32 5,42 456 15 21,49 21,58 21,45 618 16 89,77 90,85 90,47 798 17 582,96 583,71 580,57 1044 18 1912,06 1923,02 1905,61 1392 Aktuelle Programmversion (repetitiv.pl) Stellenanzahl Zeit1 Zeit2 Zeit3 Wörter 10 0,01 0,02 0,01 144 11 0,01 0,01 0,03 204 12 0,05 0,04 0,05 264 13 0,06 0,06 0,08 342 14 0,09 0,10 0,09 456 15 0,12 0,13 0,15 618 16 0,21 0,20 0,23 798 17 0,33 0,30 0,31 1044 18 0,56 0,53 0,55 1392 19 0,72 0,80 0,75 20 1,18 1,15 1,21 21 1,81 1,75 1,78 22 2,78 2,85 2,76 23 3,99 3,82 3,75 24 5,61 5,52 5,55 25 8,80 8,53 8,64 26 12,87 13,03 13,12 28 33,61 29,85 29,91 30 70,64 70,68 70,42 32 189,25 169,19 169,06 Aktuelle Programmversion (repetitiv_short.pl) Stellenanzahl Zeit1 Zeit2 Zeit3 28 25,25 25,45 25,41 30 61,05 61,25 61,12 32 149,73 150,08 149,83 33 235,55 233,24 229,87 *Alle Zeitangaben in Sekunden

Verallgemeinerung Das verwendete Alphabet kann problemlos durch entsprechende Ergänzungen erweitert werden. Letztlich kann man sagen, dass sich die Programmiersprache Prolog gut für derartige kombinatorische Aufgabenstellungen eignet, insofern die Speicherstrukturen nicht zu komplex werden.