I needed the ability to hand-edit opencog data while other processes were running. And so I hacked with guile for a while, and now there’s a scheme shell for opencog.
So far it’s very simple: just say ‘scm’ at the opencog prompt; this puts you into the shell. Then you can scheme away.
So, fore example:
(cog-new-node 'ConceptNode "some node name")
creates a new node:
#<node[3:some node name] sti:(0,0) tv:(0.000000,0.000000)>
Well… I suppose the above looks like goobldy-gook. But it just says that its a new node with zero “short-term importance” (sti) and zero “truth value” (tv). It would be slicker if all this could be viewed visually, as a graph… the above would be just a single point, with a label.
Creating links is easy:
(define x (cog-new-node 'ConceptNode "abc"))
(define y (cog-new-node 'ConceptNode "def"))
(cog-new-link 'Link x y)
which creates two new nodes (called ‘x’ and ‘y’) and a link connecting the two. Here’s the result:
#<link[2 sti:(0,0) tv:(0.000000,0.000000) <[3 abc],[3 def]>]>
What’s slick about scheme is that it’s easy to add a bit of syntactic sugar to make link and node creation even easier. So, for example, we can define some new functions:
(define (concept x) (cog-new-node 'ConceptNode x))
(define (pred x) (cog-new-node 'PredicateNode x))
(define (listyl x) (cog-new-link 'ListLink x)) ; list is a reserved word in scheme
(define (evely x) (cog-new-link 'EvaluationLink x)) ; eval is a reserved word in scheme
and with this syntactic sugar:
(evely (pred "eats") (listyl (concept "cat") (concept "fish")))
which creates the opencog graph:
#<link[53 sti:(0,0) tv:(0.000000,0.000000) <[47 eats],link[13 sti:(0,0) tv:(0.000000,0.000000) <[3 cat],[3 fish]>]>]>
So I’m thrilled. I can finally create, edit and delete nodes on the fly, without having to write C++ code, compile it, etc. etc. Woo hoo!