Hier steht der Titel der Power Point...

33
Proseminar: Programmierparadigmen und Sprachen Mercury Fakultätsname :Informatik Luo Xi Beteuer:Andreas Bartho Dresden, 11.06.2009

Transcript of Hier steht der Titel der Power Point...

Proseminar:Programmierparadigmen und Sprachen

Mercury

Fakultätsname :Informatik

Luo XiBeteuer:Andreas BarthoDresden, 11.06.2009

TU Dresden, 11.06.2009 Folie 2 von 30

Gliederung

1.Einleitung

2.Sprachbeschreibung

3.Zusammenspiel mit anderen Sprachen

4.Project

5.Quelle

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 3 von 31

1. Einleitung

●basiert auf der mathematischen Logik.

●besteht aus Menge von Axiomen.

●deklarative Programmierung .

●Forschungsgebiet:Künstliche Intelligenz.

1.1 Logik Programmierung

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 4 von 31

Besonderheiten logischerProgrammiersprachen1.Backtracking:Versuch-und-Irrtum-Prinzip

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 5 von 31

Besonderheiten logischerProgrammiersprachen2.Unifikationsalgorithmen:●Vereinheitlichung prädikatenlogischer Ausdrücke.●Substitution ist die Basisoperation.Beispiel 1:Menge von Termen : M = {t1, . . . , tn}ResultMenge : u(M) = {u(t1), . . . , u(tn)}Gesucht : allgemeinste Unifikatoren u

Beispiel 2:(in Prolog):?- f(X)=f(a). ---> X=a

?- g(X,X)=g(Y,[a,b]). --->X=[a,b] Y=[a,b]

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 6 von 31

Probleme von Logikprogrammiersprachen

1.Laufzeit:im Vergleich zu imperativ geschriebenen Programmen langsam

2.Teamarbeiten:die Entwicklung in Teams wird nicht unterstützt.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 7 von 31

1.2 Vorstellung von Mercury

●Mercury ist eine stark an Prolog angelehnte Programmiersprache.●Entwicklung seit 1993 am Department of Computer Science and Software Engineering der University of Melbourne●erste Release Version 0.3 im Juli 1995●Heute : 0.13.1, Dezember 1, 2006 ●Ziel: industriell einsetzbare LP-Sprache

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 8 von 31

1.3 Kleine Beispiel

:- module hello.

:- interface.

:- import_module io.

:- pred main(io::di, io::uo) is det.

:- implementation.

main(IOState_in, IOState_out) :-

io.write_string("Hello, World!\n", IOState_in, IOState_out).

Hello world!

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 9 von 31

2.Sprache Beschreibung

":-" :Head Symbol von Klauseln";" :Disjunktionen (Logik oder)"," :Konjunktionen (Logik und)">="und "=<" : grösser/kleiner gleich"%" :KommentarX,Y,L,... :Variable (Grosser Buchstabe)

Sonderzeichen

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 10 von 31

2.1 Typsystem

Eingebaute Typen:

●Primitive Typen : char, int, float, string●Prädikattypen : pred, pred(T), pred(T1, T2), ...●Funktionstypen : (func) = T, func(T1) = T,

func(T1,T2) = T, ...●Tupeltypen : { }, { T }, {T1, T2}, ...●List : ["a","b","c"] ( [Head|Rest] )

●State-of-the-world-Typ: io_state

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 11 von 31

Benutzerdefinierte Typen

●discriminated unions●Äquivalenztypen●abstrakte Typen

Syntax der Typdefinition::- type Typname - - -> body.

:- type Typname = = Typname2.

:- type Typname.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 12 von 31

discriminated unions

Syntax der Typdefinition::- type Typname - - ->Konstruktor1;...;Konstruktorn.

Beispiel 1:- type list(T) - - -> [] ; [T | list(T)].

Beispiel 2:- type employee - - ->employee(name :: string,age :: int,

salary :: int).

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 13 von 31

Äquivalenztypen

●Abkürzungen (vgl. typedef in C)●erhöhen Lesbarkeit

●Syntax der Typdefinition::- type Typname = = Typname2.

Beispiel:- type money = = float. % In Dollar/Euro

:- type dictionary(Key, Value) = = list({Key, Value}).

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 14 von 31

abstrakte Typen

●öffentliche Teil(Deklaration) im Interface

●Definition ist versteckt im Implementation

Syntax::- type Typname.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 15 von 31

Standard Librarybintreehash_tablelistintstackboolunitio...

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 16 von 31

2.2 Prädikate und FunktionenP/F=Deklaration+Definition

Funktionen: spezielle Prädikate

Syntax der Deklaration:- pred Name (ArgType1, ...,ArgTypen).

:- func Name (ArgType1, ...,ArgTypen)= ResType.

Syntax der DefinitionPredName(Term1, ..., Termn) :- body.

FuncName(Term1, ..., Termn) = Result :- body.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 17 von 31

BeispielFIBONACCI NUMBERS:1,1,2,3,5,8,13,...(An=An-1+An-2)

Prädikate ::- pred fib(int::in, int::out) is det.fib(N, X) :-( if N =<2 then X = 1

else fib(N - 1, A), fib(N - 2, B), X = A + B).

Funktion ::- func fib(int) = int is det.fib(N) = X :-( if N =< 2 then X = 1

else X = fib(N - 1) + fib(N - 2)).

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 18 von 31

2.3 Determinismus-Klassen

Prozedur Fail oder wie viele Lösungen

det :immer genau 1 Lösung (1)semidet :eine oder keine Lösung (<=1)multi :mindestens eine Lösung (>=1)nondet :beliebig viele Lösungen (auch keine) (>=0)failure :scheitert immer (0)

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 19 von 31

