cycr 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.txt ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ task :default => [:install]
2
+
3
+ $gem_name = "cycr"
4
+
5
+ desc "Build the gem"
6
+ task :build do
7
+ sh "gem build #$gem_name.gemspec"
8
+ end
9
+
10
+ desc "Install the library at local machnie"
11
+ task :install => :build do
12
+ sh "sudo gem install #$gem_name -l"
13
+ end
14
+
15
+ desc "Uninstall the library from local machnie"
16
+ task :uninstall do
17
+ sh "sudo gem uninstall #$gem_name"
18
+ end
19
+
20
+ desc "Clean"
21
+ task :clean do
22
+ sh "rm #$gem_name*.gem"
23
+ end
data/cycr.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "cycr"
3
+ s.version = "0.0.3"
4
+ s.date = "2010-10-19"
5
+ s.summary = "Ruby client for the (Open)Cyc server"
6
+ s.email = "apohllo@o2.pl"
7
+ s.homepage = "http://www.opencyc.org"
8
+ s.require_path = "lib"
9
+ s.description = "Ruby wrapper for (Open)Cyc server and ontology"
10
+ s.has_rdoc = false
11
+ s.authors = ['Aleksander Pohl']
12
+ s.files = ["Rakefile", "cycr.gemspec", 'lib/cycr.rb'] +
13
+ Dir.glob("lib/**/*")
14
+ s.test_files = Dir.glob("spec/**/*")
15
+ s.rdoc_options = ["--main", "README.txt"]
16
+ s.has_rdoc = true
17
+ s.extra_rdoc_files = ["README.txt"]
18
+ s.add_dependency("rspec", [">= 1.2.9"])
19
+ end
20
+
@@ -0,0 +1,14 @@
1
+ module Cyc
2
+ class Assertion
3
+ attr_reader :formula, :microtheory
4
+
5
+ def initialize(formula,microtheory)
6
+ @formula = formula
7
+ @microtheory = microtheory
8
+ end
9
+
10
+ def to_s
11
+ "#{@formula} : #{@microtheory}"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,208 @@
1
+ require 'net/telnet'
2
+
3
+ module Cyc
4
+ # Author:: Aleksander Pohl (mailto:apohllo@o2.pl)
5
+ # License:: MIT License
6
+ #
7
+ # This class is the implementation of the Cyc server client.
8
+ class Client
9
+ # If set to true, all communication with the server is logged
10
+ # to standard output
11
+ attr_accessor :debug
12
+ attr_reader :host, :port
13
+ # Creates new Client.
14
+ def initialize(host="localhost",port="3601",debug=false)
15
+ @debug = debug
16
+ @host = host
17
+ @port = port
18
+ @pid = Process.pid
19
+ @parser = Parser.new
20
+ @mts_cache = {}
21
+
22
+ # read domains mapings
23
+ # talk(File.read(File.join(
24
+ # File.dirname(__FILE__), 'domains.lisp')))
25
+
26
+ # read utility functions
27
+ talk(File.read(File.join(
28
+ File.dirname(__FILE__), 'words_reader.lisp')))
29
+
30
+ # wait untill files are processed
31
+ send_message("(define end-of-routines () ())")
32
+ while answer = receive_answer do
33
+ break if answer =~ /END-OF-ROUTINES/
34
+ end
35
+ end
36
+
37
+ # (Re)connects to the cyc server.
38
+ def reconnect
39
+ @pid = Process.pid
40
+ @conn = Net::Telnet.new("Port" => @port, "Telnetmode" => false,
41
+ "Timeout" => 600, "Host" => @host)
42
+ end
43
+
44
+ # Returns the connection object. Ensures that the pid of current
45
+ # process is the same as the pid, the connection was initialized with.
46
+ #
47
+ # If the block is given, the command is guarded by assertion, that
48
+ # it will be performed, even if the connection was reset.
49
+ def connection
50
+ #puts "#{@pid} #{Process.pid}"
51
+ if @conn.nil? or @pid != Process.pid
52
+ reconnect
53
+ end
54
+ if block_given?
55
+ begin
56
+ yield @conn
57
+ rescue Errno::ECONNRESET
58
+ reconnect
59
+ yield @conn
60
+ end
61
+ else
62
+ @conn
63
+ end
64
+ end
65
+
66
+ protected :connection, :reconnect
67
+
68
+ def clear_cache
69
+ @mts_cache = {}
70
+ end
71
+
72
+ # Closes connection with the server
73
+ def close
74
+ connection{|c| c.puts("(api-quit)")}
75
+ @conn = nil
76
+ end
77
+
78
+ NART_QUERY =<<-END
79
+ (clet ((result ())
80
+ (call-value :call))
81
+ (pif (listp call-value)
82
+ (cdolist (el call-value)
83
+ (pif (nart-p el)
84
+ (cpush (nart-id el) result)
85
+ (cpush el result)))
86
+ (pif (nart-p call-value)
87
+ (cpush (nart-id call-value) result)
88
+ (cpush call-value result)))
89
+ result)
90
+ END
91
+
92
+
93
+ # Sends message +msg+ directly to the Cyc server and receives
94
+ # the answer.
95
+ def talk(msg, options={})
96
+ #conn.puts(msg.respond_to?(:to_cyc) ? msg.to_cyc : msg)
97
+ msg = NART_QUERY.sub(/:call/,msg) if options[:nart]
98
+
99
+ send_message(msg)
100
+ receive_answer(options)
101
+ end
102
+
103
+ # Send the raw message.
104
+ def send_message(msg)
105
+ @last_message = msg
106
+ puts "Send: #{msg}" if @debug
107
+ connection{|c| c.puts(msg)}
108
+ end
109
+
110
+ # Receive answer from server.
111
+ def receive_answer(options={})
112
+ answer = connection{|c| c.waitfor(/./)}
113
+ puts "Recv: #{answer}" if @debug
114
+ if answer.nil?
115
+ raise "Unknwon error occured. " +
116
+ "Check the submitted query in detail!"
117
+ end
118
+ while not answer =~ /\n/ do
119
+ next_answer = connection{|c| c.waitfor(/./)}
120
+ puts "Recv: #{next_answer}" if @debug
121
+ if answer.nil?
122
+ answer = next_answer
123
+ else
124
+ answer += next_answer
125
+ end
126
+ end
127
+ # XXX ignore some potential asynchronous answers
128
+ answer = answer.split("\n")[-1]
129
+ answer = answer.sub(/(\d\d\d) (.*)/,"\\2")
130
+ if($1.to_i == 200)
131
+ begin
132
+ result = @parser.parse(answer,options[:stack])
133
+ result = options[:nart] ? substitute_narts(result) : result
134
+ rescue Parser::ContinueParsing => ex
135
+ result = ex.stack
136
+ current_result = result
137
+ last_message = @last_message
138
+ while current_result.size == 100 do
139
+ send_message("(subseq #{last_message} #{result.size} " +
140
+ "#{result.size + 100})")
141
+ current_result = receive_answer(options)
142
+ result.concat(current_result)
143
+ end
144
+ result
145
+ end
146
+ else
147
+ unless $2.nil?
148
+ puts $2.sub(/^"/,"").sub(/"$/,"") + "\n" +
149
+ @last_message
150
+ else
151
+ puts "unknown error!"
152
+ end
153
+ nil
154
+ end
155
+ end
156
+
157
+
158
+ def method_missing(name,*args)
159
+ #"_missing_method_#{name}"
160
+ method_name = name.to_s.gsub("_","-").sub(/-nart$/,"")
161
+ options = {}
162
+ def method_name.to_cyc(quote=false)
163
+ self
164
+ end
165
+ options[:nart] = true if name.to_s =~ /_nart$/
166
+ talk(([method_name] + args).to_cyc,options)
167
+ end
168
+
169
+ DENOTATION_QUERY =<<-END
170
+ (nart-denotation-mapper ":word")
171
+ END
172
+
173
+ def denotation_mapper(name)
174
+ send_message(DENOTATION_QUERY.sub(/:word/,name))
175
+ receive_answer(:nart => true)
176
+ end
177
+
178
+
179
+ # Finds collection with given name. The name has to
180
+ # be the name of the exact name of the constant.
181
+ def find_collection(name)
182
+ term = self.find_constant(name)
183
+ Collection.new(term, self) unless term.nil?
184
+ end
185
+
186
+ protected
187
+
188
+ def substitute_narts(terms)
189
+ unless terms.nil?
190
+ terms.collect{|t| t.is_a?(String) ? Cyc::Nart.new(t,self) : t}
191
+ end
192
+ end
193
+
194
+ def relevant_mts(term)
195
+ @mts_cache[term] ||=
196
+ (mts = self.term_mts(term)
197
+ if mts
198
+ mts.select{|mt| mt.is_a? Symbol}.
199
+ reject{|mt| IRRELEVANT_MTS.include?(mt)}
200
+ else
201
+ []
202
+ end)
203
+ end
204
+
205
+ def with_reconnect
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,76 @@
1
+ module Cyc
2
+ class Collection
3
+ attr_reader :symbol
4
+
5
+ def initialize(symbol, cyc)
6
+ @symbol = symbol
7
+ @cyc = cyc
8
+ @printed = false
9
+ end
10
+
11
+ def printed?
12
+ @printed
13
+ end
14
+
15
+ def parents
16
+ unless @parents
17
+ parents = @cyc.min_genls(symbol)
18
+ @parents = if parents
19
+ parents.map{|p| Collection.new(p,@cyc)}
20
+ else
21
+ []
22
+ end
23
+ end
24
+ @parents
25
+ end
26
+
27
+ def children
28
+ unless @children
29
+ children = @cyc.max_specs(symbol)
30
+ if children
31
+ @children = children.map{|p| Collection.new(p,@cyc)}
32
+ else
33
+ @children = []
34
+ end
35
+ end
36
+ @children
37
+ end
38
+
39
+ def comment
40
+ @cyc.comment(@symbol)
41
+ end
42
+
43
+ def lexemes()
44
+ default_str = [@cyc.symbol_str(symbol)]
45
+ aux_strs = @cyc.symbol_strs(symbol) || []
46
+ (default_str + aux_strs).uniq.compact.join(", ")
47
+ end
48
+
49
+ def to_s
50
+ @symbol.to_s
51
+ end
52
+
53
+ def ==(other)
54
+ return false unless other.is_a? Collection
55
+ self.symbol == other.symbol
56
+ end
57
+
58
+ def =~(other)
59
+ return false unless other.is_a? Collection
60
+ self.parents - other.parents == [] &&
61
+ other.parents - self.parents == []
62
+ end
63
+
64
+ def ancestor?(node)
65
+ return true if node == :Thing
66
+ ancestors = @parents.dup
67
+ while !ancestors.empty?
68
+ ancestor = ancestors.shift
69
+ return true if ancestor == node
70
+ ancestors += ancestor.parents
71
+ ancestors.uniq!
72
+ end
73
+ false
74
+ end
75
+ end # Node
76
+ end
@@ -0,0 +1,8 @@
1
+ module Cyc
2
+ # These Microteories contain non-ontological assertions.
3
+ IRRELEVANT_MTS = [:WordNetMappingMt, :EnglishMt, :UniversalVocabularyMt,
4
+ :BaseKB, :CycHistoricalPossibilityTheoryMt, :SENSUSMappingMt,
5
+ :GeneralLexiconMt, :BookkeepingMt, :CycNounLearnerMt, :HPKBVocabMt,
6
+ :SKSIMt, :TopicMt, :SNOMEDMappingMt, :MeSHMappingMt, :CycNounLearnerMt,
7
+ :TheMotleyFoolUKCorpusMt, :AnalystDatabaseMt, :CyclistsMt ]
8
+ end