Module: MicroKanren::MiniKanrenWrappers

Includes:
Lisp
Defined in:
lib/micro_kanren/mini_kanren_wrappers.rb

Instance Method Summary collapse

Methods included from Lisp

#assp, #car, #cdr, #cons, #cons?, #length, #lists_equal?, #lprint, #map, #procedure?

Instance Method Details

#empty_stateObject



5
6
7
# File 'lib/micro_kanren/mini_kanren_wrappers.rb', line 5

def empty_state
  cons(mzero, 0)
end

#pull(stream) ⇒ Object

Advances a stream until it matures. Per microKanren document 5.2, “From Streams to Lists.”



11
12
13
# 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) ⇒ Object



29
30
31
32
# 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) ⇒ Object



46
47
48
# File 'lib/micro_kanren/mini_kanren_wrappers.rb', line 46

def reify_name(n)
  "_.#{n}".to_sym
end

#reify_s(v, s) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
# 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) ⇒ Object



15
16
17
18
19
20
21
# 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) ⇒ Object



23
24
25
26
27
# 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) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
# 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