Beispiel:-pred square(int::in, int::out) is det.

square(X, X * X). % X=2 -> 2*2=4

:-pred absolute square root(float::in, float::out) issemidet.

absolute square root(X, AbsSqrtX) :−

X >= 0.0,AbsSqrtX = math.sqrt(X).

% X=4.0 -> AbsSqrtX =2.0

% X=-1.0-> keine Loesungen

:− pred small prime(int::out) is multi.

small prime(2).

small prime(3).

small prime(5).

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 20 von 31

2.4 Mode SystemPrädikate Deklaration=Signatur+ModeBeispiel 1

:− pred phone(string::in, int::out) is semidet.

phone(“Ian”, 66532).

phone(“Julien”, 66532).

:− pred phone(string, int).

:− mode phone(in, out) is semidet.

Beispiel 2:− pred phone(string, int).

:− mode phone(in, out) is semidet.

:− mode phone(out, in) is nondet.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 21 von 31

Vorteile

●erhöht die Lesbarkeit des Quellcodes

●die Fehler festgestellt

●die Zahl der möglichen Laufzeitfehler verringert

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 22 von 31

2.5 Modul-System

●Zusammenfassung von Programmstücken●saubere Schnittstellen möglich●ermöglicht Teamarbeit●ADTs(abstrakte Datentype) möglich

Vorteile

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 23 von 31

Aufbau:- module Modulename.

:- interface.% öffentliche Typen, Prädikate,% Funktionen und Importe

:- implementation.% geheime Typen, Prädikate,% Funktionen und Importe

:- end_module Modulename.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 24 von 31

Beispiel:- module queue.

:- interface.

:- type queue(T). %abstrakte typ

:- pred is_empty(queue(T)::in) is semidet.

:- pred enqueue(queue(T)::in, T::in, queue(T)::out) is det.

:- implementation.

:- import_module list.

:- type queue(T) = = list(T).

is_empty( [ ] ).

enqueue(Qu0, Elem, Queue) :- list__append(Qu0, Elem, Queue).

:- end_module queue.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 25 von 31

2.6 if-then-else

Syntax von if-then-else :

if CondGoal then ThenGoal else ElseGoal

Beispiel:

fib(N) = X :-

( if N =< 2 then X = 1 else X = fib(N - 1) + fib(N - 2)).

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 26 von 31

2.7 Negation

·"not G" ist die Negation von G.·Negation fail,falls G richtig.·Negation richtig,falls G fail.

Beispiel:·not G1, G2 =(not G1), G2, .... ·not (G1, G2, ...)

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 27 von 31

2.8 I/O System●Status der Welt: io_state●nur eine Referenz auf den Status●bei Änderungen: zerstören und neuen Status erstellenBeispiel 1::- pred main(io__state:di, io__state::uo)is det.

main(IOState_in, IOState_out) :-

io.write_string("Hello, ", IOState_in, IOState_tmp1),

io.write_string("World!", IOState_tmp1, IOState_out).

Beispiel 2:main(!IO) :-

io__write_int(1, !IO),

io__write_int(2, !IO).

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 28 von 31

3.Zusammenspiel mit anderen Sprache●unterstüzt die Integration von C Code●allgemeiners Interface für Einbindung von Code aus verschiedenen Sprache●Fremdcode mit pragma foreign proc eingebundenBeispiel::- pragma foreign proc(”Lang”,Pred(Var1 ::Mode1 , Var2::Mode2 , ...),

Attributes, Foreign Code).

:- pragma foreign proc(”Lang”,Func(Var1 ::Mode1 , Var2::Mode2 , ...)

= (Var::Mode),

Attributes, Foreign Code).

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 29 von 31

Beispiel:

:- func sin(float) = float.

:- pragma foreign proc("C",

sin(X::in) = (Sin::out),

[may call mercury],

"Sin = sin(X);").

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 30 von 31

4.Project

• HAL HAL ist ein Constraint-Solver, der auf Mercury basiert. Es handelt sich um ein Gemeinschaftsprojekt verschiedener Universitaeten. Die Arbeit scheint seit 2003 still zu stehen.

• Aditi Aditi ist eine Datenbank, die auf Mercury basiert. Sie wurde bis Ende 2002 an der University of Melbourne entwickelt.

• MUZAK MUZAK ist ein Animationsprogramm für Z-Spezifikationen. Die Arbeit wurde 1999 abgeschlossen/eingestellt.

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 31 von 31

Zusammenfassung

●Viele Probleme von Prolog gelöst durch:●starke Typisierung●Determinismus-System●Mode-System●Modul-System●I/O System

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 32 von 31

5.Quelle[1] F. Henderson, T. Conway, Z. Somogyi et. al. The Mercury LanguageReference Manual, [2] R. Becket. Ralph Becket’s Mercury tutorial.[3] T. Conway, Z. Somogyi, F. Henderson. The Prolog to Mercury

Transition Guide, [4] Mercury-Entwicklerteam. Comparing Mercury with Haskell -

nur online verf¨ugbar unter http://www.cs.mu.oz.au/research/

mercury/information/comparison with haskell.html[5] Mercury-Entwicklerteam. The Mercury Library Reference Manual,[6] F. Henderson, T. Conway, Z. Somogyi et. al. The Mercury User´s

Guide,[7] S.Hölldobler. Logik und Logikprogrammierung. [8] Webseite des Mercury-Projekts:

http://www.cs.mu.oz.au/research/mercury/

TU Dresden, 11.06.2009 Proseminar:Mercury Folie 33 von 30

Danke für Aufmerksamkeit !