rubylog 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. data/Gemfile +1 -1
  2. data/README.hu.rb +58 -0
  3. data/README.rdoc +248 -89
  4. data/Rakefile +6 -1
  5. data/VERSION +1 -1
  6. data/bin/rubylog +18 -0
  7. data/examples/dcg.rb +35 -0
  8. data/examples/dcg2.rb +42 -0
  9. data/examples/enumerators.rb +30 -0
  10. data/examples/factorial.rb +9 -8
  11. data/examples/hanoi.rb +24 -0
  12. data/examples/hello.rb +11 -5
  13. data/examples/parsing.rb +27 -0
  14. data/examples/primitives.rb +24 -0
  15. data/examples/theory.rb +22 -10
  16. data/lib/rubylog/builtins/default.rb +10 -0
  17. data/lib/rubylog/builtins/file_system.rb +15 -0
  18. data/lib/rubylog/builtins/logic.rb +109 -0
  19. data/lib/rubylog/builtins/reflection.rb +94 -0
  20. data/lib/rubylog/builtins/term.rb +47 -0
  21. data/lib/rubylog/dsl/array_splat.rb +25 -0
  22. data/lib/rubylog/dsl/primitives.rb +17 -0
  23. data/lib/rubylog/dsl/thats.rb +22 -0
  24. data/lib/rubylog/dsl/variables.rb +30 -0
  25. data/lib/rubylog/dsl.rb +35 -17
  26. data/lib/rubylog/errors.rb +19 -1
  27. data/lib/rubylog/interfaces/assertable.rb +16 -0
  28. data/lib/rubylog/interfaces/callable.rb +18 -0
  29. data/lib/rubylog/interfaces/composite_term.rb +47 -0
  30. data/lib/rubylog/interfaces/predicate.rb +8 -0
  31. data/lib/rubylog/interfaces/procedure.rb +60 -0
  32. data/lib/rubylog/interfaces/term.rb +41 -0
  33. data/lib/rubylog/mixins/array.rb +118 -0
  34. data/lib/{class.rb → rubylog/mixins/class.rb} +2 -2
  35. data/lib/rubylog/mixins/hash.rb +8 -0
  36. data/lib/rubylog/mixins/kernel.rb +5 -0
  37. data/lib/rubylog/mixins/method.rb +3 -0
  38. data/lib/rubylog/mixins/object.rb +8 -0
  39. data/lib/rubylog/mixins/proc.rb +37 -0
  40. data/lib/rubylog/mixins/string.rb +104 -0
  41. data/lib/rubylog/mixins/symbol.rb +44 -0
  42. data/lib/rubylog/simple_procedure.rb +8 -0
  43. data/lib/rubylog/{clause.rb → structure.rb} +32 -31
  44. data/lib/rubylog/theory.rb +368 -79
  45. data/lib/rubylog/variable.rb +102 -23
  46. data/lib/rubylog.rb +33 -25
  47. data/logic/builtins/file_system_logic.rb +23 -0
  48. data/logic/builtins/reflection_logic.rb +40 -0
  49. data/logic/dereference_logic.rb +23 -0
  50. data/logic/directory_structure_logic.rb +19 -0
  51. data/logic/dsl_logic.rb +29 -0
  52. data/logic/errors_logic.rb +9 -0
  53. data/logic/guard_logic.rb +115 -0
  54. data/logic/list_logic.rb +55 -0
  55. data/logic/map_logic.rb +15 -0
  56. data/logic/multitheory.rb +23 -0
  57. data/logic/recursion_logic.rb +12 -0
  58. data/logic/string_logic.rb +41 -0
  59. data/logic/thats_logic.rb +51 -0
  60. data/logic/variable_logic.rb +24 -0
  61. data/rubylog.gemspec +85 -46
  62. data/spec/bartak_guide_spec.rb +57 -62
  63. data/spec/builtins/all_spec.rb +99 -0
  64. data/spec/builtins/and_spec.rb +22 -0
  65. data/spec/builtins/array_spec.rb +16 -0
  66. data/spec/builtins/branch_or_spec.rb +27 -0
  67. data/spec/builtins/cut_spec.rb +44 -0
  68. data/spec/builtins/fail_spec.rb +5 -0
  69. data/spec/builtins/false_spec.rb +5 -0
  70. data/spec/builtins/in_spec.rb +38 -0
  71. data/spec/builtins/is_false_spec.rb +12 -0
  72. data/spec/builtins/is_spec.rb +26 -0
  73. data/spec/builtins/matches_spec.rb +23 -0
  74. data/spec/builtins/or_spec.rb +22 -0
  75. data/spec/{rubylog/builtins → builtins}/splits_to.rb +0 -0
  76. data/spec/builtins/then_spec.rb +27 -0
  77. data/spec/builtins/true_spec.rb +5 -0
  78. data/spec/clause_spec.rb +82 -0
  79. data/spec/compilation_spec.rb +61 -0
  80. data/spec/custom_classes_spec.rb +43 -0
  81. data/spec/dereference.rb +10 -0
  82. data/spec/{inriasuite.rb → inriasuite_spec.rb} +2 -9
  83. data/spec/queries_spec.rb +150 -0
  84. data/spec/recursion_spec.rb +4 -4
  85. data/spec/ruby_code_spec.rb +52 -0
  86. data/spec/rules_spec.rb +97 -0
  87. data/spec/spec_helper.rb +6 -2
  88. data/spec/theory_spec.rb +28 -0
  89. data/spec/unification_spec.rb +84 -0
  90. data/spec/variable_spec.rb +26 -0
  91. metadata +153 -180
  92. data/examples/4queens.rb +0 -10
  93. data/examples/calculation.rb +0 -12
  94. data/examples/concepts.rb +0 -46
  95. data/examples/fp.rb +0 -56
  96. data/examples/historia_de_espana.rb +0 -31
  97. data/examples/idea.rb +0 -143
  98. data/examples/lists.rb +0 -5
  99. data/examples/mechanika.rb +0 -409
  100. data/examples/parse.rb +0 -15
  101. data/lib/array.rb +0 -24
  102. data/lib/method.rb +0 -4
  103. data/lib/object.rb +0 -5
  104. data/lib/proc.rb +0 -4
  105. data/lib/rubylog/builtins.rb +0 -193
  106. data/lib/rubylog/callable.rb +0 -20
  107. data/lib/rubylog/composite_term.rb +0 -38
  108. data/lib/rubylog/dsl/constants.rb +0 -15
  109. data/lib/rubylog/dsl/first_order_functors.rb +0 -9
  110. data/lib/rubylog/dsl/global_functors.rb +0 -3
  111. data/lib/rubylog/dsl/second_order_functors.rb +0 -8
  112. data/lib/rubylog/internal_helpers.rb +0 -16
  113. data/lib/rubylog/predicate.rb +0 -34
  114. data/lib/rubylog/proc_method_additions.rb +0 -69
  115. data/lib/rubylog/term.rb +0 -20
  116. data/lib/rubylog/unifiable.rb +0 -19
  117. data/lib/symbol.rb +0 -35
  118. data/script/inriasuite2spec +0 -0
  119. data/script/inriasuite2spec.pl +0 -22
  120. data/spec/rubylog/clause_spec.rb +0 -81
  121. data/spec/rubylog/variable_spec.rb +0 -25
  122. data/spec/rubylog_spec.rb +0 -914
