mini_kraken 0.2.03 → 0.2.04

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/lib/mini_kraken/atomic/all_atomic.rb +4 -0
  4. data/lib/mini_kraken/{core → atomic}/atomic_term.rb +23 -9
  5. data/lib/mini_kraken/atomic/k_boolean.rb +42 -0
  6. data/lib/mini_kraken/{core → atomic}/k_integer.rb +2 -1
  7. data/lib/mini_kraken/{core → atomic}/k_symbol.rb +5 -3
  8. data/lib/mini_kraken/{core → composite}/composite_term.rb +6 -4
  9. data/lib/mini_kraken/composite/cons_cell.rb +132 -0
  10. data/lib/mini_kraken/{core → composite}/cons_cell_visitor.rb +1 -1
  11. data/lib/mini_kraken/core/association_walker.rb +14 -14
  12. data/lib/mini_kraken/core/binary_relation.rb +10 -10
  13. data/lib/mini_kraken/core/equals.rb +159 -161
  14. data/lib/mini_kraken/core/goal_relation.rb +2 -2
  15. data/lib/mini_kraken/core/goal_template.rb +7 -7
  16. data/lib/mini_kraken/core/{variable.rb → log_var.rb} +10 -3
  17. data/lib/mini_kraken/core/{variable_ref.rb → log_var_ref.rb} +3 -3
  18. data/lib/mini_kraken/core/tap.rb +46 -0
  19. data/lib/mini_kraken/core/vocabulary.rb +8 -8
  20. data/lib/mini_kraken/glue/dsl.rb +21 -17
  21. data/lib/mini_kraken/glue/fresh_env.rb +7 -2
  22. data/lib/mini_kraken/glue/fresh_env_factory.rb +1 -1
  23. data/lib/mini_kraken/glue/run_star_expression.rb +2 -2
  24. data/lib/mini_kraken/version.rb +1 -1
  25. data/spec/.rubocop.yml +1 -1
  26. data/spec/atomic/atomic_term_spec.rb +94 -0
  27. data/spec/{core → atomic}/k_boolean_spec.rb +19 -34
  28. data/spec/{core → atomic}/k_symbol_spec.rb +3 -11
  29. data/spec/{core → composite}/cons_cell_spec.rb +10 -8
  30. data/spec/{core → composite}/cons_cell_visitor_spec.rb +11 -10
  31. data/spec/core/association_spec.rb +6 -4
  32. data/spec/core/association_walker_spec.rb +8 -6
  33. data/spec/core/conde_spec.rb +19 -17
  34. data/spec/core/conj2_spec.rb +10 -8
  35. data/spec/core/def_relation_spec.rb +9 -7
  36. data/spec/core/disj2_spec.rb +11 -10
  37. data/spec/core/environment_spec.rb +12 -10
  38. data/spec/core/equals_spec.rb +12 -10
  39. data/spec/core/goal_spec.rb +6 -5
  40. data/spec/core/goal_template_spec.rb +5 -5
  41. data/spec/core/{variable_ref_spec.rb → log_var_ref_spec.rb} +4 -4
  42. data/spec/core/{variable_spec.rb → log_var_spec.rb} +4 -4
  43. data/spec/core/vocabulary_spec.rb +12 -11
  44. data/spec/glue/dsl_chap1_spec.rb +0 -45
  45. data/spec/glue/dsl_chap2_spec.rb +115 -7
  46. data/spec/glue/fresh_env_factory_spec.rb +11 -9
  47. data/spec/glue/fresh_env_spec.rb +3 -3
  48. data/spec/glue/run_star_expression_spec.rb +13 -11
  49. data/spec/support/factory_atomic.rb +22 -0
  50. data/spec/support/factory_methods.rb +11 -26
  51. metadata +28 -23
  52. data/lib/mini_kraken/core/cons_cell.rb +0 -82
  53. data/lib/mini_kraken/core/k_boolean.rb +0 -35
@@ -2,192 +2,190 @@
2
2
 
3
3
  require 'singleton'
4
4
  require_relative 'binary_relation'
5
- require_relative 'cons_cell_visitor'
5
+ require_relative '../composite/cons_cell_visitor'
6
6
  require_relative 'duck_fiber'
7
- require_relative 'variable'
8
- require_relative 'variable_ref'
9
-
10
- unless MiniKraken::Core.constants(false).include? :Equals
11
- module MiniKraken
12
- module Core
13
- # equals tries to unify two terms
14
- class Equals < BinaryRelation
15
- include Singleton
16
-
17
- def initialize
18
- super('equals', '==')
7
+ require_relative 'log_var'
8
+ require_relative 'log_var_ref'
9
+
10
+ module MiniKraken
11
+ module Core
12
+ # equals tries to unify two terms
13
+ class Equals < BinaryRelation
14
+ include Singleton
15
+
16
+ def initialize
17
+ super('equals', '==')
18
+ end
19
+
20
+ # @param actuals [Array<Term>] A two-elements array
21
+ # @param anEnv [Vocabulary] A vocabulary object
22
+ # @return [Fiber<Outcome>] A Fiber(-like) instance that yields Outcomes
23
+ def solver_for(actuals, anEnv)
24
+ arg1, arg2 = *actuals
25
+ DuckFiber.new(:custom) do
26
+ outcome = unification(arg1, arg2, anEnv)
27
+ outcome.prune!
19
28
  end
20
-
21
- # @param actuals [Array<Term>] A two-elements array
22
- # @param anEnv [Vocabulary] A vocabulary object
23
- # @return [Fiber<Outcome>] A Fiber(-like) instance that yields Outcomes
24
- def solver_for(actuals, anEnv)
25
- arg1, arg2 = *actuals
26
- DuckFiber.new(:custom) do
27
- outcome = unification(arg1, arg2, anEnv)
28
- outcome.prune!
29
+ end
30
+
31
+ def unification(arg1, arg2, anEnv)
32
+ arg1_nil = arg1.nil?
33
+ arg2_nil = arg2.nil?
34
+ if arg1_nil || arg2_nil
35
+ if arg1_nil && arg2_nil
36
+ result = Outcome.success(anEnv)
37
+ else
38
+ result = Outcome.failure(anEnv)
29
39
  end
40
+ return result
30
41
  end
31
-
32
- def unification(arg1, arg2, anEnv)
33
- arg1_nil = arg1.nil?
34
- arg2_nil = arg2.nil?
35
- if arg1_nil || arg2_nil
36
- if arg1_nil && arg2_nil
42
+ new_arg1, new_arg2 = commute_cond(arg1, arg2, anEnv)
43
+ do_unification(new_arg1, new_arg2, anEnv)
44
+ end
45
+
46
+ private
47
+
48
+
49
+ # table: Unification
50
+ # | arg1 | arg2 | Criterion || Unification |
51
+ # | isa? Atomic | isa? Atomic | arg1.eq? arg2 is true || { "s", [] } |
52
+ # | isa? Atomic | isa? Atomic | arg1.eq? arg2 is false || { "u", [] } |
53
+ # | isa? CompositeTerm | isa? Atomic | dont_care || { "u", [] } |
54
+ # | isa? CompositeTerm | isa? CompositeTerm | unification(arg1.car, arg2.car) => "s" || { "s", [bindings*] } |
55
+ # | isa? CompositeTerm | isa? CompositeTerm | unification(arg1.cdr, arg2.cdr) => "u" || { "u", [] ) | |
56
+ # | isa? LogVarRef | isa? Atomic | arg1.fresh? is true || { "s", [arg2] } |
57
+ # | isa? LogVarRef | isa? Atomic | arg1.fresh? is false || |
58
+ # | | unification(arg1.value, arg2) => "s" || { "s", [bindings*] } |
59
+ # | | unification(arg1.value, arg2) => "u" || { "u", [] } |
60
+ # | isa? LogVarRef | isa? CompositeTerm | arg1.fresh? is true || { "s", [arg2] } | # What if arg1 occurs in arg2?
61
+ # | isa? LogVarRef | isa? CompositeTerm | arg1.fresh? is false || |
62
+ # | | unification(arg1.value, arg2) => "s" || { "s", [bindings*] } |
63
+ # | | unification(arg1.value, arg2) => "u" || { "u", [] } |
64
+ # | isa? LogVarRef | isa? LogVarRef | arg1.fresh?, arg2.fresh? => [true, true] || { "s", [arg1 <=> arg2] } |
65
+ # | isa? LogVarRef | isa? LogVarRef | arg1.fresh?, arg2.fresh? => [true, false] || |
66
+ # | | unification(arg1, arg2.value) => "s" || { "s", [bindings*] } |
67
+ # | | unification(arg1, arg2.value) => "u" || { "u", [] } |
68
+ # | isa? LogVarRef | isa? LogVarRef | arg1.fresh?, arg2.fresh? => [false, false]|| |
69
+ # | | unification(arg1, arg2.value) => "s" || { "s", [bindings*] } |
70
+ # | | unification(arg1, arg2.value) => "u" || { "u", [] }
71
+ def do_unification(arg1, arg2, anEnv)
72
+ # require 'debug'
73
+ return Outcome.success(anEnv) if arg1.equal?(arg2)
74
+
75
+ result = Outcome.failure(anEnv) # default case
76
+
77
+ if arg1.kind_of?(Atomic::AtomicTerm)
78
+ result = Outcome.success(anEnv) if arg1.eql?(arg2)
79
+ elsif arg1.kind_of?(Composite::CompositeTerm)
80
+ if arg2.kind_of?(Composite::CompositeTerm) # Atomic::AtomicTerm is default case => fail
81
+ result = unify_composite_terms(arg1, arg2, anEnv)
82
+ end
83
+ elsif arg1.kind_of?(LogVarRef)
84
+ arg1_freshness = arg1.freshness(anEnv)
85
+ if arg2.kind_of?(Atomic::AtomicTerm)
86
+ if arg1_freshness.degree == :fresh
37
87
  result = Outcome.success(anEnv)
88
+ arg1.associate(arg2, result)
38
89
  else
39
- result = Outcome.failure(anEnv)
40
- end
41
- return result
42
- end
43
- new_arg1, new_arg2 = commute_cond(arg1, arg2, anEnv)
44
- do_unification(new_arg1, new_arg2, anEnv)
45
- end
46
-
47
- private
48
-
49
-
50
- # table: Unification
51
- # | arg1 | arg2 | Criterion || Unification |
52
- # | isa? Atomic | isa? Atomic | arg1.eq? arg2 is true || { "s", [] } |
53
- # | isa? Atomic | isa? Atomic | arg1.eq? arg2 is false || { "u", [] } |
54
- # | isa? CompositeTerm | isa? Atomic | dont_care || { "u", [] } |
55
- # | isa? CompositeTerm | isa? CompositeTerm | unification(arg1.car, arg2.car) => "s" || { "s", [bindings*] } |
56
- # | isa? CompositeTerm | isa? CompositeTerm | unification(arg1.cdr, arg2.cdr) => "u" || { "u", [] ) | |
57
- # | isa? VariableRef | isa? Atomic | arg1.fresh? is true || { "s", [arg2] } |
58
- # | isa? VariableRef | isa? Atomic | arg1.fresh? is false || |
59
- # | | unification(arg1.value, arg2) => "s" || { "s", [bindings*] } |
60
- # | | unification(arg1.value, arg2) => "u" || { "u", [] } |
61
- # | isa? VariableRef | isa? CompositeTerm | arg1.fresh? is true || { "s", [arg2] } | # What if arg1 occurs in arg2?
62
- # | isa? VariableRef | isa? CompositeTerm | arg1.fresh? is false || |
63
- # | | unification(arg1.value, arg2) => "s" || { "s", [bindings*] } |
64
- # | | unification(arg1.value, arg2) => "u" || { "u", [] } |
65
- # | isa? VariableRef | isa? VariableRef | arg1.fresh?, arg2.fresh? => [true, true] || { "s", [arg1 <=> arg2] } |
66
- # | isa? VariableRef | isa? VariableRef | arg1.fresh?, arg2.fresh? => [true, false] || |
67
- # | | unification(arg1, arg2.value) => "s" || { "s", [bindings*] } |
68
- # | | unification(arg1, arg2.value) => "u" || { "u", [] } |
69
- # | isa? VariableRef | isa? VariableRef | arg1.fresh?, arg2.fresh? => [false, false]|| |
70
- # | | unification(arg1, arg2.value) => "s" || { "s", [bindings*] } |
71
- # | | unification(arg1, arg2.value) => "u" || { "u", [] }
72
- def do_unification(arg1, arg2, anEnv)
73
- # require 'debug'
74
- return Outcome.success(anEnv) if arg1.equal?(arg2)
75
-
76
- result = Outcome.failure(anEnv) # default case
77
-
78
- if arg1.kind_of?(AtomicTerm)
79
- result = Outcome.success(anEnv) if arg1.eql?(arg2)
80
- elsif arg1.kind_of?(CompositeTerm)
81
- if arg2.kind_of?(CompositeTerm) # AtomicTerm is default case => fail
82
- result = unify_composite_terms(arg1, arg2, anEnv)
90
+ result = Outcome.success(anEnv) if arg1.value(anEnv).eql?(arg2)
83
91
  end
84
- elsif arg1.kind_of?(VariableRef)
85
- arg1_freshness = arg1.freshness(anEnv)
86
- if arg2.kind_of?(AtomicTerm)
87
- if arg1_freshness.degree == :fresh
88
- result = Outcome.success(anEnv)
89
- arg1.associate(arg2, result)
90
- else
91
- result = Outcome.success(anEnv) if arg1.value(anEnv).eql?(arg2)
92
- end
93
- elsif arg2.kind_of?(CompositeTerm)
94
- if arg1_freshness.degree == :fresh
95
- result = Outcome.success(anEnv)
96
- arg1.associate(arg2, result)
97
- else
98
- # Ground case...
99
- arg1_associated = arg1_freshness.associated
100
- unless arg1_associated.kind_of?(AtomicTerm)
101
- result = unify_composite_terms(arg1_associated, arg2, anEnv)
102
- end
92
+ elsif arg2.kind_of?(Composite::CompositeTerm)
93
+ if arg1_freshness.degree == :fresh
94
+ result = Outcome.success(anEnv)
95
+ arg1.associate(arg2, result)
96
+ else
97
+ # Ground case...
98
+ arg1_associated = arg1_freshness.associated
99
+ unless arg1_associated.kind_of?(Atomic::AtomicTerm)
100
+ result = unify_composite_terms(arg1_associated, arg2, anEnv)
103
101
  end
104
- elsif arg2.kind_of?(VariableRef)
105
- freshness = [arg1.fresh?(anEnv), arg2.fresh?(anEnv)]
106
- case freshness
107
- when [false, false] # TODO: confirm this...
108
- result = unification(arg1.value(anEnv), arg2.value(anEnv), anEnv)
109
- when [true, true]
110
- result = Outcome.success(anEnv)
111
- if arg1.var_name != arg2.var_name
112
- arg1.associate(arg2, result)
113
- arg2.associate(arg1, result)
114
- end
115
- when [true, false]
116
- result = Outcome.success(anEnv)
102
+ end
103
+ elsif arg2.kind_of?(LogVarRef)
104
+ freshness = [arg1.fresh?(anEnv), arg2.fresh?(anEnv)]
105
+ case freshness
106
+ when [false, false] # TODO: confirm this...
107
+ result = unification(arg1.value(anEnv), arg2.value(anEnv), anEnv)
108
+ when [true, true]
109
+ result = Outcome.success(anEnv)
110
+ if arg1.var_name != arg2.var_name
117
111
  arg1.associate(arg2, result)
118
- else
119
- raise StandardError, "Unsupported freshness combination #{freshness}"
112
+ arg2.associate(arg1, result)
120
113
  end
114
+ when [true, false]
115
+ result = Outcome.success(anEnv)
116
+ arg1.associate(arg2, result)
121
117
  else
122
- arg_kinds = [arg1.class, arg2.class]
123
- raise StandardError, "Unsupported combination #{arg_kinds}"
118
+ raise StandardError, "Unsupported freshness combination #{freshness}"
124
119
  end
120
+ else
121
+ arg_kinds = [arg1.class, arg2.class]
122
+ raise StandardError, "Unsupported combination #{arg_kinds}"
125
123
  end
126
-
127
- result
128
124
  end
129
125
 
