/usr/lib/swi-prolog/doc/Manual/whichmodules.html is in swi-prolog-nox 5.10.4-3ubuntu1.
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 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>SWI-Prolog 5.7.3 Reference Manual: Section 5.2</TITLE><LINK REL=home HREF="index.html">
<LINK REL=contents HREF="Contents.html">
<LINK REL=index HREF="DocIndex.html">
<LINK REL=previous HREF="whymodules.html">
<LINK REL=next HREF="defmodule.html">
<STYLE type="text/css">
/* Style sheet for SWI-Prolog latex2html
*/
dd.defbody
{ margin-bottom: 1em;
}
dt.pubdef
{ background-color: #c5e1ff;
}
.bib dd
{ margin-bottom: 1em;
}
.bib dt
{ float: left;
margin-right: 1.3ex;
}
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="whymodules.html"><IMG SRC="prev.gif" BORDER=0 ALT="Previous"></A>
<A class="nav" href="defmodule.html"><IMG SRC="next.gif" BORDER=0 ALT="Next"></A>
</DIV>
<H2><A NAME="sec:5.2"><SPAN class="sec-nr">5.2</SPAN> <SPAN class="sec-title">Name-based
versus Predicate-based Modules</SPAN></A></H2>
<A NAME="sec:whichmodules"></A>
<P>Two approaches to realize a module system are commonly used in Prolog
and other languages. The first one is the <EM>name based</EM> module
system. In these systems, each atom read is tagged (normally prefixed)
with the module name, with the exception of those atoms that are defined
<EM>public</EM>. In the second approach, each module actually implements
its own predicate space.
<P>A critical problem with using modules in Prolog is introduced by the
meta-predicates that transform between Prolog data and Prolog
predicates. Consider the case where we write:
<PRE class="code">
:- module(extend, [add_extension/3]).
add_extension(Extension, Plain, Extended) :-
maplist(extend_atom(Extension), Plain, Extended).
extend_atom(Extension, Plain, Extended) :-
atom_concat(Plain, Extension, Extended).
</PRE>
<P>In this case we would like maplist to call extend_atom/3 in the
module
<CODE>extend</CODE>. A name based module system will do this correctly.
It will tag the atom <CODE>extend_atom</CODE> with the module and
maplist will use this to construct the tagged term extend_atom/3. A name
based module however, will not only tag the atoms that will eventually
be used to refer to a predicate, but <STRONG>all</STRONG> atoms that are
not declared public. So, with a name based module system also data is
local to the module. This introduces another serious problem:
<PRE class="code">
:- module(action, [action/3]).
action(Object, sleep, Arg) :- ....
action(Object, awake, Arg) :- ....
:- module(process, [awake_process/2]).
awake_process(Process, Arg) :-
action(Process, awake, Arg).
</PRE>
<P>This code uses a simple object-oriented implementation technique were
atoms are used as method selectors. Using a name based module system,
this code will not work, unless we declare the selectors public atoms in
all modules that use them. Predicate based module systems do not require
particular precautions for handling this case.
<P>It appears we have to choose either to have local data, or to have
trouble with meta-predicates. Probably it is best to choose for the
predicate based approach as novice users will not often write generic
meta-predicates that have to be used across multiple modules, but are
likely to write programs that pass data around across modules.
Experienced Prolog programmers should be able to deal with the
complexities of meta-predicates in a predicate based module system.
<P></BODY></HTML>
|