Download Logik - Softwaretechnik und Programmiersprachen

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Logik und Logische Programmierung
Einführung!
Michael Leuschel!
!
Softwaretechnik und Programmiersprachen
!
04/04/2011!
Lecture 1
Übersicht!
 
(Mathematische) Logik
→ Logische Programmierung
→ Prolog!
 
Warum?!
•  Theorie und Praxis!
 
Was ?!
•  Übersicht über das Lehrmaterial!
 
Wie ?!
•  Klausuren,..!
•  Übungen, ...!
Teil 1:
(Mathematische)
Logik
!
Gregor Reisch, „Die Logik präsentiert ihre zentralen Themen“,
Margarita Philosophica, 1503/08 (?). Die beiden Hunde veritas und
falsitas jagen den Hasen problema, die Logik eilt mit dem Schwert
syllogismus bewaffnet hinterher. Links unten Parmenides, mit dem die
logische Argumentation Einzug in die Philosophie hielt, in einer Höhle.
Quelle: Wikipedia.de
Logik: Wikipedia!
Logik (griechisch ἡ λογική (τέχνη) he logiké téchne „die denkende
[Kunst, Vorgehensweise] ) ist die Lehre des vernünftigen (Schluss-)
Folgerns.
Die Logik untersucht die Gültigkeit von Argumenten hinsichtlich ihrer
Struktur unabhängig vom konkreten Inhalt der eigentlichen
Aussagen. In diesem Sinne spricht man auch von „formaler Logik.
Die Logik ist sowohl ein Teilgebiet der Philosophie als auch der
Mathematik und der Informatik.
Seit dem 20. Jahrhundert versteht man unter Logik überwiegend
symbolische Logik. Diese baut auf einer künstlichen Sprache auf und
verwendet streng definierte Schlussregeln. Ein einfaches Beispiel für
ein solches formales System ist die Aussagenlogik. Die symbolische
Logik nennt man auch mathematische Logik oder formale Logik im
engeren Sinn. Die Logik hatte nicht immer eine in diesem Sinn
formale Struktur, sondern befasste sich in der Antike und im
Mittelalter überwiegend mit natürlichsprachlichen Argumenten.
(Mathematische) Logik!
 
 
Auch symbolische Logik genannt
Abgrenzung zur “philosophischen Logik !
Mathematical logic, then, is a branch of
mathematics which has much the same relation
to the analysis and criticism of thought as
geometry has to the science of space !
!
!
!Haskell B. Curry, 1963!
Warum Logik studieren ?!
 
Wichtiger Zweig der Mathematik!
 
 
Wissensdarstellung + intelligentes Denken!
 
 
Was ist Wahrheit? Was ist ein Beweis ?!
Künstliche Intelligenz (artificial intelligence),
knowledge-based systems, expert systems, natural
language understanding, semantisches Web, ...!
Überlegungen über Programme!
 
Verifikation, statische Analyse, Optimierung,…!
  Hardware!
 
Universale Vorrichtung der Berrechnung:!
 
Logische Programmierung, Prolog, …!
Was beinhaltet eine Logik ?!
1. Sprache der Ausdrücke und Formeln!
2. Beweistheorie (proof theory)!
Axiome : unabdingbar wahr, automatisch Theoreme!
  Inferenzregeln : um neue Theoreme von
existierenden abzuleiten (truth preserving
inference)!
 
3. Modelltheorie (existiert nicht immer)!
 
 
Abbildung von Ausdrücken auf “echte” Objekte, und
Verknüpfung mit Aussagen in der “echten” Welt!
Logic = Studium der korrekten Inferenz/
Schlussfolgerung!
Verschiedene Logiken!
 
 
 
 
 
 
 
 
Aussagenlogik (propositional logic)!
Prädikatenlogik der ersten Stufe (predicate
logic, first-order logic FOL)!
Logik höherer Stufe (HOL)!
Temporale Logik - Modallogik!
Mehrwertige Logiken, Fuzzy Logik!
Nichtmonotone Logiken!
Relevanzlogik, lineare Logik!
...!
2. Higher-Order Logic
∃ R. R(tom) → human(tom)
variables over objects and relations
1. First-Order Logic (Prädikatenlogik)
- constants, functions, variables
(tom mother(tom) X)
human(sokrates)
- relations
( human(.) married(. , .) )
∀ X. human(X) → mortal(X)
- quantifiers
(∀ ∃ )
variables over objects
0. Propositional Logic (Aussagenlogik)
rains
- propositions
rains → carry_umbrella
(basic units: either true or false)
- logical connectives
p ∨¬ p
rains ∨¬ rains
(∨ ∧ ¬ →)
no variables
rains
rains → carry_umbrella
Aussagenlogik!
  Questions
rains ∨¬ rains
to the Audience:!
  Was
ist die Sprache?!
  Beweistheorie!
•  Was gibt es an Axiomen ?!
•  Was gibt es an Inferenzregeln?!
  Modelltheorie!
•  Wie können wir Formeln mit der realen Welt
verknüpfen?!
p ∨¬ p
Syntax der Aussagenlogik
 
Junktoren
 
 
 
 
 
 
 
Aussagen
 
 
Und (Konjunktion): ∧
Oder (Disjunktion): ∨
If then (Implikation): →
Äquivalenz: ⇔
Nicht (Negation):
¬
. . . Äquivalenz, exclusives Oder, . . .
Bezeichner:
p
q
(
)
Andere Zeichen:
 
Klammern
05/04/2011
rains ...
Logic Teaser
 
Ritter: sagen immer die
Wahrheit
Schurken: lügen immer
1: A sagt: B ist ein Schurke
oder C ist ein Schurke
2: B sagt A ist ein Ritter
 
Was sind A & B & C?
 
 
 
05/04/2011
Darstellung in Aussagenlogik!
  (A_Ritter
⇔ (¬B_Ritter or ¬C_Ritter))
∧
(B_Ritter ⇔ A_Ritter )!
1: A sagt: B ist ein Schurke
oder C ist ein Schurke
2: B sagt A ist ein Ritter
Interpretation einer Formel!
Aussage bekommt Wert ∈ {T,F}!
  Verknüpfungstabelle:!
  Jede
bekommt einen Wert ∈ {T,F}
basierend auf dem Wert der Argumente!
  Formel
  Modell
 
!
einer Formel :!
Interpretation die die Formel wahr macht!
Truth Tables
!!
""
¬!
¬!
!! ## ""
!! $$ ""
% "" ! & "
!! %
true
true
true
true
false
false
true
true
true
true
true
true
true
true
true
false
false
false
false
false
false
true
true
false
false
false
false
false
true
true
true
true
false
false
true
true
true
true
false
false
false
false
false
true
true
false
false
false
false
true
true
true
05/04/2011
Arten von Formeln!
  Tautologie!
  Nur
Modelle!
  Erfüllbare
Formel!
  Mindestens
ein Modell!
  Widerspruch:!
  Kein
Modell!
  Äquivalenz
von Formeln ? Definition von
Schlussfolgerung?!
Äquivalenz, Logische Folge!
  A
und B sind äquivalent (A≡B) genau
dann wenn sie die gleichen Modelle
haben!
  B
ist eine Schlussfolgerung von A (A |= B)
genau dann wenn alle Modelle von A
auch Modelle von B sind!
Eine Beweistheorie der
Aussagenlogik!
Im Kurs werden wir eine andere Technik sehen
(Grundlage von Prolog + SAT Solver)
Aussagenlogik!
Problem
Formel
In Aussagenlogik
SAT Solver
if(x==null) {
search(x.value)
…
}
Kurze Geschichte I!
350 v.Chr.
Gründung
der Logik
Aristoteles
1910
1879
Leibniz,
Boole,
Cantor
Mathematische
Logik
Frege
Russel
Whitehead
Theorem
Kurze Geschichte II!
Gödels
Unvollständigkeitssatz
Über formal unentscheidbare Sätze
der Principia Mathematica
und verwandter Systeme I.
Monatsh. Math. Phys., 38, 1931
Gödels
Vollständig-keitssatz
Die Vollständigkeit der Axiome des
Turing:
Unentscheidbarkeit
On Computable Numbers, with an Application
to the Entscheidungsproblem.!
Proc. London Math. Soc., 42, 1936-7!
Satz von
Herbrand
Sur la non-contradiction de l’arithmetique.
Journ. für die reine angew. Math., 166, 1931
logischen Funktionen-kalküls."
Monatsh. für Math. Phys. 37, 1930!
1930
1931
1936
Kursinhalte für Logik!
  Aussagenlogik!
  Einführung,
