Sophie

Sophie

distrib > Fedora > 13 > i386 > by-pkgid > 2fcb262fce8df923d1c90b2e80f20b02 > files > 1436

pl-5.7.11-5.fc12.i686.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<HTML>
<HEAD>
<TITLE>Programming in XPCE/Prolog: Section 6.1</TITLE><LINK REL=home HREF="index.html">
<LINK REL=contents HREF="Contents.html">
<LINK REL=index HREF="DocIndex.html">
<LINK REL=summary HREF="summary.html">
<LINK REL=previous HREF="pceprolog.html">
<LINK REL=next HREF="prologdata.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;
}

/* 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="summary.html"><IMG SRC="info.gif" BORDER=0 ALT="Summary"></A>
<A class="nav" href="pceprolog.html"><IMG SRC="prev.gif" BORDER=0 ALT="Previous"></A>
<A class="nav" href="prologdata.html"><IMG SRC="next.gif" BORDER=0 ALT="Next"></A>
</DIV>

<H2><A NAME="sec:6.1"><SPAN class="sec-nr">6.1</SPAN> <SPAN class="sec-title">XPCE 
is not Prolog!</SPAN></A></H2>

<A NAME="sec:notprolog"></A>

<P>Data managed by Prolog consists of logical variables, atoms, 
integers, floats and compound terms (including lists). <font size=-1>XPCE</font> 
has natural counterparts for atoms (a <A class="" href="summary.html#class:name">name</A> 
object), integers (a <font size=-1>XPCE</font> int) and floating point 
numbers (a <A class="" href="summary.html#class:real">real</A> object). 
Prolog logical variables and compound terms however have no direct 
counterpart in the
<font size=-1>XPCE</font> environment. <font size=-1>XPCE</font> has 
variables (class <A class="" href="summary.html#class:var">var</A>), but 
these obey totally different scoping and binding rules.

<P>Where Prolog uses a compound term to represent data that belongs 
together (e.g. person(Name, Age, Address)), <font size=-1>XPCE</font> 
uses objects for this purpose:<SUP class="fn">7<SPAN class="fn-text">This 
example uses <font size=-1>XPCE</font> user-defined classes. The details 
of this mechanism do not matter for the argument in this section. 
User-defined classes are described in <A class="sec" href="udc.html">chapter 
7</A>.</SPAN></SUP>

<PRE class="code">
:- pce_begin_class(person(name, age, address), object).

variable(name,    name,   both, "Name of the person").
variable(age,     int,    both, "Age in years").
variable(address, string, both, "Full address").

initialise(P, Name:name, Age:int, Address:string) :-&gt;
        "Create from name, age and address"::
        send(P, name, Name),
        send(P, age, Age),
        send(P, address, Address).

:- pce_end_class.

1 ?- new(P, person(fred, 30, 'Long Street 45')).
P = @3664437/person
</PRE>

<P>These two representations have very different properties:

<P>
<UL>
<LI><I>Equality</I><BR>
Prolog cannot distinguish between `<TT>person('Fred', 30, 'Long Street 
45')</TT>' and a second instance of the same term. In <font size=-1>XPCE</font> 
two instances of the same class having the same state are different 
entities.
<LI><I>Attributes</I><BR>
Whereas an attribute (argument) of a Prolog term is either a logical 
variable or instantiated to a Prolog data object, an attribute of an 
object may be assigned to. The assignment is destructive.
<LI><I>Types</I><BR>
<font size=-1>XPCE</font> is a dynamically typed language and <font size=-1>XPCE</font> 
object attributes may have types. Prolog is untyped.
</UL>

<P></BODY></HTML>