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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/mini_kraken/atomic/all_atomic.rb +4 -0
- data/lib/mini_kraken/{core → atomic}/atomic_term.rb +23 -9
- data/lib/mini_kraken/atomic/k_boolean.rb +42 -0
- data/lib/mini_kraken/{core → atomic}/k_integer.rb +2 -1
- data/lib/mini_kraken/{core → atomic}/k_symbol.rb +5 -3
- data/lib/mini_kraken/{core → composite}/composite_term.rb +6 -4
- data/lib/mini_kraken/composite/cons_cell.rb +132 -0
- data/lib/mini_kraken/{core → composite}/cons_cell_visitor.rb +1 -1
- data/lib/mini_kraken/core/association_walker.rb +14 -14
- data/lib/mini_kraken/core/binary_relation.rb +10 -10
- data/lib/mini_kraken/core/equals.rb +159 -161
- data/lib/mini_kraken/core/goal_relation.rb +2 -2
- data/lib/mini_kraken/core/goal_template.rb +7 -7
- data/lib/mini_kraken/core/{variable.rb → log_var.rb} +10 -3
- data/lib/mini_kraken/core/{variable_ref.rb → log_var_ref.rb} +3 -3
- data/lib/mini_kraken/core/tap.rb +46 -0
- data/lib/mini_kraken/core/vocabulary.rb +8 -8
- data/lib/mini_kraken/glue/dsl.rb +21 -17
- data/lib/mini_kraken/glue/fresh_env.rb +7 -2
- data/lib/mini_kraken/glue/fresh_env_factory.rb +1 -1
- data/lib/mini_kraken/glue/run_star_expression.rb +2 -2
- data/lib/mini_kraken/version.rb +1 -1
- data/spec/.rubocop.yml +1 -1
- data/spec/atomic/atomic_term_spec.rb +94 -0
- data/spec/{core → atomic}/k_boolean_spec.rb +19 -34
- data/spec/{core → atomic}/k_symbol_spec.rb +3 -11
- data/spec/{core → composite}/cons_cell_spec.rb +10 -8
- data/spec/{core → composite}/cons_cell_visitor_spec.rb +11 -10
- data/spec/core/association_spec.rb +6 -4
- data/spec/core/association_walker_spec.rb +8 -6
- data/spec/core/conde_spec.rb +19 -17
- data/spec/core/conj2_spec.rb +10 -8
- data/spec/core/def_relation_spec.rb +9 -7
- data/spec/core/disj2_spec.rb +11 -10
- data/spec/core/environment_spec.rb +12 -10
- data/spec/core/equals_spec.rb +12 -10
- data/spec/core/goal_spec.rb +6 -5
- data/spec/core/goal_template_spec.rb +5 -5
- data/spec/core/{variable_ref_spec.rb → log_var_ref_spec.rb} +4 -4
- data/spec/core/{variable_spec.rb → log_var_spec.rb} +4 -4
- data/spec/core/vocabulary_spec.rb +12 -11
- data/spec/glue/dsl_chap1_spec.rb +0 -45
- data/spec/glue/dsl_chap2_spec.rb +115 -7
- data/spec/glue/fresh_env_factory_spec.rb +11 -9
- data/spec/glue/fresh_env_spec.rb +3 -3
- data/spec/glue/run_star_expression_spec.rb +13 -11
- data/spec/support/factory_atomic.rb +22 -0
- data/spec/support/factory_methods.rb +11 -26
- metadata +28 -23
- data/lib/mini_kraken/core/cons_cell.rb +0 -82
- data/lib/mini_kraken/core/k_boolean.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96c07c3751d0c46963e19f8e25dc429a77dbd630c22b32018914ccf36f471689
|
4
|
+
data.tar.gz: 26efce2c03a89fd4129c756ce64daa80783cc9bfcebc0358b493076f33ef9434
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1df0d6a9397a804e35700aaedb1fcc1ae7fb91a4b3b237ffe138be5cc63b51113d1af5a57f5cd216a41217993dce5dc5186d0690ab992d2eab229995321e7dfb
|
7
|
+
data.tar.gz: d5af2983495e31e77e8947bffeca99a9b88b916208cb511a88e3f0e397ec2f105cd60d333d2663b78c4e943edad9e4c76c8aa7eabd07a94a733e9821d63de305
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## [0.2.04] - 2020-09-02
|
2
|
+
- Intermediate version before vast code rework.
|
3
|
+
|
4
|
+
### CHANGED
|
5
|
+
- Classes `KBoolean`, `KSymbol`, `KInteger` moved to namespace `Atomic`
|
6
|
+
- Classes `ConsCell`, `ConsCellVisitor` moved to namespace `Composite`
|
7
|
+
- Class `Variable` renamed to `LogVar`
|
8
|
+
- Class `VariableRef` renamed to `LogVarRef`
|
9
|
+
|
1
10
|
## [0.2.03] - 2020-09-02
|
2
11
|
- The DSL (Domain Specific Language) supports the `caro` relation & passes frames up to 2-8 from Chapter 2.
|
3
12
|
|
@@ -1,16 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'term'
|
4
|
-
require_relative 'freshness'
|
3
|
+
require_relative '../core/term'
|
4
|
+
require_relative '../core/freshness'
|
5
5
|
|
6
6
|
module MiniKraken
|
7
|
-
module
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
# This module packages the atomic term classes, that is,
|
8
|
+
# the basic MiniKraken datatypes.
|
9
|
+
module Atomic
|
10
|
+
# An atomic term is an elementary MiniKraken term, a data value
|
11
|
+
# that cannot be decomposed into simpler MiniKraken term(s).
|
12
|
+
# Typically, an atomic term encapsulates a Ruby primitive data object.
|
13
|
+
# MiniKraken treats atomic terms as immutable objects.
|
14
|
+
class AtomicTerm < Core::Term
|
15
|
+
# @return [Object] Internal representation of a MiniKraken data value.
|
12
16
|
attr_reader :value
|
13
17
|
|
18
|
+
# Initialize an atomic term with the given data object.
|
14
19
|
# @param aValue [Object] Ruby representation of MiniKraken data value
|
15
20
|
def initialize(aValue)
|
16
21
|
super()
|
@@ -23,7 +28,7 @@ module MiniKraken
|
|
23
28
|
# @param _env [Vocabulary]
|
24
29
|
# @return [Freshness]
|
25
30
|
def freshness(_env)
|
26
|
-
Freshness.new(:ground, self)
|
31
|
+
Core::Freshness.new(:ground, self)
|
27
32
|
end
|
28
33
|
|
29
34
|
# An atomic term is a ground term: by definition it doesn't contain
|
@@ -35,19 +40,27 @@ module MiniKraken
|
|
35
40
|
end
|
36
41
|
|
37
42
|
# An atomic term is a ground term: by definition it doesn't contain
|
38
|
-
# any fresh variable.
|
43
|
+
# any (fresh) variable.
|
39
44
|
# @param _env [Vocabulary]
|
40
45
|
# @return [TrueClass]
|
41
46
|
def ground?(_env)
|
42
47
|
true
|
43
48
|
end
|
44
49
|
|
50
|
+
# Return a String representation of the atomic term
|
51
|
+
# @return [String]
|
52
|
+
def to_s
|
53
|
+
value.to_s
|
54
|
+
end
|
55
|
+
|
56
|
+
# Treat this object as a data value.
|
45
57
|
# @return [AtomicTerm]
|
46
58
|
def quote(_env)
|
47
59
|
self
|
48
60
|
end
|
49
61
|
|
50
62
|
# Data equality testing
|
63
|
+
# @param other [AtomicTerm, #value]
|
51
64
|
# @return [Boolean]
|
52
65
|
def ==(other)
|
53
66
|
if other.respond_to?(:value)
|
@@ -58,6 +71,7 @@ module MiniKraken
|
|
58
71
|
end
|
59
72
|
|
60
73
|
# Type and data equality testing
|
74
|
+
# @param other [AtomicTerm]
|
61
75
|
# @return [Boolean]
|
62
76
|
def eql?(other)
|
63
77
|
(self.class == other.class) && value.eql?(other.value)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'atomic_term'
|
4
|
+
|
5
|
+
module MiniKraken
|
6
|
+
module Atomic
|
7
|
+
# A specialized atomic term that implements a boolean (true/false) value
|
8
|
+
# in MiniKraken.
|
9
|
+
class KBoolean < AtomicTerm
|
10
|
+
# Initialize a MiniKraken boolean with a given data value.
|
11
|
+
# @example
|
12
|
+
# # Initialize with a Ruby boolean
|
13
|
+
# truthy = KBoolean.new(true)
|
14
|
+
# falsey = KBoolean.new(false)
|
15
|
+
# # Initialize with a String inspired from canonical miniKanren
|
16
|
+
# truthy = KBoolean.new('#t') # In Scheme #t means true
|
17
|
+
# falsey = KBoolean.new('#f') # In Scheme #f means false
|
18
|
+
# # Initialize with a Symbol inspired from canonical miniKanren
|
19
|
+
# truthy = KBoolean.new(:"#t") # In Scheme #t means true
|
20
|
+
# falsey = KBoolean.new(:"#f") # In Scheme #f means false
|
21
|
+
# @param aValue [Boolean, String, Symbol] Ruby representation of boolean value.
|
22
|
+
def initialize(aValue)
|
23
|
+
super(validated_value(aValue))
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def validated_value(aValue)
|
29
|
+
case aValue
|
30
|
+
when true, false
|
31
|
+
aValue
|
32
|
+
when :"#t", '#t'
|
33
|
+
true
|
34
|
+
when :"#f", '#f'
|
35
|
+
false
|
36
|
+
else
|
37
|
+
raise StandardError, "Invalid boolean literal '#{aValue}'"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end # class
|
41
|
+
end # module
|
42
|
+
end # module
|
@@ -3,9 +3,10 @@
|
|
3
3
|
require_relative 'atomic_term'
|
4
4
|
|
5
5
|
module MiniKraken
|
6
|
-
module
|
6
|
+
module Atomic
|
7
7
|
# A specialized atomic term that represents an integer value.
|
8
8
|
# in MiniKraken
|
9
|
+
# @note As MiniKraken doesn't support integer values yet, this class is WIP.
|
9
10
|
class KInteger < AtomicTerm
|
10
11
|
# @param aValue [Integer] Ruby representation of integer value
|
11
12
|
def initialize(aValue)
|
@@ -3,10 +3,11 @@
|
|
3
3
|
require_relative 'atomic_term'
|
4
4
|
|
5
5
|
module MiniKraken
|
6
|
-
module
|
7
|
-
# A specialized atomic term that represents a symbolic value
|
8
|
-
# in MiniKraken
|
6
|
+
module Atomic
|
7
|
+
# A specialized atomic term that represents a symbolic value
|
8
|
+
# in MiniKraken.
|
9
9
|
class KSymbol < AtomicTerm
|
10
|
+
# Initialize a MiniKraken symbol with a given Ruby Symbol value.
|
10
11
|
# @param aValue [Symbol] Ruby representation of symbol value
|
11
12
|
def initialize(aValue)
|
12
13
|
super(aValue)
|
@@ -19,6 +20,7 @@ module MiniKraken
|
|
19
20
|
end
|
20
21
|
|
21
22
|
# Returns a string representing the MiniKraken symbol.
|
23
|
+
# @return [String]
|
22
24
|
def to_s
|
23
25
|
":#{id2name}"
|
24
26
|
end
|
@@ -1,13 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'term'
|
4
|
-
require_relative 'freshness'
|
3
|
+
require_relative '../core/term'
|
4
|
+
require_relative '../core/freshness'
|
5
5
|
|
6
6
|
module MiniKraken
|
7
|
-
module
|
7
|
+
# This module packages the composite term classes.
|
8
|
+
# These hold one or more MiniKanren objects.
|
9
|
+
module Composite
|
8
10
|
# An composite term is an Minikraken term that can be
|
9
11
|
# decomposed into simpler MiniKraken data value(s).
|
10
|
-
class CompositeTerm < Term
|
12
|
+
class CompositeTerm < Core::Term
|
11
13
|
# Abstract method (to override). Return the child terms.
|
12
14
|
# @return [Array<Term>]
|
13
15
|
def children
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'composite_term'
|
4
|
+
|
5
|
+
module MiniKraken
|
6
|
+
module Composite
|
7
|
+
# In Lisp dialects, a cons cell (or a pair) is a data structure with two
|
8
|
+
# fields called the car and cdr fields (for historical reasons).
|
9
|
+
# Cons cells are the key ingredient for building lists in Lisp.
|
10
|
+
# A cons cell can be depicted as a box with two parts, car and cdr each
|
11
|
+
# containing a reference to another object.
|
12
|
+
# +-----------+
|
13
|
+
# | car | cdr |
|
14
|
+
# +--|-----|--+
|
15
|
+
# | |
|
16
|
+
# V V
|
17
|
+
# obj1 obj2
|
18
|
+
#
|
19
|
+
# The list (1 2 3) can be constructed as follows:
|
20
|
+
# +-----------+
|
21
|
+
# | car | cdr |
|
22
|
+
# +--|-----|--+
|
23
|
+
# | |
|
24
|
+
# V V
|
25
|
+
# 1 +-----------+
|
26
|
+
# | car | cdr |
|
27
|
+
# +--|-----|--+
|
28
|
+
# | |
|
29
|
+
# V V
|
30
|
+
# 2 +-----------+
|
31
|
+
# | car | cdr |
|
32
|
+
# +--|-----|--+
|
33
|
+
# | |
|
34
|
+
# V V
|
35
|
+
# 3 nil
|
36
|
+
class ConsCell < CompositeTerm
|
37
|
+
# The first slot in a ConsCell
|
38
|
+
# @return [Term]
|
39
|
+
attr_reader :car
|
40
|
+
|
41
|
+
# The second slot in a ConsCell
|
42
|
+
# @return [Term]
|
43
|
+
attr_reader :cdr
|
44
|
+
|
45
|
+
# Construct a new conscell whose car and cdr are obj1 and obj2.
|
46
|
+
# @param obj1 [Term, NilClass]
|
47
|
+
# @param obj2 [Term, NilClass]
|
48
|
+
def initialize(obj1, obj2 = nil)
|
49
|
+
super()
|
50
|
+
@car = obj1
|
51
|
+
if obj2.kind_of?(ConsCell) && obj2.null?
|
52
|
+
@cdr = nil
|
53
|
+
else
|
54
|
+
@cdr = obj2
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def children
|
59
|
+
[car, cdr]
|
60
|
+
end
|
61
|
+
|
62
|
+
# Return true if it is an empty list, otherwise false.
|
63
|
+
# A list is empty, when both car and cdr fields are nil.
|
64
|
+
# @return [Boolean]
|
65
|
+
def null?
|
66
|
+
car.nil? && cdr.nil?
|
67
|
+
end
|
68
|
+
|
69
|
+
# Return true if car and cdr fields have the same values as the other
|
70
|
+
# ConsCell.
|
71
|
+
# @param other [ConsCell]
|
72
|
+
# @return [Boolean]
|
73
|
+
def ==(other)
|
74
|
+
return false unless other.respond_to?(:car)
|
75
|
+
|
76
|
+
(car == other.car) && (cdr == other.cdr)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Test for type and data value equality.
|
80
|
+
# @param other [ConsCell]
|
81
|
+
# @return [Boolean]
|
82
|
+
def eql?(other)
|
83
|
+
(self.class == other.class) && car.eql?(other.car) && cdr.eql?(other.cdr)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Return a data object that is a copy of the ConsCell
|
87
|
+
# @param anEnv [Core::Environment]
|
88
|
+
# @return [ConsCell]
|
89
|
+
def quote(anEnv)
|
90
|
+
return self if null?
|
91
|
+
|
92
|
+
new_car = car.nil? ? nil : car.quote(anEnv)
|
93
|
+
new_cdr = cdr.nil? ? nil : cdr.quote(anEnv)
|
94
|
+
ConsCell.new(new_car, new_cdr)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Use the list notation from Lisp as a text representation.
|
98
|
+
# @return [String]
|
99
|
+
def to_s
|
100
|
+
return '()' if null?
|
101
|
+
|
102
|
+
"(#{pair_to_s})"
|
103
|
+
end
|
104
|
+
|
105
|
+
# Change the cdr of ConsCell to 'another'.
|
106
|
+
# Analogue of set-cdr! procedure in Scheme.
|
107
|
+
# @param another [Term]
|
108
|
+
def set_cdr!(another)
|
109
|
+
@cdr = another
|
110
|
+
end
|
111
|
+
|
112
|
+
protected
|
113
|
+
|
114
|
+
def pair_to_s
|
115
|
+
result = +car.to_s
|
116
|
+
if cdr
|
117
|
+
result << ' '
|
118
|
+
if cdr.kind_of?(ConsCell)
|
119
|
+
result << cdr.pair_to_s
|
120
|
+
else
|
121
|
+
result << ". #{cdr}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
result
|
126
|
+
end
|
127
|
+
end # class
|
128
|
+
|
129
|
+
# Constant representing the null (empty) list.
|
130
|
+
NullList = ConsCell.new(nil, nil).freeze
|
131
|
+
end # module
|
132
|
+
end # module
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'set'
|
4
|
-
require_relative 'atomic_term'
|
5
|
-
require_relative 'cons_cell'
|
4
|
+
require_relative '../atomic/atomic_term'
|
5
|
+
require_relative '../composite/cons_cell'
|
6
6
|
|
7
7
|
module MiniKraken
|
8
8
|
module Core
|
@@ -26,7 +26,7 @@ module MiniKraken
|
|
26
26
|
# Treat easy cases first...
|
27
27
|
return nil if assocs.empty?
|
28
28
|
|
29
|
-
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(AtomicTerm) }
|
29
|
+
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(Atomic::AtomicTerm) }
|
30
30
|
return assoc_atomic.value if assoc_atomic
|
31
31
|
|
32
32
|
result = nil
|
@@ -45,17 +45,17 @@ module MiniKraken
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def walk_value(aTerm, anEnv)
|
48
|
-
return aTerm if aTerm.kind_of?(AtomicTerm) || aTerm.kind_of?(AnyValue)
|
48
|
+
return aTerm if aTerm.kind_of?(Atomic::AtomicTerm) || aTerm.kind_of?(AnyValue)
|
49
49
|
|
50
50
|
result = nil
|
51
51
|
|
52
|
-
if aTerm.kind_of?(CompositeTerm)
|
52
|
+
if aTerm.kind_of?(Composite::CompositeTerm)
|
53
53
|
children = aTerm.children.compact
|
54
54
|
walk_results = children.map do |child|
|
55
55
|
walk_value(child, anEnv)
|
56
56
|
end
|
57
57
|
result = aTerm unless walk_results.any?(&:nil?)
|
58
|
-
else #
|
58
|
+
else # LogVarRef or Variable
|
59
59
|
name = aTerm.respond_to?(:name) ? aTerm.name : aTerm.var_name
|
60
60
|
result = find_ground(name, anEnv)
|
61
61
|
end
|
@@ -74,9 +74,9 @@ module MiniKraken
|
|
74
74
|
# require 'debug'
|
75
75
|
result = nil
|
76
76
|
|
77
|
-
if aTerm.kind_of?(AtomicTerm)
|
77
|
+
if aTerm.kind_of?(Atomic::AtomicTerm)
|
78
78
|
result = Freshness.new(:ground, aTerm)
|
79
|
-
elsif aTerm.kind_of?(CompositeTerm)
|
79
|
+
elsif aTerm.kind_of?(Composite::CompositeTerm)
|
80
80
|
children = aTerm.children.compact
|
81
81
|
walk_results = children.map { |chd| determine_freshness(chd, anEnv) }
|
82
82
|
|
@@ -89,7 +89,7 @@ module MiniKraken
|
|
89
89
|
degree = :bound
|
90
90
|
end
|
91
91
|
result = Freshness.new(degree, aTerm)
|
92
|
-
else #
|
92
|
+
else # LogVarRef or Variable
|
93
93
|
name = aTerm.respond_to?(:name) ? aTerm.name : aTerm.var_name
|
94
94
|
assocs = anEnv[name]
|
95
95
|
if assocs.empty?
|
@@ -103,7 +103,7 @@ module MiniKraken
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def freshness_associated(assocs, anEnv)
|
106
|
-
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(AtomicTerm) }
|
106
|
+
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(Atomic::AtomicTerm) }
|
107
107
|
return Freshness.new(:ground, assoc_atomic.value) if assoc_atomic
|
108
108
|
|
109
109
|
raw_results = assocs.map do |assc|
|
@@ -133,11 +133,11 @@ module MiniKraken
|
|
133
133
|
# require 'debug'
|
134
134
|
result = nil
|
135
135
|
|
136
|
-
if aTerm.kind_of?(AtomicTerm)
|
136
|
+
if aTerm.kind_of?(Atomic::AtomicTerm)
|
137
137
|
result = aTerm.quote(anEnv)
|
138
|
-
elsif aTerm.kind_of?(ConsCell)
|
138
|
+
elsif aTerm.kind_of?(Composite::ConsCell)
|
139
139
|
result = aTerm.quote(anEnv)
|
140
|
-
else #
|
140
|
+
else # LogVarRef or Variable
|
141
141
|
name = aTerm.respond_to?(:name) ? aTerm.name : aTerm.var_name
|
142
142
|
assocs = anEnv[name]
|
143
143
|
if assocs.empty?
|
@@ -151,7 +151,7 @@ module MiniKraken
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def quote_associated(assocs, anEnv)
|
154
|
-
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(AtomicTerm) }
|
154
|
+
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(Atomic::AtomicTerm) }
|
155
155
|
return assoc_atomic.value if assoc_atomic
|
156
156
|
|
157
157
|
raw_results = assocs.map do |assc|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'relation'
|
4
|
-
require_relative 'composite_term'
|
4
|
+
require_relative '../composite/composite_term'
|
5
5
|
|
6
6
|
module MiniKraken
|
7
7
|
module Core
|
@@ -25,26 +25,26 @@ module MiniKraken
|
|
25
25
|
# |arg1 | arg2 | arg2.ground? || Commute |
|
26
26
|
# | isa? Atomic | isa? Atomic | dont_care || Yes |
|
27
27
|
# | isa? Atomic | isa? CompositeTerm | dont_care || Yes |
|
28
|
-
# | isa? Atomic | isa?
|
28
|
+
# | isa? Atomic | isa? LogVarRef | dont_care || Yes |
|
29
29
|
# | isa? CompositeTerm | isa? Atomic | true || No |
|
30
30
|
# | isa? CompositeTerm | isa? CompositeTerm | false || Yes |
|
31
31
|
# | isa? CompositeTerm | isa? CompositeTerm | true || No |
|
32
|
-
# | isa? CompositeTerm | isa?
|
33
|
-
# | isa?
|
34
|
-
# | isa?
|
35
|
-
# | isa?
|
36
|
-
# | isa?
|
32
|
+
# | isa? CompositeTerm | isa? LogVarRef | dont_care || Yes |
|
33
|
+
# | isa? LogVarRef | isa? Atomic | dont_care || No |
|
34
|
+
# | isa? LogVarRef | isa? CompositeTerm | dont_care || No |
|
35
|
+
# | isa? LogVarRef | isa? LogVarRef | false || Yes |
|
36
|
+
# | isa? LogVarRef | isa? LogVarRef | true || No |
|
37
37
|
def commute_cond(arg1, arg2, env)
|
38
38
|
commuting = true
|
39
|
-
arg2_is_var_ref = arg2.kind_of?(
|
39
|
+
arg2_is_var_ref = arg2.kind_of?(LogVarRef)
|
40
40
|
|
41
|
-
if arg1.kind_of?(CompositeTerm)
|
41
|
+
if arg1.kind_of?(Composite::CompositeTerm)
|
42
42
|
if arg2_is_var_ref
|
43
43
|
commuting = true
|
44
44
|
else
|
45
45
|
commuting = !arg2.ground?(env)
|
46
46
|
end
|
47
|
-
elsif arg1.kind_of?(
|
47
|
+
elsif arg1.kind_of?(LogVarRef)
|
48
48
|
if arg2_is_var_ref
|
49
49
|
commuting = !arg2.ground?(env)
|
50
50
|
else
|