130
- # @param arg1 [ConsCell]
131
- # @param arg2 [ConsCell]
132
- # @return [Outcome]
133
- def unify_composite_terms(arg1, arg2, anEnv)
134
- # require 'debug'
135
- result = Outcome.success(anEnv)
136
- # We'll do parallel iteration
137
- visitor1 = ConsCellVisitor.df_visitor(arg1)
138
- visitor2 = ConsCellVisitor.df_visitor(arg2)
139
- skip_children1 = false
140
- skip_children2 = false
141
-
142
- loop do
143
- side1, cell1 = visitor1.resume(skip_children1)
144
- side2, cell2 = visitor2.resume(skip_children2)
145
- if side1 != side2
146
- result = Outcome.failure(anEnv)
147
- elsif side1 == :stop
148
- break
149
- else
150
- case [cell1.class, cell2.class] # nil, AtomicTerm, ConsCell, VariableRef
151
- when [ConsCell, ConsCell]
152
- skip_children1 = false
153
- skip_children2 = false
154
- when [ConsCell, VariableRef]
155
- skip_children1 = true
156
- skip_children2 = false
157
- sub_result = unification(cell1, cell2, anEnv)
158
- result = merge_results(result, sub_result)
159
- when [VariableRef, ConsCell]
160
- skip_children1 = false
161
- skip_children2 = true
162
- sub_result = do_unification(cell1, cell2, anEnv)
163
- result = merge_results(result, sub_result)
164
- else
126
+ result
127
+ end
128
+
129
+ # @param arg1 [Composite::ConsCell]
130
+ # @param arg2 [Composite::ConsCell]
131
+ # @return [Outcome]
132
+ def unify_composite_terms(arg1, arg2, anEnv)
133
+ # require 'debug'
134
+ result = Outcome.success(anEnv)
135
+ # We'll do parallel iteration
136
+ visitor1 = Composite::ConsCellVisitor.df_visitor(arg1)
137
+ visitor2 = Composite::ConsCellVisitor.df_visitor(arg2)
138
+ skip_children1 = false
139
+ skip_children2 = false
140
+
141
+ loop do
142
+ side1, cell1 = visitor1.resume(skip_children1)
143
+ side2, cell2 = visitor2.resume(skip_children2)
144
+ if side1 != side2
145
+ result = Outcome.failure(anEnv)
146
+ elsif side1 == :stop
147
+ break
148
+ else
149
+ case [cell1.class, cell2.class] # nil, Atomic::AtomicTerm, Composite::ConsCell, LogVarRef
150
+ when [Composite::ConsCell, Composite::ConsCell]
165
151
  skip_children1 = false
166
152
  skip_children2 = false
153
+ when [Composite::ConsCell, LogVarRef]
154
+ skip_children1 = true
155
+ skip_children2 = false
167
156
  sub_result = unification(cell1, cell2, anEnv)
168
157
  result = merge_results(result, sub_result)
169
- end
158
+ when [LogVarRef, Composite::ConsCell]
159
+ skip_children1 = false
160
+ skip_children2 = true
161
+ sub_result = do_unification(cell1, cell2, anEnv)
162
+ result = merge_results(result, sub_result)
163
+ else
164
+ skip_children1 = false
165
+ skip_children2 = false
166
+ sub_result = unification(cell1, cell2, anEnv)
167
+ result = merge_results(result, sub_result)
170
168
  end
171
-
172
- break if result.failure?
173
169
  end
174
170
 
175
- result
171
+ break if result.failure?
176
172
  end
177
173
 
178
- def merge_results(result1, result2)
179
- raise StandardError if result2.kind_of?(Hash)
174
+ result
175
+ end
180
176
 
181
- if result2.success?
182
- result1.merge(result2)
183
- result1
184
- else
185
- result2
186
- end
177
+ def merge_results(result1, result2)
178
+ raise StandardError if result2.kind_of?(Hash)
179
+
180
+ if result2.success?
181
+ result1.merge(result2)
182
+ result1
183
+ else
184
+ result2
187
185
  end
188
- end # class
186
+ end
187
+ end # class
189
188
 
190
- Equals.instance.freeze
191
- end # module
189
+ Equals.instance.freeze
192
190
  end # module
193
- end # unless
191
+ end # module
@@ -15,9 +15,9 @@ module MiniKraken
15
15
 
16
16
  def validated_args(actuals)
17
17
  actuals.each do |arg|
18
- unless arg.kind_of?(Goal)
18
+ unless arg.kind_of?(Goal) || arg.kind_of?(Glue::FreshEnv)
19
19
  prefix = "#{name} expects goal as argument, found a "
20
- raise StandardError, prefix + "'#{arg.class}'"
20
+ raise StandardError, prefix + "'#{arg.class}': #{arg}"
21
21
  end
22
22
  end
23
23
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'base_arg'
4
- require_relative 'cons_cell_visitor'
4
+ require_relative '../composite/cons_cell_visitor'
5
5
 