@@ -0,0 +1,60 @@
1
+ module Rubylog::Procedure
2
+ include Rubylog::Predicate
3
+
4
+ # accepts the *args of the called structure
5
+ def call *args
6
+ catch :cut do
7
+ each do |rule|
8
+ begin
9
+ rule = rule.rubylog_compile_variables
10
+ head, body = rule[0], rule[1]
11
+ Rubylog.current_theory.print_trace 1, head.args, "=", args
12
+ head.args.rubylog_unify(args) {
13
+ begin
14
+ Rubylog.current_theory.print_trace 1, head, head.rubylog_variables_hash
15
+ body.prove {
16
+ yield
17
+ }
18
+ ensure
19
+ Rubylog.current_theory.print_trace -1
20
+ end
21
+ }
22
+ ensure
23
+ Rubylog.current_theory.print_trace -1
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def discontiguous!
30
+ @discontiguous = true
31
+ end
32
+
33
+ def discontiguous?
34
+ @discontiguous
35
+ end
36
+
37
+ def multitheory!
38
+ @multitheory = true
39
+ end
40
+
41
+ def multitheory?
42
+ @multitheory
43
+ end
44
+
45
+ # In case of a procedure, `each` can be implemented, which should yield all
46
+ # clauses. This makes reflection possible.
47
+ #
48
+ # def each
49
+ # yield ...
50
+ # end
51
+ #
52
+ # this should be implemented to enable assertions
53
+ # def assertz clause
54
+ # ...
55
+ # end
56
+ #
57
+ # def assertz clause
58
+ # ...
59
+ # end
60
+ end
@@ -0,0 +1,41 @@
1
+ module Rubylog::Term
2
+ def rubylog_clone
3
+ yield self
4
+ end
5
+
6
+ def rubylog_variables
7
+ []
8
+ end
9
+
10
+ def rubylog_resolve_function
11
+ self
12
+ end
13
+
14
+ def rubylog_variables_hash
15
+ vars = rubylog_variables
16
+ Hash[vars.zip(vars.map{|v|v.value})]
17
+ end
18
+
19
+ def rubylog_unify other
20
+ if other.kind_of? Rubylog::Variable
21
+ other.rubylog_unify(self) do yield end
22
+ else
23
+ yield if self == other
24
+ end
25
+ end
26
+
27
+ def rubylog_dereference
28
+ self
29
+ end
30
+
31
+ def rubylog_deep_dereference
32
+ self
33
+ end
34
+
35
+ def rubylog_compile_variables
36
+ self
37
+ end
38
+ end
39
+
40
+
41
+
@@ -0,0 +1,118 @@
1
+ module Rubylog
2
+ # for the future
3
+ def self.unify_arrays a, a_start, a_end, b, b_start, b_end
4
+ case
5
+ when (a_start > a_end and b_start > b_end)
6
+ yield
7
+ when (a_start > a_end or b_start > b_end)
8
+ return
9
+ when (a[a_start].is_a? Rubylog::DSL::ArraySplat and b[b_start].is_a? Rubylog::DSL::ArraySplat)
10
+ raise "not implemented"
11
+ when (a[a_start].is_a? Rubylog::DSL::ArraySplat)
12
+ # A=[]
13
+ a[a_start].var.rubylog_unify [] do
14
+ unify_arrays(a, a_start+1, a_end, b, b_start, b_end) { yield }
15
+ end
16
+
17
+ # A=[_X, *_Y]
18
+ new_arr = [Rubylog::Variable.new, Rubylog::DSL::ArraySplat.new(Rubylog::Variable.new)]
19
+ a[a_start].var.rubylog_unify new_arr do
20
+ unify_arrays(a[a_start].var, a_start+1, a_end, b, b_start, b_end) { yield }
21
+ end
22
+ when (b[b_start].is_a? Rubylog::DSL::ArraySplat)
23
+ raise "not implemented"
24
+ else
25
+ a[a_start].rubylog_unify b[b_start] do
26
+ unify_arrays(a, a_start+1, a_end, b, b_start+1, b_end) { yield }
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ class Array
33
+
34
+ # Term methods
35
+ def rubylog_unify other
36
+ return super{yield} unless other.instance_of? self.class
37
+ #Rubylog.unify_arrays(self, 0, length-1, other, 0, other.length-1) { yield }
38
+ if empty?
39
+ if other.empty?
40
+ yield
41
+ elsif other[0].is_a? Rubylog::DSL::ArraySplat
42
+ other[0].var.rubylog_unify [] do
43
+ self.rubylog_unify other[1..-1] do
44
+ yield
45
+ end
46
+ end
47
+ else
48
+ # failed
49
+ end
50
+ else
51
+ if self[0].is_a? Rubylog::DSL::ArraySplat
52
+ # optimize [*A] = [*B]
53
+ if other[0].is_a? Rubylog::DSL::ArraySplat and self.length == 1 and other.length == 1
54
+ self[0].var.rubylog_unify other[0].var do
55
+ yield
56
+ end
57
+ return
58
+ end
59
+
60
+ self[0].var.rubylog_unify [] do
61
+ self[1..-1].rubylog_unify other do
62
+ yield
63
+ end
64
+ end
65
+ part = [Rubylog::Variable.new, Rubylog::DSL::ArraySplat.new]
66
+ self[0].var.rubylog_unify part do
67
+ (part + self[1..-1]).rubylog_unify other do
68
+ yield
69
+ end
70
+ end
71
+ else
72
+ if other[0].is_a? Rubylog::DSL::ArraySplat
73
+ other[0].var.rubylog_unify [] do
74
+ self.rubylog_unify other[1..-1] do
75
+ yield
76
+ end
77
+ end
78
+ part = [Rubylog::Variable.new, Rubylog::DSL::ArraySplat.new]
79
+ other[0].var.rubylog_unify part do
80
+ self.rubylog_unify(part + other[1..-1]) do
81
+ yield
82
+ end
83
+ end
84
+ else
85
+ return if other.empty?
86
+ self[0].rubylog_unify other[0] do
87
+ self[1..-1].rubylog_unify other[1..-1] do
88
+ yield
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ # CompositeTerm methods
97
+ include Rubylog::CompositeTerm
98
+ def rubylog_clone &block
99
+ block[map{|t|t.rubylog_clone &block}]
100
+ end
101
+
102
+ def rubylog_deep_dereference
103
+ map do |t|
104
+ case t
105
+ when Rubylog::DSL::ArraySplat
106
+ v = t.var.rubylog_dereference
107
+ if v.is_a? Array
108
+ v.rubylog_deep_dereference
109
+ else
110
+ [t]
111
+ end
112
+ else
113
+ [t.rubylog_deep_dereference]
114
+ end
115
+ end.inject(:concat) || []
116
+ end
117
+
118
+ end
@@ -1,7 +1,7 @@
1
1
  class Class
