cycr
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:This library allows for accessing the Cyc ontology from Ruby language.
= cycr

* http://github.com/apohllo/cycr - code
* http://rubydoc.info/gems/cycr/frames - documentation

== DESCRIPTION

*cycr* is a Ruby client for the (Open)Cyc server http://www.opencyc.org.

== FEATURES

* The text protocol is used to talk with Cyc
* Ruby symbols are converted to Cyc terms
* Ruby arrays are converted to SubL arrays
* Ruby calls on the client are transparently translated to SubL
* Support for subcalls (like +with-any-mt+)
* connection drivers: regular socket and synchrony based communication
* auto reconnecting the client after server downtime
* thread safe client as an option

== PROBLEMS

* Support for NARTs might not be fully functional (works only with ResearchCyc)
* Support for CycL queries not implemented yet!

== SYNOPSIS

*cycr* is a Ruby client for the (Open)Cyc server. It is designed as a
substitution for the original Java client. It allows for conversation
with the ontology with regular Ruby objects (like symbols, arrays) 
and also exposes a raw text protocol.

If you use this library you might be intereste in:

* https://github.com/apohllo/cyc-console - replacement for Cyc console
* https://github.com/apohllo/navicyc - Rails and ExtJS replacement for Cyc browser


== REQUIREMENTS

(Open)Cyc server with TCP communication enabled.

== INSTALL

The gem is available at rubygems.org, so you can install it with:

  $ sudo gem install cycr

In case of problems just make sure that you have RubyGems v.1.3.5 at least:

  $ gem -v
  1.2.0 # => not OK
  $ gem update --system
  ...
  $ gem -v 
  1.3.7 # => OK


== BASIC USAGE

Prerequisites:

* running Cyc server - you can download it from http://www.opencyc.org
* Telnet connection is turned on.
  Type +(enable-tcp-server :cyc-api 3601)+ in the cyc console 
  or Cyc Browser -> Tools -> Interactor

Then you can start +irb+ session to see it in action.

Include the cycr gem first

  require 'cycr'

Create a cyc client object, default host: localhost, port: 3601

  cyc = Cyc::Client.new

Check if Dog generalizes to Animal

  cyc.genls? :Dog, :Animal # => true

Check if Animal generalizes to Dog

  cyc.genls? :Animal, :Dog # => nil

Check the minimal generalizations of Animal

  genls = cyc.min_genls :Animal
  # => [:"Organism-Whole", :"PerceptualAgent-Embodied",
  #  :"Agent-NonArtifactual", :SolidTangibleThing, [:CollectionUnionFn,
  #  [:TheSet, :Animal, [:GroupFn, :Animal]]],...

Check the maximal specializations of the first of the above results

  cyc.max_specs genls.first
  # => [:Microorganism, :EukaryoticOrganism, :"Unvaccinated-Generic",
  #  :"Vaccinated-Generic", :MulticellularOrganism, :Heterotroph, :Autotroph,
  #  :Lichen, :TerrestrialOrganism, :Animal, :AquaticOrganism, :Mutant,
  #  :Carnivore, :Extraterrestrial, :"Exotic-Foreign",...

It works with NARTs (but I didn't tested this functionality extensively,
so this might cause some problems - beware):

  genls[4]
  # => [:CollectionUnionFn, [:TheSet, :Animal, [:GroupFn, :Animal]]]

  cyc.max_specs genls[4]
  # => [:Animal, [:GroupFn, :Animal]]

What is more, you might even build complex subcalls, such as:

  cyc.genls? :Person, :HomoSapiens # => nil
  cyc.with_any_mt{|cyc| cyc.genls? :Person, :HomoSapiens} # => true

The assertions are parsed, as well as Cyc symbols and variables

  keys = cyc.key_predicate_rule_index :isa
  # => [:POS, :NEG]
  keys[0].class
  # => Cyc::Symbol
  cyc.symbolp keys[0]
  # => true

  keys1 = cyc.key_predicate_rule_index :isa, keys[0]
  # => [:ComputerRunningMt, :HumanManipulationMt, :BuyingMt, ...
  keys2 = cyc.key_predicate_rule_index :isa, keys[0], keys1[2]
  # => [:BACKWARD]
  rules = cyc.gather_predicate_rule_index :isa, keys[0], keys1[2], keys2[0]
  # => [[:implies, [:and, [:objectOfPossessionTransfer, :TheBuying, ?OBJ], 
  #     [:activityObjectType, :TheSelectingAProduct, ?PREFERED]], 
  #     [:isa, ?OBJ, ?PREFERED]] : BuyingMt]
  cyc.assertion_p rules[0]
  # => true

  rules[0].formula[1][1][2]
  # => ?OBJ
  rules[0].formula[1][1][2].class
  # => Cyc::Variable

The variable cannot be checked for type, since it won't be bound.


If you want to see the query which is send to Cyc, just turn on
debugging:

  cyc.debug = true
  cyc.genls? :Dog, :Animal
  # Send: (genls? #$Dog #$Animal)
  # Recv: 200 T
  # => true 

The same way, you can turn it off:

  cyc.debug = false

Remember to close the client on exit

  cyc.close

By default a Cyc client uses regular TCP socket communication and is not 
thread safe. To turn-on thread-safety pass a +thread_safe+ option to the 
constructor:
 
  cyc = Cyc::Client.new(:thread_safe => true)

Alternatively you can use a client with fibers and Event Machine synchrony 
To set-up event machine driver before requiring +cycr+:

  require 'cyc/connection/synchrony'
  require 'cycr'

Make sure that you have 'em-synchrony' gem installed. A sample code looks as
follows:

  EM.synchrony do
    cyc = EM::Synchrony::ConnectionPool.new(size => 5) do
      Cyc::Client.new :url => 'cyc://localhost:3601', :debug => true
    end
    Fiber.new do
      puts "Ani", cyc.fi_complete("Ani").inspect
    end.resume
    puts "Mi", cyc.talk('(fi-complete "Mi")').inspect
    EM.stop
  end

`Mi` will arrive before `Ani`

Warning: always use +EM::Synchrony::ConnectionPool+ to handle Fiber concurrency race conditions.

== LICENSE:
 
(The MIT/X11 License)

Copyright (c) 2008-2012 Aleksander Pohl, Rafal Michalski

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

== FEEDBACK

* mailto:apohllo@o2.pl


本源码包内暂不包含可直接显示的源代码文件,请下载源码包。