<div class="gmail_quote">2010/9/24 Peter Ross <span dir="ltr"><<a href="mailto:pro@missioncriticalit.com">pro@missioncriticalit.com</a>></span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">
> But, then, what to put in the implementation, which would the equivalent of<br>
> an empty class in Java ?<br>
><br>
</div>The equivalent to the empty class is.<br>
<br>
:- type person ---> person.<br></blockquote><div><br></div><div>If I undertand well, this would be a class, but with no possibility to create instances.</div><div><br></div><div>Reading the mercury_trans_guide :</div>
<div><a href="http://www.mercury.csse.unimelb.edu.au/information/doc-release/mercury_trans_guide/Syntax.html#Syntax">http://www.mercury.csse.unimelb.edu.au/information/doc-release/mercury_trans_guide/Syntax.html#Syntax</a></div>
<div><br></div><div>it begins with the sentence :</div><div><br></div><div><i>Prolog and Mercury have very similar syntax. Although there are a few differences, by and large if a program is accepted by a Prolog system, it will be accepted by Mercury. </i></div>
<div><br></div><div>It seems to me that this is over-optimistic.</div><div>A simple and typical Prolog program like :</div><div><br></div><div><div><font class="Apple-style-span" face="'courier new', monospace">brother( jacques, simone ).</font></div>
<div><font class="Apple-style-span" face="'courier new', monospace">parent( simone, jean_marc ).</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-style-span" style="font-family: arial; "><div>
<font class="Apple-style-span" face="'courier new', monospace">uncle(Uncle,Person) :-</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        brother(Uncle,Parent), parent(Parent,Person).</font></div>
</span></font></div></div><div><br></div><div>requires quite a large quantity of boilerplate code.</div><div><br></div><div>Here the translation I did:</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace"><div>
:- module artOfProlog_program_2_1_short .</div><div>:- interface.</div><div>:- import_module io.</div><div>:- pred main(io::di, io::uo) is cc_multi. % det.</div><div><br></div><div>:- implementation.</div><div>%%%% declarations %%%%</div>
<div>:- import_module string.</div><div>:- type person.</div><div>:- func create( string ) = person . </div><div>:- pred uncle( person/*Uncle*/::out, person::in ) is nondet . </div><div><br></div><div>:- pred brother( person, person) is nondet . </div>
<div>:- mode brother( in, out ) is nondet .</div><div>:- mode brother( out, in ) is nondet .</div><div><br></div><div>:- pred parent(person, person).</div><div>:- mode parent(in, out) is semidet. % not everyone is a parent</div>
<div>% :- mode parent(out, in) is det.  % everyone has a parent</div><div>:- mode parent(out, in) is semidet.</div><div><br></div><div>%%%% implementation %%%%</div><div>:- type person == string .</div><div>create( S ) = S .</div>
<div><br></div><div>%%%% facts %%%%</div><div>brother( create("jacques"), create("simone")).</div><div>parent( create("simone"), create("jean_marc") ).</div><div><br></div><div>%%%% rules %%%%</div>
<div>uncle(Uncle,Person) :-</div><div>        brother(Uncle,Parent), parent(Parent,Person).</div><div><br></div><div>main(!IO) :-</div><div>        uncle(Uncle, create("jean_marc") )</div><div>-> (</div><div>
        io.write( Uncle, !IO),</div><div>        io.write_string( " is an uncle.\n", !IO)</div><div>) ;</div><div>        io.write_string( "Fail\n", !IO)</div><div>.</div><font class="Apple-style-span" face="arial"><div>
<font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial"><br></font></font></div>I recognize that most of this necessary for a language for developing large and modular programs.</font></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial">But this really points to the lack of documentation. The tutorial is skeletal, and the manual is laconic.</font></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial"><br></font></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial">Happily the community is here and answers !</font></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial"><br></font></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial">But I really wonder if it is possible to learn the language without living in Melbourne or Brussels, and meeting the Gurus often.</font></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial">These are only simple things I tried until now . What time will it take me to do non trivial stuff ?</font></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial">Compare with a language like Scala, which is 6 years younger than Mercury. Scala has many tutorials and books. </font></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial">I know that Scala has no logic programming features, so Mercury still is promising.</font></font></div>
<div><font class="Apple-style-span" face="'courier new', monospace"><font class="Apple-style-span" face="arial"><br></font></font></div></div>-- <br>Jean-Marc Vanel<br>Consulting, services, training,<br>Rule-based programming, Semantic Web<br>
<a href="http://jmvanel.free.fr/">http://jmvanel.free.fr/</a><br>EulerGUI, a turntable GUI for Semantic Web + rules, XML, UML, eCore, Java bytecode<br>+33 (0)6 89 16 29 52 -- +33 (0)1 39 55 58 16<br>( we rarely listen to voice messages, please send a mail instead )<br>