SlideShare ist ein Scribd-Unternehmen logo
Harald Störrle
Harald.Stoerrle@qaware.de
@stoerrle
Programmieren mit PROLOG
München, 6. Dezember 2019
PROLOG wird erfunden von
A. Colmerauer (Marseille)
D.H.D Warren (Edinburgh)
SICStus PROLOG
Module, Compiler
SWI-PROLOG ist
quelloffen und frei
PROLOG wird in
ISO/IEC 13211-1
standardisiert
aktuelle Version von
SWI-PROLOG
swi-prolog.org
1970
1972
1978
1980
198?
1987
1995
2019
3
Solche Zahlen sind immer mit Vorsicht zu
genießen.
Die Verteilung ist logarithmisch.
Die ersten Plätze sind mit den üblichen
Verdächtigen belegt.
Viele neue Sprachen steigen rasant im
Beliebtheitsindex auf, und schrumpfen dann
innerhalb einiger Jahre eine Nische zurück, oder
verschwinden ganz.
Go scheint schon den Scheitelpunkt schon
überschritten zu haben.
Beliebtheit von
Programmiersprachen
Ratings <1%
4
Vielfach haben Sprachen spezifische
Anwendungsgebiete (z.B. Python, Assembler)
oder Platformen (Swift, Objective-C).
Der Lebenszyklus der Anwendungsgebiete
oder Platform spiegelt sich in der
Sprachbeliebtheit.
Im Mittelfeld (bis ca. Platz 50) gibt es relativ
geringe Unterschieden in der Beliebtheit.
Je nach Umfrage und Zeitpunkt erhält man
unterschiedliche Platzierungen.
Grob kann man sagen, dass sich PROLOG nach
fast 50 Jahren in guter Gesellschaft etabliert hat
(Haskell, Scala, ML, Ada, Kotlin).
Beliebtheit von
Programmiersprachen
QAware 5
Community
Sprache AnzahlTags
Java 1.615.467
SQL 518.628
Scala 93.884
Haskell 42.574
Go 42.195
Kotlin 31.634
PROLOG 10.775
Erlang 8.649
StackOverflow-Präsenz
6
Hochsprachen-Paradigmen im Überblick
Hochsprachen-Paradigmen im Vergleich
Paradigma Programm Berechnung Meta-
Programmierung
Variable Beispiele
Funktional Funktion Auswertung von
Ausdrücken
Funktionstypen,
Closures
Bezeichner für Wert
(single assignment)
Lisp, ML, Haskell
Relational Menge von
Regeln
Finden einer Lösung,
Widerlegung des Ziels
Prädikate sind Terme Bezeichner fürTerm
(Unification), backtrackable
PROLOG, Mercury,
Oz,… SQL
Imperativ Folge von
Befehlen
Befehl ändert Speicher
("Seiteneffekt")
Introspektion Speicher für Werte
(multiple assignemnt)
Algol, Pascal, C,
Objekt-
Orientiert
Objekte mit
Methoden
Folge von Nachrichten Meta-Protokolle Verweis auf Objekt SmallTalk, Self, C++
Diese Unterschiede wirken sich vor allem "in the small" aus.
"In the large" bieten die Paradigmen im wesentlichen die gleichen Mechanismen.
QAware 8
Halbaddierer
=1
X
Y
Z
>=1
X
Y
Z
&
X
Y
Z
X Y =1 (XOR) >=1 (OR) & (AND)
0 0 0 0 0
0 1 1 1 0
1 0 1 1 0
1 1 0 1 1
QAware 9
Halbaddierer
X Y Carry Summe
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
https://de.wikipedia.org/wiki/Halbaddierer
QAware 10
Volladdierer
Y Y C_in C_out S
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1
QAware 11
Zyklische Datenstrukturen, Differenzlisten, Failure slicing
a
b c
d efg
h
BDD-Demo
DiffList-Demo
StaticAnalysis
CHAT80
Chat-80 was a natural language system which allowed the user to interrogate a Prolog knowledge base in the
domain of world geography. It was developed in the early '80s by Warren and Pereira.
chat_process([what,is,the,capital,of,germany,?],ANSWER).
chat_process([what,is,the,capital,of,west_germany,?],ANSWER).
chat_process([what,is,the,capital,of,east_germany,?],ANSWER).
Attempto Controlled English
SWI-Prolog Natural Language Processing Primitives
"This package contains some well known basic routines for natural language processing and information
retrieval."
atom_to_stem_list/2, porter_stem/2, snowball/3, snowball_current_algorithm/1
double_metaphone/2, double_metaphone/3
isub/4, levenshtein, tokenize_atom/2, tokenize_atom/3, unaccent_atom/2
Natural Language Processing
Java vs. PROLOG: Infrastruktur und Lines of Code
Program Program
[LOC]
Executable
[KB]
Memory
[MB]
Setup
[h]
Build
[s]
Execution, x=42
[ms]
Execution, x=420
[ms]
JAVA
common
overhead
124 2.1 ?
>5
? N/A N/A
Naive recursive 8
class: 9
jar: 540
jvm: 191
gradle: ?
90 37+10 8,7 ... 9,2 Mio forever
Dyn.
programing
10 ? 4 327 1063
Matrix 19 ? 4 124 143
Doubling 22 ? 4 121 145
PROLOG
Naive recursive 9
exe: 98.5 5 <0.1 0
forever forever
…with tabling 10 16 31
Runtime
15
Fallstudie 1: Sudoku
QACampus, Engineering Camp 2010
Siehe metalevel.at und
https://www.youtube.com/watch?v=5KUdEZTu06o&feature=youtu.be
16
Fallstudie 2: Parser für Boole'sche Ausdrücke
// Copyright 2018 Johannes Weigend
// Licensed under the Apache License, Version 2.0
// Package parser contains an parser/interpreter for boolean expressions.
package parser
import (
"fmt"
"regexp"
"github.com/jweigend/concepts-of-programming-
languages/oop/boolparser/ast"
"github.com/jweigend/concepts-of-programming-
languages/oop/boolparser/lexer"
)
// ---------------------------------------------------------
// The expression should have the following EBNF form:
// EBNF
// ---------------------------------------------------------
// <expression> ::= <term> { <or> <term> }
// <term> ::= <factor> { <and> <factor> }
// <factor> ::= <var> | <not> <factor> | (<expression>)
// <or> ::= '|'
// <and> ::= '&'
// <not> ::= '!'
// <var> ::= '[a-zA-Z0-9]*'
// ---------------------------------------------------------
// Parser is a recursive decent parser for boolean expressions.
type Parser struct {
rootNode ast.Node
token string // ll(1)
lexer *lexer.Lexer
}
// NewParser constructs a recursive descent parser and compiles the input of
the lexer.
func NewParser(lexer *lexer.Lexer) *Parser {
b := Parser{lexer: lexer}
b.parse()
return &b
}
// Eval evaluates the AST tree against the given var map.
func (p *Parser) Eval(vars map[string]bool) bool {
return p.rootNode.Eval(vars)
}
// String implements interface Stringer.
func (p *Parser) String() string {
return fmt.Sprintf("%v", p.rootNode)
}
//
// ---------- PARSING ------------
//
// parse expr and build the AST.
func (p *Parser) parse() {
p.expression()
}
// see BNF expression.
func (p *Parser) expression() {
p.term()
for p.token == "|" {
lhs := p.rootNode
p.term()
rhs := p.rootNode
p.rootNode = &ast.Or{LHS: lhs, RHS: rhs}
}
}
// see BNF term.
func (p *Parser) term() {
p.factor()
for p.token == "&" {
lhs := p.rootNode
p.factor()
rhs := p.rootNode
p.rootNode = &ast.And{LHS: lhs, RHS: rhs}
}
}
// see BNF factor.
func (p *Parser) factor() {
p.token = p.lexer.NextToken()
if p.token == "" {
return // end
} else if p.token == "!" {
p.factor()
p.rootNode = ast.Not{Ex: p.rootNode}
} else if p.token == "(" {
p.expression()
p.token = p.lexer.NextToken()
} else if isVar(p.token) {
p.rootNode = ast.Val{Name: p.token}
p.token = p.lexer.NextToken()
} else {
panic(fmt.Sprintf("Unknown symbol %v", p.token))
}
}
// isVar checks if a token is a identifier which starts with an ASCII Letter.
func isVar(token string) bool {
if len(token) == 0 {
panic("Empty token!")
}
return validVar.MatchString(token)
}
// Regex for vars.
var validVar = regexp.MustCompile("[a-zA-Z0-9]*")
Fallstudie 3: Theorembeweiser
Summary
Logical Variables and Unification
Facts, Terms
Inferences, Backtracking, Cuts
Lists/Term-Structures
Circular data structures
Recursion
Meta-Programming
Grammar-Interpreter (DCGs)
Constraints, SAT-solving
Theorem Proving
Modes and Annotations
Dicts und dict matching
Exceptions
Arithmetics
I/O operations
Modules
Concurrency (Co-routines, multi-threading)
Classes, Objects, Protoypes, Signatures ( |= LogTalk)
Loops
Conditionals
Variables with assignemt, declarations
Pointers
Syntax
Characteristic features Conventional features
Absent features
PROLOG by Feature
Swish - PROLOG-Notebooks im Browser, see https://swish.swi-prolog.org/
Editing
PDT in Eclipse, Prolog Mode in Visual Studio Code, SWIPLEDIT, Xemacs (built in), NOVA (Refactoring)
Xref
Introspektion: edit/1 (emacs), apropos/1 (manpage), help/1 (manpages for libraries), listing/1
Debugging, Teesting
Declarative debugging ("failure slicing"): more rules=fewer solutions, see https://swi-
prolog.discourse.group/t/wiki-bug-hunting-toolbox/710
Bibliotheken für logging, error reporting, u.ä.
PLUNIT, test coverage, Test creation wizard
Static analysis
Singleton checks, checks determinacy (rdet)
Mode-Annotations/Checking, Type checking (is_of_type2, must_be2)
Documentation with PLdoc: https://prologhub.pl/tips-planning-documenting-and-testing-swi-prolog-project/
Deployment mit qsave/1
Tooling
21
Programming & Tools
https://swi-prolog.org
https://logtalk.org/
https://swish.swi-prolog.org/
https://www.tutorialspoint.com/execute_prolog_online.php
Talks & Gems
"Production Prolog" by Michael Hendricks (2013)
Various topics https://www.metalevel.at/prolog
Iteration https://swi-prolog.discourse.group/t/six-ways-to-iterate-in-prolog/477/5
Books, Tutorials
https://simply-logical.space/
https://prologhub.pl/tips-planning-documenting-and-testing-swi-prolog-project/
http://chiselapp.com/user/ttmrichter/repository/swipldoctut/doc/tip/doc/tutorial.html
https://stackoverflow.com/questions/5277263/good-ide-to-get-started-with-prolog
Resources

