rbprolog 0.0.1 → 0.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6af2d1c30e5537ecd0129fb9ff8ec732751091c2
4
- data.tar.gz: fdb511793cdaa753e458f6c7629209f0c1a9744a
3
+ metadata.gz: 53b585062269fdd1b34299a6062ed17d194a24a0
4
+ data.tar.gz: 189dee03f4f9bf9d6af6ad3ab04a1b1a6f6b8b1a
5
5
  SHA512:
6
- metadata.gz: 8e9cb8fa7831f2b504b440b2a31ccc2f4a14c0db2ac1e5380af7079d46b14d09d8cc5cec21db243e19eb57f17fb3666a6a94ec1074fb64f822fd216e346eff43
7
- data.tar.gz: 61703cdc1663c95c817dd7ebc032712c701b8c12fb1180e1b907ae13a546d9aeedc5d1e0c422078c8f163caa6f4dab47ed07ecba27871d6c3015e7aa1c0364c9
6
+ metadata.gz: f268165d241aeaf52c27044b3a69c89a92ae4ad5380e1274189d01b6efbab70d117719ec7dd3c9ccf710fd353d64d17a7f0fa9437549cffc5461537029163965
7
+ data.tar.gz: d615a690017127e4a957412ce550b2beaf832f3a97d0ccb48a80c810b5672ee1b37bd5ea431fbbdc646ada966daaf8583b2043468cb8f17f9f5d87b25adf4048
data/.gitignore CHANGED
@@ -14,4 +14,5 @@ rdoc
14
14
  spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
- tmp
17
+ tmp
18
+ .project
@@ -9,12 +9,7 @@ module Rbprolog
9
9
 
10
10
  def match!(v1, v2)
11
11
  if match?(v1, v2)
12
- if Var === v1 && !(Var === v2)
13
- @binds[v1.sym] = v2
14
- # elsif Var === v2 && !(Var === v1)
15
- # @binds[v2.sym] = v1
16
- end
17
-
12
+ @binds[v1.sym] = v2 if Var === v1 && !(Var === v2)
18
13
  true
19
14
  else
20
15
  false
@@ -1,6 +1,7 @@
1
1
  module Rbprolog
2
2
  class Deduction
3
3
  include Enumerable
4
+
4
5
  attr_accessor :args, :sym
5
6
 
6
7
  def initialize(logic, sym, *args)
@@ -11,19 +12,19 @@ module Rbprolog
11
12
  end
12
13
 
13
14
  def each
14
- each_deduce(Context.new, @logic.rules, "", []) do |hash|
15
+ each_deduce(Context.new, @logic.rules, []) do |hash|
15
16
  yield hash
16
17
  end
17
18
  end
18
19
 
19
- def each_deduce(context, rules, tabs, id)
20
- print "#{tabs}#{id.join('.')} #{@sym}?(#{@args.map(&:to_s).join(', ')})"
20
+ def each_deduce(context, rules, id)
21
+ print "#{"\t" * id.size}#{id.join('.')} #{@sym}?(#{@args.map(&:to_s).join(', ')})"
21
22
 
22
23
  rules.select {|rule| rule.sym == @sym}.each_with_index do |rule, i|
23
24
  context.scope(self) do
24
- puts " => #{@sym}?(#{@args.map {|arg| context.deduce(arg).to_s}.join(', ')})" if i == 0 #{context.to_s} #{context.binds.inspect}" if i == 0
25
+ puts " => #{@sym}?(#{@args.map {|arg| context.deduce(arg).to_s}.join(', ')})" if i == 0
25
26
 
26
- rule.each_deduce(rules, *@args.map {|arg| context.deduce(arg)}, tabs + "\t", id + [i]) do |hash|
27
+ rule.each_deduce(rules, *@args.map {|arg| context.deduce(arg)}, id + [i]) do |hash|
27
28
  context.scope(self) do
28
29
  rule.args.each_with_index do |rule_arg, rule_arg_index|
29
30
  deduced_arg = context.deduce(@args[rule_arg_index])
data/lib/rbprolog/rule.rb CHANGED
@@ -4,20 +4,20 @@ module Rbprolog
4
4
  class Rule
5
5
  attr_accessor :args, :sym
6
6
 
7
- def initialize(sym, *args, predicates)
7
+ def initialize(sym, *args, deductions)
8
8
  @sym = sym
9
9
  @args = args
10
- @predicates = [predicates].flatten
10
+ @deductions = [deductions].flatten
11
11
  end
12
12
 
13
- def each_deduce(rules, *args, tabs, id)
14
- print "#{tabs}#{id.join('.')} #{@sym}(#{@args.map(&:to_s).join(', ')}).deduce(#{args.map(&:to_s).join(', ')})"
13
+ def each_deduce(rules, *args, id)
14
+ print "#{"\t" * id.size}#{id.join('.')} #{@sym}(#{@args.map(&:to_s).join(', ')}).deduce(#{args.map(&:to_s).join(', ')})"
15
15
 
16
16
  context = Context.new
17
17
  context.scope(self) do
18
18
  if self.match!(context, args)
19
19
  puts " => #{@sym}(#{@args.map {|arg| context.deduce(arg).to_s}.join(', ')})" #{context.to_s} #{context.binds.inspect}"
20
- deduce_predicates(context, rules, *@predicates, tabs, id) do
20
+ deduce_deductions(context, rules, *@deductions, id) do
21
21
  yield context.binds
22
22
  end
23
23
  else
@@ -26,34 +26,35 @@ module Rbprolog
26
26
  end
27
27
  end
28
28
 
29
- def deduce_predicates(context, rules, *predicates, tabs, id, &block)
30
- if predicates.empty?
29
+ def match?(context, args)
30
+ @args.size == args.size && @args.zip(args).all? {|v1, v2| context.match?(v1, v2)}
31
+ end
32
+
33
+ def match!(context, args)
34
+ match = match?(context, args)
35
+ @args.zip(args).each {|v1, v2| context.match!(v1, v2)} if match
36
+ match
37
+ end
38
+
39
+ private
40
+ def deduce_deductions(context, rules, *deductions, id, &block)
41
+ if deductions.empty?
31
42
  yield
32
43
  else
33
- predicate = predicates.shift
44
+ predicate = deductions.shift
34
45
  if Deduction === predicate
35
- predicate.each_deduce(context, rules, tabs + "\t", id + [@predicates.size - predicates.size - 1]) do |hash|
36
- deduce_predicates(context, rules, *predicates, tabs, id, &block)
46
+ predicate.each_deduce(context, rules, id + [@deductions.size - deductions.size - 1]) do |hash|
47
+ deduce_deductions(context, rules, *deductions, id, &block)
37
48
  end
38
49
  else
39
50
  @logic.send(:define_singleton_method, :const_missing) do |sym|
40
51
  context.binds[sym]
41
52
  end
42
53
 
43
- predicate.call && deduce_predicates(context, rules, *predicates, tabs, id, &block)
54
+ predicate.call && deduce_deductions(context, rules, *deductions, id, &block)
44
55
  end
45
56
 
46
57
  end
47
58
  end
48
-
49
- def match?(context, args)
50
- @args.size == args.size && @args.zip(args).all? {|v1, v2| context.match?(v1, v2)}
51
- end
52
-
53
- def match!(context, args)
54
- match = match?(context, args)
55
- @args.zip(args).each {|v1, v2| context.match!(v1, v2)} if match
56
- match
57
- end
58
59
  end
59
60
  end
@@ -1,3 +1,3 @@
1
1
  module Rbprolog
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/rbprolog.gemspec CHANGED
@@ -6,11 +6,11 @@ require 'rbprolog/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "rbprolog"
8
8
  spec.version = Rbprolog::VERSION
9
- spec.authors = ["ruijia.li"]
9
+ spec.authors = ["Ruijia Li"]
10
10
  spec.email = ["ruijia.li@gmail.com"]
11
11
  spec.description = %q{A ruby implementation to simulate prolog partially}
12
12
  spec.summary = %q{A prolog DSL in ruby to do AI logic analysis}
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/rli9/rbprolog"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.metadata = { "Source Code" => "https://github.com/rli9/rbprolog" }
22
+
21
23
  spec.add_development_dependency "bundler", "~> 1.3"
22
24
  spec.add_development_dependency "rake"
23
25
  end
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require_relative '../lib/rbprolog'
2
+ require 'rbprolog'
3
3
 
4
4
  class FriendLogic
5
5
  include Rbprolog
@@ -17,20 +17,43 @@ class FriendLogic
17
17
  end
18
18
 
19
19
  class TestRbprolog < Test::Unit::TestCase
20
- def test_friend_logic
21
- l = FriendLogic.new do
22
- likes 'p5', 's1'
23
- end
20
+ def test_fact_should_be_deduced
21
+ l = FriendLogic.new
24
22
 
25
23
  assert_equal true, l.likes?('p1', 's1')
26
24
  assert_equal true, l.likes?('p1', 's2')
25
+
26
+ assert_equal ['s1', 's2'], l.likes!('p1', Rbprolog::Var.new(:X)).map {|hash| hash[:X]}.uniq
27
+ end
28
+
29
+ def test_rule_should_be_deduced
30
+ l = FriendLogic.new
31
+
27
32
  assert_equal true, l.friends?('p1', 'p2')
28
33
  assert_equal true, l.friends?('p1', 'p3')
29
34
  assert_equal true, l.friends?('p1', 'p4')
30
35
  assert_equal false, l.friends?('p1', 'p6')
31
- assert_equal true, l.likes?('p5', 's1')
32
36
 
33
- assert_equal ['s1', 's2'], l.likes!('p1', Rbprolog::Var.new(:X)).map {|hash| hash[:X]}.uniq
34
- assert_equal ['p1', 'p2', 'p3', 'p4', 'p5'], l.friends!('p1', Rbprolog::Var.new(:W)).map {|hash| hash[:W]}.uniq.sort
37
+ assert_equal ['p1', 'p2', 'p3', 'p4'], l.friends!('p1', Rbprolog::Var.new(:W)).map {|hash| hash[:W]}.uniq.sort
38
+ end
39
+
40
+ def test_logic_instances_should_be_independent
41
+ l1 = FriendLogic.new do
42
+ likes 'p5', 's1'
43
+ end
44
+
45
+ l2 = FriendLogic.new do
46
+ likes 'p5', 's2'
47
+ end
48
+
49
+ assert_equal true, l1.likes?('p5', 's1')
50
+ assert_equal false, l1.likes?('p5', 's2')
51
+ assert_equal true, l1.friends?('p5', 'p3')
52
+ assert_equal false, l1.friends?('p5', 'p2')
53
+
54
+ assert_equal false, l2.likes?('p5', 's1')
55
+ assert_equal true, l2.likes?('p5', 's2')
56
+ assert_equal false, l2.friends?('p5', 'p3')
57
+ assert_equal true, l2.friends?('p5', 'p2')
35
58
  end
36
59
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbprolog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
- - ruijia.li
7
+ - Ruijia Li
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-27 00:00:00.000000000 Z
11
+ date: 2013-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,10 +58,11 @@ files:
58
58
  - lib/rbprolog/version.rb
59
59
  - rbprolog.gemspec
60
60
  - test/test_rbprolog.rb
61
- homepage: ''
61
+ homepage: https://github.com/rli9/rbprolog
62
62
  licenses:
63
63
  - MIT
64
- metadata: {}
64
+ metadata:
65
+ Source Code: https://github.com/rli9/rbprolog
65
66
  post_install_message:
66
67
  rdoc_options: []
67
68
  require_paths: