rbprolog 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: