<!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) :-> "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>