Refutationsbeweis, Resolution!
  SAT-Solver und Anwendungen (neu)!
  Prädikatenlogik!
  Grundlagen!
  Unifikation,
Resolution, automatisches
Beweisen!
  Je
nach Interesse auch fortgeschrittene
Themen (Gödel,…)!
Teil 2:
Logische Programmierung &
Prolog!
Übersicht von Teil 2 !
  Prologs
  Erster
Syntax und Datenstrukturen!
Eindruck von Prolog!
!
  “The
Power of Prolog”!
  Live
Demo !!
  Es funktioniert !!
Kurze Geschichte III!
Predicate Logic as a
Programming Language
Resolution
A Machine-oriented Logic Based
on the Resolution Principle.
Journal of the ACM (12),1965
Linear Resolution with
Selection Function.
Proc. IFIP Congress,1971
Prolog:
Programmation en Logique
1965
1971
1972
Robinson
Kowalski
Colmerauer
Kurze Geschichte der logischen
Programmierung!
 
Erfunden in 1972!
 
 
 
Colmerauer (Implementierung,
!
!Prolog = PROgrammation en LOGique)!
Kowalski (Theorie)!
Erkenntnis: Untermenge der Prädikatenlogik!
Effiziente prozedurale Interpretation basierend auf
Resolution (Robinson 1965 + Herbrand 1931)!
  Programm = Theorie!
  Berechnung = logisches Schließen (Inferenz)!
 
Klassische vs Logische Programmierung!
Algorithmus
Deduktion
Operational Reading of Logic!
∀F,G,U,V. dx(F+G, U+V) ← dx(F,U) ∧ dx(G,V)!
Logical meaning:!
“If U is the derivative of F and V the derivative of G
then U+V is the derivative of F+G”!
Operational reading:!
“To calculate the derivative of F+G one should first
calculate the derivatives of F and G and compose
the results”!
Simple (incomplete) translation to C:!
void dx(in,out) { match(in,’+’,f,g);
dx(f,u); dx(g,v); construct(out,’+’,u,v); }!
Features of Logic Programming!
 
Declarative Language!
 
 
Uniform Language to express and reason about!
 
 
 
State what is to be computed, not how!
Programs, specifications!
Databases, queries,…!
Simple, clear semantics!
 
 
Reasoning about correctness is possible!
Enable powerful optimisations!
Console
| ?- rains.
Source File
carry_umbrella :- rains.
rains.
human(sokrates).
human(schopenhauer).
human(locke).
tiger(hobbes).
yes
| ?- carry_umbrella.
Yes
| ?- animal(sokrates).
no
| ?- animal(X).
X = hobbes ?
yes
| ?- mortal(X).
X = sokrates ? ;
mortal(X) :- human(X).
mortal(X) :- animal(X).
X = schopenhauer ? ;
animal(X) :- tiger(X).
X = hobbes ? ;
X = locke ? ;
no
Prologʼs Syntax!
  Facts!
human(socrates).!
← (implication)
  Rules (clauses)!
carry_umbrella :- rains,no_hat.!
  Variables!
∧ (conjunction)
mortal(X) :- human(X).!
exists_human :- human(Any).!
  Queries!
existential variable (∃)
?- mortal(Z).universal
!
variable (∀)
Prologʼs Datastructures!
 
Constants:!
lower-case
human(socrates).!
 
Integers, Reals:!
fib(0,1).
pi(3.141).!
 
functor
(Compound) Terms:!
left_of_tree(tree(L,R),L).!
right_of_tree(tree(L,R),R).!
?- left_of_tree(tree(leaf(2),leaf(3)),R).!
Lists in Prolog!
 
Empty list:!
 
 
! (syntactic sugar for nil )!
Non-Empty list with first element H and tail T:!
 
 
[]
[H|T] ! (syntactic sugar for .(H,T) )!
Fixed-length list:!
 
 
[a]
! (syntactic sugar for [a | [] ] = .(a,nil) )!
[a,b,c]
! (syntactic sugar for [a | [b | [c | [] ] ] ] )!
Execution Model: Picture!
if subgoal succeeds, move right
query
fails
human(X), honest(X).
if subgoal fails, backtrack to the left
query
succeeds
Practical Advantages!
 
