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