2
- def include_theory *theories
2
+ def use_theory *theories
3
3
  raise ArgumentError, "no theory given" if theories.empty?
4
- theories.each {|t| include t.public_interface}
4
+ theories.each {|t| t.subject self }
5
5
  end
6
6
 
7
7
  def rubylog_functor *functors
@@ -0,0 +1,8 @@
1
+ class Hash
2
+ def rubylog_matches_as_guard? other
3
+ self.each_pair do |k,v|
4
+ return false unless v.rubylog_matches_as_guard? other.send(*k)
5
+ end
6
+ true
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module Kernel
2
+ def theory *args, &block
3
+ Rubylog.theory *args, &block
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ class Method
2
+ include Rubylog::Predicate
3
+ end
@@ -0,0 +1,8 @@
1
+ class Object
2
+ include Rubylog::Term
3
+
4
+ def rubylog_matches_as_guard? other
5
+ Rubylog.current_theory.print_trace 0, "#{inspect}===#{other.inspect}"
6
+ self === other
7
+ end
8
+ end
@@ -0,0 +1,37 @@
1
+ class Proc
2
+
3
+ # Callable methods
4
+ include Rubylog::Callable
5
+
6
+ def prove
7
+ yield if call_with_rubylog_variables
8
+ end
9
+
10
+ # CompositeTerm methods
11
+ include Rubylog::CompositeTerm
12
+ def rubylog_clone
13
+ yield dup
14
+ end
15
+
16
+
17
+
18
+ # Term methods
19
+ def rubylog_resolve_function
20
+ call_with_rubylog_variables
21
+ end
22
+
23
+ def call_with_rubylog_variables vars = nil
24
+ vars ||= @rubylog_variables
25
+ raise Rubylog::InvalidStateError, "variables not available" if not vars
26
+
27
+ Rubylog::Theory.with_vars vars do
28
+ return call
29
+ end
30
+ # to pass arguments:
31
+ #if arity == -1
32
+ # call *@rubylog_variables.map{|v|v.value}
33
+ #else
34
+ # call *@rubylog_variables[0...arity].map{|v|v.value}
35
+ #end
36
+ end
37
+ end
@@ -0,0 +1,104 @@
1
+ class String
2
+ RUBYLOG_VAR_START = "\u0091" # "\u00ab"
3
+ RUBYLOG_VAR_END = "\u0092" # "\u00bb"
4
+ RUBYLOG_VAR_REGEXP = /#{RUBYLOG_VAR_START}([^\[]+?)\[(\d*)\]#{RUBYLOG_VAR_END}/
5
+
6
+ RubylogStringVariableGuards = [[]]
7
+
8
+ def self.rubylog_unify_strings a, a_segments, a_vars, b
9
+ #p a, a_segments, a_vars, b
10
+ if a_segments.count == 1
11
+ segment = a_segments[0]
12
+ if b.end_with?(segment)
13
+ #p b[0...b.length-segment.length]
14
+ a_vars[0].rubylog_unify b[0...b.length-segment.length] do
15
+ yield
16
+ end
17
+ end
18
+ else
19
+ b.scan /#{Regexp.quote(a_segments[0])}/ do
20
+ a_vars[0].rubylog_unify(b[0...Regexp.last_match.begin(0)]) do
21
+ rubylog_unify_strings(a, a_segments[1..-1], a_vars[1..-1], b[Regexp.last_match.end(0)..-1]) do
22
+ yield
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ # Term methods
30
+ def rubylog_unify other
31
+ return super{yield} unless other.instance_of? self.class
32
+
33
+ self_has_vars = self =~ RUBYLOG_VAR_REGEXP
34
+ other_has_vars = other =~ RUBYLOG_VAR_REGEXP
35
+
36
+ return super{yield} unless self_has_vars or other_has_vars
37
+ raise Rubylog::InstantiationError, "Cannot unify two strings with variables inside" if self_has_vars and other_has_vars
38
+
39
+ a, b = self_has_vars ? [self, other] : [other, self]
40
+ a_segments, a_vars = a.rubylog_segments
41
+
42
+ return unless b.start_with? a_segments[0]
43
+ b = b[a_segments[0].length..-1]; a_segments.shift
44
+
45
+ String.rubylog_unify_strings(a, a_segments, a_vars, b) do
46
+ yield
47
+ end
48
+
49
+ end
50
+
51
+ # CompositeTerm methods
52
+ include Rubylog::CompositeTerm
53
+ def rubylog_clone &block
54
+ scan RUBYLOG_VAR_REGEXP do
55
+ guards = RubylogStringVariableGuards[$2.to_i]
56
+ Rubylog::Variable.new($1.to_sym)[*guards].rubylog_clone(&block)
57
+ end
58
+ block[self]
59
+ end
60
+
61
+ def rubylog_deep_dereference
62
+ gsub RUBYLOG_VAR_REGEXP do
63
+ rubylog_get_string_variable($1).rubylog_deep_dereference.to_s
64
+ end
65
+ end
66
+
67
+ # returns a list of substrings which are before, between and after the rubylog
68
+ # string variables
69
+ def rubylog_segments
70
+ segments = [[0]]
71
+ vars = []
72
+
73
+ scan RUBYLOG_VAR_REGEXP do
74
+ match = Regexp.last_match
75
+ #p match
76
+ #p match.begin(0)
77
+ #p match.end(0)
78
+ #p match[0]
79
+ #p match[1]
80
+ segments.last << match.begin(0)
81
+ segments << [match.end(0)]
82
+ vars << rubylog_get_string_variable(match[1])
83
+ end
84
+
85
+
86
+ segments.last << length
87
+ #p segments, vars
88
+ segments = segments.map{|s|self[s[0]...s[1]]}
89
+ #p [self, segments, vars]
90
+ return segments, vars
91
+ end
92
+
93
+ protected
94
+
95
+ def rubylog_get_string_variable s
96
+ s = s.to_sym
97
+ if @rubylog_variables
98
+ @rubylog_variables.find{|v|v.name == s}
99
+ else
100
+ raise Rubylog::InvalidStateError, "Rubylog variables not available"
101
+ end
102
+ end
103
+
104
+ end
@@ -0,0 +1,44 @@
1
+ class Symbol
2
+
3
+ # a proxy for Structure
4
+ def functor
5
+ self
6
+ end
7
+
8
+ def arity
9
+ 0
10
+ end
11
+
12
+ def indicator
13
+ [self, 0]
14
+ end
15
+
16
+ def args
17
+ []
18
+ end
19
+
20
+ # Assertable methods
21
+ include Rubylog::Assertable
22
+
23
+ # Term methods
24
+ include Rubylog::Term
25
+
26
+ # Callable methods
27
+ include Rubylog::Callable
28
+
29
+ def prove
30
+ begin
31
+ Rubylog.current_theory.print_trace 1, self, rubylog_variables_hash
32
+
33
+ predicate = Rubylog.current_theory[[self,0]]
34
+ raise Rubylog::ExistenceError, indicator if not predicate
35
+
36
+ predicate.call(*args) { yield }
37
+
38
+ ensure
39
+ Rubylog.current_theory.print_trace -1
40
+ end
41
+ end
42
+
43
+
44
+ end
@@ -0,0 +1,8 @@
1
+ class Rubylog::SimpleProcedure < Array
2
+ include Rubylog::Procedure
3
+
4
+ alias assertz <<
5
+ alias asserta unshift
6
+ end
7
+
8
+
@@ -1,9 +1,10 @@
1
1
  module Rubylog
2
- class Clause
2
+ class Structure
3
3
 
4
4
  # data structure
5
5
  attr_reader :functor, :args
6
6
  def initialize functor, *args
7
+ #raise Rubylog::TypeError, "functor cannot be #{functor}" unless functor.is_a? Symbol
7
8
  @functor = functor
8
9
  @args = args.freeze
9
10
  @arity = args.count
@@ -14,7 +15,7 @@ module Rubylog
14
15
  end
15
16
 
16
17
  def == other
17
- other.instance_of? Clause and
18
+ other.instance_of? Structure and
18
19
  @functor == other.functor and @args == other.args
19
20
  end
20
21
  alias eql? ==
@@ -37,38 +38,36 @@ module Rubylog
37
38
  @arity
38
39
  end
39
40
 
40
- def desc
41
+ def indicator
41
42
  [@functor, @arity]
42
43
  end
43
44
 
44
- # assertion routines
45
- def if body=nil, &block
46
- Rubylog.theory.assert self, body || block
47
- end
48
-
49
- def unless body=nil, &block
50
- Rubylog.theory.assert self, Clause.new(:is_false, body || block)
51
- end
52
-
53
-
45
+ # Assertable methods
46
+ include Rubylog::Assertable
54
47
 
55
48
  # Callable methods
56
49
  include Rubylog::Callable
57
50
 
58
51
  def prove
59
- Rubylog.theory.trace 1, self, InternalHelpers.vars_hash_of(self)
60
- predicate = Rubylog.theory[@functor][@arity]
61
- raise ExistenceError, desc.inspect if not predicate
62
- predicate.call(*@args) { yield }
63
- Rubylog.theory.trace -1
52
+ begin
53
+ Rubylog.current_theory.print_trace 1, self, rubylog_variables_hash
54
+ predicate = Rubylog.current_theory[indicator]
55
+ raise Rubylog::ExistenceError, indicator.inspect if not predicate
56
+ count = 0
57
+ predicate.call(*@args) { yield; count+=1 }
58
+ count
59
+ ensure
60
+ Rubylog.current_theory.print_trace -1
61
+ end
64
62
  end
63
+
65
64
 
66
65
  # enumerable methods
67
66
  include Enumerable
68
67
  alias each solve
69
68
 
70
- # Unifiable methods
71
- include Rubylog::Unifiable
69
+ # Term methods
70
+ include Rubylog::Term
72
71
  def rubylog_unify other
73
72
  return super{yield} unless other.instance_of? self.class
74
73
  return unless other.functor == @functor
@@ -81,20 +80,22 @@ module Rubylog
81
80
  # CompositeTerm methods