Automatic Memory Management!
 
 
 
 
 
 
you will see no pointers!
Relational/databases: travel demo !
Partially specified data, nondeterminism,multiple uses: append demo!
Powerful matching: regular expression demo,
tree tiling demo!
Backtracking, search: puzzle demo, graph
colour demo, nfa/dfa!
Language processing: parser demo!
Labyrinth!
 
 
 
 
 
 
 
 
sol(T) :- ls(T),sol(T,1,1).!
sol([],4,6).!
sol([right|T],R,C) :- go_right(R,C), C1 is C+1, sol(T,R,C1).!
sol([left|T],R,C) :- C1 is C-1, go_right(R,C1), sol(T,R,C1).!
sol([down|T],R,C) :- go_down(R,C), R1 is R+1, sol(T,R1,C).!
sol([up|T],R,C) :- R1 is R-1, go_down(R1,C), sol(T,R1,C).!
ls([]).!
ls([_|T]) :- ls(T).!
Truth Table in Prolog!
  Prolog:
17 Clauses, 36 lines !
  One Java Solution (with GUI): 20
Files, 3180 Lines!
  Good Java Solution: 4 Files, 184
Lines; does not deal with =>, <=>!
  See
if you can find the logic laws?!
  Could you add a new connective?!
:- op(300,fx,'~').!
:- op(400,xfy,'&').!
:- op(500,xfy,'or'). /* Note: + has 500, * has 400 as priority */!
:- op(600,xfy,'=>').!
:- op(700,xfy,'<=>').!
:- use_module(library(terms),[term_variables/2]).!
enum([]).!
enum([H|T]) :- (H=t ; H=f), enum(T).!
print_vars([]) :- print('||').!
print_vars([H|T]) :- print('|'),print(H),!
print_vars(T).!
!
analyze(Formula) :- term_variables(Formula,Vars), numbervars(Formula,0,_),!
print_vars(Vars), print(Formula),nl,fail.!
analyze(Formula) :- term_variables(Formula,Vars),!
enum(Vars), print_vars(Vars),!
truth_value(Formula,TF), print(TF), nl,!
fail.!
analyze(_) :- nl.!
!
truth_value(t,t).!
truth_value(f,f).!
truth_value(~ X, T) :- truth_value(X,TX), neg(TX,T).!
truth_value(X & Y, T) :- truth_value(X,TX), truth_value(Y,TY), and(TX,TY,T).!
truth_value(X or Y, T) :- truth_value(X,TX), truth_value(Y,TY), or(TX,TY,T).!
truth_value(X => Y, T) :- truth_value(~X or Y, T).!
truth_value(X <=> Y, T) :- truth_value(X & Y or ~X & ~Y, T).!
neg(f,t).
neg(t,f).!
and(f,_,f). and(t,f,f). and(t,t,t).!
or(t,_,t). or(f,f,f). or(f,t,t).!
Prolog
TruthTable.java
for (Permutator p = new Permutator(ids.size()); p.hasNext();) {
!
!
!Map<String,Boolean>map=newTreeMap<String,Boolean>();
!
!
!boolean[] values = p.next();
!
!
!for (int i = 0; i < values.length; i++) {
!
!
!
!map.put(ids.get(i),
values[i]);
!
!
!
!System.out.print(values[i]
"\t");
+
!
!
!}
!
!
!System.out.println("| " + evaluator.evaluate(ast, map));
!
!}
!}
!private static String
concatenate(String[] args) {
!
!if (args.length == 0)
!
!
!return ""; !
!StringBuffer result = new StringBuffer();
!
!for (int i = 0; i < args.length - 1; i++) {
!
!
!result.append(args[i] + " ");
!
package de.jastram.truthtable;import java.io.IOException;import
!}
!
!result.append(args[args.length - 1]);
java.io.PushbackReader;import java.io.StringReader;import java.util.List;import
!
!return result.toString(); !}}
java.util.Map;import java.util.TreeMap;import
de.jastram.truthtable.lexer.Lexer;import
de.jastram.truthtable.lexer.LexerException;import
de.jastram.truthtable.node.Start;import
de.jastram.truthtable.parser.Parser;import
de.jastram.truthtable.parser.ParserException;/** * Program that takes a logic
expression on the command line and evaluates it * with all interpretations. */
public class TruthTable { !public static void main(String[] args) throws
LexerException, IOException,
!
!
!ParserException{
!
!Stringarg=concatenate(args);
!
!PushbackReaderin=newPushbackReader(newStringReader(arg));
!
!Parser parser = new Parser(new Lexer(in));
!
!Start ast = parser.parse();
!
!List<String> ids = new IdCollector().getIds(ast);
!
!Evaluatorevaluator=newEvaluator(); !
!for(Stringid:ids){
!
!
!System.out.print(id + "\t");
!
!}
!
!System.out.println("|"+arg);
!
!System.out.println
("=============================================="); !
!!
Permutator.java
package de.jastram.truthtable;import java.util.Iterator;/** * An
Iterator that provides permutations for n boolean values, where n is
the * argument to the constructor. The results are provided as boolean
arrays. */public class Permutator implements Iterator<boolean[]> {
!private int length;
!private int counter = 0;
!publicPermutator(intnumFields){ !
!if(numFields>31)
!
!
!throw new IndexOutOfBoundsException
("Too many variables!");
!
!this.length =
numFields; !}
!public boolean hasNext() {
!
!return counter < (Math.pow(2, length));
!}
!public boolean[] next() {
!
!boolean[]
bits = new boolean[length];
!
!for (int i = 0; i <
length; i++) {
!
!
!int shift = counter >>
i;
!
!
!bits[i] = (shift % 2 == 1);
!
!}
!
!counter++; !
!return bits;
!}
!public void remove() {
!
!throw new UnsupportedOperationException();
!}}!
IdCollector.java
package de.jastram.truthtable;import java.util.ArrayList;import
java.util.List;import
de.jastram.truthtable.analysis.DepthFirstAdapter;import
de.jastram.truthtable.node.Start;import
de.jastram.truthtable.node.TId;/** * This Visitor collects all distinct
Ids. */public class IdCollector extends DepthFirstAdapter {!private
List<String> ids = new ArrayList<String>();
!public List<String>
getIds(Start ast) {
!
!ast.apply(this);
!
!returnids;!}
!@Override !publicvoidcaseTId(TIdnode){
!
!if (!ids.contains(node.getText())) !
!
!ids.add(node.getText());
!
!super.caseTId(node);
!}}!
Evaluator.java
!@Override
!public void caseAAndExpr
package de.jastram.truthtable;import java.util.Map;import
(AAndExpr node) {
!
java.util.NoSuchElementException;import java.util.Stack;import
!super.caseAAndExpr(node); !
de.jastram.truthtable.analysis.DepthFirstAdapter;import
!boolean value1 = stack.pop();
de.jastram.truthtable.node.AAndExpr;import
!
!boolean value2 = stack.pop();
de.jastram.truthtable.node.ANegTerm;import
!
!stack.push(value1 & value2);
de.jastram.truthtable.node.AOrExpr;import
!}
@Override
!public void
de.jastram.truthtable.node.Start;import de.jastram.truthtable.node.TId;/** * caseAOrExpr(AOrExpr node) {
!
This Visitor Evaluates an AST for a Set of given values. */public class
!super.caseAOrExpr(node); !
Evaluator extends DepthFirstAdapter { !private Stack<Boolean> stack = new
!boolean value1 = stack.pop();
Stack<Boolean>();
!private Map<String, Boolean> values;
!public
!
!boolean value2 = stack.pop();
boolean evaluate(Start ast, Map<String, Boolean> values) {
!
!
!stack.push(value1 | value2);
!this.values = values;
!
!ast.apply(this);
!}}!
!
!return stack.pop();
!}
!@Override
!public void caseTId(TId node) {
!
!Boolean
value = values.get(node.getText());
!
!if (value == null)
!
!
!throw new NoSuchElementException("Don't
know id: " + node);
!
!stack.push(value);
!
!super.caseTId(node);
!}
!@Override
!public void
caseANegTerm(ANegTerm node) {
!
!super.caseANegTerm(node);
!
!boolean value = stack.pop();
!
!stack.push(!value);
!}
!!
Where are the logic laws ?
But Prolog will not be as fast
Right ?
Geschwindigkeit, Fib Rekursiv!
 
Java (BigInteger)!
 
 
 
 
 
Fib(25), 121393, Zeit 90 ms!
Fib(30),1346269, Zeit 632 ms!
Fib(35), 14930352, Zeit 7030 ms!
SICStus Prolog 4!
| ?- main.!
 
 
 
25 : 121393 ; Time = 20 ms!!
30 : 1346269 ; Time = 250 ms!
35 : 14930352 ; Time = 2750 ms!
LIPS!
  Logical
Inferences per Second!
  On MacBook Pro 2,33 GHz:!
$ sicstus4 -l bench.pl --goal "bench(100000)."
% compiling /Users/leuschel/PrologTemp/bench.pl...
% compiled /Users/leuschel/PrologTemp/bench.pl
in module user, 10 msec 4604 bytes
SICStus 4.0.1 (i386-darwin-8.9.1): Tue May 15 14:53:23 CEST 2007
Licensed to SP4phil-fak.uni-duesseldorf.de
33288590.604026847 lips for 100000
iterations taking 1490 msecs (1500-10)
Logic Programming useful for!!
 
Software Engineering/Mission Critical
Systems!
 
 
Artificial Intelligence Applications:!
 
 
Expert Systems, Natural Language Processing,
Intelligent Agents, ...!
Operations Research, Optimisation,
Planning!
 
 
Mercury, Program Analysis!
Constraint Logic Programming!
Programming Languages!
 
Parsers, Compilers, Domain-Specific Languages
(Erlang), Analysis, Verification, Rapid Prototyping...!
Opening (25 May 2009)!
 
 
 
 
 
TEN DECLARATIVE PROGRAMMING CONSULTANTS SOUGHT!
Semmle and LogicBlox are creating a platform for declarativeprogramming in Datalog, a pure
logic programming language.Semmle is based in Oxford, headed by Oege de Moor;LogicBlox is
based in Atlanta, headed by Molham Aref.To configure our solution at a number of large
corporateclients in the retail, insurance and software qualityindustries, we urgently require 10
full-time staff to act as consultants. These consultants will work with clients to write custom
queries in Datalog, and to create user interfaces in a declarative framework.This is a unique
opportunity to change the way enterprise software is constructed, and to become part of the
revolutionto adopt declarative programming in mainstream applications.Semmle and LogicBlox
offer a vibrant, intellectuallystimulating environment to work on exciting applications ofcuttingedge technology.!
Requirements:You must be passionate about simplifying the constructionof complex software
systems. A good undergraduate degree in computer science or related discipline is necessary.
Substantial programming experience, and familarity with declarative programming (both
functional and logic) is a must. Some travel will be required.Starting date and renumeration:The
openings are available immediately. The renumeration dependson experience and
qualifications; it is especially competitive for recent graduates.!
Further information:To find out more about this opportunity, write toOege de Moor
([email protected]) and Molham Aref ([email protected]).!
To apply:Send a CV and the names of three referees (at least two ofwhom must be able to
comment on your programming abilities)to [email protected], by June 12.!
Learning Outcome!
Option 1:
Prolog will become your favourite language!
  Option 2:
It will not become your favourite language!
!Prolog still useful:!
 
Rapid prototyping!
  Prolog interpreter as part of application
(Windows NT)!
  Implicit in your application (Unification/Matching,
Search, Backtracking,…)!
  Semantic Web!
 
Background Material!
 
Ulf Nilsson and Jan Maluszynski, Logic,
Programming and Prolog, Wiley & Sons, 1990.
Covers logic, logic programming, pure Prolog.!
Patrick Blackburn, Johan Bos and Kristina Striegnitz,
Learn Prolog Now!
  Arbeitsbuch Prolog
 
http://www.informatik.uni-rostock.de/mmis/courses/ss07/23002/arbeitsbuch_prolog.pdf!
Ivan Bratko, Prolog Programming for Artificial
Intelligence, Addison Wesley, 1990!
  Clocksin & Mellish, Programming in Prolog, SpringerVerlag.!
  Sterling and Shapiro. The Art of Prolog. MIT Press.!
 
Summary!
  Logic,
Logic Programming, and Prolog
are!
  Very
useful for theory and practice!
  Fun and stimulating!
  Difficult
(you will have to work hard!)!
Some Existing Prolog Systems!
 
Prolog!
 
 
Extended Prolog!
 
 
 
Constraints: SICStus, CIAO, Eclipse, ...!
Tabling: XSB Prolog!
Purified Prolog!
 
 
SWI, IF, Visual (PDC) Prolog!
Mercury, Gödel!
Integrated with Functional Programming!
 
Curry, Babel, Escher!