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_state ⇒ Object
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
|