Wrote section 5.
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1830 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
parent
cbd17831f7
commit
7afc0fdd07
@ -877,11 +877,48 @@ complications:
|
|||||||
\item Supporting the so-called logical update (LU) semantics of the
|
\item Supporting the so-called logical update (LU) semantics of the
|
||||||
ISO Prolog standard becomes harder.
|
ISO Prolog standard becomes harder.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
We will briefly discuss possible ways of handling these complications.
|
We will briefly discuss possible ways of addressing these issues.
|
||||||
However, we note that Prolog systems typically provide indexing for
|
However, we note that Prolog systems typically provide indexing for
|
||||||
dynamic predicates and thus already deal in some way or another with
|
dynamic predicates and thus already deal in some way or another with
|
||||||
these issues. It's just that \JITI makes these problems harder.
|
these issues; \JITI makes the problems more involved but not
|
||||||
|
fundamentally different than those with only first argument indexing.
|
||||||
|
|
||||||
|
The first complication suggests that we should allocate memory for
|
||||||
|
dynamic indices in separate chunks, so that these can be expanded and
|
||||||
|
deallocated independently. Indeed, this is what we do.
|
||||||
|
%
|
||||||
|
Regarding the second complication, in the absence of any other
|
||||||
|
information, the only alternative is to generate indices for all
|
||||||
|
arguments. As optimizations, we can avoid indexing for predicates with
|
||||||
|
only one clause (these are often used to simulate global variables)
|
||||||
|
and we can exclude arguments where some clause has a variable.
|
||||||
|
|
||||||
|
Under logical update semantics calls to a dynamic goal execute in a
|
||||||
|
``snapshot'' of the corresponding predicate. In other words, each call
|
||||||
|
sees the clauses that existed at the time the call was made, even if
|
||||||
|
some of the clauses were later deleted or new clauses were asserted.
|
||||||
|
If several calls are alive in the stack, several snapshots will be
|
||||||
|
alive at the same time. The standard solution to this problem is to
|
||||||
|
use time stamps to tell which clauses are \emph{live} for which calls.
|
||||||
|
%
|
||||||
|
This solution complicates freeing index tables because (1) an index
|
||||||
|
table holds references to clauses, and (2) the table may be in use,
|
||||||
|
that is, it may be accesible from the execution stacks. A table thus
|
||||||
|
is killed in several steps:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Detach the index table from the indexing tree.
|
||||||
|
\item Recursively \emph{kill} every child of the current table:
|
||||||
|
if the current table is killed, so will be its children.
|
||||||
|
\item Wait until the table is not in use, that is, it is not pointed
|
||||||
|
to by someone.
|
||||||
|
\item Walk the table and release any references it may hold.
|
||||||
|
\item Physically recover space.
|
||||||
|
\end{enumerate}
|
||||||
|
%% It is interesting to observe that at the end of an \emph{itemset-node}
|
||||||
|
%% the emulator can remove references to the current index, hence freeing
|
||||||
|
%% the code it is currently executing. This happens on the last member of
|
||||||
|
%% the \emph{itemset-node}, so the emulator reads all the instruction's
|
||||||
|
%% arguments before executing the instruction.
|
||||||
|
|
||||||
\section{Implementation in XXX and in YAP} \label{sec:impl}
|
\section{Implementation in XXX and in YAP} \label{sec:impl}
|
||||||
%==========================================================
|
%==========================================================
|
||||||
@ -1127,7 +1164,7 @@ computation.
|
|||||||
We compare times for 10 runs of the saturation/refinement cycle of the
|
We compare times for 10 runs of the saturation/refinement cycle of the
|
||||||
ILP system. Table~\ref{tab:ilp:time} shows time results. The
|
ILP system. Table~\ref{tab:ilp:time} shows time results. The
|
||||||
\bench{Krki} datasets have small search spaces and small databases, so
|
\bench{Krki} datasets have small search spaces and small databases, so
|
||||||
they essentially achieve the same performance under both versions:
|
they achieve the same performance under both versions:
|
||||||
there is no slowdown. The \bench{Mesh}, \bench{Mutagenesis}, and
|
there is no slowdown. The \bench{Mesh}, \bench{Mutagenesis}, and
|
||||||
\bench{Pyrimides} applications do not benefit much from indexing in
|
\bench{Pyrimides} applications do not benefit much from indexing in
|
||||||
the database, but they do benefit from indexing in the dynamic
|
the database, but they do benefit from indexing in the dynamic
|
||||||
|
Reference in New Issue
Block a user