Commit a2712841 authored by Amin Raslan's avatar Amin Raslan
Browse files

Replace future_work.tex

parent 63c6ce3c
\section{Future Work}
Wie in Kapitel~\ref{section:schlussfolgerung} (Schlussfolgerung) zu sehen ist, gibt es viele Unterschiede zwischen CLP(FD) und MiniZinc. Jede der beiden Sprachen zeigt sich an manchen Stellen besser als die Andere. Für die zukünftige Arbeit könnte ein automatischer Übersetzer zwischen CLP(FD) und MiniZinc erstellt werden, um die Vorteile beider Sprachen gemeinsam zu nutzen. Dieses Kapitel stellt anhand der Modelle in Kapitel~\ref{section:vergleich_von_implementierungen} (Vergleich von Implementierungen) und deren Implementierungen in Anhang~\ref{appendix:implementierungen_clpfd_und_minizinc} Vorschläge zur Verfügung, wie solch ein automatischer Übersetzer teilweise implementiert werden könnte.
Wie in Kapitel~\ref{section:vergleich_von_implementierungen} (Vergleich von Implementierungen) zu sehen ist, gibt es viele Unterschiede zwischen CLP(FD) und MiniZinc. Jede der beiden Sprachen ist sich in manchen Bereichen besser geeignet als die Andere. Für die zukünftige Arbeit könnte ein automatischer Übersetzer zwischen CLP(FD) und MiniZinc erstellt werden, um die Vorteile beider Sprachen gemeinsam zu nutzen. Dieses Kapitel stellt anhand der Modelle in Kapitel~\ref{section:vergleich_von_implementierungen} (Vergleich von Implementierungen) und deren Implementierungen in Anhang~\ref{appendix:implementierungen_clpfd_und_minizinc} Vorschläge zur Verfügung, wie solch ein automatischer Übersetzer teilweise implementiert werden könnte.
\paragraph*{Prolog-Prädikate und MiniZinc-Funktionen}
In der Regel werden Prolog-Prädikate rekursiv mit einem Basecase implementiert. Diese Prädikate können als rekursive Funktionen in MiniZinc implementiert werden, wobei der Basecase im Prädikat als die Abbruchbedingung in der Funktion verwendet wird, wie in N Factorial (Anhang~\ref{subsection:n_factorial}) zu sehen ist. Mit dem automatischen Übersetzer könnte also auf diese Weise zwischen Prolog-Prädikaten und MiniZinc-Funktionen übersetzt werden.
In der Regel werden Prolog-Prädikate rekursiv mit einem Basecase implementiert. Diese Prädikate können als rekursive Funktionen in MiniZinc implementiert werden, wobei der Basecase im Prädikat als die Abbruchbedingung in der Funktion verwendet wird, wie in N Factorial (Anhang~\ref{subsection:n_factorial}) zu sehen ist.
Umkegehrt können rekursive Funktionen in MiniZinc als Prolog-Prädikate implementiert werden, wobei die Abbruchbedingung in der Funktion in MiniZinc als der Basecase im Prolog-Prädikat verwendet wird. Mit dem automatischen Übersetzer könnte also auf diese Weise zwischen Prolog-Prädikaten und MiniZinc-Funktionen übersetzt werden.
\paragraph*{Variablendefinitionen}
Wenn mehrere Variablen die selbe Domäne haben, werden sie in CLP(FD) in der Regel benannt und in eine Liste gepackt. Diese Liste erhält dann die Domäne dieser Variablen. In MiniZinc werden diese Variablen einzeln definiert. Sie erhalten die Domäne in ihren Definitionen. Beispiel~\ref{bsp:variablendefinitionen} zeigt, wie der automatische Übersetzer Variablen der selben Domäne zwischen CLP(FD) und MiniZinc übersetzen könnte. Für weitere Beispiele siehe Send More Money (Anhang~\ref{subsubsection:send_more_money}), Send Most Money (Anhang~\ref{subsubsection:send_most_money}), Smuggler's Knapsack (Anhang~\ref{subsection:smugglers_knapsack}), Zebra Puzzle (Anhang~\ref{subsection:zebra_puzzle}), Seseman's Convent (Anhang~\ref{subsection:sesemans_convent}) und Magic Hexagon (Anhang~\ref{subsection:magic_hexagon}).
Wenn mehrere Variablen dieselbe Domäne haben, werden sie in CLP(FD) in der Regel in eine Liste gepackt. Diese Liste erhält dann die Domäne dieser Variablen. In MiniZinc werden diese Variablen in der Regel einzeln definiert. Diese Variablen erhalten die Domäne dann jeweils in ihren Definitionen. Beispiel~\ref{bsp:variablendefinitionen} zeigt, wie der automatische Übersetzer Variablen derselben Domäne zwischen CLP(FD) und MiniZinc übersetzen könnte. In MiniZinc wird zuerst die Domäne erstellt und dann werden die Variablen erstellt und diese bekommen die Domäne in der Definition. In CLP(FD) ist es umgekehrt. Zuerst werden die Variablen als eine Liste erstellt und dann bekommt diese Liste die Domäne.
\begin{beispiel}
\begin{minted}[frame=single,linenos]{prolog}
......@@ -23,16 +25,18 @@ var domain: C;
\label{bsp:variablendefinitionen}
\end{beispiel}
Für weitere Beispiele siehe Send More Money (Anhang~\ref{subsubsection:send_more_money}), Send Most Money (Anhang~\ref{subsubsection:send_most_money}), Smuggler's Knapsack (Anhang~\ref{subsection:smugglers_knapsack}), Zebra Puzzle (Anhang~\ref{subsection:zebra_puzzle}), Seseman's Convent (Anhang~\ref{subsection:sesemans_convent}) und Magic Hexagon (Anhang~\ref{subsection:magic_hexagon}).
\paragraph*{Matrix erstellen}
In manchen Modellen geht es um Quadrate, für die Matrizen in der Implementierung erstellt werden. Diese Matrizen wurden in allen Modellen auf ähnliche Weise erstellt. Beispiel~\ref{bsp:matrix} zeigt, wie der automatische Übersetzer Matrizen zwischen CLP(FD) und MiniZinc übersetzen könnte. Für weitere Beispeiel siehe Magic Square (Anhang~\ref{subsection:magic_square}), Sudoku (Anhang~\ref{subsection:sudoku}) und Euler's Officer Problem (Anhang~\ref{subsection:eulers_officer_problem}).
In manchen Modellen geht es um Quadrate, für die Matrizen in der Implementierung erstellt werden. Diese Matrizen wurden in allen Modellen auf ähnliche Weise erstellt. Für ein NxN-Quadrat wird in CLP(FD) eine Liste mit N Elementen erstellt. In dieser Liste werden dann N innere Listen mithilfe von \emph{maplist} und \emph{same\_length} erstellt, die jeweils N Elemente beinhalten. Dann wird allen Elementen in den inneren Listen mithilfe von \emph{domain} eine Domäne zugewiesen. Da \emph{domain} im ersten Argument eine Liste bekommt, aber wir ein Quadrat (eine Liste von Listen) haben, muss vorher noch \emph{append} verwendet werden. Damit erhalten wir eine einzige Liste aus diesem Quadrat, die wir dann im ersten Argument in \emph{domain} verwenden können. In MiniZinc wird ein 2-dimensionales Array mit N Zeilen und N Spalten erstellt. Beispiel~\ref{bsp:matrix} zeigt, wie der automatische Übersetzer Matrizen zwischen CLP(FD) und MiniZinc übersetzen könnte.
\begin{beispiel}
\begin{minted}[frame=single,linenos]{prolog}
%CLP(FD)
length(Quadrat, 3),
maplist(same_length(Quadrat), Quadrat),
append(Quadrat, Vs),
domain(Vs, 1, 9).
append(Quadrat, List),
domain(List, 1, 9).
%MiniZinc
array[1..3,1..3] of var 1..9: quadrat;
......@@ -41,11 +45,36 @@ array[1..3,1..3] of var 1..9: quadrat;
\label{bsp:matrix}
\end{beispiel}
Die Liste in CLP(FD) und das Array in MiniZinc bekommen dieselbe Länge und die Elemente in der Liste und im Array bekommen dieselbe Domäne. Für weitere Beispiele siehe Magic Square (Anhang~\ref{subsection:magic_square}), Sudoku (Anhang~\ref{subsection:sudoku}) und Euler's Officer Problem (Anhang~\ref{subsection:eulers_officer_problem}).
\paragraph*{Gleichungen und Constraints}
Weiterhin könnten die Gleichungen in CLP(FD) als Constraints in MiniZinc implementiert werden, wie die Gleichungen in Smuggler's Knapsack (Anhang~\ref{subsection:smugglers_knapsack}).
Für mathematische Gleichungen werden arithmetische Constraints in CLP(FD) wie \#=/2 verwendet und in MiniZinc wird \emph{constraint} dafür verwendet, wie in Beispiel zu sehen ist.
\begin{beispiel}
\begin{minted}[frame=single,linenos]{prolog}
%CLP(FD)
a*3 + b*2 #= 7
%MiniZinc
constraint a*3 + b*2 = 7;
\end{minted}
\caption{Mathematische Gleichungen in CLP(FD) und in MiniZinc}
\label{bsp:math_gleichungen}
\end{beispiel}
Der automatische Übersetzter kann auf diese Weise mathematische Gleichungen zwischen CLP(FD) und MiniZinc übersetzen. Ein weiteres Beispiel für mathematische Gleichungen ist in Smuggler's Knapsack (Anhang~\ref{subsection:smugglers_knapsack}) zu finden.
\paragraph*{Maplist und Forall}
Um Listen in CLP(FD) zu durchlaufen, wird in manchen Modellen \emph{maplist} verwendet. In MiniZinc wird in diesen Modellen dann \emph{forall} verwendet, um die Arrays zu durchlaufen, wie beispielsweise in Sudoku (Anhang~\ref{subsection:sudoku}) zu sehen ist. Der automatische Übersetzer könnte also zwischen maplist in CLP(FD) und forall in MiniZinc übesetzen.
\paragraph*{Parameter, Lösung und Ausgabe}
Prolog-Prädikate bekommen in der Regel Parameter übergeben. Das letzte Argument ist normalerweise die Ausgabe. Am Ende wird \emph{labeling} verwendet, um Lösungen für das Modell zu finden. In das zweite Argument von \emph{labeling} kommen alle Variablen rein, für die nach Lösungen gefunden werden soll. In MiniZinc werden diese übergebenen Parameter von CLP(FD) (außer des Letzten) als Variablen definiert, die feste Werte beim Ausführen des Modells erhalten. Der letzte Parameter von CLP(FD) erhält in MiniZinc \emph{var} in der Definition, wie alle anderen Variablen, die später definiert werden und für die nach Lösungen gesucht werden soll. Am Ende wird \emph{solve satisfy} verwendet, um Lösungen für das Modell zu finden. Sowohl in CLP(FD) als auch in MiniZinc könnten zusätzlich die Optionen \emph{max} und \emph{min} in \emph{labeling} beziehungsweise \emph{solve} verwendet werden, um die Lösung zu maximieren oder zu minimieren.
\ No newline at end of file
Prolog-Prädikate bekommen in der Regel Parameter übergeben. Das letzte Argument ist normalerweise die Ausgabe, wie beispielsweise in \emph{sum(1, 2, S)}, hier ist die Ausgabe dann \emph{S = 3}. Am Ende wird \emph{labeling} verwendet, um Lösungen für das Modell zu finden. In das zweite Argument von \emph{labeling} kommen alle Variablen rein, für die nach Lösungen gefunden werden soll.
In MiniZinc werden Variablen definiert. Variablen, für die nach Lösungen gesucht werden soll, erhalten \emph{var} in der Definition. Am Ende wird \emph{solve satisfy} verwendet, um Lösungen für das Modell zu finden.
Die Argumente in den Prolog-Prädikaten können als Variablen in MiniZinc definiert werden. Das letzte Argument im Prolog-Prädikat und alle Variablen in \emph{labeling} bekommen in MiniZinc \emph{var} in der Definition, da für sie nach Lösungen gefunden werden soll. Schließlich könnte \emph{output} verwendet werden, um das letzte Argument vom Prolog-Prädikat in MiniZinc auszugeben.
Wenn die Option \emph{max} beziehungsweise \emph{min} in \emph{labeling} in CLP(FD) verwendet werden, kann die Option \emph{solve maximize} beziehungsweise \emph{solve minimize} verwendet werden.
Umgekehrt können alle Variablen in MiniZinc, die vor dem Ausführen des Modells feste Werte erhalten sollen, als Parameter in einem Prolog-Prädikat verwendet werden. Für alle Variablen, die \emph{var} in der Definition haben, wird in CLP(FD) \emph{labeling} verwendet. Wenn \emph{output} in MiniZinc verwendet wird, wird die Variable in \emph{output} als das letzte Argument im Prolog-Prädikat verwendet. Sonst werden alle Variablen mit \emph{var} in der Definition als die letzten Argumente im Prolog-Prädikat verwendet, denn wenn \emph{output} in MiniZinc nicht verwendet wird, werden alle Variablen mit \emph{var} in der Definition ausgegeben.
\ No newline at end of file
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