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 +4 -4
- data/.gitignore +2 -1
- data/lib/rbprolog/context.rb +1 -6
- data/lib/rbprolog/deduction.rb +6 -5
- data/lib/rbprolog/rule.rb +22 -21
- data/lib/rbprolog/version.rb +1 -1
- data/rbprolog.gemspec +4 -2
- data/test/test_rbprolog.rb +31 -8
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53b585062269fdd1b34299a6062ed17d194a24a0
|
4
|
+
data.tar.gz: 189dee03f4f9bf9d6af6ad3ab04a1b1a6f6b8b1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f268165d241aeaf52c27044b3a69c89a92ae4ad5380e1274189d01b6efbab70d117719ec7dd3c9ccf710fd353d64d17a7f0fa9437549cffc5461537029163965
|
7
|
+
data.tar.gz: d615a690017127e4a957412ce550b2beaf832f3a97d0ccb48a80c810b5672ee1b37bd5ea431fbbdc646ada966daaf8583b2043468cb8f17f9f5d87b25adf4048
|
data/.gitignore
CHANGED
data/lib/rbprolog/context.rb
CHANGED
@@ -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
|
data/lib/rbprolog/deduction.rb
CHANGED
@@ -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,
|
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,
|
20
|
-
print "#{
|
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
|
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)},
|
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,
|
7
|
+
def initialize(sym, *args, deductions)
|
8
8
|
@sym = sym
|
9
9
|
@args = args
|
10
|
-
@
|
10
|
+
@deductions = [deductions].flatten
|
11
11
|
end
|
12
12
|
|
13
|
-
def each_deduce(rules, *args,
|
14
|
-
print "#{
|
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
|
-
|
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
|
30
|
-
|
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 =
|
44
|
+
predicate = deductions.shift
|
34
45
|
if Deduction === predicate
|
35
|
-
predicate.each_deduce(context, rules,
|
36
|
-
|
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 &&
|
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
|
data/lib/rbprolog/version.rb
CHANGED
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 = ["
|
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
|
data/test/test_rbprolog.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'test/unit'
|
2
|
-
|
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
|
21
|
-
l = FriendLogic.new
|
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 ['
|
34
|
-
|
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.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Ruijia Li
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
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:
|