/usr/share/doc/swi-prolog-doc/Manual/xref.html is in swi-prolog-doc 5.6.59-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>SWI-Prolog 5.6.59 Reference Manual: Section 3.7</TITLE><LINK REL=home HREF="index.html">
<LINK REL=contents HREF="Contents.html">
<LINK REL=index HREF="DocIndex.html">
<LINK REL=previous HREF="navigator.html">
<LINK REL=next HREF="idepreds.html">
<STYLE type="text/css">
/* Style sheet for SWI-Prolog latex2html
*/
dd.defbody
{ margin-bottom: 1em;
}
dt.pubdef
{ background-color: #c5e1ff;
}
pre.code
{ margin-left: 1.5em;
margin-right: 1.5em;
border: 1px dotted;
padding-top: 5px;
padding-left: 5px;
padding-bottom: 5px;
background-color: #f8f8f8;
}
div.navigate
{ text-align: center;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
}
div.title
{ text-align: center;
padding-bottom: 1em;
font-size: 200%;
font-weight: bold;
}
div.author
{ text-align: center;
font-style: italic;
}
div.abstract
{ margin-top: 2em;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
margin-left: 10%; margin-right:10%;
}
div.abstract-title
{ text-align: center;
padding: 5px;
font-size: 120%;
font-weight: bold;
}
div.toc-h1
{ font-size: 200%;
font-weight: bold;
}
div.toc-h2
{ font-size: 120%;
font-weight: bold;
margin-left: 2em;
}
div.toc-h3
{ font-size: 100%;
font-weight: bold;
margin-left: 4em;
}
div.toc-h4
{ font-size: 100%;
margin-left: 6em;
}
span.sec-nr
{
}
span.sec-title
{
}
span.pred-ext
{ font-weight: bold;
}
span.pred-tag
{ float: right;
font-size: 80%;
font-style: italic;
color: #202020;
}
/* Footnotes */
sup.fn { color: blue; text-decoration: underline; }
span.fn-text { display: none; }
sup.fn span {display: none;}
sup:hover span
{ display: block !important;
position: absolute; top: auto; left: auto; width: 80%;
color: #000; background: white;
border: 2px solid;
padding: 5px; margin: 10px; z-index: 100;
font-size: smaller;
}
</STYLE>
</HEAD>
<BODY BGCOLOR="white">
<DIV class="navigate"><A class="nav" href="index.html"><IMG SRC="home.gif" BORDER=0 ALT="Home"></A>
<A class="nav" href="Contents.html"><IMG SRC="index.gif" BORDER=0 ALT="Contents"></A>
<A class="nav" href="DocIndex.html"><IMG SRC="yellow_pages.gif" BORDER=0 ALT="Index"></A>
<A class="nav" href="navigator.html"><IMG SRC="prev.gif" BORDER=0 ALT="Previous"></A>
<A class="nav" href="idepreds.html"><IMG SRC="next.gif" BORDER=0 ALT="Next"></A>
</DIV>
<H2><A NAME="sec:3.7"><SPAN class="sec-nr">3.7</SPAN> <SPAN class="sec-title">Cross
referencer</SPAN></A></H2>
<A NAME="sec:xref"></A>
<P>A cross-referencers is a tool examining the caller-callee relation
between predicates and using this information to explicate dependency
relations between source files, find calls to non-existing predicates
and predicates for which no callers can be found. Cross-referencing is
useful during program development, reorganisation, cleanup, porting and
other program maintenance tasks. The dynamic nature of Prolog makes the
task non-trivial. Goals can be created dynamically <A NAME="idx:call1:300"></A><A class="pred" href="metacall.html#call/1">call/1</A>
after construction of a goal term. Abtract interpretation can find some
of such calls, but the ultimately they can come from external
communication, making it completely impossible to predict the callee. In
other words, the cross-referencer has only partial understanding of the
program and its results are necessarily incomplete. Still, it provides
valuable information to the developer.
<P>SWI-Prolog's cross-referencer is split into two parts. The standard
Prolog library <CODE>library(prolog_xref)</CODE> is an extensible
library for information gathering described in <A class="sec" href="prologxref.html">section
A.18</A> and the XPCE
<P>library <CODE>library(pce_xref)</CODE> provides a graphical frontend
for the cross-referencer described here. We demonstrate the tool on
CHAT80, a natural language question and answer system by Fernando C.N.
Pereira and David H.D. Warren.
<DL>
<DT class="pubdef"><A NAME="gxref/0"><STRONG>gxref</STRONG></A></DT>
<DD class="defbody">
Run cross-referencer on all currently loaded files and present a
graphical overview of the result. As the predicate operates on the
currently loaded application it must be run after loading the
application.
</DD>
</DL>
<P><A NAME="fig:xrefchatfile"></A>
<CENTER>
<IMG SRC="xrefchatfile.gif">
</CENTER>
<TABLE ALIGN=center WIDTH="75%"><TR><TD>
<B>Figure 3 : </B>File info for <TT>chattop.pl</TT>, part of CHAT80</TABLE>
<P>The <B>left window</B> (see <A class="fig" href="xref.html#fig:xrefchatfile">figure
3</A> provides browsers for loaded files and predicates. To avoid long
file paths the file hierarchy has three main branches. The first is the
current directory holding the sources. The second is marked <CODE>alias</CODE>
and below it are the file-search-path aliases (see <A NAME="idx:filesearchpath2:301"></A><A class="pred" href="consulting.html#file_search_path/2">file_search_path/2</A>
and
<A NAME="idx:absolutefilename3:302"></A><A class="pred" href="files.html#absolute_file_name/3">absolute_file_name/3</A>).
Here you find files loaded from the system as well as modules of the
program loaded from other locations using file search path. All loaded
files that fall outside these categories are below the last branch
called <CODE><CODE>/</CODE></CODE>. File where the system found
suspicious dependencies are marked with an exclamation mark. This also
holds for directories holding such files. Clicking on a file opens a
<EM>File info</EM> window in the right pane.
<P>The <B>File info</B> window shows a file, its main properties, its
undefined and not-called predicates and its import- and export relations
to other files in the project. Both predicates and files can be opened
by clicking on them. The number of callers in a file for a certain
predicate is indicated with a blue underlined number. A left-click will
open a list and allows to edit the calling predicate.
<P>The <B>Dependencies</B> (see <A class="fig" href="xref.html#fig:xrefchatdep">figure
4</A>) window displays a graphical overview of dependencies between
files. Using the background menu a complete graph of the project can be
created. It is also possible to drag files onto the graph window and use
the menu on the nodes to incrementally expand the graph. The underlined
blue text indicates the number of predicates used in the destination
file. Left-clicking opens a menu to open the definition or select one of
the callers.
<P><A NAME="fig:xrefchatdep"></A>
<CENTER>
<IMG SRC="xrefchatdep.gif">
</CENTER>
<TABLE ALIGN=center WIDTH="75%"><TR><TD>
<B>Figure 4 : </B>Dependencies between source files of CHAT80</TABLE>
<P><B>Module and non-module files</B>
<P>The cross-referencer threads module and non-module project files
differently. Module files have explicit import and export relations and
the tool shows the usage and consistency of the relations. Using the
menu-command <B>Header</B> the tool creates a consistent import list for
the module that can be included in the file. The tool computes the
dependency relations between the non-module files. If the user wishes to
convert the project into a module-based one the <B>Header</B> command
generates an appropriate module header and import list. Note that the
cross-referencer may have missed dependencies and does not deal with
meta-predicates defined in one module and called in another. Such
problems must be resolved manually.
<P><B>Settings</B>
<P>The following settings can be controlled from the <B>settings</B>
menu:
<DL>
<DT><B>Warn autoload</B></DT>
<DD class="defbody">
By default disabled. If enabled, modules that require predicates to be
autoloaded are flagged with a warning and the file info window of a
module shows the required autoload predicates.</DD>
<DT><B>Warn not called</B></DT>
<DD class="defbody">
If enabled (default), the file-overview shows an alert icon for files
that have predicates that are not called.
</DD>
</DL>
<P></BODY></HTML>
|