Weitere ähnliche Inhalte

Ähnlich wie Programmieren mit PROLOG

Java und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzenJava und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzen
Andreas Schreiber
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
Frank Müller
 
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragenA Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
Roland Ewald
 
Web-Services mit Go
Web-Services mit GoWeb-Services mit Go
Web-Services mit Go
Sebastian Harl
 
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
Christian Kauhaus
 
SCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickSCALA: ein kurzer Überblick
SCALA: ein kurzer Überblick
Roland Ewald
 
Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)
Nane Kratzke
 
German AAT 2013
German AAT 2013German AAT 2013
German AAT 2013
AAT Taiwan
 
Python, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und RaumfahrtforschungPython, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und Raumfahrtforschung
Andreas Schreiber
 
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
Robin Sedlaczek
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
Torsten Fink
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
Frank Müller
 
Giessen R Users Group - 1. Workshop SEM mit lavaan
Giessen R Users Group - 1. Workshop SEM mit lavaanGiessen R Users Group - 1. Workshop SEM mit lavaan
Giessen R Users Group - 1. Workshop SEM mit lavaan
masem research institute
 
PyLucene@PyCon DE 2011
PyLucene@PyCon DE 2011PyLucene@PyCon DE 2011
PyLucene@PyCon DE 2011
Thomas Koch
 