82
81
  include Rubylog::CompositeTerm
83
82
  def rubylog_clone &block
84
- block.call Clause.new @functor,
85
- *@args.map{|a|a.rubylog_clone &block}
83
+ block.call Structure.new @functor,
84
+ *@args.map{|a| a.rubylog_clone &block}
85
+ end
86
+ def rubylog_deep_dereference
87
+ Structure.new @functor.rubylog_deep_dereference,
88
+ *@args.rubylog_deep_dereference
86
89
  end
87
90
 
88
- # Second-order functors (:is_false, :and, :or, :then)
89
- include Rubylog::DSL::SecondOrderFunctors
90
91
 
91
92
  # convenience methods
92
- def solutions
93
- goal = rubylog_compile_variables
94
- goal.variable_hashes_without_compile.map do |hash|
95
- goal.rubylog_clone {|i| hash[i] || i }
96
- end
97
- end
93
+ #def each_solution
94
+ #goal = rubylog_compile_variables
95
+ #goal.variable_hashes_without_compile.each do |hash|
96
+ #yield goal.rubylog_clone {|i| hash[i] || i }
97
+ #end
98
+ #end
98
99
 
99
100
  def variable_hashes
100
101
  rubylog_compile_variables.variable_hashes_without_compile
@@ -109,5 +110,5 @@ module Rubylog
109
110
  end
110
111
  end
111
112
  end
112
-
113
113
  end
114
+