Hier steht der Titel der Power Point Präsentation.st.inf.tu-dresden.de/files/teaching/ss09/PS09/luo_folien.pdfProseminar:Mercury. Folie 3 von 31. 1. Einleitung basiert auf der mathematischen
Post on 23-Sep-2019
2 Views
Preview:
Transcript
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/
top related