Commit 0b892a54 authored by Amin Raslan's avatar Amin Raslan
Browse files

Replace hintergrundwissen.tex

parent abb4759a
\section{Hintergrundwissen} \section{Hintergrundwissen}
\label{section:hintergrundwissen}
Programmiersprachen können in der Regel verschiedene Programmierparadigmen erlauben, wobei grob zwischen der \emph{imperativen} und der \emph{deklarativen} Programmierung unterschieden wird. Bei der imperativen Programmierung wird beschrieben, wie etwas berechnet werden soll. Der Programmierer gibt also eine Folge von Anweisungen (Befehlen) in einer bestimmten Reihenfolge vor, die dann festlegen, was der Computer tun soll. Prozedurale und objektorientierte Programmierung sind beispielhafte Programmierparadigmen, die dieses Prinzip verwenden. Im Gegensatz dazu wird bei der deklarativen Programmierung beschrieben, was berechnet werden soll. Der Programmierer versorgt den Computer also mit Informationen, welcher dann einen Lösungsraum aufbaut und versucht, eine Lösung zu finden. Funktionale und logische Programmierung sind beispielhafte Programmierparadigmen, die dieses Prinzip verwenden \cite{programmierparadigma}. Diese Arbeit beschäftigt sich grundsätzlich mit der logischen Programmierung. Die logische Programmierung wurde unter Anderem aus dem Versuch entwickelt, logische Theoreme mithilfe der Machine zu beweisen, wie zum Beispiel zu beweisen, dass ein Theorem wie $X \rightarrow Z$ aus den logischen Axiomen $X \rightarrow Y$ und $Y \rightarrow Z$ folgt. Es können aber auch Probleme in anderen Bereichen als Theoreme betrachten werden, wie arithmetische Aufgaben sowie Datenbanken \cite{logische_programmierung}. Logische Programmierung findet unter Anderem Einsatz in der künstlichen Intelligenz, Programmentwicklung, Datenbanken, Sprachverarbeitung, Computer Aided Desgin und Constraintprogrammierung \cite{einsatz_logischer_programmierung}, was das Thema dieser Arbeit ist. Programmiersprachen können in der Regel verschiedene Programmierparadigmen erlauben, wobei grob zwischen der \emph{imperativen} und der \emph{deklarativen} Programmierung unterschieden wird. Bei der imperativen Programmierung wird beschrieben, wie etwas berechnet werden soll. Der Programmierer gibt also eine Folge von Anweisungen (Befehlen) in einer bestimmten Reihenfolge vor, die dann festlegen, was der Computer tun soll. Prozedurale und objektorientierte Programmierung sind beispielhafte Programmierparadigmen, die dieses Prinzip verwenden. Im Gegensatz dazu wird bei der deklarativen Programmierung beschrieben, was berechnet werden soll. Der Programmierer versorgt den Computer also mit Informationen, welcher dann einen Lösungsraum aufbaut und versucht, eine Lösung zu finden. Funktionale und logische Programmierung sind beispielhafte Programmierparadigmen, die dieses Prinzip verwenden \cite{programmierparadigma}. Diese Arbeit beschäftigt sich grundsätzlich mit der logischen Programmierung. Die logische Programmierung wurde unter Anderem aus dem Versuch entwickelt, logische Theoreme mithilfe der Machine zu beweisen, wie zum Beispiel zu beweisen, dass ein Theorem wie $X \rightarrow Z$ aus den logischen Axiomen $X \rightarrow Y$ und $Y \rightarrow Z$ folgt. Es können aber auch Probleme in anderen Bereichen als Theoreme betrachten werden, wie arithmetische Aufgaben sowie Datenbanken \cite{logische_programmierung}. Logische Programmierung findet unter Anderem Einsatz in der künstlichen Intelligenz, Programmentwicklung, Datenbanken, Sprachverarbeitung, Computer Aided Desgin und Constraintprogrammierung \cite{einsatz_logischer_programmierung}, was das Thema dieser Arbeit ist.
\subsection{Prolog} \subsection{Prolog}
...@@ -145,6 +146,20 @@ In Beispiel~\ref{bsp:minizinc_bsp} haben wir die Implementierung von Beispiel~\r ...@@ -145,6 +146,20 @@ In Beispiel~\ref{bsp:minizinc_bsp} haben wir die Implementierung von Beispiel~\r
MiniZinc-Modelle werden sowohl in der MiniZincIDE als auc über SICStus-Prolog aufgerufen. In SICStus-Prolog werden dafür bestimmte Prädikate verwendet. Diese befinden sich in der Bibleothek \emph{zinc}. Das Prädikat \emph{mzn\_load\_file(+MznFile, +Options, -FznState)} erhält eine MiniZinc-Datei mit der Endung \emph{.mzn} mit weiteren Optionen und erzeugt eine äquivalente FlatZinc-Datei \emph{FznState}. Unter den Optionen sind \emph{parameters\slash1} und \emph{variables\slash1}. In \emph{parameters} können wir Parameter an die MiniZinc-Datei geben und mit \emph{variables} können wir Ausgaben von der Datei erhalten. Siehe Anhang~\ref{subsubsection:n_factorial_minizinc_sicstus} für ein Beispiel für den Aufruf vom MiniZinc-Modell \emph{N Factorial} über SICStus-Prolog. In der Übersetzung von MiniZinc in FlatZinc wird optimiert. Wegen der Optimierung können Variablen, die in MiniZinc definiert wurden, in FlatZinc weggelassen werden. Wir können diese Variablen aber beim Aufruf in SICStus-Prolog benötigen. Hier bietet sich die Option \emph{optimize(false} an, mit der dann nicht mehr optimiert wird und die Variablen deswegen nicht weggelassen werden (siehe Anhang~\ref{subsubsection:zebra_puzzle_minizinc_sicstus} für ein Beispiel im Modell \emph{Zebra Puzzle}) \cite{minizinc_sicstus}. Weiterhin wird auch das Prädikat \emph{fzn\_solve\slash1} verwendet. Dieses versucht, eine Lösung für die FlatZinc-Datei zu finden und sie dann anzuzeigen \cite{flatzinc_sicstus}. MiniZinc-Modelle werden sowohl in der MiniZincIDE als auc über SICStus-Prolog aufgerufen. In SICStus-Prolog werden dafür bestimmte Prädikate verwendet. Diese befinden sich in der Bibleothek \emph{zinc}. Das Prädikat \emph{mzn\_load\_file(+MznFile, +Options, -FznState)} erhält eine MiniZinc-Datei mit der Endung \emph{.mzn} mit weiteren Optionen und erzeugt eine äquivalente FlatZinc-Datei \emph{FznState}. Unter den Optionen sind \emph{parameters\slash1} und \emph{variables\slash1}. In \emph{parameters} können wir Parameter an die MiniZinc-Datei geben und mit \emph{variables} können wir Ausgaben von der Datei erhalten. Siehe Anhang~\ref{subsubsection:n_factorial_minizinc_sicstus} für ein Beispiel für den Aufruf vom MiniZinc-Modell \emph{N Factorial} über SICStus-Prolog. In der Übersetzung von MiniZinc in FlatZinc wird optimiert. Wegen der Optimierung können Variablen, die in MiniZinc definiert wurden, in FlatZinc weggelassen werden. Wir können diese Variablen aber beim Aufruf in SICStus-Prolog benötigen. Hier bietet sich die Option \emph{optimize(false} an, mit der dann nicht mehr optimiert wird und die Variablen deswegen nicht weggelassen werden (siehe Anhang~\ref{subsubsection:zebra_puzzle_minizinc_sicstus} für ein Beispiel im Modell \emph{Zebra Puzzle}) \cite{minizinc_sicstus}. Weiterhin wird auch das Prädikat \emph{fzn\_solve\slash1} verwendet. Dieses versucht, eine Lösung für die FlatZinc-Datei zu finden und sie dann anzuzeigen \cite{flatzinc_sicstus}.
In MiniZinc muss nicht wie in Prolog auf Groß- und Kleinschreibung geachtet werden, da Variablen in MiniZinc durch \emph{var} kennzeichnet werden. Da wir jedoch die MiniZinc-Modelle über SICStus-Prolog durch Prädikate, die großgeschriebene Variablen als Parameter übergeben bekommen, aufrufen wollen, müssen die Variablennamen in den MiniZinc-Modellen kleingeschrieben werden. Sonst kann der Prolog-Interpreter, zum Beispiel im folgenden Prädikat, nicht zwischen den Variablen unterscheiden:
\begin{minted}[frame=single,linenos]{prolog}
:- use_module(library(zinc)).
n_factorial_minizinc(N, Factorial) :-
mzn_load_file('n_factorial.mzn',
[parameters([N=N]),variables([Factorial=Factorial])],
FznState),
fzn_solve(FznState).
\end{minted}
Deswegen sind die Deklarationen in MiniZinc-N-Factorial sowie in allen anderen MiniZinc-Modellen kleingeschrieben, wie in Anhang~\ref{appendix:implementierungen_clpfd_und_minizinc} zu sehen ist.
\subsubsection*{FlatZinc} \subsubsection*{FlatZinc}
Constraint-Solver arbeiten nicht direkt mit den MiniZinc-Modellen, sondern mit einer einfacheren Menge von MiniZinc, die FlatZinc genannt wird. MiniZinc-Modelle werden also in äquivalente FlatZinc-Modelle übersetzt. Constraint-Solver arbeiten nicht direkt mit den MiniZinc-Modellen, sondern mit einer einfacheren Menge von MiniZinc, die FlatZinc genannt wird. MiniZinc-Modelle werden also in äquivalente FlatZinc-Modelle übersetzt.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment