module MicroKanren::MiniKanrenWrappers
Public Instance Methods
empty_state()
click to toggle source
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 5 def empty_state cons(mzero, 0) end
pull(stream)
click to toggle source
Advances a stream until it matures. Per microKanren document 5.2, “From Streams to Lists.”
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 11 def pull(stream) stream.is_a?(Proc) && !cons?(stream) ? pull(stream.call) : stream end
reify_1st(s_c)
click to toggle source
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 29 def reify_1st(s_c) v = walk_star((var 0), car(s_c)) walk_star(v, reify_s(v, nil)) end
reify_name(n)
click to toggle source
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 46 def reify_name(n) "_.#{n}".to_sym end
reify_s(v, s)
click to toggle source
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 34 def reify_s(v, s) v = walk(v, s) if var?(v) n = reify_name(length(s)) cons(cons(v, n), s) elsif pair?(v) reify_s(cdr(v), reify_s(car(v), s)) else s end end
take(n, stream)
click to toggle source
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 15 def take(n, stream) if n > 0 if cur = pull(stream) cons(car(cur), take(n - 1, cdr(cur))) end end end
take_all(stream)
click to toggle source
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 23 def take_all(stream) if cur = pull(stream) cons(car(cur), take_all(cdr(cur))) end end
walk_star(v, s)
click to toggle source
# File lib/micro_kanren/mini_kanren_wrappers.rb, line 50 def walk_star(v, s) v = walk(v, s) if var?(v) v elsif pair?(v) cons(walk_star(car(v), s), walk_star(cdr(v), s)) else v end end