Programmieren mit Go
Programmieren mit GoProgrammieren mit Go
Programmieren mit Go
Sebastian Harl
 
Puppet und OpenStack - Ein gutes Team
Puppet und OpenStack - Ein gutes TeamPuppet und OpenStack - Ein gutes Team
Puppet und OpenStack - Ein gutes Team
NETWAYS
 
Schnittstellen und Webservices
Schnittstellen und WebservicesSchnittstellen und Webservices
Schnittstellen und Webservices
Jakob .
 
Statische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der PraxisStatische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der Praxis
Roland Ewald
 
Tech-Talk: Python vs. Ruby
Tech-Talk: Python vs. RubyTech-Talk: Python vs. Ruby
Tech-Talk: Python vs. Ruby
schlauch
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
QAware GmbH
 

Ähnlich wie Programmieren mit PROLOG (20)

Java und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzenJava und Python - Das Beste aus beiden Welten nutzen
Java und Python - Das Beste aus beiden Welten nutzen
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragenA Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
A Day in the Life of a Bug --- sinnvoll zu Open Source Projekten beitragen
 
Web-Services mit Go
Web-Services mit GoWeb-Services mit Go
Web-Services mit Go
 
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
 
SCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickSCALA: ein kurzer Überblick
SCALA: ein kurzer Überblick
 
Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)
 
