Re: Powerloom API

Thomas Russ <[email protected]> Wed, 31 Oct 2007 09:49:32 -0700
Newsgroups gmane.comp.ai.powerloom
Message-ID <[email protected]>
On Oct 31, 2007, at 3:04 AM, Andrea Poli wrote:

> Thomas Russ ha scritto:
>> On Oct 30, 2007, at 7:14 AM, Magnus Malm wrote:
>>
>>
>>> Hello
>>>
>>> I am looking into the API of PowerLoom, and I was just wondering if
>>> there's some examples of how to use it? Especially the s-*
>>> functions. How to create/delete concepts, objects, relations, etc.
>>> If there's no such examples available, perhaps someone could post
>>> one or two quick and simple ones to the mailinglist?
>>>
>>
>> You didn't specify which language you were planning to use.
>>
>>
> I need to use C++ for my thesis on home automation
>> There is an example file for Java, which is on the documentation page
>> of our web site:
>>
>>    <http://www.isi.edu/isd/LOOM/PowerLoom/documentation/
>> PowerLoomExample.java>
>>
>>
>>
> The manual hasn't any documentation on C++ API. There are some  
> examples?

We don't really have any specific C++ examples, since we haven't  
programmed directly using that language.  When we use the C++ version  
of PowerLoom, we have always done that through the Stella programming  
language and had the resulting C++ code generated for us.

What you can do, however, is use the command "cpptrans" in the  
PowerLoom listener to translate and print Stella constructs in their C 
++ form.  That will allow you to see how constructs from the  
reference manual will look.  There are also analogous commands for  
java "jptrans" and lisp "ptrans".  The name is short for "print  
translation".

For example:

PL-USER |= (cpptrans (pli/get-concept "RELATION" null null))

pli::getConcept("RELATION", NULL, NULL)

PL-USER |= (cpptrans (pli/s-retrieve "all (concept ?y" null null))

pli::sRetrieve("all (concept ?y", NULL, NULL)

The main difference between the C++ examples and the Java code is  
that C++ uses namespaces corresponding to the PowerLoom modules, in  
contrast to Java and Lisp which uses their native packages.  For  
lisp, the pli functions are in the PLI package.  All others are in  
the STELLA package.

The other difference in C++ compared to Java, is that objects are  
referred to using pointers.

PL-USER |= (cpptrans (let ((c (pli/get-concept "CONCEPT" null null))
                            (it (pli/get-concept-instances c null  
null)))
                        (print it)))

{ LogicObject* c = pli::getConcept("CONCEPT", NULL, NULL);
   pli::PlIterator* it = pli::getConceptInstances(c, NULL, NULL);

   std::cout << it;
}

The naming convention transformations for C++ are the same as Java,  
except that the "*" character is translated to "o" instead of "$".