mini_kraken 0.2.03 → 0.3.03
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/.rubocop.yml +378 -333
- data/CHANGELOG.md +48 -0
- data/README.md +29 -21
- data/lib/mini_kraken/atomic/all_atomic.rb +5 -0
- data/lib/mini_kraken/atomic/atomic_term.rb +96 -0
- data/lib/mini_kraken/atomic/k_boolean.rb +42 -0
- data/lib/mini_kraken/{core → atomic}/k_integer.rb +2 -5
- data/lib/mini_kraken/atomic/k_string.rb +17 -0
- data/lib/mini_kraken/{core → atomic}/k_symbol.rb +4 -8
- data/lib/mini_kraken/composite/all_composite.rb +4 -0
- data/lib/mini_kraken/composite/composite_term.rb +27 -0
- data/lib/mini_kraken/composite/cons_cell.rb +301 -0
- data/lib/mini_kraken/composite/cons_cell_visitor.rb +50 -0
- data/lib/mini_kraken/composite/list.rb +32 -0
- data/lib/mini_kraken/core/all_core.rb +8 -0
- data/lib/mini_kraken/core/any_value.rb +31 -7
- data/lib/mini_kraken/core/arity.rb +69 -0
- data/lib/mini_kraken/core/association.rb +29 -4
- data/lib/mini_kraken/core/association_copy.rb +50 -0
- data/lib/mini_kraken/core/base_term.rb +13 -0
- data/lib/mini_kraken/core/blackboard.rb +315 -0
- data/lib/mini_kraken/core/bookmark.rb +46 -0
- data/lib/mini_kraken/core/context.rb +492 -0
- data/lib/mini_kraken/core/duck_fiber.rb +21 -19
- data/lib/mini_kraken/core/entry.rb +40 -0
- data/lib/mini_kraken/core/fail.rb +20 -18
- data/lib/mini_kraken/core/fusion.rb +29 -0
- data/lib/mini_kraken/core/goal.rb +20 -29
- data/lib/mini_kraken/core/log_var.rb +22 -0
- data/lib/mini_kraken/core/log_var_ref.rb +108 -0
- data/lib/mini_kraken/core/nullary_relation.rb +2 -9
- data/lib/mini_kraken/core/parametrized_term.rb +68 -0
- data/lib/mini_kraken/core/relation.rb +14 -28
- data/lib/mini_kraken/core/scope.rb +67 -0
- data/lib/mini_kraken/core/solver_adapter.rb +58 -0
- data/lib/mini_kraken/core/specification.rb +48 -0
- data/lib/mini_kraken/core/succeed.rb +21 -17
- data/lib/mini_kraken/core/symbol_table.rb +137 -0
- data/lib/mini_kraken/core/term.rb +15 -4
- data/lib/mini_kraken/glue/dsl.rb +44 -88
- data/lib/mini_kraken/glue/run_star_expression.rb +28 -30
- data/lib/mini_kraken/rela/all_rela.rb +8 -0
- data/lib/mini_kraken/rela/binary_relation.rb +30 -0
- data/lib/mini_kraken/rela/conde.rb +143 -0
- data/lib/mini_kraken/rela/conj2.rb +65 -0
- data/lib/mini_kraken/rela/def_relation.rb +93 -0
- data/lib/mini_kraken/rela/disj2.rb +70 -0
- data/lib/mini_kraken/rela/fresh.rb +98 -0
- data/lib/mini_kraken/{core → rela}/goal_relation.rb +7 -9
- data/lib/mini_kraken/rela/unify.rb +265 -0
- data/lib/mini_kraken/version.rb +1 -1
- data/mini_kraken.gemspec +2 -2
- data/spec/.rubocop.yml +1 -1
- data/spec/atomic/atomic_term_spec.rb +98 -0
- data/spec/{core → atomic}/k_boolean_spec.rb +19 -34
- data/spec/{core → atomic}/k_symbol_spec.rb +3 -16
- data/spec/composite/cons_cell_spec.rb +225 -0
- data/spec/{core → composite}/cons_cell_visitor_spec.rb +36 -20
- data/spec/composite/list_spec.rb +50 -0
- data/spec/core/any_value_spec.rb +52 -0
- data/spec/core/arity_spec.rb +92 -0
- data/spec/core/association_copy_spec.rb +69 -0
- data/spec/core/association_spec.rb +31 -4
- data/spec/core/blackboard_spec.rb +287 -0
- data/spec/core/bookmark_spec.rb +40 -0
- data/spec/core/context_spec.rb +245 -0
- data/spec/core/core_spec.rb +40 -0
- data/spec/core/duck_fiber_spec.rb +16 -46
- data/spec/core/fail_spec.rb +5 -6
- data/spec/core/goal_spec.rb +22 -12
- data/spec/core/log_var_ref_spec.rb +105 -0
- data/spec/core/log_var_spec.rb +64 -0
- data/spec/core/nullary_relation_spec.rb +33 -0
- data/spec/core/parametrized_tem_spec.rb +39 -0
- data/spec/core/relation_spec.rb +33 -0
- data/spec/core/scope_spec.rb +73 -0
- data/spec/core/solver_adapter_spec.rb +70 -0
- data/spec/core/specification_spec.rb +43 -0
- data/spec/core/succeed_spec.rb +5 -5
- data/spec/core/symbol_table_spec.rb +142 -0
- data/spec/glue/dsl_chap1_spec.rb +88 -144
- data/spec/glue/dsl_chap2_spec.rb +454 -19
- data/spec/glue/run_star_expression_spec.rb +81 -906
- data/spec/rela/conde_spec.rb +153 -0
- data/spec/rela/conj2_spec.rb +123 -0
- data/spec/rela/def_relation_spec.rb +119 -0
- data/spec/rela/disj2_spec.rb +117 -0
- data/spec/rela/fresh_spec.rb +147 -0
- data/spec/rela/unify_spec.rb +369 -0
- data/spec/support/factory_atomic.rb +29 -0
- data/spec/support/factory_composite.rb +21 -0
- data/spec/support/factory_methods.rb +11 -26
- metadata +98 -70
- data/lib/mini_kraken/core/association_walker.rb +0 -183
- data/lib/mini_kraken/core/atomic_term.rb +0 -67
- data/lib/mini_kraken/core/base_arg.rb +0 -10
- data/lib/mini_kraken/core/binary_relation.rb +0 -63
- data/lib/mini_kraken/core/composite_goal.rb +0 -46
- data/lib/mini_kraken/core/composite_term.rb +0 -41
- data/lib/mini_kraken/core/conde.rb +0 -143
- data/lib/mini_kraken/core/conj2.rb +0 -79
- data/lib/mini_kraken/core/cons_cell.rb +0 -82
- data/lib/mini_kraken/core/cons_cell_visitor.rb +0 -102
- data/lib/mini_kraken/core/def_relation.rb +0 -53
- data/lib/mini_kraken/core/designation.rb +0 -55
- data/lib/mini_kraken/core/disj2.rb +0 -72
- data/lib/mini_kraken/core/environment.rb +0 -73
- data/lib/mini_kraken/core/equals.rb +0 -193
- data/lib/mini_kraken/core/formal_arg.rb +0 -22
- data/lib/mini_kraken/core/formal_ref.rb +0 -25
- data/lib/mini_kraken/core/freshness.rb +0 -45
- data/lib/mini_kraken/core/goal_arg.rb +0 -12
- data/lib/mini_kraken/core/goal_template.rb +0 -102
- data/lib/mini_kraken/core/k_boolean.rb +0 -35
- data/lib/mini_kraken/core/outcome.rb +0 -63
- data/lib/mini_kraken/core/variable.rb +0 -41
- data/lib/mini_kraken/core/variable_ref.rb +0 -84
- data/lib/mini_kraken/core/vocabulary.rb +0 -446
- data/lib/mini_kraken/glue/fresh_env.rb +0 -103
- data/lib/mini_kraken/glue/fresh_env_factory.rb +0 -83
- data/spec/core/association_walker_spec.rb +0 -192
- data/spec/core/conde_spec.rb +0 -147
- data/spec/core/conj2_spec.rb +0 -114
- data/spec/core/cons_cell_spec.rb +0 -107
- data/spec/core/def_relation_spec.rb +0 -97
- data/spec/core/disj2_spec.rb +0 -99
- data/spec/core/environment_spec.rb +0 -142
- data/spec/core/equals_spec.rb +0 -317
- data/spec/core/goal_template_spec.rb +0 -74
- data/spec/core/outcome_spec.rb +0 -56
- data/spec/core/variable_ref_spec.rb +0 -30
- data/spec/core/variable_spec.rb +0 -35
- data/spec/core/vocabulary_spec.rb +0 -219
- data/spec/glue/fresh_env_factory_spec.rb +0 -97
- data/spec/glue/fresh_env_spec.rb +0 -62
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../lib/mini_kraken/atomic/all_atomic'
|
4
|
+
|
5
|
+
module MiniKraken
|
6
|
+
# Mix-in module that provides convenience factory methods.
|
7
|
+
module FactoryAtomic
|
8
|
+
# Factory method for constructing a KBoolean instance
|
9
|
+
# @param aValue [Boolean]
|
10
|
+
# @return [Core::KBoolean]
|
11
|
+
def k_boolean(aValue)
|
12
|
+
Atomic::KBoolean.new(aValue)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Factory method for constructing a KString instance
|
16
|
+
# @param aString [String]
|
17
|
+
# @return [Core::KSymbol]
|
18
|
+
def k_string(aString)
|
19
|
+
Atomic::KString.new(aString)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Factory method for constructing a KSymbol instance
|
23
|
+
# @param aSymbol [Symbol]
|
24
|
+
# @return [Core::KSymbol]
|
25
|
+
def k_symbol(aSymbol)
|
26
|
+
Atomic::KSymbol.new(aSymbol)
|
27
|
+
end
|
28
|
+
end # end
|
29
|
+
end # module
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../lib/mini_kraken/composite/list'
|
4
|
+
|
5
|
+
module MiniKraken
|
6
|
+
# Mix-in module that provides convenience factory methods.
|
7
|
+
module FactoryComposite
|
8
|
+
# Factory method for constructing a ConsCell
|
9
|
+
# @param obj1 [Term]
|
10
|
+
# @param obj2 [Term]
|
11
|
+
# @return [Core::ConsCell]
|
12
|
+
def cons(obj1, obj2 = nil)
|
13
|
+
Composite::List.cons(obj1, obj2)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Factory method that build a proper list with given elements
|
17
|
+
def make_list(*elems)
|
18
|
+
Composite::List.make_list(elems)
|
19
|
+
end
|
20
|
+
end # module
|
21
|
+
end # module
|
@@ -1,11 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../../lib/mini_kraken/core/any_value'
|
4
|
-
require_relative '../../lib/mini_kraken/
|
5
|
-
require_relative '../../lib/mini_kraken/
|
6
|
-
require_relative '../../lib/mini_kraken/core/
|
7
|
-
require_relative '../../lib/mini_kraken/core/
|
8
|
-
require_relative '../../lib/mini_kraken/core/variable_ref'
|
4
|
+
require_relative '../../lib/mini_kraken/atomic/all_atomic'
|
5
|
+
require_relative '../../lib/mini_kraken/composite/cons_cell'
|
6
|
+
require_relative '../../lib/mini_kraken/core/log_var'
|
7
|
+
require_relative '../../lib/mini_kraken/core/log_var_ref'
|
9
8
|
|
10
9
|
module MiniKraken
|
11
10
|
# Mix-in module that provides convenience factory methods.
|
@@ -24,7 +23,7 @@ module MiniKraken
|
|
24
23
|
# @param obj2 [Term]
|
25
24
|
# @return [Core::ConsCell]
|
26
25
|
def cons(obj1, obj2 = nil)
|
27
|
-
|
26
|
+
Composite::ConsCell.new(obj1, obj2)
|
28
27
|
end
|
29
28
|
|
30
29
|
# Factory method for constructing a goal using the Equals relation.
|
@@ -58,32 +57,18 @@ module MiniKraken
|
|
58
57
|
Core::Goal.new(Core::Disj2.instance, [g1, g2])
|
59
58
|
end
|
60
59
|
|
61
|
-
# Factory method for constructing a
|
62
|
-
# @param aValue [Boolean]
|
63
|
-
# @return [Core::KBoolean]
|
64
|
-
def k_boolean(aValue)
|
65
|
-
Core::KBoolean.new(aValue)
|
66
|
-
end
|
67
|
-
|
68
|
-
# Factory method for constructing a KSymbol instance
|
69
|
-
# @param aSymbol [Symbol]
|
70
|
-
# @return [Core::KSymbol]
|
71
|
-
def k_symbol(aSymbol)
|
72
|
-
Core::KSymbol.new(aSymbol)
|
73
|
-
end
|
74
|
-
|
75
|
-
# Factory method for constructing a Variable
|
60
|
+
# Factory method for constructing a LogVar
|
76
61
|
# @param var_name [String]
|
77
|
-
# @return [Core::
|
62
|
+
# @return [Core::LogVar]
|
78
63
|
def variable(var_name)
|
79
|
-
Core::
|
64
|
+
Core::LogVar.new(var_name)
|
80
65
|
end
|
81
66
|
|
82
|
-
# Factory method for constructing a
|
67
|
+
# Factory method for constructing a LogVarRef
|
83
68
|
# @param var_name [String]
|
84
|
-
# @return [Core::
|
69
|
+
# @return [Core::LogVarRef]
|
85
70
|
def var_ref(var_name)
|
86
|
-
Core::
|
71
|
+
Core::LogVarRef.new(var_name)
|
87
72
|
end
|
88
73
|
end # end
|
89
74
|
end # module
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mini_kraken
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.03
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
-
description: Implementation of
|
55
|
+
description: Implementation of miniKanren language in Ruby. WIP
|
56
56
|
email:
|
57
57
|
- famished.tiger@yahoo.com
|
58
58
|
executables: []
|
@@ -69,78 +69,96 @@ files:
|
|
69
69
|
- README.md
|
70
70
|
- Rakefile
|
71
71
|
- lib/mini_kraken.rb
|
72
|
+
- lib/mini_kraken/atomic/all_atomic.rb
|
73
|
+
- lib/mini_kraken/atomic/atomic_term.rb
|
74
|
+
- lib/mini_kraken/atomic/k_boolean.rb
|
75
|
+
- lib/mini_kraken/atomic/k_integer.rb
|
76
|
+
- lib/mini_kraken/atomic/k_string.rb
|
77
|
+
- lib/mini_kraken/atomic/k_symbol.rb
|
78
|
+
- lib/mini_kraken/composite/all_composite.rb
|
79
|
+
- lib/mini_kraken/composite/composite_term.rb
|
80
|
+
- lib/mini_kraken/composite/cons_cell.rb
|
81
|
+
- lib/mini_kraken/composite/cons_cell_visitor.rb
|
82
|
+
- lib/mini_kraken/composite/list.rb
|
83
|
+
- lib/mini_kraken/core/all_core.rb
|
72
84
|
- lib/mini_kraken/core/any_value.rb
|
85
|
+
- lib/mini_kraken/core/arity.rb
|
73
86
|
- lib/mini_kraken/core/association.rb
|
74
|
-
- lib/mini_kraken/core/
|
75
|
-
- lib/mini_kraken/core/
|
76
|
-
- lib/mini_kraken/core/
|
77
|
-
- lib/mini_kraken/core/
|
78
|
-
- lib/mini_kraken/core/
|
79
|
-
- lib/mini_kraken/core/composite_term.rb
|
80
|
-
- lib/mini_kraken/core/conde.rb
|
81
|
-
- lib/mini_kraken/core/conj2.rb
|
82
|
-
- lib/mini_kraken/core/cons_cell.rb
|
83
|
-
- lib/mini_kraken/core/cons_cell_visitor.rb
|
84
|
-
- lib/mini_kraken/core/def_relation.rb
|
85
|
-
- lib/mini_kraken/core/designation.rb
|
86
|
-
- lib/mini_kraken/core/disj2.rb
|
87
|
+
- lib/mini_kraken/core/association_copy.rb
|
88
|
+
- lib/mini_kraken/core/base_term.rb
|
89
|
+
- lib/mini_kraken/core/blackboard.rb
|
90
|
+
- lib/mini_kraken/core/bookmark.rb
|
91
|
+
- lib/mini_kraken/core/context.rb
|
87
92
|
- lib/mini_kraken/core/duck_fiber.rb
|
88
|
-
- lib/mini_kraken/core/
|
89
|
-
- lib/mini_kraken/core/equals.rb
|
93
|
+
- lib/mini_kraken/core/entry.rb
|
90
94
|
- lib/mini_kraken/core/fail.rb
|
91
|
-
- lib/mini_kraken/core/
|
92
|
-
- lib/mini_kraken/core/formal_ref.rb
|
93
|
-
- lib/mini_kraken/core/freshness.rb
|
95
|
+
- lib/mini_kraken/core/fusion.rb
|
94
96
|
- lib/mini_kraken/core/goal.rb
|
95
|
-
- lib/mini_kraken/core/
|
96
|
-
- lib/mini_kraken/core/
|
97
|
-
- lib/mini_kraken/core/goal_template.rb
|
98
|
-
- lib/mini_kraken/core/k_boolean.rb
|
99
|
-
- lib/mini_kraken/core/k_integer.rb
|
100
|
-
- lib/mini_kraken/core/k_symbol.rb
|
97
|
+
- lib/mini_kraken/core/log_var.rb
|
98
|
+
- lib/mini_kraken/core/log_var_ref.rb
|
101
99
|
- lib/mini_kraken/core/nullary_relation.rb
|
102
|
-
- lib/mini_kraken/core/
|
100
|
+
- lib/mini_kraken/core/parametrized_term.rb
|
103
101
|
- lib/mini_kraken/core/relation.rb
|
102
|
+
- lib/mini_kraken/core/scope.rb
|
103
|
+
- lib/mini_kraken/core/solver_adapter.rb
|
104
|
+
- lib/mini_kraken/core/specification.rb
|
104
105
|
- lib/mini_kraken/core/succeed.rb
|
106
|
+
- lib/mini_kraken/core/symbol_table.rb
|
105
107
|
- lib/mini_kraken/core/term.rb
|
106
|
-
- lib/mini_kraken/core/variable.rb
|
107
|
-
- lib/mini_kraken/core/variable_ref.rb
|
108
|
-
- lib/mini_kraken/core/vocabulary.rb
|
109
108
|
- lib/mini_kraken/glue/dsl.rb
|
110
|
-
- lib/mini_kraken/glue/fresh_env.rb
|
111
|
-
- lib/mini_kraken/glue/fresh_env_factory.rb
|
112
109
|
- lib/mini_kraken/glue/run_star_expression.rb
|
110
|
+
- lib/mini_kraken/rela/all_rela.rb
|
111
|
+
- lib/mini_kraken/rela/binary_relation.rb
|
112
|
+
- lib/mini_kraken/rela/conde.rb
|
113
|
+
- lib/mini_kraken/rela/conj2.rb
|
114
|
+
- lib/mini_kraken/rela/def_relation.rb
|
115
|
+
- lib/mini_kraken/rela/disj2.rb
|
116
|
+
- lib/mini_kraken/rela/fresh.rb
|
117
|
+
- lib/mini_kraken/rela/goal_relation.rb
|
118
|
+
- lib/mini_kraken/rela/unify.rb
|
113
119
|
- lib/mini_kraken/version.rb
|
114
120
|
- mini_kraken.gemspec
|
115
121
|
- spec/.rubocop.yml
|
122
|
+
- spec/atomic/atomic_term_spec.rb
|
123
|
+
- spec/atomic/k_boolean_spec.rb
|
124
|
+
- spec/atomic/k_symbol_spec.rb
|
125
|
+
- spec/composite/cons_cell_spec.rb
|
126
|
+
- spec/composite/cons_cell_visitor_spec.rb
|
127
|
+
- spec/composite/list_spec.rb
|
128
|
+
- spec/core/any_value_spec.rb
|
129
|
+
- spec/core/arity_spec.rb
|
130
|
+
- spec/core/association_copy_spec.rb
|
116
131
|
- spec/core/association_spec.rb
|
117
|
-
- spec/core/
|
118
|
-
- spec/core/
|
119
|
-
- spec/core/
|
120
|
-
- spec/core/
|
121
|
-
- spec/core/cons_cell_visitor_spec.rb
|
122
|
-
- spec/core/def_relation_spec.rb
|
123
|
-
- spec/core/disj2_spec.rb
|
132
|
+
- spec/core/blackboard_spec.rb
|
133
|
+
- spec/core/bookmark_spec.rb
|
134
|
+
- spec/core/context_spec.rb
|
135
|
+
- spec/core/core_spec.rb
|
124
136
|
- spec/core/duck_fiber_spec.rb
|
125
|
-
- spec/core/environment_spec.rb
|
126
|
-
- spec/core/equals_spec.rb
|
127
137
|
- spec/core/fail_spec.rb
|
128
138
|
- spec/core/goal_spec.rb
|
129
|
-
- spec/core/
|
130
|
-
- spec/core/
|
131
|
-
- spec/core/
|
132
|
-
- spec/core/
|
139
|
+
- spec/core/log_var_ref_spec.rb
|
140
|
+
- spec/core/log_var_spec.rb
|
141
|
+
- spec/core/nullary_relation_spec.rb
|
142
|
+
- spec/core/parametrized_tem_spec.rb
|
143
|
+
- spec/core/relation_spec.rb
|
144
|
+
- spec/core/scope_spec.rb
|
145
|
+
- spec/core/solver_adapter_spec.rb
|
146
|
+
- spec/core/specification_spec.rb
|
133
147
|
- spec/core/succeed_spec.rb
|
134
|
-
- spec/core/
|
135
|
-
- spec/core/variable_spec.rb
|
136
|
-
- spec/core/vocabulary_spec.rb
|
148
|
+
- spec/core/symbol_table_spec.rb
|
137
149
|
- spec/glue/dsl_chap1_spec.rb
|
138
150
|
- spec/glue/dsl_chap2_spec.rb
|
139
|
-
- spec/glue/fresh_env_factory_spec.rb
|
140
|
-
- spec/glue/fresh_env_spec.rb
|
141
151
|
- spec/glue/run_star_expression_spec.rb
|
142
152
|
- spec/mini_kraken_spec.rb
|
153
|
+
- spec/rela/conde_spec.rb
|
154
|
+
- spec/rela/conj2_spec.rb
|
155
|
+
- spec/rela/def_relation_spec.rb
|
156
|
+
- spec/rela/disj2_spec.rb
|
157
|
+
- spec/rela/fresh_spec.rb
|
158
|
+
- spec/rela/unify_spec.rb
|
143
159
|
- spec/spec_helper.rb
|
160
|
+
- spec/support/factory_atomic.rb
|
161
|
+
- spec/support/factory_composite.rb
|
144
162
|
- spec/support/factory_methods.rb
|
145
163
|
homepage: https://github.com/famished-tiger/mini_kraken
|
146
164
|
licenses:
|
@@ -165,32 +183,42 @@ requirements: []
|
|
165
183
|
rubygems_version: 3.0.3
|
166
184
|
signing_key:
|
167
185
|
specification_version: 4
|
168
|
-
summary: Implementation of
|
186
|
+
summary: Implementation of miniKanren language in Ruby. WIP
|
169
187
|
test_files:
|
188
|
+
- spec/atomic/atomic_term_spec.rb
|
189
|
+
- spec/atomic/k_boolean_spec.rb
|
190
|
+
- spec/atomic/k_symbol_spec.rb
|
191
|
+
- spec/composite/cons_cell_spec.rb
|
192
|
+
- spec/composite/cons_cell_visitor_spec.rb
|
193
|
+
- spec/composite/list_spec.rb
|
194
|
+
- spec/core/any_value_spec.rb
|
195
|
+
- spec/core/arity_spec.rb
|
196
|
+
- spec/core/association_copy_spec.rb
|
170
197
|
- spec/core/association_spec.rb
|
171
|
-
- spec/core/
|
172
|
-
- spec/core/
|
173
|
-
- spec/core/
|
174
|
-
- spec/core/
|
175
|
-
- spec/core/cons_cell_visitor_spec.rb
|
176
|
-
- spec/core/def_relation_spec.rb
|
177
|
-
- spec/core/disj2_spec.rb
|
198
|
+
- spec/core/blackboard_spec.rb
|
199
|
+
- spec/core/bookmark_spec.rb
|
200
|
+
- spec/core/context_spec.rb
|
201
|
+
- spec/core/core_spec.rb
|
178
202
|
- spec/core/duck_fiber_spec.rb
|
179
|
-
- spec/core/environment_spec.rb
|
180
|
-
- spec/core/equals_spec.rb
|
181
203
|
- spec/core/fail_spec.rb
|
182
204
|
- spec/core/goal_spec.rb
|
183
|
-
- spec/core/
|
184
|
-
- spec/core/
|
185
|
-
- spec/core/
|
186
|
-
- spec/core/
|
205
|
+
- spec/core/log_var_ref_spec.rb
|
206
|
+
- spec/core/log_var_spec.rb
|
207
|
+
- spec/core/nullary_relation_spec.rb
|
208
|
+
- spec/core/parametrized_tem_spec.rb
|
209
|
+
- spec/core/relation_spec.rb
|
210
|
+
- spec/core/scope_spec.rb
|
211
|
+
- spec/core/solver_adapter_spec.rb
|
212
|
+
- spec/core/specification_spec.rb
|
187
213
|
- spec/core/succeed_spec.rb
|
188
|
-
- spec/core/
|
189
|
-
- spec/core/variable_spec.rb
|
190
|
-
- spec/core/vocabulary_spec.rb
|
214
|
+
- spec/core/symbol_table_spec.rb
|
191
215
|
- spec/glue/dsl_chap1_spec.rb
|
192
216
|
- spec/glue/dsl_chap2_spec.rb
|
193
|
-
- spec/glue/fresh_env_factory_spec.rb
|
194
|
-
- spec/glue/fresh_env_spec.rb
|
195
217
|
- spec/glue/run_star_expression_spec.rb
|
196
218
|
- spec/mini_kraken_spec.rb
|
219
|
+
- spec/rela/conde_spec.rb
|
220
|
+
- spec/rela/conj2_spec.rb
|
221
|
+
- spec/rela/def_relation_spec.rb
|
222
|
+
- spec/rela/disj2_spec.rb
|
223
|
+
- spec/rela/fresh_spec.rb
|
224
|
+
- spec/rela/unify_spec.rb
|
@@ -1,183 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'set'
|
4
|
-
require_relative 'atomic_term'
|
5
|
-
require_relative 'cons_cell'
|
6
|
-
|
7
|
-
module MiniKraken
|
8
|
-
module Core
|
9
|
-
class AssociationWalker
|
10
|
-
attr_reader :visitees
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
@visitees = Set.new
|
14
|
-
end
|
15
|
-
|
16
|
-
# @param aName [String]
|
17
|
-
# @param anEnv [Vocabulary]
|
18
|
-
# @return [Term, NilClass]
|
19
|
-
def find_ground(aName, anEnv)
|
20
|
-
# require 'debug'
|
21
|
-
assocs = anEnv[aName]
|
22
|
-
walk_assocs(assocs, anEnv)
|
23
|
-
end
|
24
|
-
|
25
|
-
def walk_assocs(assocs, anEnv)
|
26
|
-
# Treat easy cases first...
|
27
|
-
return nil if assocs.empty?
|
28
|
-
|
29
|
-
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(AtomicTerm) }
|
30
|
-
return assoc_atomic.value if assoc_atomic
|
31
|
-
|
32
|
-
result = nil
|
33
|
-
assocs.each do |assc|
|
34
|
-
unless visitees.include?(assc)
|
35
|
-
visitees.add(assc)
|
36
|
-
sub_result = walk_value(assc.value, anEnv)
|
37
|
-
if sub_result
|
38
|
-
result = sub_result
|
39
|
-
break
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
result
|
45
|
-
end
|
46
|
-
|
47
|
-
def walk_value(aTerm, anEnv)
|
48
|
-
return aTerm if aTerm.kind_of?(AtomicTerm) || aTerm.kind_of?(AnyValue)
|
49
|
-
|
50
|
-
result = nil
|
51
|
-
|
52
|
-
if aTerm.kind_of?(CompositeTerm)
|
53
|
-
children = aTerm.children.compact
|
54
|
-
walk_results = children.map do |child|
|
55
|
-
walk_value(child, anEnv)
|
56
|
-
end
|
57
|
-
result = aTerm unless walk_results.any?(&:nil?)
|
58
|
-
else # VariableRef or Variable
|
59
|
-
name = aTerm.respond_to?(:name) ? aTerm.name : aTerm.var_name
|
60
|
-
result = find_ground(name, anEnv)
|
61
|
-
end
|
62
|
-
|
63
|
-
result
|
64
|
-
end
|
65
|
-
|
66
|
-
# A composite term is fresh when all its members are nil or all non-nil members
|
67
|
-
# are all fresh.
|
68
|
-
# A composite term is bound when it is not fresh and not ground
|
69
|
-
# A composite term is a ground term when all its non-nil members are ground.
|
70
|
-
# @param aTerm [Term]
|
71
|
-
# @param anEnv [Vocabulary]
|
72
|
-
# @return [Freshness]
|
73
|
-
def determine_freshness(aTerm, anEnv)
|
74
|
-
# require 'debug'
|
75
|
-
result = nil
|
76
|
-
|
77
|
-
if aTerm.kind_of?(AtomicTerm)
|
78
|
-
result = Freshness.new(:ground, aTerm)
|
79
|
-
elsif aTerm.kind_of?(CompositeTerm)
|
80
|
-
children = aTerm.children.compact
|
81
|
-
walk_results = children.map { |chd| determine_freshness(chd, anEnv) }
|
82
|
-
|
83
|
-
degree = nil
|
84
|
-
if walk_results.all?(&:fresh?)
|
85
|
-
degree = :fresh
|
86
|
-
elsif walk_results.all?(&:ground?)
|
87
|
-
degree = :ground
|
88
|
-
else
|
89
|
-
degree = :bound
|
90
|
-
end
|
91
|
-
result = Freshness.new(degree, aTerm)
|
92
|
-
else # VariableRef or Variable
|
93
|
-
name = aTerm.respond_to?(:name) ? aTerm.name : aTerm.var_name
|
94
|
-
assocs = anEnv[name]
|
95
|
-
if assocs.empty?
|
96
|
-
result = Freshness.new(:fresh, nil)
|
97
|
-
else
|
98
|
-
result = freshness_associated(assocs, anEnv)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
result
|
103
|
-
end
|
104
|
-
|
105
|
-
def freshness_associated(assocs, anEnv)
|
106
|
-
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(AtomicTerm) }
|
107
|
-
return Freshness.new(:ground, assoc_atomic.value) if assoc_atomic
|
108
|
-
|
109
|
-
raw_results = assocs.map do |assc|
|
110
|
-
unless visitees.include?(assc)
|
111
|
-
visitees.add(assc)
|
112
|
-
determine_freshness(assc.value, anEnv)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
raw_results.compact!
|
117
|
-
result = nil
|
118
|
-
if raw_results.all?(&:fresh?)
|
119
|
-
# TODO: What if multiple bindings?...
|
120
|
-
result = Freshness.new(:bound, assocs[0].value)
|
121
|
-
elsif raw_results.any?(&:ground?)
|
122
|
-
ground_value = raw_results.find(&:ground?).associated
|
123
|
-
result = Freshness.new(:ground, ground_value)
|
124
|
-
else
|
125
|
-
# TODO: What if multiple bindings?...
|
126
|
-
result = Freshness.new(:bound, raw_results[0].associated)
|
127
|
-
end
|
128
|
-
|
129
|
-
result
|
130
|
-
end
|
131
|
-
|
132
|
-
def quote_term(aTerm, anEnv)
|
133
|
-
# require 'debug'
|
134
|
-
result = nil
|
135
|
-
|
136
|
-
if aTerm.kind_of?(AtomicTerm)
|
137
|
-
result = aTerm.quote(anEnv)
|
138
|
-
elsif aTerm.kind_of?(ConsCell)
|
139
|
-
result = aTerm.quote(anEnv)
|
140
|
-
else # VariableRef or Variable
|
141
|
-
name = aTerm.respond_to?(:name) ? aTerm.name : aTerm.var_name
|
142
|
-
assocs = anEnv[name]
|
143
|
-
if assocs.empty?
|
144
|
-
result = nil
|
145
|
-
else
|
146
|
-
result = quote_associated(assocs, anEnv)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
result
|
151
|
-
end
|
152
|
-
|
153
|
-
def quote_associated(assocs, anEnv)
|
154
|
-
assoc_atomic = assocs.find { |assc| assc.value.kind_of?(AtomicTerm) }
|
155
|
-
return assoc_atomic.value if assoc_atomic
|
156
|
-
|
157
|
-
raw_results = assocs.map do |assc|
|
158
|
-
unless visitees.include?(assc)
|
159
|
-
visitees.add(assc)
|
160
|
-
quote_term(assc.value, anEnv)
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
raw_results.compact!
|
165
|
-
result = nil
|
166
|
-
if raw_results.empty?
|
167
|
-
result = nil
|
168
|
-
elsif raw_results.all? { |res| res.fresh?(anEnv) }
|
169
|
-
# TODO: What if multiple bindings?...
|
170
|
-
result = quote_term(assocs[0].value, anEnv)
|
171
|
-
elsif raw_results.any? { |res| res.ground?(anEnv) }
|
172
|
-
ground_res = raw_results.find { |res| res.ground?(anEnv) }
|
173
|
-
result = quote_term(ground_res, anEnv)
|
174
|
-
else
|
175
|
-
# TODO: What if multiple bindings?...
|
176
|
-
result = quote_term(raw_results[0], anEnv)
|
177
|
-
end
|
178
|
-
|
179
|
-
result
|
180
|
-
end
|
181
|
-
end # class
|
182
|
-
end # module
|
183
|
-
end # module
|