6
6
  module MiniKraken
7
7
  module Core
@@ -54,7 +54,7 @@ module MiniKraken
54
54
  goal_args << formals2actuals[arg.name]
55
55
  elsif arg.kind_of?(GoalTemplate)
56
56
  goal_args << arg.send(:do_instantiate, formals2actuals)
57
- elsif arg.kind_of?(ConsCell)
57
+ elsif arg.kind_of?(Composite::ConsCell)
58
58
  # if list contains a formal_ref it must be replaced by the actual
59
59
  goal_args << transform(arg, formals2actuals)
60
60
  else
@@ -71,9 +71,9 @@ module MiniKraken
71
71
  return aConsCell if aConsCell.null?
72
72
 
73
73
  member = { car: :@car, cdr: :@cdr }
74
- visitor = ConsCellVisitor.df_visitor(aConsCell)
74
+ visitor = Composite::ConsCellVisitor.df_visitor(aConsCell)
75
75
  side, cell = visitor.resume
76
- result = ConsCell.new(nil, nil)
76
+ result = Composite::ConsCell.new(nil, nil)
77
77
  node = result
78
78
 
79
79
  loop do
@@ -84,15 +84,15 @@ module MiniKraken
84
84
  case cell
85
85
  when FormalRef
86
86
  converted = formals2actuals[cell.name]
87
- when ConsCell
88
- converted = ConsCell.new(nil, nil)
87
+ when Composite::ConsCell
88
+ converted = Composite::ConsCell.new(nil, nil)
89
89
  when GoalTemplate
90
90
  converted = cell.send(:do_instantiate, formals2actuals)
91
91
  else
92
92
  converted = cell
93
93
  end
94
94
  node.instance_variable_set(member[side], converted)
95
- node = converted if converted.kind_of?(ConsCell)
95
+ node = converted if converted.kind_of?(Composite::ConsCell)
96
96
  end
97
97
 
98
98
  result
@@ -6,24 +6,31 @@ require_relative 'vocabulary'
6
6
 
7
7
  module MiniKraken
8
8
  module Core
9
- # Representation of a MiniKraken variable.
10
- # It is a named slot that can be associated with one value.
11
- class Variable
9
+ # Representation of a MiniKraken logical variable.
10
+ # It is a named slot that can be associated with one value at the time.
11
+ # In relational programming, there is no explicit assignment expression.
12
+ # A logical variable acquire a value through an algorithm called
13
+ # 'unification'.
14
+ class LogVar
12
15
  include Designation # Mixin: Acquire name attribute
13
16
 
14
17
  # @return [String] Internal variable name used by MiniKraken
15
18
  attr_accessor :i_name
16
19
 
20
+ # Create a logical variable with given name
17
21
  # @param aName [String] The name of the variable
18
22
  def initialize(aName)
19
23
  init_designation(aName)
20
24
  @i_name = name.dup
21
25
  end
22
26
 
27
+ # Indicate whether this variable is fused with another one.
28
+ # @return [Boolean]
23
29
  def fused?
24
30
  name != i_name
25
31
  end
26
32
 
33
+ # @param [Core::Vocabulary]
27
34
  def quote(env)
28
35
  raise StandardError, "class #{env}" unless env.kind_of?(Vocabulary)
29
36
 
@@ -8,7 +8,7 @@ module MiniKraken
8
8
  module Core
9
9
  # A variable reference represents the occurrence of a variable (name) in a
10
10
  # MiniKraken term.
11
- class VariableRef < Term
11
+ class LogVarRef < Term
12
12
  include Designation # Mixin: Acquire name attribute
13
13
  alias var_name name
14
14
 
@@ -48,7 +48,7 @@ module MiniKraken
48
48
  val.nil? ? AnyValue.new(var_name, env, names_fused(env)) : val
49
49
  end
50
50
 
51
- # param another [VariableRef]
51
+ # param another [LogVarRef]
52
52
  # @param env [Environment]
53
53
  # @return [Boolean]
54
54
  def fused_with?(another, env)
@@ -63,7 +63,7 @@ module MiniKraken
63
63
  env.names_fused(var_name)
64
64
  end
65
65
 
66
- # param another [VariableRef]
66
+ # param another [LogVarRef]
67
67
  # @param env [Environment]
68
68
  # @return [Boolean]
69
69
  def different_from?(another, env)