German AAT 2013
German AAT 2013German AAT 2013
German AAT 2013
 
Python, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und RaumfahrtforschungPython, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und Raumfahrtforschung
 
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
#SpeakRoslyn - Die Microsoft .NET Compiler Plattform
 
Funktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit SodiumFunktionale Reaktive Programmierung mit Sodium
Funktionale Reaktive Programmierung mit Sodium
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
 
Giessen R Users Group - 1. Workshop SEM mit lavaan
Giessen R Users Group - 1. Workshop SEM mit lavaanGiessen R Users Group - 1. Workshop SEM mit lavaan
Giessen R Users Group - 1. Workshop SEM mit lavaan
 
PyLucene@PyCon DE 2011
PyLucene@PyCon DE 2011PyLucene@PyCon DE 2011
PyLucene@PyCon DE 2011
 
Programmieren mit Go
Programmieren mit GoProgrammieren mit Go
Programmieren mit Go
 
Puppet und OpenStack - Ein gutes Team
Puppet und OpenStack - Ein gutes TeamPuppet und OpenStack - Ein gutes Team
Puppet und OpenStack - Ein gutes Team
 
Schnittstellen und Webservices
Schnittstellen und WebservicesSchnittstellen und Webservices
Schnittstellen und Webservices
 
Statische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der PraxisStatische Analyse von Java-Code in der Praxis
Statische Analyse von Java-Code in der Praxis
 
Tech-Talk: Python vs. Ruby
Tech-Talk: Python vs. RubyTech-Talk: Python vs. Ruby
Tech-Talk: Python vs. Ruby
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 

Mehr von QAware GmbH

Frontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdfFrontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdf
QAware GmbH
 
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
QAware GmbH
 
50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
QAware GmbH
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
QAware GmbH
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
QAware GmbH
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
QAware GmbH
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
QAware GmbH
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
QAware GmbH
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
QAware GmbH
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
QAware GmbH
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
QAware GmbH
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
QAware GmbH
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
QAware GmbH
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
QAware GmbH
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
QAware GmbH
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
QAware GmbH
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
QAware GmbH
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
QAware GmbH
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
QAware GmbH
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
QAware GmbH
 

Mehr von QAware GmbH (20)

Frontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdfFrontends mit Hilfe von KI entwickeln.pdf
Frontends mit Hilfe von KI entwickeln.pdf
 
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
Mit ChatGPT Dinosaurier besiegen - Möglichkeiten und Grenzen von LLM für die ...
 
50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
 

Programmieren mit PROLOG

  • 2. PROLOG wird erfunden von A. Colmerauer (Marseille) D.H.D Warren (Edinburgh) SICStus PROLOG Module, Compiler SWI-PROLOG ist quelloffen und frei PROLOG wird in ISO/IEC 13211-1 standardisiert aktuelle Version von SWI-PROLOG swi-prolog.org 1970 1972 1978 1980 198? 1987 1995 2019
  • 3. 3 Solche Zahlen sind immer mit Vorsicht zu genießen. Die Verteilung ist logarithmisch. Die ersten Plätze sind mit den üblichen Verdächtigen belegt. Viele neue Sprachen steigen rasant im Beliebtheitsindex auf, und schrumpfen dann innerhalb einiger Jahre eine Nische zurück, oder verschwinden ganz. Go scheint schon den Scheitelpunkt schon überschritten zu haben. Beliebtheit von Programmiersprachen Ratings <1%
  • 4. 4 Vielfach haben Sprachen spezifische Anwendungsgebiete (z.B. Python, Assembler) oder Platformen (Swift, Objective-C). Der Lebenszyklus der Anwendungsgebiete oder Platform spiegelt sich in der Sprachbeliebtheit. Im Mittelfeld (bis ca. Platz 50) gibt es relativ geringe Unterschieden in der Beliebtheit. Je nach Umfrage und Zeitpunkt erhält man unterschiedliche Platzierungen. Grob kann man sagen, dass sich PROLOG nach fast 50 Jahren in guter Gesellschaft etabliert hat (Haskell, Scala, ML, Ada, Kotlin). Beliebtheit von Programmiersprachen
  • 5. QAware 5 Community Sprache AnzahlTags Java 1.615.467 SQL 518.628 Scala 93.884 Haskell 42.574 Go 42.195 Kotlin 31.634 PROLOG 10.775 Erlang 8.649 StackOverflow-Präsenz
  • 7. Hochsprachen-Paradigmen im Vergleich Paradigma Programm Berechnung Meta- Programmierung Variable Beispiele Funktional Funktion Auswertung von Ausdrücken Funktionstypen, Closures Bezeichner für Wert (single assignment) Lisp, ML, Haskell Relational Menge von Regeln Finden einer Lösung, Widerlegung des Ziels Prädikate sind Terme Bezeichner fürTerm (Unification), backtrackable PROLOG, Mercury, Oz,… SQL Imperativ Folge von Befehlen Befehl ändert Speicher ("Seiteneffekt") Introspektion Speicher für Werte (multiple assignemnt) Algol, Pascal, C, Objekt- Orientiert Objekte mit Methoden Folge von Nachrichten Meta-Protokolle Verweis auf Objekt SmallTalk, Self, C++ Diese Unterschiede wirken sich vor allem "in the small" aus. "In the large" bieten die Paradigmen im wesentlichen die gleichen Mechanismen.
  • 8. QAware 8 Halbaddierer =1 X Y Z >=1 X Y Z & X Y Z X Y =1 (XOR) >=1 (OR) & (AND) 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1
  • 9. QAware 9 Halbaddierer X Y Carry Summe 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 https://de.wikipedia.org/wiki/Halbaddierer
  • 10. QAware 10 Volladdierer Y Y C_in C_out S 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1
  • 11. QAware 11 Zyklische Datenstrukturen, Differenzlisten, Failure slicing a b c d efg h BDD-Demo DiffList-Demo StaticAnalysis
  • 12. CHAT80 Chat-80 was a natural language system which allowed the user to interrogate a Prolog knowledge base in the domain of world geography. It was developed in the early '80s by Warren and Pereira. chat_process([what,is,the,capital,of,germany,?],ANSWER). chat_process([what,is,the,capital,of,west_germany,?],ANSWER). chat_process([what,is,the,capital,of,east_germany,?],ANSWER). Attempto Controlled English SWI-Prolog Natural Language Processing Primitives "This package contains some well known basic routines for natural language processing and information retrieval." atom_to_stem_list/2, porter_stem/2, snowball/3, snowball_current_algorithm/1 double_metaphone/2, double_metaphone/3 isub/4, levenshtein, tokenize_atom/2, tokenize_atom/3, unaccent_atom/2 Natural Language Processing
  • 13. Java vs. PROLOG: Infrastruktur und Lines of Code
  • 14. Program Program [LOC] Executable [KB] Memory [MB] Setup [h] Build [s] Execution, x=42 [ms] Execution, x=420 [ms] JAVA common overhead 124 2.1 ? >5 ? N/A N/A Naive recursive 8 class: 9 jar: 540 jvm: 191 gradle: ? 90 37+10 8,7 ... 9,2 Mio forever Dyn. programing 10 ? 4 327 1063 Matrix 19 ? 4 124 143 Doubling 22 ? 4 121 145 PROLOG Naive recursive 9 exe: 98.5 5 <0.1 0 forever forever …with tabling 10 16 31 Runtime
  • 15. 15 Fallstudie 1: Sudoku QACampus, Engineering Camp 2010 Siehe metalevel.at und https://www.youtube.com/watch?v=5KUdEZTu06o&feature=youtu.be
  • 16. 16 Fallstudie 2: Parser für Boole'sche Ausdrücke // Copyright 2018 Johannes Weigend // Licensed under the Apache License, Version 2.0 // Package parser contains an parser/interpreter for boolean expressions. package parser import ( "fmt" "regexp" "github.com/jweigend/concepts-of-programming- languages/oop/boolparser/ast" "github.com/jweigend/concepts-of-programming- languages/oop/boolparser/lexer" ) // --------------------------------------------------------- // The expression should have the following EBNF form: // EBNF // --------------------------------------------------------- // <expression> ::= <term> { <or> <term> } // <term> ::= <factor> { <and> <factor> } // <factor> ::= <var> | <not> <factor> | (<expression>) // <or> ::= '|' // <and> ::= '&' // <not> ::= '!' // <var> ::= '[a-zA-Z0-9]*' // --------------------------------------------------------- // Parser is a recursive decent parser for boolean expressions. type Parser struct { rootNode ast.Node token string // ll(1) lexer *lexer.Lexer } // NewParser constructs a recursive descent parser and compiles the input of the lexer. func NewParser(lexer *lexer.Lexer) *Parser { b := Parser{lexer: lexer} b.parse() return &b } // Eval evaluates the AST tree against the given var map. func (p *Parser) Eval(vars map[string]bool) bool { return p.rootNode.Eval(vars) } // String implements interface Stringer. func (p *Parser) String() string { return fmt.Sprintf("%v", p.rootNode) } // // ---------- PARSING ------------ // // parse expr and build the AST. func (p *Parser) parse() { p.expression() } // see BNF expression. func (p *Parser) expression() { p.term() for p.token == "|" { lhs := p.rootNode p.term() rhs := p.rootNode p.rootNode = &ast.Or{LHS: lhs, RHS: rhs} } } // see BNF term. func (p *Parser) term() { p.factor() for p.token == "&" { lhs := p.rootNode p.factor() rhs := p.rootNode p.rootNode = &ast.And{LHS: lhs, RHS: rhs} } } // see BNF factor. func (p *Parser) factor() { p.token = p.lexer.NextToken() if p.token == "" { return // end } else if p.token == "!" { p.factor() p.rootNode = ast.Not{Ex: p.rootNode} } else if p.token == "(" { p.expression() p.token = p.lexer.NextToken() } else if isVar(p.token) { p.rootNode = ast.Val{Name: p.token} p.token = p.lexer.NextToken() } else { panic(fmt.Sprintf("Unknown symbol %v", p.token)) } } // isVar checks if a token is a identifier which starts with an ASCII Letter. func isVar(token string) bool { if len(token) == 0 { panic("Empty token!") } return validVar.MatchString(token) } // Regex for vars. var validVar = regexp.MustCompile("[a-zA-Z0-9]*")
  • 19. Logical Variables and Unification Facts, Terms Inferences, Backtracking, Cuts Lists/Term-Structures Circular data structures Recursion Meta-Programming Grammar-Interpreter (DCGs) Constraints, SAT-solving Theorem Proving Modes and Annotations Dicts und dict matching Exceptions Arithmetics I/O operations Modules Concurrency (Co-routines, multi-threading) Classes, Objects, Protoypes, Signatures ( |= LogTalk) Loops Conditionals Variables with assignemt, declarations Pointers Syntax Characteristic features Conventional features Absent features PROLOG by Feature
  • 20. Swish - PROLOG-Notebooks im Browser, see https://swish.swi-prolog.org/ Editing PDT in Eclipse, Prolog Mode in Visual Studio Code, SWIPLEDIT, Xemacs (built in), NOVA (Refactoring) Xref Introspektion: edit/1 (emacs), apropos/1 (manpage), help/1 (manpages for libraries), listing/1 Debugging, Teesting Declarative debugging ("failure slicing"): more rules=fewer solutions, see https://swi- prolog.discourse.group/t/wiki-bug-hunting-toolbox/710 Bibliotheken für logging, error reporting, u.ä. PLUNIT, test coverage, Test creation wizard Static analysis Singleton checks, checks determinacy (rdet) Mode-Annotations/Checking, Type checking (is_of_type2, must_be2) Documentation with PLdoc: https://prologhub.pl/tips-planning-documenting-and-testing-swi-prolog-project/ Deployment mit qsave/1 Tooling
  • 21. 21 Programming & Tools https://swi-prolog.org https://logtalk.org/ https://swish.swi-prolog.org/ https://www.tutorialspoint.com/execute_prolog_online.php Talks & Gems "Production Prolog" by Michael Hendricks (2013) Various topics https://www.metalevel.at/prolog Iteration https://swi-prolog.discourse.group/t/six-ways-to-iterate-in-prolog/477/5 Books, Tutorials https://simply-logical.space/ https://prologhub.pl/tips-planning-documenting-and-testing-swi-prolog-project/ http://chiselapp.com/user/ttmrichter/repository/swipldoctut/doc/tip/doc/tutorial.html https://stackoverflow.com/questions/5277263/good-ide-to-get-started-with-prolog Resources